@shepai/cli 1.151.2 → 1.152.0-pr476.5b101f5

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 (727) hide show
  1. package/apis/json-schema/InteractiveAgentConfig.yaml +25 -0
  2. package/apis/json-schema/InteractiveMessage.yaml +23 -0
  3. package/apis/json-schema/InteractiveMessageRole.yaml +7 -0
  4. package/apis/json-schema/InteractiveSession.yaml +30 -0
  5. package/apis/json-schema/InteractiveSessionStatus.yaml +9 -0
  6. package/apis/json-schema/Settings.yaml +3 -0
  7. package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts +17 -0
  8. package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/ports/output/agents/index.d.ts +1 -0
  10. package/dist/packages/core/src/application/ports/output/agents/index.d.ts.map +1 -1
  11. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts +53 -0
  12. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts.map +1 -0
  13. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.js +13 -0
  14. package/dist/packages/core/src/application/ports/output/repositories/index.d.ts +2 -0
  15. package/dist/packages/core/src/application/ports/output/repositories/index.d.ts.map +1 -1
  16. package/dist/packages/core/src/application/ports/output/repositories/interactive-message-repository.interface.d.ts +37 -0
  17. package/dist/packages/core/src/application/ports/output/repositories/interactive-message-repository.interface.d.ts.map +1 -0
  18. package/dist/packages/core/src/application/ports/output/repositories/interactive-message-repository.interface.js +10 -0
  19. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts +78 -0
  20. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts.map +1 -0
  21. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.js +10 -0
  22. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  23. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  24. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +187 -0
  25. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -0
  26. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.js +12 -0
  27. package/dist/packages/core/src/application/use-cases/interactive/get-interactive-chat-state.use-case.d.ts +26 -0
  28. package/dist/packages/core/src/application/use-cases/interactive/get-interactive-chat-state.use-case.d.ts.map +1 -0
  29. package/dist/packages/core/src/application/use-cases/interactive/get-interactive-chat-state.use-case.js +41 -0
  30. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts +14 -0
  31. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts.map +1 -0
  32. package/dist/packages/core/src/application/use-cases/interactive/index.js +9 -0
  33. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.d.ts +31 -0
  34. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.d.ts.map +1 -0
  35. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.js +43 -0
  36. package/dist/packages/core/src/application/use-cases/interactive/start-interactive-session.use-case.d.ts +34 -0
  37. package/dist/packages/core/src/application/use-cases/interactive/start-interactive-session.use-case.d.ts.map +1 -0
  38. package/dist/packages/core/src/application/use-cases/interactive/start-interactive-session.use-case.js +43 -0
  39. package/dist/packages/core/src/application/use-cases/interactive/stop-interactive-session.use-case.d.ts +27 -0
  40. package/dist/packages/core/src/application/use-cases/interactive/stop-interactive-session.use-case.d.ts.map +1 -0
  41. package/dist/packages/core/src/application/use-cases/interactive/stop-interactive-session.use-case.js +42 -0
  42. package/dist/packages/core/src/domain/errors/concurrent-session-limit.error.d.ts +13 -0
  43. package/dist/packages/core/src/domain/errors/concurrent-session-limit.error.d.ts.map +1 -0
  44. package/dist/packages/core/src/domain/errors/concurrent-session-limit.error.js +19 -0
  45. package/dist/packages/core/src/domain/generated/output.d.ts +77 -0
  46. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  47. package/dist/packages/core/src/domain/generated/output.js +12 -0
  48. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  49. package/dist/packages/core/src/infrastructure/di/container.js +47 -0
  50. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/interactive-message.mapper.d.ts +36 -0
  51. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/interactive-message.mapper.d.ts.map +1 -0
  52. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/interactive-message.mapper.js +41 -0
  53. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/interactive-session.mapper.d.ts +39 -0
  54. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/interactive-session.mapper.d.ts.map +1 -0
  55. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/interactive-session.mapper.js +47 -0
  56. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +3 -0
  57. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  58. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +10 -0
  59. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-create-interactive-tables.d.ts +22 -0
  60. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-create-interactive-tables.d.ts.map +1 -0
  61. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-create-interactive-tables.js +52 -0
  62. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-interactive-agent-settings.d.ts +16 -0
  63. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-interactive-agent-settings.d.ts.map +1 -0
  64. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-interactive-agent-settings.js +27 -0
  65. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/047-add-agent-session-id.d.ts +15 -0
  66. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/047-add-agent-session-id.d.ts.map +1 -0
  67. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/047-add-agent-session-id.js +27 -0
  68. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/048-add-turn-status.d.ts +15 -0
  69. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/048-add-turn-status.d.ts.map +1 -0
  70. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/048-add-turn-status.js +20 -0
  71. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-message.repository.d.ts +18 -0
  72. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-message.repository.d.ts.map +1 -0
  73. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-message.repository.js +58 -0
  74. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +28 -0
  75. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -0
  76. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +137 -0
  77. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  78. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +10 -3
  79. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts +18 -0
  80. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
  81. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +27 -0
  82. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts +43 -0
  83. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -0
  84. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +288 -0
  85. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts +3 -0
  86. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts.map +1 -1
  87. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.js +6 -0
  88. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +1 -1
  89. package/dist/packages/core/src/infrastructure/services/interactive/feature-context.builder.d.ts +26 -0
  90. package/dist/packages/core/src/infrastructure/services/interactive/feature-context.builder.d.ts.map +1 -0
  91. package/dist/packages/core/src/infrastructure/services/interactive/feature-context.builder.js +140 -0
  92. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +90 -0
  93. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -0
  94. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +889 -0
  95. package/dist/src/presentation/web/app/(dashboard)/@drawer/chat/page.d.ts +3 -0
  96. package/dist/src/presentation/web/app/(dashboard)/@drawer/chat/page.d.ts.map +1 -0
  97. package/dist/src/presentation/web/app/(dashboard)/@drawer/chat/page.js +6 -0
  98. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -1
  99. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  100. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
  101. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  102. package/dist/src/presentation/web/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.d.ts +11 -0
  103. package/dist/src/presentation/web/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.d.ts.map +1 -0
  104. package/dist/src/presentation/web/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +18 -0
  105. package/dist/src/presentation/web/app/(dashboard)/chat/page.d.ts +3 -0
  106. package/dist/src/presentation/web/app/(dashboard)/chat/page.d.ts.map +1 -0
  107. package/dist/src/presentation/web/app/(dashboard)/chat/page.js +4 -0
  108. package/dist/src/presentation/web/app/(dashboard)/repository/[repositoryId]/[tab]/page.d.ts +3 -0
  109. package/dist/src/presentation/web/app/(dashboard)/repository/[repositoryId]/[tab]/page.d.ts.map +1 -0
  110. package/dist/src/presentation/web/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +4 -0
  111. package/dist/src/presentation/web/app/api/agent-events/route.d.ts +6 -0
  112. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  113. package/dist/src/presentation/web/app/api/agent-events/route.js +54 -1
  114. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/mark-read/route.d.ts +19 -0
  115. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/mark-read/route.d.ts.map +1 -0
  116. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/mark-read/route.js +24 -0
  117. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/messages/route.d.ts +24 -0
  118. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/messages/route.d.ts.map +1 -0
  119. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/messages/route.js +76 -0
  120. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stop/route.d.ts +16 -0
  121. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stop/route.d.ts.map +1 -0
  122. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stop/route.js +21 -0
  123. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.d.ts +21 -0
  124. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.d.ts.map +1 -0
  125. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.js +87 -0
  126. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts +12 -0
  127. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts.map +1 -0
  128. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.js +28 -0
  129. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/messages/route.d.ts +19 -0
  130. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/messages/route.d.ts.map +1 -0
  131. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/messages/route.js +78 -0
  132. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/route.d.ts +18 -0
  133. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/route.d.ts.map +1 -0
  134. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/route.js +43 -0
  135. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/stream/route.d.ts +19 -0
  136. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/stream/route.d.ts.map +1 -0
  137. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/stream/route.js +92 -0
  138. package/dist/src/presentation/web/app/api/interactive/sessions/route.d.ts +12 -0
  139. package/dist/src/presentation/web/app/api/interactive/sessions/route.d.ts.map +1 -0
  140. package/dist/src/presentation/web/app/api/interactive/sessions/route.js +37 -0
  141. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  142. package/dist/src/presentation/web/app/layout.js +2 -1
  143. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts +6 -0
  144. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts.map +1 -0
  145. package/dist/src/presentation/web/components/assistant-ui/thread.js +192 -0
  146. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +1 -1
  147. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  148. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -0
  149. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +1 -1
  150. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
  151. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +1 -0
  152. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts +3 -1
  153. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  154. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +5 -6
  155. package/dist/src/presentation/web/components/common/control-center-drawer/global-chat-drawer-client.d.ts +2 -0
  156. package/dist/src/presentation/web/components/common/control-center-drawer/global-chat-drawer-client.d.ts.map +1 -0
  157. package/dist/src/presentation/web/components/common/control-center-drawer/global-chat-drawer-client.js +17 -0
  158. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts +3 -1
  159. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  160. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +15 -8
  161. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +7 -1
  162. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  163. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +11 -4
  164. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  165. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +10 -2
  166. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts +9 -2
  167. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts.map +1 -1
  168. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.js +11 -16
  169. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  170. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +10 -2
  171. package/dist/src/presentation/web/components/features/chat/AgentStatusBadge.d.ts +21 -0
  172. package/dist/src/presentation/web/components/features/chat/AgentStatusBadge.d.ts.map +1 -0
  173. package/dist/src/presentation/web/components/features/chat/AgentStatusBadge.js +46 -0
  174. package/dist/src/presentation/web/components/features/chat/AgentStatusBadge.stories.d.ts +20 -0
  175. package/dist/src/presentation/web/components/features/chat/AgentStatusBadge.stories.d.ts.map +1 -0
  176. package/dist/src/presentation/web/components/features/chat/AgentStatusBadge.stories.js +52 -0
  177. package/dist/src/presentation/web/components/features/chat/ChatComposer.d.ts +18 -0
  178. package/dist/src/presentation/web/components/features/chat/ChatComposer.d.ts.map +1 -0
  179. package/dist/src/presentation/web/components/features/chat/ChatComposer.js +16 -0
  180. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts +14 -0
  181. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts.map +1 -0
  182. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.js +13 -0
  183. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts +9 -0
  184. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts.map +1 -0
  185. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.js +19 -0
  186. package/dist/src/presentation/web/components/features/chat/ChatInput.d.ts +19 -0
  187. package/dist/src/presentation/web/components/features/chat/ChatInput.d.ts.map +1 -0
  188. package/dist/src/presentation/web/components/features/chat/ChatInput.js +42 -0
  189. package/dist/src/presentation/web/components/features/chat/ChatInput.stories.d.ts +14 -0
  190. package/dist/src/presentation/web/components/features/chat/ChatInput.stories.d.ts.map +1 -0
  191. package/dist/src/presentation/web/components/features/chat/ChatInput.stories.js +56 -0
  192. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.d.ts +21 -0
  193. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.d.ts.map +1 -0
  194. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.js +43 -0
  195. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.stories.d.ts +24 -0
  196. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.stories.d.ts.map +1 -0
  197. package/dist/src/presentation/web/components/features/chat/ChatMessageBubble.stories.js +84 -0
  198. package/dist/src/presentation/web/components/features/chat/ChatMessageList.d.ts +25 -0
  199. package/dist/src/presentation/web/components/features/chat/ChatMessageList.d.ts.map +1 -0
  200. package/dist/src/presentation/web/components/features/chat/ChatMessageList.js +36 -0
  201. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts +2 -0
  202. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -0
  203. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +259 -0
  204. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts +6 -0
  205. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -0
  206. package/dist/src/presentation/web/components/features/chat/ChatTab.js +67 -0
  207. package/dist/src/presentation/web/components/features/chat/ChatTab.stories.d.ts +25 -0
  208. package/dist/src/presentation/web/components/features/chat/ChatTab.stories.d.ts.map +1 -0
  209. package/dist/src/presentation/web/components/features/chat/ChatTab.stories.js +237 -0
  210. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +34 -0
  211. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -0
  212. package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +272 -0
  213. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  214. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +71 -8
  215. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts +8 -0
  216. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -0
  217. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +29 -0
  218. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +1 -2
  219. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  220. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +5 -13
  221. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  222. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +45 -2
  223. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  224. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +25 -66
  225. package/dist/src/presentation/web/components/providers/query-provider.d.ts +4 -0
  226. package/dist/src/presentation/web/components/providers/query-provider.d.ts.map +1 -0
  227. package/dist/src/presentation/web/components/providers/query-provider.js +16 -0
  228. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts +15 -0
  229. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts.map +1 -0
  230. package/dist/src/presentation/web/hooks/turn-statuses-provider.js +26 -0
  231. package/dist/src/presentation/web/hooks/use-attachments.d.ts +26 -0
  232. package/dist/src/presentation/web/hooks/use-attachments.d.ts.map +1 -0
  233. package/dist/src/presentation/web/hooks/use-attachments.js +227 -0
  234. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +12 -0
  235. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -0
  236. package/dist/src/presentation/web/hooks/use-turn-statuses.js +26 -0
  237. package/dist/tsconfig.build.tsbuildinfo +1 -1
  238. package/package.json +3 -1
  239. package/web/.next/BUILD_ID +1 -1
  240. package/web/.next/app-path-routes-manifest.json +13 -0
  241. package/web/.next/build-manifest.json +5 -5
  242. package/web/.next/fallback-build-manifest.json +2 -2
  243. package/web/.next/prerender-manifest.json +3 -3
  244. package/web/.next/required-server-files.js +3 -3
  245. package/web/.next/required-server-files.json +3 -3
  246. package/web/.next/routes-manifest.json +83 -0
  247. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +3 -3
  248. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +82 -82
  249. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  250. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  251. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  252. package/web/.next/server/app/(dashboard)/@drawer/chat/page/app-paths-manifest.json +3 -0
  253. package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +18 -0
  254. package/web/.next/server/app/(dashboard)/@drawer/chat/page/next-font-manifest.json +6 -0
  255. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +8 -0
  256. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +395 -0
  257. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +22 -0
  258. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.map +5 -0
  259. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -0
  260. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +2 -0
  261. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +3 -3
  262. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +84 -84
  263. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  264. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  265. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  266. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
  267. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +98 -98
  268. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  269. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  270. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  271. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +3 -3
  272. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +98 -98
  273. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  274. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  275. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  276. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/app-paths-manifest.json +3 -0
  277. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +18 -0
  278. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/next-font-manifest.json +6 -0
  279. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +8 -0
  280. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +395 -0
  281. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +22 -0
  282. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.map +5 -0
  283. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -0
  284. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +2 -0
  285. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +3 -3
  286. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +78 -78
  287. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  288. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  289. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  290. package/web/.next/server/app/(dashboard)/chat/page/app-paths-manifest.json +3 -0
  291. package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +18 -0
  292. package/web/.next/server/app/(dashboard)/chat/page/next-font-manifest.json +6 -0
  293. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +8 -0
  294. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +395 -0
  295. package/web/.next/server/app/(dashboard)/chat/page.js +22 -0
  296. package/web/.next/server/app/(dashboard)/chat/page.js.map +5 -0
  297. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -0
  298. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +2 -0
  299. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +3 -3
  300. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +84 -84
  301. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  302. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  303. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  304. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
  305. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +98 -98
  306. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  307. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  308. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  309. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +3 -3
  310. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +98 -98
  311. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  312. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  313. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  314. package/web/.next/server/app/(dashboard)/page/build-manifest.json +3 -3
  315. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +78 -78
  316. package/web/.next/server/app/(dashboard)/page.js +2 -2
  317. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  318. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  319. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/app-paths-manifest.json +3 -0
  320. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +18 -0
  321. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/next-font-manifest.json +6 -0
  322. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +8 -0
  323. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +395 -0
  324. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +22 -0
  325. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.map +5 -0
  326. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -0
  327. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +2 -0
  328. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +3 -3
  329. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +78 -78
  330. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  331. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  332. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  333. package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  334. package/web/.next/server/app/_global-error.html +2 -2
  335. package/web/.next/server/app/_global-error.rsc +1 -1
  336. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  337. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  338. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  339. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  340. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  341. package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  342. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +36 -6
  343. package/web/.next/server/app/_not-found/page.js +2 -2
  344. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  345. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  346. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  347. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  348. package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
  349. package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
  350. package/web/.next/server/app/api/evidence/route.js +1 -1
  351. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  352. package/web/.next/server/app/api/graph-data/route.js +1 -1
  353. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  354. package/web/.next/server/app/api/interactive/chat/[featureId]/mark-read/route/app-paths-manifest.json +3 -0
  355. package/web/.next/server/app/api/interactive/chat/[featureId]/mark-read/route/build-manifest.json +11 -0
  356. package/web/.next/server/app/api/interactive/chat/[featureId]/mark-read/route/server-reference-manifest.json +4 -0
  357. package/web/.next/server/app/api/interactive/chat/[featureId]/mark-read/route.js +7 -0
  358. package/web/.next/server/app/api/interactive/chat/[featureId]/mark-read/route.js.map +5 -0
  359. package/web/.next/server/app/api/interactive/chat/[featureId]/mark-read/route.js.nft.json +1 -0
  360. package/web/.next/server/app/api/interactive/chat/[featureId]/mark-read/route_client-reference-manifest.js +2 -0
  361. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route/app-paths-manifest.json +3 -0
  362. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route/build-manifest.json +11 -0
  363. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route/server-reference-manifest.json +4 -0
  364. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js +7 -0
  365. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.map +5 -0
  366. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -0
  367. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route_client-reference-manifest.js +2 -0
  368. package/web/.next/server/app/api/interactive/chat/[featureId]/stop/route/app-paths-manifest.json +3 -0
  369. package/web/.next/server/app/api/interactive/chat/[featureId]/stop/route/build-manifest.json +11 -0
  370. package/web/.next/server/app/api/interactive/chat/[featureId]/stop/route/server-reference-manifest.json +4 -0
  371. package/web/.next/server/app/api/interactive/chat/[featureId]/stop/route.js +7 -0
  372. package/web/.next/server/app/api/interactive/chat/[featureId]/stop/route.js.map +5 -0
  373. package/web/.next/server/app/api/interactive/chat/[featureId]/stop/route.js.nft.json +1 -0
  374. package/web/.next/server/app/api/interactive/chat/[featureId]/stop/route_client-reference-manifest.js +2 -0
  375. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route/app-paths-manifest.json +3 -0
  376. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route/build-manifest.json +11 -0
  377. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route/server-reference-manifest.json +4 -0
  378. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route.js +6 -0
  379. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route.js.map +5 -0
  380. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route.js.nft.json +1 -0
  381. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route_client-reference-manifest.js +2 -0
  382. package/web/.next/server/app/api/interactive/chat/turn-statuses/route/app-paths-manifest.json +3 -0
  383. package/web/.next/server/app/api/interactive/chat/turn-statuses/route/build-manifest.json +11 -0
  384. package/web/.next/server/app/api/interactive/chat/turn-statuses/route/server-reference-manifest.json +4 -0
  385. package/web/.next/server/app/api/interactive/chat/turn-statuses/route.js +7 -0
  386. package/web/.next/server/app/api/interactive/chat/turn-statuses/route.js.map +5 -0
  387. package/web/.next/server/app/api/interactive/chat/turn-statuses/route.js.nft.json +1 -0
  388. package/web/.next/server/app/api/interactive/chat/turn-statuses/route_client-reference-manifest.js +2 -0
  389. package/web/.next/server/app/api/interactive/sessions/[id]/messages/route/app-paths-manifest.json +3 -0
  390. package/web/.next/server/app/api/interactive/sessions/[id]/messages/route/build-manifest.json +11 -0
  391. package/web/.next/server/app/api/interactive/sessions/[id]/messages/route/server-reference-manifest.json +4 -0
  392. package/web/.next/server/app/api/interactive/sessions/[id]/messages/route.js +7 -0
  393. package/web/.next/server/app/api/interactive/sessions/[id]/messages/route.js.map +5 -0
  394. package/web/.next/server/app/api/interactive/sessions/[id]/messages/route.js.nft.json +1 -0
  395. package/web/.next/server/app/api/interactive/sessions/[id]/messages/route_client-reference-manifest.js +2 -0
  396. package/web/.next/server/app/api/interactive/sessions/[id]/route/app-paths-manifest.json +3 -0
  397. package/web/.next/server/app/api/interactive/sessions/[id]/route/build-manifest.json +11 -0
  398. package/web/.next/server/app/api/interactive/sessions/[id]/route/server-reference-manifest.json +4 -0
  399. package/web/.next/server/app/api/interactive/sessions/[id]/route.js +7 -0
  400. package/web/.next/server/app/api/interactive/sessions/[id]/route.js.map +5 -0
  401. package/web/.next/server/app/api/interactive/sessions/[id]/route.js.nft.json +1 -0
  402. package/web/.next/server/app/api/interactive/sessions/[id]/route_client-reference-manifest.js +2 -0
  403. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route/app-paths-manifest.json +3 -0
  404. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route/build-manifest.json +11 -0
  405. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route/server-reference-manifest.json +4 -0
  406. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route.js +6 -0
  407. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route.js.map +5 -0
  408. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route.js.nft.json +1 -0
  409. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route_client-reference-manifest.js +2 -0
  410. package/web/.next/server/app/api/interactive/sessions/route/app-paths-manifest.json +3 -0
  411. package/web/.next/server/app/api/interactive/sessions/route/build-manifest.json +11 -0
  412. package/web/.next/server/app/api/interactive/sessions/route/server-reference-manifest.json +4 -0
  413. package/web/.next/server/app/api/interactive/sessions/route.js +7 -0
  414. package/web/.next/server/app/api/interactive/sessions/route.js.map +5 -0
  415. package/web/.next/server/app/api/interactive/sessions/route.js.nft.json +1 -0
  416. package/web/.next/server/app/api/interactive/sessions/route_client-reference-manifest.js +2 -0
  417. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  418. package/web/.next/server/app/api/sessions-batch/route.js +1 -1
  419. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  420. package/web/.next/server/app/api/tools/route.js +2 -2
  421. package/web/.next/server/app/settings/page/build-manifest.json +3 -3
  422. package/web/.next/server/app/settings/page/server-reference-manifest.json +42 -42
  423. package/web/.next/server/app/settings/page.js +3 -3
  424. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  425. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  426. package/web/.next/server/app/skills/page/build-manifest.json +3 -3
  427. package/web/.next/server/app/skills/page/server-reference-manifest.json +46 -16
  428. package/web/.next/server/app/skills/page.js +3 -3
  429. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  430. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  431. package/web/.next/server/app/tools/page/build-manifest.json +3 -3
  432. package/web/.next/server/app/tools/page/server-reference-manifest.json +46 -16
  433. package/web/.next/server/app/tools/page.js +3 -3
  434. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  435. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  436. package/web/.next/server/app/version/page/build-manifest.json +3 -3
  437. package/web/.next/server/app/version/page/server-reference-manifest.json +36 -6
  438. package/web/.next/server/app/version/page.js +2 -2
  439. package/web/.next/server/app/version/page.js.nft.json +1 -1
  440. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  441. package/web/.next/server/app-paths-manifest.json +13 -0
  442. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +8 -2
  443. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  444. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_interactive_sessions_route_actions_f2e7447f.js +3 -0
  445. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_interactive_sessions_route_actions_f2e7447f.js.map +1 -0
  446. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_mark-read_route_actions_ce79c730.js +3 -0
  447. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_mark-read_route_actions_ce79c730.js.map +1 -0
  448. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_messages_route_actions_f98e5802.js +3 -0
  449. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_messages_route_actions_f98e5802.js.map +1 -0
  450. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_stop_route_actions_36518d35.js +3 -0
  451. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_stop_route_actions_36518d35.js.map +1 -0
  452. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_stream_route_actions_e6210931.js +3 -0
  453. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_stream_route_actions_e6210931.js.map +1 -0
  454. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_turn-statuses_route_actions_f97e4de7.js +3 -0
  455. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_turn-statuses_route_actions_f97e4de7.js.map +1 -0
  456. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_sessions_[id]_messages_route_actions_be179971.js +3 -0
  457. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_sessions_[id]_messages_route_actions_be179971.js.map +1 -0
  458. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_sessions_[id]_stream_route_actions_58ab2b5b.js +3 -0
  459. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_sessions_[id]_stream_route_actions_58ab2b5b.js.map +1 -0
  460. package/web/.next/server/chunks/[root-of-the-server]__10852c5c._.js +3 -0
  461. package/web/.next/server/chunks/[root-of-the-server]__10852c5c._.js.map +1 -0
  462. package/web/.next/server/chunks/[root-of-the-server]__2b71641f._.js +3 -0
  463. package/web/.next/server/chunks/[root-of-the-server]__2b71641f._.js.map +1 -0
  464. package/web/.next/server/chunks/[root-of-the-server]__2bb675ff._.js +3 -0
  465. package/web/.next/server/chunks/[root-of-the-server]__2bb675ff._.js.map +1 -0
  466. package/web/.next/server/chunks/{[root-of-the-server]__0d33c29e._.js → [root-of-the-server]__31598852._.js} +2 -2
  467. package/web/.next/server/chunks/{[root-of-the-server]__0d33c29e._.js.map → [root-of-the-server]__31598852._.js.map} +1 -1
  468. package/web/.next/server/chunks/[root-of-the-server]__32b04219._.js +3 -0
  469. package/web/.next/server/chunks/[root-of-the-server]__32b04219._.js.map +1 -0
  470. package/web/.next/server/chunks/[root-of-the-server]__4408a5ba._.js +12 -0
  471. package/web/.next/server/chunks/[root-of-the-server]__4408a5ba._.js.map +1 -0
  472. package/web/.next/server/chunks/[root-of-the-server]__6565a045._.js +3 -0
  473. package/web/.next/server/chunks/[root-of-the-server]__6565a045._.js.map +1 -0
  474. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js +18 -0
  475. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js.map +1 -0
  476. package/web/.next/server/chunks/[root-of-the-server]__8f8d6afe._.js +3 -0
  477. package/web/.next/server/chunks/[root-of-the-server]__8f8d6afe._.js.map +1 -0
  478. package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js +1 -1
  479. package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js.map +1 -1
  480. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  481. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js +3 -0
  482. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js.map +1 -0
  483. package/web/.next/server/chunks/{[root-of-the-server]__26565141._.js → [root-of-the-server]__acea6565._.js} +2 -2
  484. package/web/.next/server/chunks/{[root-of-the-server]__26565141._.js.map → [root-of-the-server]__acea6565._.js.map} +1 -1
  485. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +3 -0
  486. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -0
  487. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  488. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  489. package/web/.next/server/chunks/{[root-of-the-server]__25f23d5d._.js → [root-of-the-server]__e3692208._.js} +2 -2
  490. package/web/.next/server/chunks/{[root-of-the-server]__25f23d5d._.js.map → [root-of-the-server]__e3692208._.js.map} +1 -1
  491. package/web/.next/server/chunks/{[root-of-the-server]__a5879003._.js → [root-of-the-server]__ea653642._.js} +2 -2
  492. package/web/.next/server/chunks/{[root-of-the-server]__a5879003._.js.map → [root-of-the-server]__ea653642._.js.map} +1 -1
  493. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_interactive_sessions_[id]_route_actions_a4ea4d16.js +3 -0
  494. package/web/.next/server/chunks/f3a1f__next-internal_server_app_api_interactive_sessions_[id]_route_actions_a4ea4d16.js.map +1 -0
  495. package/web/.next/server/chunks/ssr/403f9_next_dist_c9d9b4d7._.js +1 -1
  496. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_2c44200f.js +4 -0
  497. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_2c44200f.js.map +1 -0
  498. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_56f4f121.js +4 -0
  499. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_56f4f121.js.map +1 -0
  500. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_77436e06.js +4 -0
  501. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_77436e06.js.map +1 -0
  502. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_b9bb0443.js +4 -0
  503. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_b9bb0443.js.map +1 -0
  504. package/web/.next/server/chunks/ssr/744ca_web_app_(dashboard)_repository_[repositoryId]_[tab]_page_tsx_2e9a3025._.js +3 -0
  505. package/web/.next/server/chunks/ssr/744ca_web_app_(dashboard)_repository_[repositoryId]_[tab]_page_tsx_2e9a3025._.js.map +1 -0
  506. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  507. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  508. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +7 -0
  509. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -0
  510. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_4b319ae6._.js +3 -0
  511. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_4b319ae6._.js.map +1 -0
  512. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +1 -1
  513. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
  514. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +4 -0
  515. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js.map +1 -0
  516. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +4 -0
  517. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js.map +1 -0
  518. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  519. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +4 -0
  520. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js.map +1 -0
  521. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +4 -0
  522. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -0
  523. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
  524. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
  525. package/web/.next/server/chunks/ssr/[root-of-the-server]__7528eb6f._.js +3 -0
  526. package/web/.next/server/chunks/ssr/[root-of-the-server]__7528eb6f._.js.map +1 -0
  527. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +4 -0
  528. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js.map +1 -0
  529. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +4 -0
  530. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +1 -0
  531. package/web/.next/server/chunks/ssr/[root-of-the-server]__b14946f5._.js +2 -2
  532. package/web/.next/server/chunks/ssr/[root-of-the-server]__b8d4bd27._.js +3 -0
  533. package/web/.next/server/chunks/ssr/[root-of-the-server]__b8d4bd27._.js.map +1 -0
  534. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
  535. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
  536. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +4 -0
  537. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -0
  538. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js +7 -0
  539. package/web/.next/server/chunks/ssr/[root-of-the-server]__e91ffd5e._.js.map +1 -0
  540. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +4 -0
  541. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js.map +1 -0
  542. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +3 -0
  543. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -0
  544. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  545. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  546. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  547. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  548. package/web/.next/server/chunks/ssr/{_2aa1f61e._.js → _245b6623._.js} +3 -3
  549. package/web/.next/server/chunks/ssr/_245b6623._.js.map +1 -0
  550. package/web/.next/server/chunks/ssr/_3a0b989f._.js +6 -0
  551. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -0
  552. package/web/.next/server/chunks/ssr/{_6c7faa01._.js → _507a8382._.js} +2 -2
  553. package/web/.next/server/chunks/ssr/_507a8382._.js.map +1 -0
  554. package/web/.next/server/chunks/ssr/_51af0bf4._.js +3 -0
  555. package/web/.next/server/chunks/ssr/_51af0bf4._.js.map +1 -0
  556. package/web/.next/server/chunks/ssr/_56b9d60f._.js +3 -0
  557. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -0
  558. package/web/.next/server/chunks/ssr/_5f69c13f._.js +4 -0
  559. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -0
  560. package/web/.next/server/chunks/ssr/_78ff6f1d._.js +3 -0
  561. package/web/.next/server/chunks/ssr/_78ff6f1d._.js.map +1 -0
  562. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +4 -0
  563. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -0
  564. package/web/.next/server/chunks/ssr/_8219712a._.js +3 -0
  565. package/web/.next/server/chunks/ssr/_8219712a._.js.map +1 -0
  566. package/web/.next/server/chunks/ssr/_82c57f10._.js +4 -0
  567. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -0
  568. package/web/.next/server/chunks/ssr/{_0020fddd._.js → _8b57edb8._.js} +2 -2
  569. package/web/.next/server/chunks/ssr/_8b57edb8._.js.map +1 -0
  570. package/web/.next/server/chunks/ssr/_8d733ce4._.js +3 -0
  571. package/web/.next/server/chunks/ssr/_8d733ce4._.js.map +1 -0
  572. package/web/.next/server/chunks/ssr/{_6256a985._.js → _9495d50b._.js} +3 -3
  573. package/web/.next/server/chunks/ssr/{_6256a985._.js.map → _9495d50b._.js.map} +1 -1
  574. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +4 -0
  575. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -0
  576. package/web/.next/server/chunks/ssr/_ac4a3873._.js +3 -0
  577. package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -0
  578. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +4 -0
  579. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -0
  580. package/web/.next/server/chunks/ssr/_cb5a021e._.js +4 -0
  581. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -0
  582. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +1 -1
  583. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +1 -1
  584. package/web/.next/server/chunks/ssr/_d4b20e29._.js +1 -1
  585. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  586. package/web/.next/server/chunks/ssr/_d86175ae._.js +4 -0
  587. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -0
  588. package/web/.next/server/chunks/ssr/_d8bedf13._.js +4 -0
  589. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -0
  590. package/web/.next/server/chunks/ssr/_e9a73a63._.js +9 -0
  591. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +1 -0
  592. package/web/.next/server/chunks/ssr/{_4093a637._.js → _fa0acc22._.js} +2 -2
  593. package/web/.next/server/chunks/ssr/_fa0acc22._.js.map +1 -0
  594. package/web/.next/server/chunks/ssr/_fa7efce3._.js +6 -0
  595. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -0
  596. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  597. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  598. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_global-chat-drawer-client_tsx_158c4b12._.js +3 -0
  599. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_global-chat-drawer-client_tsx_158c4b12._.js.map +1 -0
  600. package/web/.next/server/chunks/ssr/node_modules__pnpm_8ec2c790._.js +3 -0
  601. package/web/.next/server/chunks/ssr/node_modules__pnpm_8ec2c790._.js.map +1 -0
  602. package/web/.next/server/chunks/ssr/node_modules__pnpm_ef15a0bd._.js +3 -0
  603. package/web/.next/server/chunks/ssr/node_modules__pnpm_ef15a0bd._.js.map +1 -0
  604. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +3 -0
  605. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -0
  606. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +3 -0
  607. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -0
  608. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +3 -0
  609. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -0
  610. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_chat_page_tsx_85327270._.js +3 -0
  611. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_chat_page_tsx_85327270._.js.map +1 -0
  612. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  613. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  614. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +3 -0
  615. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +1 -0
  616. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  617. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  618. package/web/.next/server/middleware-build-manifest.js +3 -3
  619. package/web/.next/server/pages/500.html +2 -2
  620. package/web/.next/server/server-reference-manifest.js +1 -1
  621. package/web/.next/server/server-reference-manifest.json +1346 -562
  622. package/web/.next/static/chunks/0aa0c51000c61a82.js +5 -0
  623. package/web/.next/static/chunks/0bb071bc5f7487be.js +1 -0
  624. package/web/.next/static/chunks/0c38793438b8c038.js +1 -0
  625. package/web/.next/static/chunks/0df0e1499e672836.js +3 -0
  626. package/web/.next/static/chunks/11091b676d1b3bd4.js +1 -0
  627. package/web/.next/static/chunks/19e9b142ad142695.js +7 -0
  628. package/web/.next/static/chunks/22c459f1877b1e4f.js +1 -0
  629. package/web/.next/static/chunks/2354d39c63978576.js +1 -0
  630. package/web/.next/static/chunks/29f375627d0eccca.js +1 -0
  631. package/web/.next/static/chunks/2ea8e9030cd5ab2b.js +1 -0
  632. package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +1 -0
  633. package/web/.next/static/chunks/4b2c4a5c35ebb70d.js +1 -0
  634. package/web/.next/static/chunks/5ae60a052ab5f437.js +5 -0
  635. package/web/.next/static/chunks/811d8a0007da9137.js +1 -0
  636. package/web/.next/static/chunks/8a83eca1de6a4ed0.js +1 -0
  637. package/web/.next/static/chunks/8ba1c07ef18b15a9.js +1 -0
  638. package/web/.next/static/chunks/9033e51dfc21b48d.js +1 -0
  639. package/web/.next/static/chunks/{4b013b6f4afce0a6.js → a36ca50cbdfb3ffe.js} +1 -1
  640. package/web/.next/static/chunks/b4cde06eff374c59.js +5 -0
  641. package/web/.next/static/chunks/be7d8a4fee3b9860.js +1 -0
  642. package/web/.next/static/chunks/c86594475dcb03d5.css +1 -0
  643. package/web/.next/static/chunks/cd54b758f58061d0.js +1 -0
  644. package/web/.next/static/chunks/{cfe4dc9904fcfddb.js → d0e04c4bd51d2553.js} +1 -1
  645. package/web/.next/static/chunks/{1ba116f1756fed5e.js → fab1eb6312340c1b.js} +2 -2
  646. package/web/.next/static/chunks/{turbopack-c2d183e05f30c7dc.js → turbopack-432ef324fc27240c.js} +1 -1
  647. package/web/package.json +7 -2
  648. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +0 -3
  649. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +0 -1
  650. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js +0 -3
  651. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js.map +0 -1
  652. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +0 -4
  653. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js.map +0 -1
  654. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +0 -4
  655. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +0 -1
  656. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +0 -4
  657. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js.map +0 -1
  658. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +0 -4
  659. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +0 -1
  660. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +0 -4
  661. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +0 -1
  662. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -7
  663. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +0 -1
  664. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +0 -4
  665. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +0 -1
  666. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +0 -3
  667. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +0 -1
  668. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +0 -4
  669. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +0 -1
  670. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js +0 -3
  671. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js.map +0 -1
  672. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +0 -4
  673. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +0 -1
  674. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +0 -1
  675. package/web/.next/server/chunks/ssr/_01046927._.js +0 -9
  676. package/web/.next/server/chunks/ssr/_01046927._.js.map +0 -1
  677. package/web/.next/server/chunks/ssr/_0b2cac86._.js +0 -3
  678. package/web/.next/server/chunks/ssr/_0b2cac86._.js.map +0 -1
  679. package/web/.next/server/chunks/ssr/_0c473fef._.js +0 -6
  680. package/web/.next/server/chunks/ssr/_0c473fef._.js.map +0 -1
  681. package/web/.next/server/chunks/ssr/_1b719e7f._.js +0 -4
  682. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +0 -1
  683. package/web/.next/server/chunks/ssr/_2aa1f61e._.js.map +0 -1
  684. package/web/.next/server/chunks/ssr/_37e8548b._.js +0 -4
  685. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +0 -1
  686. package/web/.next/server/chunks/ssr/_4093a637._.js.map +0 -1
  687. package/web/.next/server/chunks/ssr/_55d763e2._.js +0 -4
  688. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +0 -1
  689. package/web/.next/server/chunks/ssr/_6c7faa01._.js.map +0 -1
  690. package/web/.next/server/chunks/ssr/_8fcc39d4._.js +0 -3
  691. package/web/.next/server/chunks/ssr/_8fcc39d4._.js.map +0 -1
  692. package/web/.next/server/chunks/ssr/_b71645b4._.js +0 -4
  693. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +0 -1
  694. package/web/.next/server/chunks/ssr/_d8575088._.js +0 -3
  695. package/web/.next/server/chunks/ssr/_d8575088._.js.map +0 -1
  696. package/web/.next/server/chunks/ssr/_e9e9ed20._.js +0 -6
  697. package/web/.next/server/chunks/ssr/_e9e9ed20._.js.map +0 -1
  698. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js +0 -3
  699. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js.map +0 -1
  700. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +0 -3
  701. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +0 -1
  702. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +0 -3
  703. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +0 -1
  704. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +0 -3
  705. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +0 -1
  706. package/web/.next/server/chunks/ssr/src_presentation_web_f6e481b8._.js +0 -3
  707. package/web/.next/server/chunks/ssr/src_presentation_web_f6e481b8._.js.map +0 -1
  708. package/web/.next/static/chunks/08baac5434d9528e.js +0 -13
  709. package/web/.next/static/chunks/16966906cfa77db6.js +0 -5
  710. package/web/.next/static/chunks/24da1cc4c8a65e26.js +0 -1
  711. package/web/.next/static/chunks/36d9607f2209cd84.js +0 -1
  712. package/web/.next/static/chunks/46117e4b43552316.js +0 -1
  713. package/web/.next/static/chunks/49057cf8cd37e262.js +0 -1
  714. package/web/.next/static/chunks/4cec255f2754e5ec.js +0 -1
  715. package/web/.next/static/chunks/530d578f066ee9ad.js +0 -1
  716. package/web/.next/static/chunks/5ff8cd236a52ed3d.js +0 -1
  717. package/web/.next/static/chunks/601d93593f5f664f.js +0 -1
  718. package/web/.next/static/chunks/7089c5c993a8debb.js +0 -1
  719. package/web/.next/static/chunks/7a0118240b58924a.js +0 -1
  720. package/web/.next/static/chunks/903d3357abf9b52c.js +0 -1
  721. package/web/.next/static/chunks/9b8678597fa1db84.css +0 -1
  722. package/web/.next/static/chunks/b70dd4985a814b27.js +0 -1
  723. package/web/.next/static/chunks/e4a7c6ef8a3e6fa0.js +0 -1
  724. package/web/.next/static/chunks/f66c996402a430f5.js +0 -1
  725. /package/web/.next/static/{RCXQqSnwzdmA7_70mFW0K → vc6t9IqXHzQXsbrkf5_dt}/_buildManifest.js +0 -0
  726. /package/web/.next/static/{RCXQqSnwzdmA7_70mFW0K → vc6t9IqXHzQXsbrkf5_dt}/_clientMiddlewareManifest.json +0 -0
  727. /package/web/.next/static/{RCXQqSnwzdmA7_70mFW0K → vc6t9IqXHzQXsbrkf5_dt}/_ssgManifest.js +0 -0
@@ -0,0 +1,889 @@
1
+ /**
2
+ * Interactive Session Service
3
+ *
4
+ * Singleton service that owns the lifecycle of all interactive agent sessions.
5
+ * Uses the IAgentExecutorFactory to create interactive executors that manage
6
+ * persistent sessions via the agent SDK. Multi-turn context is maintained
7
+ * by the SDK session handle internally.
8
+ *
9
+ * Dependencies are injected via constructor for testability (no real processes
10
+ * are spawned in unit tests — the factory is replaced with a test double).
11
+ */
12
+ import * as crypto from 'node:crypto';
13
+ import { InteractiveSessionStatus, InteractiveMessageRole, AgentType, AgentAuthMethod, } from '../../../domain/generated/output.js';
14
+ import { ConcurrentSessionLimitError } from '../../../domain/errors/concurrent-session-limit.error.js';
15
+ import { getSettings, hasSettings } from '../settings.service.js';
16
+ /** Default idle timeout if no settings are loaded (15 minutes). */
17
+ const DEFAULT_TIMEOUT_MS = 15 * 60 * 1000;
18
+ /** Default concurrent session cap. */
19
+ const DEFAULT_CAP = 3;
20
+ /** Maximum time to wait for the agent to become ready (60 seconds). */
21
+ const BOOT_TIMEOUT_MS = 60_000;
22
+ /**
23
+ * Core service managing interactive agent session lifecycles.
24
+ * Must be registered as a singleton in the DI container.
25
+ *
26
+ * **Polymorphic `featureId` scope key:** The `featureId` parameter accepted
27
+ * by public methods (`sendUserMessage`, `getChatState`, `subscribeByFeature`,
28
+ * etc.) is a polymorphic scope key — not necessarily a feature UUID:
29
+ * - Feature chat: actual feature UUID (e.g. `"feat-abc123"`)
30
+ * - Repository chat: repo identifier (e.g. `"repo-<repoId>"`)
31
+ * - Global chat: literal string `"global"`
32
+ *
33
+ * Sessions and messages are isolated by this key regardless of chat type.
34
+ *
35
+ * @todo Consider renaming to `scopeId` + adding a `scopeType` discriminator.
36
+ */
37
+ export class InteractiveSessionService {
38
+ sessionRepo;
39
+ messageRepo;
40
+ executorFactory;
41
+ featureRepo;
42
+ contextBuilder;
43
+ /** Live sessions indexed by sessionId. */
44
+ sessions = new Map();
45
+ /** Cached agentSessionIds from stopped sessions, keyed by featureId. */
46
+ stoppedAgentSessionIds = new Map();
47
+ constructor(sessionRepo, messageRepo, executorFactory, featureRepo, contextBuilder) {
48
+ this.sessionRepo = sessionRepo;
49
+ this.messageRepo = messageRepo;
50
+ this.executorFactory = executorFactory;
51
+ this.featureRepo = featureRepo;
52
+ this.contextBuilder = contextBuilder;
53
+ }
54
+ // ---------------------------------------------------------------------------
55
+ // Public API
56
+ // ---------------------------------------------------------------------------
57
+ async startSession(featureId, worktreePath, model, agentType) {
58
+ const cap = this.getCap();
59
+ const activeCount = await this.sessionRepo.countActiveSessions();
60
+ if (activeCount >= cap) {
61
+ throw new ConcurrentSessionLimitError(activeCount, cap);
62
+ }
63
+ // Create DB record with booting status
64
+ const now = new Date();
65
+ const session = {
66
+ id: crypto.randomUUID(),
67
+ featureId,
68
+ status: InteractiveSessionStatus.booting,
69
+ startedAt: now,
70
+ lastActivityAt: now,
71
+ createdAt: now,
72
+ updatedAt: now,
73
+ };
74
+ await this.sessionRepo.create(session);
75
+ // Carry over agentSessionId from previous session so resumption works
76
+ let previousAgentSessionId;
77
+ for (const [, s] of this.sessions) {
78
+ if (s.featureId === featureId && s.agentSessionId) {
79
+ previousAgentSessionId = s.agentSessionId;
80
+ break;
81
+ }
82
+ }
83
+ // Also check stoppedSessions cache (populated on stop)
84
+ previousAgentSessionId ??= this.stoppedAgentSessionIds.get(featureId);
85
+ // Fall back to DB — the in-memory cache may be empty after service restart
86
+ if (!previousAgentSessionId) {
87
+ const latestDbSession = await this.sessionRepo.findByFeatureId(featureId);
88
+ if (latestDbSession) {
89
+ previousAgentSessionId =
90
+ (await this.sessionRepo.getAgentSessionId(latestDbSession.id)) ?? undefined;
91
+ }
92
+ }
93
+ // Set up in-memory state
94
+ const state = {
95
+ sessionId: session.id,
96
+ featureId,
97
+ worktreePath,
98
+ model,
99
+ agentType,
100
+ handle: null,
101
+ agentSessionId: previousAgentSessionId,
102
+ timer: null,
103
+ currentAssistantBuffer: '',
104
+ toolEventsLog: [],
105
+ subscribers: new Set(),
106
+ turnInProgress: false,
107
+ turnQueue: [],
108
+ };
109
+ this.sessions.set(session.id, state);
110
+ // Fire-and-forget the async boot sequence. The API returns the session
111
+ // immediately in "booting" status; the frontend polls until "ready".
112
+ void this.completeBootAsync(state, featureId, worktreePath);
113
+ return session;
114
+ }
115
+ /**
116
+ * Asynchronously complete the boot sequence: build feature context,
117
+ * create an SDK session via the interactive executor, send the boot
118
+ * prompt, iterate the stream for the greeting, persist the greeting,
119
+ * and transition the session to "ready".
120
+ */
121
+ async completeBootAsync(state, featureId, worktreePath) {
122
+ try {
123
+ // Build the feature context prompt
124
+ const feature = await this.featureRepo.findById(featureId);
125
+ const openPRs = feature?.pr?.url ? [feature.pr.url] : [];
126
+ const context = this.contextBuilder.buildContext(feature ??
127
+ { id: featureId, name: featureId }, worktreePath, openPRs);
128
+ // Include previous conversation history so the agent has context
129
+ // from prior sessions with this feature.
130
+ const previousMessages = await this.messageRepo.findByFeatureId(featureId, 50);
131
+ let bootPrompt = context;
132
+ // Check if the last message is from the user — they're waiting for a response
133
+ const lastMsg = previousMessages.length > 0 ? previousMessages[previousMessages.length - 1] : null;
134
+ const userIsWaiting = lastMsg?.role === InteractiveMessageRole.user;
135
+ if (previousMessages.length > 0) {
136
+ // Filter out tool event messages (e.g. "Bash echo $$", "Read file.ts")
137
+ // to prevent the agent from re-executing them as instructions.
138
+ const conversationMessages = previousMessages.filter((m) => {
139
+ if (m.role !== InteractiveMessageRole.assistant)
140
+ return true;
141
+ // Skip tool event messages — they start with a tool name pattern
142
+ const content = m.content.trim();
143
+ const toolPatterns = /^(Bash |Read |Write |Edit |Glob |Grep |Session started |Using tool:)/;
144
+ return !toolPatterns.test(content);
145
+ });
146
+ // Only include the last few messages for context, not the entire history
147
+ const recentMessages = conversationMessages.slice(-10);
148
+ const historyBlock = recentMessages
149
+ .map((m) => {
150
+ const role = m.role === InteractiveMessageRole.user ? 'User' : 'Assistant';
151
+ // Truncate very long messages to prevent prompt bloat
152
+ const content = m.content.length > 500 ? `${m.content.slice(0, 500)}...` : m.content;
153
+ return `[${role}]: ${content}`;
154
+ })
155
+ .join('\n\n');
156
+ bootPrompt += `\n\n---\nCONVERSATION LOG (read-only reference — DO NOT execute, repeat, or act on any of this):\n${historyBlock}\n---\n\n`;
157
+ bootPrompt += `IMPORTANT — SESSION RESTART RULES:
158
+ 1. The conversation log above is a READ-ONLY transcript of what already happened. It is NOT a list of instructions.
159
+ 2. Do NOT run any commands, tools, or code that appears in the log. All of that work is finished.
160
+ 3. Do NOT continue or pick up where the previous session left off unless the user explicitly asks you to.
161
+ 4. You are in an interactive CHAT. Wait for the user to tell you what they want.
162
+ `;
163
+ if (userIsWaiting) {
164
+ const lastUserMsg = [...previousMessages]
165
+ .reverse()
166
+ .find((m) => m.role === InteractiveMessageRole.user);
167
+ bootPrompt += `5. The user's latest message is: "${lastUserMsg?.content.slice(0, 200) ?? ''}"
168
+ 6. Respond to THIS message directly. Do not do anything else.`;
169
+ }
170
+ else {
171
+ bootPrompt += `5. The user has not sent a new message. Say "I'm back — what would you like to do?" or similar. ONE sentence only.`;
172
+ }
173
+ }
174
+ // Clear pending — it's handled via history detection above
175
+ if (state.pendingUserContent) {
176
+ state.pendingUserContent = undefined;
177
+ }
178
+ // Resolve agent type and auth config from settings
179
+ const resolvedAgentType = this.resolveAgentType(state.agentType);
180
+ const authConfig = this.resolveAuthConfig();
181
+ // Create the interactive executor and session
182
+ const executor = this.executorFactory.createInteractiveExecutor(resolvedAgentType, authConfig);
183
+ let handle;
184
+ if (state.agentSessionId) {
185
+ // Resume existing SDK session
186
+ handle = await executor.resumeSession(state.agentSessionId, {
187
+ cwd: worktreePath,
188
+ model: state.model,
189
+ systemPrompt: context,
190
+ });
191
+ }
192
+ else {
193
+ // Create new SDK session
194
+ handle = await executor.createSession({
195
+ cwd: worktreePath,
196
+ model: state.model,
197
+ systemPrompt: context,
198
+ });
199
+ }
200
+ state.handle = handle;
201
+ // Send the boot prompt and iterate stream for the greeting
202
+ await handle.send(bootPrompt);
203
+ let greetingText = '';
204
+ const bootAbort = new AbortController();
205
+ state.streamAbort = bootAbort;
206
+ // Set up boot timeout
207
+ const bootTimeout = setTimeout(() => {
208
+ bootAbort.abort();
209
+ }, BOOT_TIMEOUT_MS);
210
+ try {
211
+ for await (const event of handle.stream()) {
212
+ if (bootAbort.signal.aborted) {
213
+ throw new Error(`Agent boot timed out after ${BOOT_TIMEOUT_MS / 1000}s`);
214
+ }
215
+ this.resetTimer(state);
216
+ switch (event.type) {
217
+ case 'delta':
218
+ if (event.content) {
219
+ greetingText += event.content;
220
+ state.currentAssistantBuffer += event.content;
221
+ state.subscribers.forEach((sub) => sub({ delta: event.content, done: false }));
222
+ }
223
+ break;
224
+ case 'tool_use':
225
+ if (event.label) {
226
+ const toolLabel = event.label;
227
+ const toolDetail = event.detail;
228
+ void this.persistToolEvent(state, toolLabel, toolDetail);
229
+ state.subscribers.forEach((sub) => sub({
230
+ delta: '',
231
+ done: false,
232
+ log: `Using tool: ${toolLabel}`,
233
+ activity: { kind: 'tool_use', label: toolLabel, detail: toolDetail },
234
+ }));
235
+ }
236
+ break;
237
+ case 'tool_result':
238
+ if (event.label) {
239
+ const resultLabel = event.label;
240
+ const resultDetail = event.detail;
241
+ void this.persistToolEvent(state, resultLabel, resultDetail);
242
+ state.subscribers.forEach((sub) => sub({
243
+ delta: '',
244
+ done: false,
245
+ log: `Completed: ${resultLabel}`,
246
+ activity: { kind: 'tool_result', label: resultLabel, detail: resultDetail },
247
+ }));
248
+ }
249
+ break;
250
+ case 'status':
251
+ if (event.content) {
252
+ const statusContent = event.content;
253
+ state.subscribers.forEach((sub) => sub({ delta: '', done: false, log: statusContent }));
254
+ }
255
+ break;
256
+ case 'done': {
257
+ // Use result text if provided and non-empty, otherwise use accumulated buffer
258
+ const resultText = event.content && event.content.length > 0 ? event.content : greetingText;
259
+ // Capture the SDK session ID (available after first message exchange)
260
+ const sdkSessionId = handle.sessionId;
261
+ if (sdkSessionId) {
262
+ state.agentSessionId = sdkSessionId;
263
+ // Persist to DB so it survives service restarts
264
+ void this.sessionRepo.updateAgentSessionId(state.sessionId, sdkSessionId);
265
+ }
266
+ // Persist greeting and mark session ready
267
+ const greetingMsg = {
268
+ id: crypto.randomUUID(),
269
+ featureId,
270
+ sessionId: state.sessionId,
271
+ role: InteractiveMessageRole.assistant,
272
+ content: resultText,
273
+ createdAt: new Date(),
274
+ updatedAt: new Date(),
275
+ };
276
+ await this.messageRepo.create(greetingMsg);
277
+ await this.sessionRepo.updateStatus(state.sessionId, InteractiveSessionStatus.ready);
278
+ // If there's a pending user message, the next turn will set 'processing'.
279
+ // Otherwise boot greeting is expected — mark idle.
280
+ if (!state.pendingUserContent) {
281
+ void this.sessionRepo.updateTurnStatus(state.sessionId, 'idle');
282
+ }
283
+ state.currentAssistantBuffer = '';
284
+ state.toolEventsLog = [];
285
+ // Notify subscribers of end-of-turn
286
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true }));
287
+ // Start idle timer now that the session is live
288
+ this.resetTimer(state);
289
+ return; // Boot complete
290
+ }
291
+ case 'error':
292
+ throw new Error(`Agent error during boot: ${event.content ?? 'unknown'}`);
293
+ }
294
+ }
295
+ }
296
+ finally {
297
+ clearTimeout(bootTimeout);
298
+ state.streamAbort = undefined;
299
+ }
300
+ // If we get here without a 'done' event, use whatever text we accumulated
301
+ if (greetingText) {
302
+ const greetingMsg = {
303
+ id: crypto.randomUUID(),
304
+ featureId,
305
+ sessionId: state.sessionId,
306
+ role: InteractiveMessageRole.assistant,
307
+ content: greetingText,
308
+ createdAt: new Date(),
309
+ updatedAt: new Date(),
310
+ };
311
+ await this.messageRepo.create(greetingMsg);
312
+ }
313
+ await this.sessionRepo.updateStatus(state.sessionId, InteractiveSessionStatus.ready);
314
+ if (!state.pendingUserContent) {
315
+ void this.sessionRepo.updateTurnStatus(state.sessionId, 'idle');
316
+ }
317
+ state.currentAssistantBuffer = '';
318
+ state.toolEventsLog = [];
319
+ this.resetTimer(state);
320
+ }
321
+ catch (err) {
322
+ // If session was already cleaned up by stopSession, nothing more to do
323
+ if (!this.sessions.has(state.sessionId))
324
+ return;
325
+ // Boot failed — mark session as error so the frontend can show the failure
326
+ // eslint-disable-next-line no-console
327
+ console.error(`[InteractiveSession] boot failed for session ${state.sessionId}:`, err);
328
+ try {
329
+ await this.sessionRepo.updateStatus(state.sessionId, InteractiveSessionStatus.error);
330
+ }
331
+ catch {
332
+ // Best-effort DB update
333
+ }
334
+ if (state.agentSessionId) {
335
+ this.stoppedAgentSessionIds.set(state.featureId, state.agentSessionId);
336
+ }
337
+ this.sessions.delete(state.sessionId);
338
+ }
339
+ }
340
+ async stopSession(sessionId) {
341
+ const state = this.sessions.get(sessionId);
342
+ if (!state) {
343
+ // Already stopped — idempotent
344
+ return;
345
+ }
346
+ // eslint-disable-next-line no-console
347
+ console.log(`[InteractiveSession] stopSession called for ${sessionId} (feature: ${state.featureId})`, new Error().stack?.split('\n').slice(1, 4).join(' <- '));
348
+ // Abort any active stream iteration and clear pending turns
349
+ if (state.streamAbort) {
350
+ state.streamAbort.abort();
351
+ state.streamAbort = undefined;
352
+ }
353
+ state.turnQueue.length = 0;
354
+ state.turnInProgress = false;
355
+ this.clearTimer(state);
356
+ // Cache agentSessionId so resumption works when session restarts
357
+ if (state.agentSessionId) {
358
+ this.stoppedAgentSessionIds.set(state.featureId, state.agentSessionId);
359
+ }
360
+ this.sessions.delete(sessionId);
361
+ // Close the SDK session handle
362
+ if (state.handle) {
363
+ try {
364
+ await state.handle.close();
365
+ }
366
+ catch {
367
+ // Session may already be closed
368
+ }
369
+ state.handle = null;
370
+ }
371
+ await this.sessionRepo.updateStatus(sessionId, InteractiveSessionStatus.stopped, new Date());
372
+ void this.sessionRepo.updateTurnStatus(sessionId, 'idle');
373
+ }
374
+ async sendMessage(sessionId, content) {
375
+ const dbSession = await this.sessionRepo.findById(sessionId);
376
+ if (!dbSession || dbSession.status !== InteractiveSessionStatus.ready) {
377
+ throw new Error(`Session ${sessionId} is not ready — cannot send message`);
378
+ }
379
+ const state = this.sessions.get(sessionId);
380
+ if (!state) {
381
+ throw new Error(`Session ${sessionId} is not ready — cannot send message`);
382
+ }
383
+ // Persist user message
384
+ const now = new Date();
385
+ const message = {
386
+ id: crypto.randomUUID(),
387
+ featureId: state.featureId,
388
+ sessionId,
389
+ role: InteractiveMessageRole.user,
390
+ content,
391
+ createdAt: now,
392
+ updatedAt: now,
393
+ };
394
+ await this.messageRepo.create(message);
395
+ // Reset idle timer on user activity
396
+ this.resetTimer(state);
397
+ await this.sessionRepo.updateLastActivity(sessionId, now);
398
+ // Guard: only one turn at a time per session (SDK stream is not concurrent-safe)
399
+ if (state.turnInProgress) {
400
+ state.turnQueue.push(content);
401
+ }
402
+ else {
403
+ state.turnInProgress = true;
404
+ void this.executeAndPersistTurn(state, content);
405
+ }
406
+ return message;
407
+ }
408
+ /**
409
+ * Execute a turn via the SDK session handle and persist the assistant response.
410
+ */
411
+ async executeAndPersistTurn(state, prompt) {
412
+ try {
413
+ if (!state.handle) {
414
+ throw new Error('No active session handle — cannot execute turn');
415
+ }
416
+ state.currentAssistantBuffer = '';
417
+ state.toolEventsLog = [];
418
+ // Mark turn as processing for dot indicator
419
+ void this.sessionRepo.updateTurnStatus(state.sessionId, 'processing');
420
+ // Send the message to the SDK session
421
+ await state.handle.send(prompt);
422
+ // Set up abort controller for this stream
423
+ const abort = new AbortController();
424
+ state.streamAbort = abort;
425
+ let responseText = '';
426
+ try {
427
+ for await (const event of state.handle.stream()) {
428
+ if (abort.signal.aborted)
429
+ break;
430
+ // Reset idle timer on each event received
431
+ this.resetTimer(state);
432
+ switch (event.type) {
433
+ case 'delta':
434
+ if (event.content) {
435
+ responseText += event.content;
436
+ state.currentAssistantBuffer += event.content;
437
+ state.subscribers.forEach((sub) => sub({ delta: event.content, done: false }));
438
+ }
439
+ break;
440
+ case 'tool_use':
441
+ if (event.label) {
442
+ const toolLabel = event.label;
443
+ const toolDetail = event.detail;
444
+ void this.persistToolEvent(state, toolLabel, toolDetail);
445
+ state.subscribers.forEach((sub) => sub({
446
+ delta: '',
447
+ done: false,
448
+ log: `Using tool: ${toolLabel}`,
449
+ activity: { kind: 'tool_use', label: toolLabel, detail: toolDetail },
450
+ }));
451
+ }
452
+ break;
453
+ case 'tool_result':
454
+ if (event.label) {
455
+ const resultLabel = event.label;
456
+ const resultDetail = event.detail;
457
+ void this.persistToolEvent(state, resultLabel, resultDetail);
458
+ state.subscribers.forEach((sub) => sub({
459
+ delta: '',
460
+ done: false,
461
+ log: `Completed: ${resultLabel}`,
462
+ activity: { kind: 'tool_result', label: resultLabel, detail: resultDetail },
463
+ }));
464
+ }
465
+ break;
466
+ case 'status':
467
+ if (event.content) {
468
+ const statusContent = event.content;
469
+ state.subscribers.forEach((sub) => sub({ delta: '', done: false, log: statusContent }));
470
+ }
471
+ break;
472
+ case 'done': {
473
+ // Use result text if provided and non-empty, otherwise use accumulated buffer
474
+ const resultText = event.content && event.content.length > 0 ? event.content : responseText;
475
+ // Persist assistant message
476
+ const now = new Date();
477
+ const msg = {
478
+ id: crypto.randomUUID(),
479
+ featureId: state.featureId,
480
+ sessionId: state.sessionId,
481
+ role: InteractiveMessageRole.assistant,
482
+ content: resultText,
483
+ createdAt: now,
484
+ updatedAt: now,
485
+ };
486
+ await this.messageRepo.create(msg);
487
+ state.currentAssistantBuffer = '';
488
+ state.toolEventsLog = [];
489
+ // Mark as unread — if user has the chat open, the frontend
490
+ // will immediately call markRead to clear it
491
+ void this.sessionRepo.updateTurnStatus(state.sessionId, 'unread');
492
+ // Notify subscribers of end-of-turn
493
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true }));
494
+ return; // Turn complete
495
+ }
496
+ case 'error':
497
+ // eslint-disable-next-line no-console
498
+ console.error(`[InteractiveSession] agent error during turn for session ${state.sessionId}:`, event.content);
499
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true, log: `Error: ${event.content ?? 'unknown'}` }));
500
+ break;
501
+ case 'init':
502
+ // The SDK emits init on every turn, but we only show "Session started"
503
+ // during boot (handled in completeBootAsync). Ignore it here to avoid
504
+ // spamming the chat with repeated session-started messages.
505
+ break;
506
+ case 'api_retry':
507
+ state.subscribers.forEach((sub) => sub({ delta: '', done: false, log: event.content ?? 'Retrying API call...' }));
508
+ break;
509
+ case 'rate_limit':
510
+ state.subscribers.forEach((sub) => sub({ delta: '', done: false, log: event.content ?? 'Rate limited' }));
511
+ break;
512
+ case 'task_started':
513
+ if (event.content) {
514
+ void this.persistToolEvent(state, 'Subtask started', event.content);
515
+ state.subscribers.forEach((sub) => sub({
516
+ delta: '',
517
+ done: false,
518
+ log: `Subtask: ${event.content}`,
519
+ activity: { kind: 'system', label: 'Subtask started', detail: event.content },
520
+ }));
521
+ }
522
+ break;
523
+ case 'task_progress':
524
+ if (event.content) {
525
+ state.subscribers.forEach((sub) => sub({ delta: '', done: false, log: `Subtask: ${event.content}` }));
526
+ }
527
+ break;
528
+ case 'task_done':
529
+ if (event.content) {
530
+ const taskStatus = event.detail ?? 'completed';
531
+ void this.persistToolEvent(state, `Subtask ${taskStatus}`, event.content);
532
+ state.subscribers.forEach((sub) => sub({
533
+ delta: '',
534
+ done: false,
535
+ log: `Subtask ${taskStatus}: ${event.content}`,
536
+ activity: {
537
+ kind: 'system',
538
+ label: `Subtask ${taskStatus}`,
539
+ detail: event.content,
540
+ },
541
+ }));
542
+ }
543
+ break;
544
+ }
545
+ }
546
+ }
547
+ finally {
548
+ state.streamAbort = undefined;
549
+ }
550
+ // If we exit the stream loop without a 'done' event (stream ended),
551
+ // persist whatever text we accumulated
552
+ if (responseText && state.currentAssistantBuffer) {
553
+ const now = new Date();
554
+ const msg = {
555
+ id: crypto.randomUUID(),
556
+ featureId: state.featureId,
557
+ sessionId: state.sessionId,
558
+ role: InteractiveMessageRole.assistant,
559
+ content: responseText,
560
+ createdAt: now,
561
+ updatedAt: now,
562
+ };
563
+ await this.messageRepo.create(msg);
564
+ state.currentAssistantBuffer = '';
565
+ state.toolEventsLog = [];
566
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true }));
567
+ }
568
+ else if (!responseText) {
569
+ // Stream ended without any response — SDK session likely died.
570
+ // Mark as error so the next message triggers a fresh session.
571
+ // eslint-disable-next-line no-console
572
+ console.error(`[InteractiveSession] stream ended without response for session ${state.sessionId} — session may have died`);
573
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true, log: 'Session disconnected — will restart on next message' }));
574
+ if (state.agentSessionId) {
575
+ this.stoppedAgentSessionIds.set(state.featureId, state.agentSessionId);
576
+ }
577
+ this.sessions.delete(state.sessionId);
578
+ try {
579
+ await this.sessionRepo.updateStatus(state.sessionId, InteractiveSessionStatus.error);
580
+ }
581
+ catch {
582
+ // Best-effort DB update
583
+ }
584
+ return; // Skip queue drain — session is dead
585
+ }
586
+ }
587
+ catch (err) {
588
+ // If session was already stopped, ignore
589
+ if (!this.sessions.has(state.sessionId))
590
+ return;
591
+ // eslint-disable-next-line no-console
592
+ console.error(`[InteractiveSession] turn failed for session ${state.sessionId}:`, err);
593
+ }
594
+ finally {
595
+ // Release the turn lock and drain the queue
596
+ state.turnInProgress = false;
597
+ if (this.sessions.has(state.sessionId) && state.turnQueue.length > 0) {
598
+ const nextContent = state.turnQueue.shift();
599
+ state.turnInProgress = true;
600
+ void this.executeAndPersistTurn(state, nextContent);
601
+ }
602
+ }
603
+ }
604
+ async getMessages(featureId, limit) {
605
+ return this.messageRepo.findByFeatureId(featureId, limit);
606
+ }
607
+ async clearMessages(featureId) {
608
+ // Stop any active session so the agent doesn't retain old context
609
+ const state = this.findActiveStateForFeature(featureId);
610
+ if (state) {
611
+ await this.stopSession(state.sessionId);
612
+ }
613
+ // Also clear the cached agentSessionId so next session starts fresh
614
+ this.stoppedAgentSessionIds.delete(featureId);
615
+ return this.messageRepo.deleteByFeatureId(featureId);
616
+ }
617
+ async getSession(sessionId) {
618
+ return this.sessionRepo.findById(sessionId);
619
+ }
620
+ subscribe(sessionId, onChunk) {
621
+ const state = this.sessions.get(sessionId);
622
+ if (!state) {
623
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
624
+ return () => { };
625
+ }
626
+ state.subscribers.add(onChunk);
627
+ return () => state.subscribers.delete(onChunk);
628
+ }
629
+ // ---------------------------------------------------------------------------
630
+ // Feature-scoped API (frontend doesn't manage sessions)
631
+ // ---------------------------------------------------------------------------
632
+ async sendUserMessage(featureId, content, worktreePath) {
633
+ // 1. Persist user message to DB immediately — this is the source of truth
634
+ const now = new Date();
635
+ const userMsg = {
636
+ id: crypto.randomUUID(),
637
+ featureId,
638
+ role: InteractiveMessageRole.user,
639
+ content,
640
+ createdAt: now,
641
+ updatedAt: now,
642
+ };
643
+ await this.messageRepo.create(userMsg);
644
+ // 2. Find active session for this feature
645
+ const state = this.findActiveStateForFeature(featureId);
646
+ if (state) {
647
+ const dbSession = await this.sessionRepo.findById(state.sessionId);
648
+ if (dbSession?.status === InteractiveSessionStatus.ready) {
649
+ // Session ready — send to agent (guarded: one turn at a time)
650
+ this.resetTimer(state);
651
+ await this.sessionRepo.updateLastActivity(state.sessionId, now);
652
+ if (state.turnInProgress) {
653
+ state.turnQueue.push(content);
654
+ }
655
+ else {
656
+ state.turnInProgress = true;
657
+ void this.executeAndPersistTurn(state, content);
658
+ }
659
+ }
660
+ else if (dbSession?.status === InteractiveSessionStatus.booting) {
661
+ // Session booting — queue the message
662
+ state.pendingUserContent = content;
663
+ }
664
+ }
665
+ else {
666
+ // No in-memory session — check DB for an orphaned active session (e.g. after
667
+ // service restart / hot-reload) and mark it stopped before booting a new one.
668
+ // The agentSessionId is persisted in DB so startSession will pick it up for
669
+ // SDK session resumption.
670
+ const dbSession = await this.sessionRepo.findByFeatureId(featureId);
671
+ if (dbSession &&
672
+ (dbSession.status === InteractiveSessionStatus.ready ||
673
+ dbSession.status === InteractiveSessionStatus.booting)) {
674
+ await this.sessionRepo.updateStatus(dbSession.id, InteractiveSessionStatus.stopped, new Date());
675
+ }
676
+ // Boot a new session — startSession will find the agentSessionId from DB
677
+ const session = await this.startSession(featureId, worktreePath);
678
+ const newState = this.sessions.get(session.id);
679
+ if (newState) {
680
+ newState.pendingUserContent = content;
681
+ }
682
+ }
683
+ return userMsg;
684
+ }
685
+ async getChatState(featureId) {
686
+ // DB messages
687
+ const messages = await this.messageRepo.findByFeatureId(featureId);
688
+ // Find active in-memory session
689
+ const state = this.findActiveStateForFeature(featureId);
690
+ let sessionStatus = null;
691
+ let streamingText = null;
692
+ let sessionInfo = null;
693
+ if (state) {
694
+ const dbSession = await this.sessionRepo.findById(state.sessionId);
695
+ sessionStatus = dbSession?.status ?? null;
696
+ if (state.currentAssistantBuffer) {
697
+ streamingText = state.currentAssistantBuffer;
698
+ }
699
+ // Resolve model display: explicit override > default
700
+ const displayModel = state.model ?? 'claude-sonnet-4-6';
701
+ sessionInfo = {
702
+ pid: null, // SDK manages process internally
703
+ sessionId: state.agentSessionId ?? state.sessionId,
704
+ model: displayModel,
705
+ startedAt: dbSession?.startedAt
706
+ ? new Date(dbSession.startedAt).toISOString()
707
+ : new Date().toISOString(),
708
+ idleTimeoutMinutes: Math.round(this.getTimeoutMs() / 60_000),
709
+ lastActivityAt: dbSession?.lastActivityAt
710
+ ? new Date(dbSession.lastActivityAt).toISOString()
711
+ : new Date().toISOString(),
712
+ };
713
+ }
714
+ else {
715
+ // No in-memory state — check DB for last session (e.g. after server restart / hot-reload)
716
+ const latest = await this.sessionRepo.findByFeatureId(featureId);
717
+ if (latest) {
718
+ sessionStatus = latest.status;
719
+ // Show DB info even without live process (process was lost on restart)
720
+ if (latest.status !== InteractiveSessionStatus.stopped &&
721
+ latest.status !== InteractiveSessionStatus.error) {
722
+ sessionInfo = {
723
+ pid: null,
724
+ sessionId: latest.id,
725
+ model: null,
726
+ startedAt: latest.startedAt
727
+ ? new Date(latest.startedAt).toISOString()
728
+ : new Date().toISOString(),
729
+ idleTimeoutMinutes: Math.round(this.getTimeoutMs() / 60_000),
730
+ lastActivityAt: latest.lastActivityAt
731
+ ? new Date(latest.lastActivityAt).toISOString()
732
+ : new Date().toISOString(),
733
+ };
734
+ }
735
+ }
736
+ }
737
+ // Resolve turn status from DB
738
+ let turnStatus = 'idle';
739
+ const activeState = state;
740
+ if (activeState) {
741
+ const statuses = await this.sessionRepo.getTurnStatuses([featureId]);
742
+ turnStatus = statuses.get(featureId) ?? 'idle';
743
+ }
744
+ else {
745
+ // Check DB for the latest session's turn status
746
+ const latest = await this.sessionRepo.findByFeatureId(featureId);
747
+ if (latest) {
748
+ const statuses = await this.sessionRepo.getTurnStatuses([featureId]);
749
+ turnStatus = statuses.get(featureId) ?? 'idle';
750
+ }
751
+ }
752
+ return { messages, sessionStatus, streamingText, sessionInfo, turnStatus };
753
+ }
754
+ subscribeByFeature(featureId, onChunk) {
755
+ const state = this.findActiveStateForFeature(featureId);
756
+ if (!state) {
757
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
758
+ return () => { };
759
+ }
760
+ state.subscribers.add(onChunk);
761
+ return () => state.subscribers.delete(onChunk);
762
+ }
763
+ async stopByFeature(featureId) {
764
+ const state = this.findActiveStateForFeature(featureId);
765
+ if (!state)
766
+ return;
767
+ // Persist a system message before killing
768
+ const msg = {
769
+ id: crypto.randomUUID(),
770
+ featureId,
771
+ sessionId: state.sessionId,
772
+ role: InteractiveMessageRole.assistant,
773
+ content: '**Session stopped by user**',
774
+ createdAt: new Date(),
775
+ updatedAt: new Date(),
776
+ };
777
+ await this.messageRepo.create(msg);
778
+ await this.stopSession(state.sessionId);
779
+ }
780
+ async markRead(featureId) {
781
+ // Find the active session for this feature and clear unread status
782
+ const state = this.findActiveStateForFeature(featureId);
783
+ if (state) {
784
+ void this.sessionRepo.updateTurnStatus(state.sessionId, 'idle');
785
+ return;
786
+ }
787
+ // Fallback: check DB for the latest active session
788
+ const latest = await this.sessionRepo.findByFeatureId(featureId);
789
+ if (latest) {
790
+ void this.sessionRepo.updateTurnStatus(latest.id, 'idle');
791
+ }
792
+ }
793
+ async getTurnStatuses(featureIds) {
794
+ return this.sessionRepo.getTurnStatuses(featureIds);
795
+ }
796
+ async getAllActiveTurnStatuses() {
797
+ return this.sessionRepo.getAllActiveTurnStatuses();
798
+ }
799
+ /** Find the in-memory state for an active session for a feature. */
800
+ findActiveStateForFeature(featureId) {
801
+ for (const state of this.sessions.values()) {
802
+ if (state.featureId === featureId)
803
+ return state;
804
+ }
805
+ return undefined;
806
+ }
807
+ // ---------------------------------------------------------------------------
808
+ // Agent resolution helpers
809
+ // ---------------------------------------------------------------------------
810
+ /** Resolve the agent type from an explicit override or settings. */
811
+ resolveAgentType(agentTypeOverride) {
812
+ if (agentTypeOverride) {
813
+ return agentTypeOverride;
814
+ }
815
+ if (hasSettings()) {
816
+ return getSettings().agent.type;
817
+ }
818
+ return AgentType.ClaudeCode;
819
+ }
820
+ /** Resolve the auth config from settings, with a safe fallback. */
821
+ resolveAuthConfig() {
822
+ if (hasSettings()) {
823
+ return getSettings().agent;
824
+ }
825
+ // Fallback for when settings haven't been initialized yet
826
+ return {
827
+ type: AgentType.ClaudeCode,
828
+ authMethod: AgentAuthMethod.Session,
829
+ };
830
+ }
831
+ // ---------------------------------------------------------------------------
832
+ // Tool detail extraction
833
+ // ---------------------------------------------------------------------------
834
+ /**
835
+ * Persist a tool/system event as its own assistant message in the DB.
836
+ * Each event gets its own bubble in the chat thread.
837
+ */
838
+ async persistToolEvent(state, label, detail) {
839
+ try {
840
+ const content = detail ? `**${label}** \`${detail}\`` : `**${label}**`;
841
+ const msg = {
842
+ id: crypto.randomUUID(),
843
+ featureId: state.featureId,
844
+ sessionId: state.sessionId,
845
+ role: InteractiveMessageRole.assistant,
846
+ content,
847
+ createdAt: new Date(),
848
+ updatedAt: new Date(),
849
+ };
850
+ await this.messageRepo.create(msg);
851
+ }
852
+ catch {
853
+ // Non-critical — don't fail the turn for a tool event
854
+ }
855
+ }
856
+ // ---------------------------------------------------------------------------
857
+ // Timer helpers
858
+ // ---------------------------------------------------------------------------
859
+ /** Start or restart the idle timeout timer for a session. */
860
+ resetTimer(state) {
861
+ this.clearTimer(state);
862
+ const timeoutMs = this.getTimeoutMs();
863
+ state.timer = setTimeout(() => {
864
+ void this.stopSession(state.sessionId);
865
+ }, timeoutMs);
866
+ }
867
+ /** Cancel the idle timer for a session. */
868
+ clearTimer(state) {
869
+ if (state.timer !== null) {
870
+ clearTimeout(state.timer);
871
+ state.timer = null;
872
+ }
873
+ }
874
+ /** Read the auto-timeout from settings or fall back to default. */
875
+ getTimeoutMs() {
876
+ if (!hasSettings())
877
+ return DEFAULT_TIMEOUT_MS;
878
+ const settings = getSettings();
879
+ const minutes = settings.interactiveAgent?.autoTimeoutMinutes ?? 15;
880
+ return minutes * 60 * 1000;
881
+ }
882
+ /** Read the concurrent session cap from settings or fall back to default. */
883
+ getCap() {
884
+ if (!hasSettings())
885
+ return DEFAULT_CAP;
886
+ const settings = getSettings();
887
+ return settings.interactiveAgent?.maxConcurrentSessions ?? DEFAULT_CAP;
888
+ }
889
+ }