@shepai/cli 1.167.0 → 1.168.0-pr505.7d2bb14

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 (470) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +5 -0
  2. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts +38 -2
  3. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +16 -1
  5. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts +2 -0
  7. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/interactive/index.js +1 -0
  9. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.d.ts +17 -0
  10. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.js +34 -0
  12. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts.map +1 -1
  13. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.js +6 -2
  14. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  15. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  16. package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
  17. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/legacy-migrations.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/legacy-migrations.js +11 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-feature-flag-inventory.d.ts +11 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-feature-flag-inventory.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-feature-flag-inventory.js +17 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts +3 -3
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +3 -3
  30. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +12 -3
  32. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts +3 -0
  33. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +59 -6
  35. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +7 -0
  36. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +101 -1
  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/features/feature-tree-page-client.d.ts +7 -0
  44. package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts.map +1 -0
  45. package/dist/src/presentation/web/app/features/feature-tree-page-client.js +13 -0
  46. package/dist/src/presentation/web/app/features/get-feature-tree-data.d.ts +10 -0
  47. package/dist/src/presentation/web/app/features/get-feature-tree-data.d.ts.map +1 -0
  48. package/dist/src/presentation/web/app/features/get-feature-tree-data.js +47 -0
  49. package/dist/src/presentation/web/app/features/page.d.ts +4 -0
  50. package/dist/src/presentation/web/app/features/page.d.ts.map +1 -0
  51. package/dist/src/presentation/web/app/features/page.js +9 -0
  52. package/dist/src/presentation/web/app/layout.d.ts +0 -1
  53. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  54. package/dist/src/presentation/web/app/layout.js +0 -1
  55. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts +3 -2
  56. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts.map +1 -1
  57. package/dist/src/presentation/web/components/assistant-ui/thread.js +26 -3
  58. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.js +68 -56
  60. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +1 -0
  62. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts +1 -0
  63. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.js +7 -1
  65. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts +1 -0
  66. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.js +3 -0
  68. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +3 -1
  70. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/features/chat/ChatTab.js +3 -2
  72. package/dist/src/presentation/web/components/features/chat/InteractionBubble.d.ts +33 -0
  73. package/dist/src/presentation/web/components/features/chat/InteractionBubble.d.ts.map +1 -0
  74. package/dist/src/presentation/web/components/features/chat/InteractionBubble.js +155 -0
  75. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.d.ts +22 -0
  76. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.d.ts.map +1 -0
  77. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.js +107 -0
  78. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +16 -0
  79. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +62 -1
  81. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  82. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +18 -3
  83. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  84. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  85. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +1 -1
  86. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts +36 -0
  87. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts.map +1 -0
  88. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.js +196 -0
  89. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.d.ts +12 -0
  90. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.d.ts.map +1 -0
  91. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.js +166 -0
  92. package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts +3 -0
  93. package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts.map +1 -0
  94. package/dist/src/presentation/web/components/features/feature-tree-table/index.js +1 -0
  95. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -0
  97. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  99. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  101. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  102. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  103. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  104. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  105. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  106. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  107. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  108. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  109. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  110. package/dist/src/presentation/web/hooks/use-graph-state.js +16 -0
  111. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +1 -1
  112. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
  113. package/dist/src/presentation/web/hooks/use-turn-statuses.js +1 -1
  114. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  115. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  116. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  117. package/dist/translations/ar/web.json +3 -0
  118. package/dist/translations/de/web.json +3 -0
  119. package/dist/translations/en/web.json +3 -0
  120. package/dist/translations/es/web.json +3 -0
  121. package/dist/translations/fr/web.json +3 -0
  122. package/dist/translations/he/web.json +3 -0
  123. package/dist/translations/pt/web.json +3 -0
  124. package/dist/translations/ru/web.json +3 -0
  125. package/dist/tsconfig.build.tsbuildinfo +1 -1
  126. package/package.json +1 -1
  127. package/web/.next/BUILD_ID +1 -1
  128. package/web/.next/app-path-routes-manifest.json +2 -0
  129. package/web/.next/build-manifest.json +6 -6
  130. package/web/.next/fallback-build-manifest.json +2 -2
  131. package/web/.next/prerender-manifest.json +3 -3
  132. package/web/.next/required-server-files.js +3 -3
  133. package/web/.next/required-server-files.json +3 -3
  134. package/web/.next/routes-manifest.json +14 -0
  135. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +4 -4
  136. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +1 -8
  137. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  138. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  139. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  140. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +4 -4
  142. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +1 -8
  143. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  144. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
  145. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  146. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +4 -4
  148. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +1 -8
  149. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  150. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  152. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  153. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  154. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -8
  155. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  156. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  157. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  158. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +4 -4
  160. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +1 -8
  161. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
  162. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  163. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  164. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  165. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +4 -4
  166. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +1 -8
  167. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  168. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  169. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  170. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +4 -4
  172. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +1 -8
  173. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  174. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  175. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  176. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  177. package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +4 -4
  178. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +1 -8
  179. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  180. package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
  181. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  182. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +4 -4
  184. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +1 -8
  185. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  186. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  187. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  188. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  189. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  190. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -8
  191. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  192. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  193. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  194. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  195. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +4 -4
  196. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +1 -8
  197. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
  198. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  199. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  200. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  201. package/web/.next/server/app/(dashboard)/page/build-manifest.json +4 -4
  202. package/web/.next/server/app/(dashboard)/page/react-loadable-manifest.json +1 -8
  203. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  204. package/web/.next/server/app/(dashboard)/page.js +1 -1
  205. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  206. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  207. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +4 -4
  208. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +1 -8
  209. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  210. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  211. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  212. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  213. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +4 -4
  214. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +1 -8
  215. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  216. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  217. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  218. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  219. package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  220. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  221. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  222. package/web/.next/server/app/_global-error.html +2 -2
  223. package/web/.next/server/app/_global-error.rsc +7 -7
  224. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  225. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  226. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  227. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  228. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  229. package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  230. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -8
  231. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  232. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  233. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  234. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  235. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  236. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  237. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  238. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/app-paths-manifest.json +3 -0
  239. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/build-manifest.json +11 -0
  240. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/server-reference-manifest.json +4 -0
  241. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js +7 -0
  242. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js.map +5 -0
  243. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js.nft.json +1 -0
  244. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route_client-reference-manifest.js +2 -0
  245. package/web/.next/server/app/features/page/app-paths-manifest.json +3 -0
  246. package/web/.next/server/app/features/page/build-manifest.json +18 -0
  247. package/web/.next/server/app/features/page/next-font-manifest.json +6 -0
  248. package/web/.next/server/app/features/page/react-loadable-manifest.json +1 -0
  249. package/web/.next/server/app/features/page/server-reference-manifest.json +95 -0
  250. package/web/.next/server/app/features/page.js +18 -0
  251. package/web/.next/server/app/features/page.js.map +5 -0
  252. package/web/.next/server/app/features/page.js.nft.json +1 -0
  253. package/web/.next/server/app/features/page_client-reference-manifest.js +2 -0
  254. package/web/.next/server/app/settings/page/build-manifest.json +4 -4
  255. package/web/.next/server/app/settings/page/react-loadable-manifest.json +1 -8
  256. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  257. package/web/.next/server/app/settings/page.js +1 -1
  258. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  259. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  260. package/web/.next/server/app/skills/page/build-manifest.json +4 -4
  261. package/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -8
  262. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  263. package/web/.next/server/app/skills/page.js +1 -1
  264. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  265. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  266. package/web/.next/server/app/tools/page/build-manifest.json +4 -4
  267. package/web/.next/server/app/tools/page/react-loadable-manifest.json +1 -8
  268. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  269. package/web/.next/server/app/tools/page.js +1 -1
  270. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  271. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  272. package/web/.next/server/app/version/page/build-manifest.json +4 -4
  273. package/web/.next/server/app/version/page/react-loadable-manifest.json +1 -8
  274. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  275. package/web/.next/server/app/version/page.js.nft.json +1 -1
  276. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  277. package/web/.next/server/app-paths-manifest.json +2 -0
  278. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_respond_route_actions_990d51bd.js +3 -0
  279. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_respond_route_actions_990d51bd.js.map +1 -0
  280. package/web/.next/server/chunks/[root-of-the-server]__31944fa2._.js +3 -0
  281. package/web/.next/server/chunks/[root-of-the-server]__31944fa2._.js.map +1 -0
  282. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js +9 -3
  283. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js.map +1 -1
  284. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  285. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js.map +1 -1
  286. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  287. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  288. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  289. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  290. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  291. package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js +3 -0
  292. package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js.map +1 -0
  293. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js → [root-of-the-server]__0c5452c3._.js} +2 -2
  294. package/web/.next/server/chunks/ssr/[root-of-the-server]__0c5452c3._.js.map +1 -0
  295. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  296. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  297. package/web/.next/server/chunks/ssr/[root-of-the-server]__20a36a42._.js +3 -0
  298. package/web/.next/server/chunks/ssr/[root-of-the-server]__20a36a42._.js.map +1 -0
  299. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  300. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +1 -1
  301. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -1
  302. package/web/.next/server/chunks/ssr/{[root-of-the-server]__dffa13c5._.js → [root-of-the-server]__69dd3217._.js} +2 -2
  303. package/web/.next/server/chunks/ssr/{[root-of-the-server]__dffa13c5._.js.map → [root-of-the-server]__69dd3217._.js.map} +1 -1
  304. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +4 -0
  305. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -0
  306. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +1 -1
  307. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
  308. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1abe77bb._.js → [root-of-the-server]__7ffd3598._.js} +3 -3
  309. package/web/.next/server/chunks/ssr/[root-of-the-server]__7ffd3598._.js.map +1 -0
  310. package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js → [root-of-the-server]__851f6adb._.js} +2 -2
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__851f6adb._.js.map +1 -0
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7562afc6._.js → [root-of-the-server]__b020c17d._.js} +3 -3
  315. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +1 -0
  316. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  317. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  318. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +1 -1
  319. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
  320. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
  321. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
  322. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b0aac03._.js → [root-of-the-server]__e88da4ee._.js} +3 -3
  323. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b0aac03._.js.map → [root-of-the-server]__e88da4ee._.js.map} +1 -1
  324. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  325. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  326. package/web/.next/server/chunks/ssr/{_a5913a26._.js → _004b47fc._.js} +2 -2
  327. package/web/.next/server/chunks/ssr/{_a5913a26._.js.map → _004b47fc._.js.map} +1 -1
  328. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  329. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  330. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  331. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  332. package/web/.next/server/chunks/ssr/_0727935d._.js +1 -1
  333. package/web/.next/server/chunks/ssr/_0727935d._.js.map +1 -1
  334. package/web/.next/server/chunks/ssr/_0dc06d07._.js +1 -1
  335. package/web/.next/server/chunks/ssr/_0dc06d07._.js.map +1 -1
  336. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  337. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  338. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  339. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  340. package/web/.next/server/chunks/ssr/_1e08a336._.js.map +1 -1
  341. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  342. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  343. package/web/.next/server/chunks/ssr/_4a4709c5._.js +4 -0
  344. package/web/.next/server/chunks/ssr/_4a4709c5._.js.map +1 -0
  345. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +3 -0
  346. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -0
  347. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
  348. package/web/.next/server/chunks/ssr/_560f2971._.js +3 -0
  349. package/web/.next/server/chunks/ssr/_560f2971._.js.map +1 -0
  350. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  351. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  352. package/web/.next/server/chunks/ssr/{_b4c3ffcc._.js → _58902d92._.js} +2 -2
  353. package/web/.next/server/chunks/ssr/{_b4c3ffcc._.js.map → _58902d92._.js.map} +1 -1
  354. package/web/.next/server/chunks/ssr/{_506a3bc3._.js → _682fc996._.js} +2 -2
  355. package/web/.next/server/chunks/ssr/_682fc996._.js.map +1 -0
  356. package/web/.next/server/chunks/ssr/_6892e3b9._.js +3 -0
  357. package/web/.next/server/chunks/ssr/_6892e3b9._.js.map +1 -0
  358. package/web/.next/server/chunks/ssr/_a1068852._.js +3 -0
  359. package/web/.next/server/chunks/ssr/_a1068852._.js.map +1 -0
  360. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  361. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  362. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  363. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  364. package/web/.next/server/chunks/ssr/_b4a9122d._.js +3 -0
  365. package/web/.next/server/chunks/ssr/_b4a9122d._.js.map +1 -0
  366. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  367. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  368. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  369. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  370. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  371. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  372. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  373. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  374. package/web/.next/server/chunks/ssr/_f535d854._.js +3 -0
  375. package/web/.next/server/chunks/ssr/_f535d854._.js.map +1 -0
  376. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  377. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  378. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  379. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  380. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  381. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  382. package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js +3 -0
  383. package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js.map +1 -0
  384. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  385. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +10 -0
  386. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js.map +1 -0
  387. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  388. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  389. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js +3 -0
  390. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js.map +1 -0
  391. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  392. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  393. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +1 -1
  394. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js.map +1 -1
  395. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
  396. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
  397. package/web/.next/server/middleware-build-manifest.js +4 -4
  398. package/web/.next/server/pages/500.html +2 -2
  399. package/web/.next/server/server-reference-manifest.js +1 -1
  400. package/web/.next/server/server-reference-manifest.json +90 -48
  401. package/web/.next/static/chunks/{fe70e73feb07bcfd.js → 08ec4c9ab61717aa.js} +1 -1
  402. package/web/.next/static/chunks/{dedf6ca63c5468fa.js → 09edd35d194bec06.js} +3 -3
  403. package/web/.next/static/chunks/{d4d8f0a137bd2eb4.js → 12803afee7d0afc8.js} +2 -2
  404. package/web/.next/static/chunks/20f7cc98a013b11c.js +1 -0
  405. package/web/.next/static/chunks/2f711373a93c5bc3.css +1 -0
  406. package/web/.next/static/chunks/{8866edda931a81c2.js → 352c5cb6ed572dc3.js} +1 -1
  407. package/web/.next/static/chunks/3e393d6a78b2ade4.js +1 -0
  408. package/web/.next/static/chunks/41b4082b079b3ede.js +1 -0
  409. package/web/.next/static/chunks/4cec255f2754e5ec.js +1 -0
  410. package/web/.next/static/chunks/5a36922f56850850.js +1 -0
  411. package/web/.next/static/chunks/5b7275374d2696b3.css +1 -0
  412. package/web/.next/static/chunks/5ed47e998707b519.js +8 -0
  413. package/web/.next/static/chunks/647140fe96a7c88a.js +1 -0
  414. package/web/.next/static/chunks/6d6f70ff5151b8cb.js +7 -0
  415. package/web/.next/static/chunks/7bbbe3273230d2a1.js +3 -0
  416. package/web/.next/static/chunks/{7a7d7e71cf9b5a4e.js → 890a772551fc3962.js} +1 -1
  417. package/web/.next/static/chunks/982aef195c118996.js +1 -0
  418. package/web/.next/static/chunks/{d6a1facd04a52af5.js → a830880e642a6e01.js} +3 -3
  419. package/web/.next/static/chunks/c3ef3b892f7794ec.js +1 -0
  420. package/web/.next/static/chunks/c625deec577681f7.js +1 -0
  421. package/web/.next/static/chunks/dadf5909b2f15985.js +1 -0
  422. package/web/.next/static/chunks/dc134f3f58cdf850.js +5 -0
  423. package/web/.next/static/chunks/e137a48b35703673.js +1 -0
  424. package/web/.next/static/chunks/{3f404f608aebc7bb.js → e26afac86ed33fa7.js} +1 -1
  425. package/web/.next/static/chunks/f48af05c1bdb8aec.js +1 -0
  426. package/web/.next/static/chunks/f998b42b5cddafd6.js +1 -0
  427. package/web/.next/static/chunks/{d7eebb5c0aa9e101.js → fac6bac55da705ea.js} +1 -1
  428. package/web/.next/static/chunks/fb9d76d30fa8f790.js +1 -0
  429. package/web/.next/static/chunks/{turbopack-432ef324fc27240c.js → turbopack-57bb0674e2cd1d31.js} +1 -1
  430. package/web/package.json +2 -0
  431. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +0 -1
  432. package/web/.next/server/chunks/ssr/[root-of-the-server]__248ee887._.js.map +0 -1
  433. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js +0 -3
  434. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js.map +0 -1
  435. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +0 -1
  436. package/web/.next/server/chunks/ssr/[root-of-the-server]__b062b383._.js.map +0 -1
  437. package/web/.next/server/chunks/ssr/_3bcda5d7._.js +0 -3
  438. package/web/.next/server/chunks/ssr/_3bcda5d7._.js.map +0 -1
  439. package/web/.next/server/chunks/ssr/_4d49a312._.js +0 -3
  440. package/web/.next/server/chunks/ssr/_4d49a312._.js.map +0 -1
  441. package/web/.next/server/chunks/ssr/_506a3bc3._.js.map +0 -1
  442. package/web/.next/server/chunks/ssr/_5ab8e97d._.js +0 -3
  443. package/web/.next/server/chunks/ssr/_5ab8e97d._.js.map +0 -1
  444. package/web/.next/server/chunks/ssr/_9215e9ec._.js +0 -3
  445. package/web/.next/server/chunks/ssr/_9215e9ec._.js.map +0 -1
  446. package/web/.next/server/chunks/ssr/_b5fc318a._.js +0 -3
  447. package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
  448. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +0 -3
  449. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +0 -1
  450. package/web/.next/static/chunks/0be57768a211221a.js +0 -1
  451. package/web/.next/static/chunks/16eea21868510afd.js +0 -5
  452. package/web/.next/static/chunks/3208dc997aaee4d3.css +0 -1
  453. package/web/.next/static/chunks/3deefc76ea55047c.js +0 -1
  454. package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +0 -1
  455. package/web/.next/static/chunks/420eb8b33d83c4cb.js +0 -1
  456. package/web/.next/static/chunks/63b0ad1dbc27a5d0.js +0 -1
  457. package/web/.next/static/chunks/65440524d7ee7d13.js +0 -1
  458. package/web/.next/static/chunks/672e3da3ad26005b.js +0 -1
  459. package/web/.next/static/chunks/6c634b447a6a0db8.js +0 -7
  460. package/web/.next/static/chunks/6d7b999c99d6d175.js +0 -9
  461. package/web/.next/static/chunks/6eb32cd5d2795a7c.js +0 -1
  462. package/web/.next/static/chunks/7f4d1ec4e9f921a3.js +0 -1
  463. package/web/.next/static/chunks/8180973e9cd6a99e.css +0 -1
  464. package/web/.next/static/chunks/c0e13e7d1601bc5d.js +0 -1
  465. package/web/.next/static/chunks/c7e793951b20a67f.js +0 -1
  466. package/web/.next/static/chunks/da6d0839a24602eb.js +0 -3
  467. package/web/.next/static/chunks/db3bf9eb0b519bae.js +0 -1
  468. /package/web/.next/static/{JjjyVzk5ESdcMWkH6999z → 9dnSGRS5_ITgOmM09PgwP}/_buildManifest.js +0 -0
  469. /package/web/.next/static/{JjjyVzk5ESdcMWkH6999z → 9dnSGRS5_ITgOmM09PgwP}/_clientMiddlewareManifest.json +0 -0
  470. /package/web/.next/static/{JjjyVzk5ESdcMWkH6999z → 9dnSGRS5_ITgOmM09PgwP}/_ssgManifest.js +0 -0
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { InteractionBubble } from './InteractionBubble.js';
4
+ const meta = {
5
+ title: 'Features/Chat/InteractionBubble',
6
+ component: InteractionBubble,
7
+ parameters: { layout: 'padded' },
8
+ decorators: [
9
+ (Story) => (_jsx("div", { className: "bg-background mx-auto max-w-xl rounded-lg border p-4", children: _jsx(Story, {}) })),
10
+ ],
11
+ };
12
+ export default meta;
13
+ const colorInteraction = {
14
+ toolCallId: 'toolu_color_1',
15
+ questions: [
16
+ {
17
+ question: 'What is your favorite color?',
18
+ header: 'Color',
19
+ multiSelect: false,
20
+ options: [
21
+ { label: 'Red', description: 'The color red' },
22
+ { label: 'Blue', description: 'The color blue' },
23
+ { label: 'Green', description: 'The color green' },
24
+ { label: 'Yellow', description: 'The color yellow' },
25
+ ],
26
+ },
27
+ ],
28
+ };
29
+ const multiSelectInteraction = {
30
+ toolCallId: 'toolu_features_1',
31
+ questions: [
32
+ {
33
+ question: 'Which features do you want to enable?',
34
+ header: 'Features',
35
+ multiSelect: true,
36
+ options: [
37
+ { label: 'Dark mode', description: 'Enable dark theme support' },
38
+ { label: 'Notifications', description: 'Push notifications for updates' },
39
+ { label: 'Analytics', description: 'Usage analytics and reporting' },
40
+ ],
41
+ },
42
+ ],
43
+ };
44
+ const multiQuestionInteraction = {
45
+ toolCallId: 'toolu_setup_1',
46
+ questions: [
47
+ {
48
+ question: "What's your preferred coding environment?",
49
+ header: 'IDE',
50
+ multiSelect: false,
51
+ options: [
52
+ {
53
+ label: 'VS Code',
54
+ description: "Microsoft's popular editor with rich extension ecosystem.",
55
+ },
56
+ { label: 'Neovim', description: 'Terminal-based, highly customizable.' },
57
+ { label: 'JetBrains', description: 'Full-featured IDEs with deep language intelligence.' },
58
+ { label: 'Cursor', description: 'AI-first fork of VS Code.' },
59
+ ],
60
+ },
61
+ {
62
+ question: 'Which of these technologies do you actively use? (pick all that apply)',
63
+ header: 'Tech Stack',
64
+ multiSelect: true,
65
+ options: [
66
+ { label: 'TypeScript', description: 'Statically typed JavaScript.' },
67
+ { label: 'Python', description: 'Scripting, data science, ML, or backend.' },
68
+ { label: 'Go', description: 'Fast, compiled, cloud-native tooling.' },
69
+ { label: 'Rust', description: 'Systems programming with memory safety.' },
70
+ ],
71
+ },
72
+ {
73
+ question: 'How would you describe your experience level?',
74
+ header: 'Level',
75
+ multiSelect: false,
76
+ options: [
77
+ { label: 'Junior', description: 'Less than 2 years of experience.' },
78
+ { label: 'Mid-level', description: '2-5 years of experience.' },
79
+ { label: 'Senior', description: '5+ years of experience.' },
80
+ ],
81
+ },
82
+ ],
83
+ };
84
+ // ── Interactive wrapper ─────────────────────────────────────────────────
85
+ function InteractiveBubble({ interaction }) {
86
+ const [submitted, setSubmitted] = useState(false);
87
+ if (submitted)
88
+ return _jsx("p", { className: "text-muted-foreground px-4 text-xs", children: "Submitted!" });
89
+ return _jsx(InteractionBubble, { interaction: interaction, onSubmit: () => setSubmitted(true) });
90
+ }
91
+ const noop = () => undefined;
92
+ export const SingleSelect = {
93
+ args: { interaction: colorInteraction, onSubmit: noop },
94
+ render: () => _jsx(InteractiveBubble, { interaction: colorInteraction }),
95
+ };
96
+ export const MultiSelect = {
97
+ args: { interaction: multiSelectInteraction, onSubmit: noop },
98
+ render: () => _jsx(InteractiveBubble, { interaction: multiSelectInteraction }),
99
+ };
100
+ export const TabbedMultiQuestion = {
101
+ args: { interaction: multiQuestionInteraction, onSubmit: noop },
102
+ render: () => _jsx(InteractiveBubble, { interaction: multiQuestionInteraction }),
103
+ };
104
+ export const Submitted = {
105
+ args: { interaction: colorInteraction, onSubmit: noop },
106
+ render: () => _jsx(InteractiveBubble, { interaction: colorInteraction }),
107
+ };
@@ -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,
@@ -0,0 +1,36 @@
1
+ import type { FeatureStatus } from '../../common/feature-status-config.js';
2
+ import './feature-tree-table.css';
3
+ export interface FeatureTreeRow {
4
+ id: string;
5
+ name: string;
6
+ status: FeatureStatus;
7
+ lifecycle: string;
8
+ branch: string;
9
+ repositoryName: string;
10
+ remoteUrl?: string;
11
+ parentId?: string;
12
+ /** Child rows for tree hierarchy */
13
+ _children?: FeatureTreeRow[];
14
+ /** Whether this row is a repository group header */
15
+ _isRepoGroup?: boolean;
16
+ /** Number of features in this repo group */
17
+ _featureCount?: number;
18
+ }
19
+ export interface InventoryRepo {
20
+ name: string;
21
+ remoteUrl?: string;
22
+ }
23
+ export interface FeatureTreeTableProps {
24
+ data: FeatureTreeRow[];
25
+ repos?: InventoryRepo[];
26
+ className?: string;
27
+ onFeatureClick?: (featureId: string) => void;
28
+ }
29
+ /**
30
+ * Build tree-structured data grouped by repository.
31
+ * Each repository becomes a parent node with its features as children.
32
+ * Repos without features are included as empty groups.
33
+ */
34
+ export declare function buildTreeData(flatData: FeatureTreeRow[], repos?: InventoryRepo[]): FeatureTreeRow[];
35
+ export declare function FeatureTreeTable({ data, repos, className, onFeatureClick, }: FeatureTreeTableProps): import("react/jsx-runtime").JSX.Element;
36
+ //# sourceMappingURL=feature-tree-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-tree-table.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/feature-tree-table.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,0BAA0B,CAAC;AAElC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,oDAAoD;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AA+FD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,CAAC,EAAE,aAAa,EAAE,GACtB,cAAc,EAAE,CAmElB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,cAAc,GACf,EAAE,qBAAqB,2CAgDvB"}
@@ -0,0 +1,196 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useCallback } from 'react';
4
+ import { TabulatorFull as Tabulator } from 'tabulator-tables';
5
+ import { cn } from '../../../lib/utils.js';
6
+ import './feature-tree-table.css';
7
+ const STATUS_LABELS = {
8
+ 'action-needed': 'Action Needed',
9
+ 'in-progress': 'In Progress',
10
+ pending: 'Pending',
11
+ blocked: 'Blocked',
12
+ error: 'Error',
13
+ done: 'Done',
14
+ };
15
+ /** SVG repo icon — lucide FolderGit2 */
16
+ const REPO_ICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/><circle cx="12" cy="13" r="2"/><path d="M14 13h3"/><path d="M7 13h3"/></svg>`;
17
+ function statusFormatter(cell) {
18
+ const row = cell.getRow().getData();
19
+ if (row._isRepoGroup)
20
+ return '';
21
+ const value = cell.getValue();
22
+ const label = STATUS_LABELS[value] ?? value;
23
+ return `<span class="status-pill status-pill--${value}"><span class="status-dot"></span>${label}</span>`;
24
+ }
25
+ function nameFormatter(cell) {
26
+ const row = cell.getRow().getData();
27
+ if (row._isRepoGroup) {
28
+ const count = row._featureCount ?? 0;
29
+ const countLabel = count === 0 ? 'No features' : count === 1 ? '1 Feature' : `${count} Features`;
30
+ const remoteLabel = row.remoteUrl
31
+ ? `<span class="repo-remote-url">${escapeHtml(row.remoteUrl)}</span>`
32
+ : '';
33
+ return `<span class="repo-name-cell">${REPO_ICON_SVG}<span class="repo-name-text"><span class="repo-name-primary"><span class="repo-name-title">${escapeHtml(row.name)}</span><span class="repo-feature-count">${countLabel}</span></span>${remoteLabel}</span></span>`;
34
+ }
35
+ return escapeHtml(cell.getValue());
36
+ }
37
+ function escapeHtml(text) {
38
+ const div = typeof document !== 'undefined' ? document.createElement('div') : null;
39
+ if (div) {
40
+ div.textContent = text;
41
+ return div.innerHTML;
42
+ }
43
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
44
+ }
45
+ function buildColumns(onFeatureClick) {
46
+ return [
47
+ {
48
+ title: 'Name',
49
+ field: 'name',
50
+ widthGrow: 3,
51
+ formatter: nameFormatter,
52
+ ...(onFeatureClick && {
53
+ cellClick: (_e, cell) => {
54
+ const data = cell.getRow().getData();
55
+ if (data._isRepoGroup)
56
+ return;
57
+ onFeatureClick(data.id);
58
+ },
59
+ cssClass: 'cursor-pointer',
60
+ }),
61
+ },
62
+ {
63
+ title: 'Status',
64
+ field: 'status',
65
+ widthGrow: 1.5,
66
+ formatter: statusFormatter,
67
+ },
68
+ {
69
+ title: 'Lifecycle',
70
+ field: 'lifecycle',
71
+ widthGrow: 1.5,
72
+ formatter: (cell) => {
73
+ const row = cell.getRow().getData();
74
+ if (row._isRepoGroup)
75
+ return '';
76
+ return cell.getValue();
77
+ },
78
+ },
79
+ {
80
+ title: 'Branch',
81
+ field: 'branch',
82
+ widthGrow: 2,
83
+ formatter: (cell) => {
84
+ const row = cell.getRow().getData();
85
+ if (row._isRepoGroup)
86
+ return '';
87
+ const val = cell.getValue();
88
+ if (!val)
89
+ return '';
90
+ return `<code style="font-size:12px;color:var(--color-muted-foreground,#64748b);font-family:var(--font-mono)">${escapeHtml(val)}</code>`;
91
+ },
92
+ },
93
+ ];
94
+ }
95
+ /**
96
+ * Build tree-structured data grouped by repository.
97
+ * Each repository becomes a parent node with its features as children.
98
+ * Repos without features are included as empty groups.
99
+ */
100
+ export function buildTreeData(flatData, repos) {
101
+ // Group features by repository
102
+ const byRepo = new Map();
103
+ for (const item of flatData) {
104
+ const repoName = item.repositoryName || 'Unknown';
105
+ if (!byRepo.has(repoName)) {
106
+ byRepo.set(repoName, []);
107
+ }
108
+ byRepo.get(repoName).push(item);
109
+ }
110
+ // Ensure all known repos are represented (even without features)
111
+ const repoMeta = new Map();
112
+ if (repos) {
113
+ for (const repo of repos) {
114
+ repoMeta.set(repo.name, { remoteUrl: repo.remoteUrl });
115
+ if (!byRepo.has(repo.name)) {
116
+ byRepo.set(repo.name, []);
117
+ }
118
+ }
119
+ }
120
+ const roots = [];
121
+ for (const [repoName, features] of byRepo) {
122
+ // Build parent-child relationships within this repo group
123
+ const lookup = new Map();
124
+ const repoChildren = [];
125
+ for (const item of features) {
126
+ lookup.set(item.id, { ...item, _children: [] });
127
+ }
128
+ for (const item of features) {
129
+ const node = lookup.get(item.id);
130
+ if (item.parentId && lookup.has(item.parentId)) {
131
+ lookup.get(item.parentId)._children.push(node);
132
+ }
133
+ else {
134
+ repoChildren.push(node);
135
+ }
136
+ }
137
+ // Clean up empty _children arrays
138
+ for (const node of lookup.values()) {
139
+ if (node._children?.length === 0) {
140
+ delete node._children;
141
+ }
142
+ }
143
+ const remoteUrl = repoMeta.get(repoName)?.remoteUrl ?? features[0]?.remoteUrl;
144
+ const repoGroup = {
145
+ id: `repo-${repoName}`,
146
+ name: repoName,
147
+ status: 'pending',
148
+ lifecycle: '',
149
+ branch: '',
150
+ repositoryName: repoName,
151
+ remoteUrl,
152
+ _isRepoGroup: true,
153
+ _featureCount: features.length,
154
+ ...(repoChildren.length > 0 ? { _children: repoChildren } : {}),
155
+ };
156
+ roots.push(repoGroup);
157
+ }
158
+ return roots;
159
+ }
160
+ export function FeatureTreeTable({ data, repos, className, onFeatureClick, }) {
161
+ const containerRef = useRef(null);
162
+ const tabulatorRef = useRef(null);
163
+ const onFeatureClickRef = useRef(onFeatureClick);
164
+ onFeatureClickRef.current = onFeatureClick;
165
+ const stableOnFeatureClick = useCallback((featureId) => {
166
+ onFeatureClickRef.current?.(featureId);
167
+ }, []);
168
+ useEffect(() => {
169
+ if (!containerRef.current)
170
+ return;
171
+ const treeData = buildTreeData(data, repos);
172
+ const columns = buildColumns(stableOnFeatureClick);
173
+ const table = new Tabulator(containerRef.current, {
174
+ data: treeData,
175
+ columns,
176
+ dataTree: true,
177
+ dataTreeStartExpanded: true,
178
+ layout: 'fitColumns',
179
+ height: '100%',
180
+ placeholder: 'No repositories found',
181
+ headerSortClickElement: 'icon',
182
+ rowFormatter: (row) => {
183
+ const rowData = row.getData();
184
+ if (rowData._isRepoGroup) {
185
+ row.getElement().classList.add('tabulator-row-repo-group');
186
+ }
187
+ },
188
+ });
189
+ tabulatorRef.current = table;
190
+ return () => {
191
+ table.destroy();
192
+ tabulatorRef.current = null;
193
+ };
194
+ }, [data, repos, stableOnFeatureClick]);
195
+ return (_jsx("div", { "data-testid": "feature-tree-table", className: cn('h-full w-full', className), ref: containerRef }));
196
+ }
@@ -0,0 +1,12 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { FeatureTreeTable } from './feature-tree-table.js';
3
+ declare const meta: Meta<typeof FeatureTreeTable>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ export declare const Default: Story;
7
+ export declare const SingleRepository: Story;
8
+ export declare const Empty: Story;
9
+ export declare const WithClickHandler: Story;
10
+ export declare const DeeplyNested: Story;
11
+ export declare const NoRemoteUrl: Story;
12
+ //# sourceMappingURL=feature-tree-table.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-tree-table.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAcvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0EnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAI9B,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAK9B,CAAC;AA4CF,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC;AAaF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC"}