@shepai/cli 1.151.2-pr438.6135e39 → 1.151.2-pr460.095bbae

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