@ottocode/web-sdk 0.1.173

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 (574) hide show
  1. package/README.md +187 -0
  2. package/dist/assets/fonts/JetBrainsMonoNerdFontMono-Bold.woff2 +0 -0
  3. package/dist/assets/fonts/JetBrainsMonoNerdFontMono-BoldItalic.woff2 +0 -0
  4. package/dist/assets/fonts/JetBrainsMonoNerdFontMono-Italic.woff2 +0 -0
  5. package/dist/assets/fonts/JetBrainsMonoNerdFontMono-Regular.woff2 +0 -0
  6. package/dist/assets/provider-logos.d.ts +12 -0
  7. package/dist/assets/provider-logos.d.ts.map +1 -0
  8. package/dist/assets/provider-logos.js +40 -0
  9. package/dist/assets/provider-logos.js.map +1 -0
  10. package/dist/components/branch/BranchModal.d.ts +11 -0
  11. package/dist/components/branch/BranchModal.d.ts.map +1 -0
  12. package/dist/components/branch/BranchModal.js +45 -0
  13. package/dist/components/branch/BranchModal.js.map +1 -0
  14. package/dist/components/chat/ChatInput.d.ts +35 -0
  15. package/dist/components/chat/ChatInput.d.ts.map +1 -0
  16. package/dist/components/chat/ChatInput.js +210 -0
  17. package/dist/components/chat/ChatInput.js.map +1 -0
  18. package/dist/components/chat/ChatInputContainer.d.ts +12 -0
  19. package/dist/components/chat/ChatInputContainer.d.ts.map +1 -0
  20. package/dist/components/chat/ChatInputContainer.js +295 -0
  21. package/dist/components/chat/ChatInputContainer.js.map +1 -0
  22. package/dist/components/chat/ChatInputKeyHandler.d.ts +27 -0
  23. package/dist/components/chat/ChatInputKeyHandler.d.ts.map +1 -0
  24. package/dist/components/chat/ChatInputKeyHandler.js +75 -0
  25. package/dist/components/chat/ChatInputKeyHandler.js.map +1 -0
  26. package/dist/components/chat/CommandSuggestionsPopup.d.ts +11 -0
  27. package/dist/components/chat/CommandSuggestionsPopup.d.ts.map +1 -0
  28. package/dist/components/chat/CommandSuggestionsPopup.js +43 -0
  29. package/dist/components/chat/CommandSuggestionsPopup.js.map +1 -0
  30. package/dist/components/chat/ConfigModal.d.ts +19 -0
  31. package/dist/components/chat/ConfigModal.d.ts.map +1 -0
  32. package/dist/components/chat/ConfigModal.js +47 -0
  33. package/dist/components/chat/ConfigModal.js.map +1 -0
  34. package/dist/components/chat/ConfigSelector.d.ts +11 -0
  35. package/dist/components/chat/ConfigSelector.d.ts.map +1 -0
  36. package/dist/components/chat/ConfigSelector.js +47 -0
  37. package/dist/components/chat/ConfigSelector.js.map +1 -0
  38. package/dist/components/chat/FileMentionPopup.d.ts +15 -0
  39. package/dist/components/chat/FileMentionPopup.d.ts.map +1 -0
  40. package/dist/components/chat/FileMentionPopup.js +123 -0
  41. package/dist/components/chat/FileMentionPopup.js.map +1 -0
  42. package/dist/components/chat/ShortcutsModal.d.ts +7 -0
  43. package/dist/components/chat/ShortcutsModal.d.ts.map +1 -0
  44. package/dist/components/chat/ShortcutsModal.js +275 -0
  45. package/dist/components/chat/ShortcutsModal.js.map +1 -0
  46. package/dist/components/chat/StopButton.d.ts +8 -0
  47. package/dist/components/chat/StopButton.d.ts.map +1 -0
  48. package/dist/components/chat/StopButton.js +25 -0
  49. package/dist/components/chat/StopButton.js.map +1 -0
  50. package/dist/components/chat/UnifiedAgentSelector.d.ts +12 -0
  51. package/dist/components/chat/UnifiedAgentSelector.d.ts.map +1 -0
  52. package/dist/components/chat/UnifiedAgentSelector.js +107 -0
  53. package/dist/components/chat/UnifiedAgentSelector.js.map +1 -0
  54. package/dist/components/chat/UnifiedModelSelector.d.ts +12 -0
  55. package/dist/components/chat/UnifiedModelSelector.d.ts.map +1 -0
  56. package/dist/components/chat/UnifiedModelSelector.js +198 -0
  57. package/dist/components/chat/UnifiedModelSelector.js.map +1 -0
  58. package/dist/components/common/ProviderLogo.d.ts +8 -0
  59. package/dist/components/common/ProviderLogo.d.ts.map +1 -0
  60. package/dist/components/common/ProviderLogo.js +29 -0
  61. package/dist/components/common/ProviderLogo.js.map +1 -0
  62. package/dist/components/common/StatusIndicator.d.ts +10 -0
  63. package/dist/components/common/StatusIndicator.d.ts.map +1 -0
  64. package/dist/components/common/StatusIndicator.js +57 -0
  65. package/dist/components/common/StatusIndicator.js.map +1 -0
  66. package/dist/components/git/GitCommitModal.d.ts +2 -0
  67. package/dist/components/git/GitCommitModal.d.ts.map +1 -0
  68. package/dist/components/git/GitCommitModal.js +70 -0
  69. package/dist/components/git/GitCommitModal.js.map +1 -0
  70. package/dist/components/git/GitDiffPanel.d.ts +2 -0
  71. package/dist/components/git/GitDiffPanel.d.ts.map +1 -0
  72. package/dist/components/git/GitDiffPanel.js +54 -0
  73. package/dist/components/git/GitDiffPanel.js.map +1 -0
  74. package/dist/components/git/GitDiffViewer.d.ts +7 -0
  75. package/dist/components/git/GitDiffViewer.d.ts.map +1 -0
  76. package/dist/components/git/GitDiffViewer.js +203 -0
  77. package/dist/components/git/GitDiffViewer.js.map +1 -0
  78. package/dist/components/git/GitFileItem.d.ts +9 -0
  79. package/dist/components/git/GitFileItem.d.ts.map +1 -0
  80. package/dist/components/git/GitFileItem.js +145 -0
  81. package/dist/components/git/GitFileItem.js.map +1 -0
  82. package/dist/components/git/GitFileList.d.ts +7 -0
  83. package/dist/components/git/GitFileList.d.ts.map +1 -0
  84. package/dist/components/git/GitFileList.js +108 -0
  85. package/dist/components/git/GitFileList.js.map +1 -0
  86. package/dist/components/git/GitSidebar.d.ts +2 -0
  87. package/dist/components/git/GitSidebar.d.ts.map +1 -0
  88. package/dist/components/git/GitSidebar.js +52 -0
  89. package/dist/components/git/GitSidebar.js.map +1 -0
  90. package/dist/components/git/GitSidebarToggle.d.ts +2 -0
  91. package/dist/components/git/GitSidebarToggle.d.ts.map +1 -0
  92. package/dist/components/git/GitSidebarToggle.js +16 -0
  93. package/dist/components/git/GitSidebarToggle.js.map +1 -0
  94. package/dist/components/index.d.ts +47 -0
  95. package/dist/components/index.d.ts.map +1 -0
  96. package/dist/components/index.js +60 -0
  97. package/dist/components/index.js.map +1 -0
  98. package/dist/components/messages/AssistantMessageGroup.d.ts +17 -0
  99. package/dist/components/messages/AssistantMessageGroup.d.ts.map +1 -0
  100. package/dist/components/messages/AssistantMessageGroup.js +176 -0
  101. package/dist/components/messages/AssistantMessageGroup.js.map +1 -0
  102. package/dist/components/messages/MessagePartItem.d.ts +20 -0
  103. package/dist/components/messages/MessagePartItem.d.ts.map +1 -0
  104. package/dist/components/messages/MessagePartItem.js +353 -0
  105. package/dist/components/messages/MessagePartItem.js.map +1 -0
  106. package/dist/components/messages/MessageThread.d.ts +12 -0
  107. package/dist/components/messages/MessageThread.d.ts.map +1 -0
  108. package/dist/components/messages/MessageThread.js +239 -0
  109. package/dist/components/messages/MessageThread.js.map +1 -0
  110. package/dist/components/messages/MessageThreadContainer.d.ts +7 -0
  111. package/dist/components/messages/MessageThreadContainer.d.ts.map +1 -0
  112. package/dist/components/messages/MessageThreadContainer.js +22 -0
  113. package/dist/components/messages/MessageThreadContainer.js.map +1 -0
  114. package/dist/components/messages/ToolApprovalCard.d.ts +11 -0
  115. package/dist/components/messages/ToolApprovalCard.d.ts.map +1 -0
  116. package/dist/components/messages/ToolApprovalCard.js +139 -0
  117. package/dist/components/messages/ToolApprovalCard.js.map +1 -0
  118. package/dist/components/messages/TopupApprovalCard.d.ts +9 -0
  119. package/dist/components/messages/TopupApprovalCard.d.ts.map +1 -0
  120. package/dist/components/messages/TopupApprovalCard.js +51 -0
  121. package/dist/components/messages/TopupApprovalCard.js.map +1 -0
  122. package/dist/components/messages/UserMessageGroup.d.ts +10 -0
  123. package/dist/components/messages/UserMessageGroup.d.ts.map +1 -0
  124. package/dist/components/messages/UserMessageGroup.js +132 -0
  125. package/dist/components/messages/UserMessageGroup.js.map +1 -0
  126. package/dist/components/messages/renderers/ApplyPatchRenderer.d.ts +3 -0
  127. package/dist/components/messages/renderers/ApplyPatchRenderer.d.ts.map +1 -0
  128. package/dist/components/messages/renderers/ApplyPatchRenderer.js +55 -0
  129. package/dist/components/messages/renderers/ApplyPatchRenderer.js.map +1 -0
  130. package/dist/components/messages/renderers/BashRenderer.d.ts +3 -0
  131. package/dist/components/messages/renderers/BashRenderer.d.ts.map +1 -0
  132. package/dist/components/messages/renderers/BashRenderer.js +55 -0
  133. package/dist/components/messages/renderers/BashRenderer.js.map +1 -0
  134. package/dist/components/messages/renderers/DatabaseToolRenderer.d.ts +8 -0
  135. package/dist/components/messages/renderers/DatabaseToolRenderer.d.ts.map +1 -0
  136. package/dist/components/messages/renderers/DatabaseToolRenderer.js +151 -0
  137. package/dist/components/messages/renderers/DatabaseToolRenderer.js.map +1 -0
  138. package/dist/components/messages/renderers/DebugRenderer.d.ts +5 -0
  139. package/dist/components/messages/renderers/DebugRenderer.d.ts.map +1 -0
  140. package/dist/components/messages/renderers/DebugRenderer.js +5 -0
  141. package/dist/components/messages/renderers/DebugRenderer.js.map +1 -0
  142. package/dist/components/messages/renderers/DiffView.d.ts +6 -0
  143. package/dist/components/messages/renderers/DiffView.d.ts.map +1 -0
  144. package/dist/components/messages/renderers/DiffView.js +206 -0
  145. package/dist/components/messages/renderers/DiffView.js.map +1 -0
  146. package/dist/components/messages/renderers/EditRenderer.d.ts +3 -0
  147. package/dist/components/messages/renderers/EditRenderer.d.ts.map +1 -0
  148. package/dist/components/messages/renderers/EditRenderer.js +25 -0
  149. package/dist/components/messages/renderers/EditRenderer.js.map +1 -0
  150. package/dist/components/messages/renderers/ErrorRenderer.d.ts +11 -0
  151. package/dist/components/messages/renderers/ErrorRenderer.d.ts.map +1 -0
  152. package/dist/components/messages/renderers/ErrorRenderer.js +157 -0
  153. package/dist/components/messages/renderers/ErrorRenderer.js.map +1 -0
  154. package/dist/components/messages/renderers/FinishRenderer.d.ts +3 -0
  155. package/dist/components/messages/renderers/FinishRenderer.d.ts.map +1 -0
  156. package/dist/components/messages/renderers/FinishRenderer.js +7 -0
  157. package/dist/components/messages/renderers/FinishRenderer.js.map +1 -0
  158. package/dist/components/messages/renderers/GenericRenderer.d.ts +3 -0
  159. package/dist/components/messages/renderers/GenericRenderer.d.ts.map +1 -0
  160. package/dist/components/messages/renderers/GenericRenderer.js +45 -0
  161. package/dist/components/messages/renderers/GenericRenderer.js.map +1 -0
  162. package/dist/components/messages/renderers/GitCommitRenderer.d.ts +3 -0
  163. package/dist/components/messages/renderers/GitCommitRenderer.d.ts.map +1 -0
  164. package/dist/components/messages/renderers/GitCommitRenderer.js +21 -0
  165. package/dist/components/messages/renderers/GitCommitRenderer.js.map +1 -0
  166. package/dist/components/messages/renderers/GitDiffRenderer.d.ts +3 -0
  167. package/dist/components/messages/renderers/GitDiffRenderer.d.ts.map +1 -0
  168. package/dist/components/messages/renderers/GitDiffRenderer.js +34 -0
  169. package/dist/components/messages/renderers/GitDiffRenderer.js.map +1 -0
  170. package/dist/components/messages/renderers/GitStatusRenderer.d.ts +3 -0
  171. package/dist/components/messages/renderers/GitStatusRenderer.d.ts.map +1 -0
  172. package/dist/components/messages/renderers/GitStatusRenderer.js +60 -0
  173. package/dist/components/messages/renderers/GitStatusRenderer.js.map +1 -0
  174. package/dist/components/messages/renderers/ListRenderer.d.ts +3 -0
  175. package/dist/components/messages/renderers/ListRenderer.d.ts.map +1 -0
  176. package/dist/components/messages/renderers/ListRenderer.js +28 -0
  177. package/dist/components/messages/renderers/ListRenderer.js.map +1 -0
  178. package/dist/components/messages/renderers/ProgressUpdateRenderer.d.ts +3 -0
  179. package/dist/components/messages/renderers/ProgressUpdateRenderer.d.ts.map +1 -0
  180. package/dist/components/messages/renderers/ProgressUpdateRenderer.js +9 -0
  181. package/dist/components/messages/renderers/ProgressUpdateRenderer.js.map +1 -0
  182. package/dist/components/messages/renderers/ReadRenderer.d.ts +3 -0
  183. package/dist/components/messages/renderers/ReadRenderer.d.ts.map +1 -0
  184. package/dist/components/messages/renderers/ReadRenderer.js +87 -0
  185. package/dist/components/messages/renderers/ReadRenderer.js.map +1 -0
  186. package/dist/components/messages/renderers/ReasoningRenderer.d.ts +7 -0
  187. package/dist/components/messages/renderers/ReasoningRenderer.d.ts.map +1 -0
  188. package/dist/components/messages/renderers/ReasoningRenderer.js +34 -0
  189. package/dist/components/messages/renderers/ReasoningRenderer.js.map +1 -0
  190. package/dist/components/messages/renderers/SearchRenderer.d.ts +3 -0
  191. package/dist/components/messages/renderers/SearchRenderer.d.ts.map +1 -0
  192. package/dist/components/messages/renderers/SearchRenderer.js +52 -0
  193. package/dist/components/messages/renderers/SearchRenderer.js.map +1 -0
  194. package/dist/components/messages/renderers/TodosRenderer.d.ts +3 -0
  195. package/dist/components/messages/renderers/TodosRenderer.d.ts.map +1 -0
  196. package/dist/components/messages/renderers/TodosRenderer.js +15 -0
  197. package/dist/components/messages/renderers/TodosRenderer.js.map +1 -0
  198. package/dist/components/messages/renderers/ToolErrorDisplay.d.ts +12 -0
  199. package/dist/components/messages/renderers/ToolErrorDisplay.d.ts.map +1 -0
  200. package/dist/components/messages/renderers/ToolErrorDisplay.js +10 -0
  201. package/dist/components/messages/renderers/ToolErrorDisplay.js.map +1 -0
  202. package/dist/components/messages/renderers/TreeRenderer.d.ts +3 -0
  203. package/dist/components/messages/renderers/TreeRenderer.d.ts.map +1 -0
  204. package/dist/components/messages/renderers/TreeRenderer.js +33 -0
  205. package/dist/components/messages/renderers/TreeRenderer.js.map +1 -0
  206. package/dist/components/messages/renderers/WebSearchRenderer.d.ts +3 -0
  207. package/dist/components/messages/renderers/WebSearchRenderer.d.ts.map +1 -0
  208. package/dist/components/messages/renderers/WebSearchRenderer.js +29 -0
  209. package/dist/components/messages/renderers/WebSearchRenderer.js.map +1 -0
  210. package/dist/components/messages/renderers/WriteRenderer.d.ts +3 -0
  211. package/dist/components/messages/renderers/WriteRenderer.d.ts.map +1 -0
  212. package/dist/components/messages/renderers/WriteRenderer.js +28 -0
  213. package/dist/components/messages/renderers/WriteRenderer.js.map +1 -0
  214. package/dist/components/messages/renderers/index.d.ts +16 -0
  215. package/dist/components/messages/renderers/index.d.ts.map +1 -0
  216. package/dist/components/messages/renderers/index.js +114 -0
  217. package/dist/components/messages/renderers/index.js.map +1 -0
  218. package/dist/components/messages/renderers/shared/CopyButton.d.ts +8 -0
  219. package/dist/components/messages/renderers/shared/CopyButton.d.ts.map +1 -0
  220. package/dist/components/messages/renderers/shared/CopyButton.js +27 -0
  221. package/dist/components/messages/renderers/shared/CopyButton.js.map +1 -0
  222. package/dist/components/messages/renderers/shared/ToolContentBox.d.ts +13 -0
  223. package/dist/components/messages/renderers/shared/ToolContentBox.d.ts.map +1 -0
  224. package/dist/components/messages/renderers/shared/ToolContentBox.js +9 -0
  225. package/dist/components/messages/renderers/shared/ToolContentBox.js.map +1 -0
  226. package/dist/components/messages/renderers/shared/ToolHeader.d.ts +29 -0
  227. package/dist/components/messages/renderers/shared/ToolHeader.d.ts.map +1 -0
  228. package/dist/components/messages/renderers/shared/ToolHeader.js +69 -0
  229. package/dist/components/messages/renderers/shared/ToolHeader.js.map +1 -0
  230. package/dist/components/messages/renderers/shared/index.d.ts +4 -0
  231. package/dist/components/messages/renderers/shared/index.d.ts.map +1 -0
  232. package/dist/components/messages/renderers/shared/index.js +4 -0
  233. package/dist/components/messages/renderers/shared/index.js.map +1 -0
  234. package/dist/components/messages/renderers/types.d.ts +118 -0
  235. package/dist/components/messages/renderers/types.d.ts.map +1 -0
  236. package/dist/components/messages/renderers/types.js +2 -0
  237. package/dist/components/messages/renderers/types.js.map +1 -0
  238. package/dist/components/messages/renderers/utils.d.ts +26 -0
  239. package/dist/components/messages/renderers/utils.d.ts.map +1 -0
  240. package/dist/components/messages/renderers/utils.js +60 -0
  241. package/dist/components/messages/renderers/utils.js.map +1 -0
  242. package/dist/components/onboarding/OnboardingModal.d.ts +6 -0
  243. package/dist/components/onboarding/OnboardingModal.d.ts.map +1 -0
  244. package/dist/components/onboarding/OnboardingModal.js +22 -0
  245. package/dist/components/onboarding/OnboardingModal.js.map +1 -0
  246. package/dist/components/onboarding/index.d.ts +4 -0
  247. package/dist/components/onboarding/index.d.ts.map +1 -0
  248. package/dist/components/onboarding/index.js +4 -0
  249. package/dist/components/onboarding/index.js.map +1 -0
  250. package/dist/components/onboarding/steps/DefaultsStep.d.ts +10 -0
  251. package/dist/components/onboarding/steps/DefaultsStep.d.ts.map +1 -0
  252. package/dist/components/onboarding/steps/DefaultsStep.js +99 -0
  253. package/dist/components/onboarding/steps/DefaultsStep.js.map +1 -0
  254. package/dist/components/onboarding/steps/ProviderSetupStep.d.ts +31 -0
  255. package/dist/components/onboarding/steps/ProviderSetupStep.d.ts.map +1 -0
  256. package/dist/components/onboarding/steps/ProviderSetupStep.js +253 -0
  257. package/dist/components/onboarding/steps/ProviderSetupStep.js.map +1 -0
  258. package/dist/components/research/ResearchSidebar.d.ts +7 -0
  259. package/dist/components/research/ResearchSidebar.d.ts.map +1 -0
  260. package/dist/components/research/ResearchSidebar.js +271 -0
  261. package/dist/components/research/ResearchSidebar.js.map +1 -0
  262. package/dist/components/research/ResearchSidebarToggle.d.ts +6 -0
  263. package/dist/components/research/ResearchSidebarToggle.d.ts.map +1 -0
  264. package/dist/components/research/ResearchSidebarToggle.js +13 -0
  265. package/dist/components/research/ResearchSidebarToggle.js.map +1 -0
  266. package/dist/components/research/index.d.ts +3 -0
  267. package/dist/components/research/index.d.ts.map +1 -0
  268. package/dist/components/research/index.js +3 -0
  269. package/dist/components/research/index.js.map +1 -0
  270. package/dist/components/session-files/SessionFilesDiffPanel.d.ts +2 -0
  271. package/dist/components/session-files/SessionFilesDiffPanel.d.ts.map +1 -0
  272. package/dist/components/session-files/SessionFilesDiffPanel.js +345 -0
  273. package/dist/components/session-files/SessionFilesDiffPanel.js.map +1 -0
  274. package/dist/components/session-files/SessionFilesSidebar.d.ts +6 -0
  275. package/dist/components/session-files/SessionFilesSidebar.d.ts.map +1 -0
  276. package/dist/components/session-files/SessionFilesSidebar.js +80 -0
  277. package/dist/components/session-files/SessionFilesSidebar.js.map +1 -0
  278. package/dist/components/session-files/SessionFilesSidebarToggle.d.ts +6 -0
  279. package/dist/components/session-files/SessionFilesSidebarToggle.d.ts.map +1 -0
  280. package/dist/components/session-files/SessionFilesSidebarToggle.js +15 -0
  281. package/dist/components/session-files/SessionFilesSidebarToggle.js.map +1 -0
  282. package/dist/components/session-files/index.d.ts +4 -0
  283. package/dist/components/session-files/index.d.ts.map +1 -0
  284. package/dist/components/session-files/index.js +4 -0
  285. package/dist/components/session-files/index.js.map +1 -0
  286. package/dist/components/sessions/LeanHeader.d.ts +10 -0
  287. package/dist/components/sessions/LeanHeader.d.ts.map +1 -0
  288. package/dist/components/sessions/LeanHeader.js +62 -0
  289. package/dist/components/sessions/LeanHeader.js.map +1 -0
  290. package/dist/components/sessions/SessionHeader.d.ts +8 -0
  291. package/dist/components/sessions/SessionHeader.d.ts.map +1 -0
  292. package/dist/components/sessions/SessionHeader.js +74 -0
  293. package/dist/components/sessions/SessionHeader.js.map +1 -0
  294. package/dist/components/sessions/SessionItem.d.ts +9 -0
  295. package/dist/components/sessions/SessionItem.d.ts.map +1 -0
  296. package/dist/components/sessions/SessionItem.js +28 -0
  297. package/dist/components/sessions/SessionItem.js.map +1 -0
  298. package/dist/components/sessions/SessionListContainer.d.ts +7 -0
  299. package/dist/components/sessions/SessionListContainer.d.ts.map +1 -0
  300. package/dist/components/sessions/SessionListContainer.js +47 -0
  301. package/dist/components/sessions/SessionListContainer.js.map +1 -0
  302. package/dist/components/settings/SettingsSidebar.d.ts +2 -0
  303. package/dist/components/settings/SettingsSidebar.d.ts.map +1 -0
  304. package/dist/components/settings/SettingsSidebar.js +134 -0
  305. package/dist/components/settings/SettingsSidebar.js.map +1 -0
  306. package/dist/components/settings/SettingsSidebarToggle.d.ts +2 -0
  307. package/dist/components/settings/SettingsSidebarToggle.d.ts.map +1 -0
  308. package/dist/components/settings/SettingsSidebarToggle.js +10 -0
  309. package/dist/components/settings/SettingsSidebarToggle.js.map +1 -0
  310. package/dist/components/settings/SetuTopupModal.d.ts +2 -0
  311. package/dist/components/settings/SetuTopupModal.d.ts.map +1 -0
  312. package/dist/components/settings/SetuTopupModal.js +196 -0
  313. package/dist/components/settings/SetuTopupModal.js.map +1 -0
  314. package/dist/components/terminals/TerminalList.d.ts +8 -0
  315. package/dist/components/terminals/TerminalList.d.ts.map +1 -0
  316. package/dist/components/terminals/TerminalList.js +32 -0
  317. package/dist/components/terminals/TerminalList.js.map +1 -0
  318. package/dist/components/terminals/TerminalViewer.d.ts +6 -0
  319. package/dist/components/terminals/TerminalViewer.d.ts.map +1 -0
  320. package/dist/components/terminals/TerminalViewer.js +263 -0
  321. package/dist/components/terminals/TerminalViewer.js.map +1 -0
  322. package/dist/components/terminals/TerminalsSidebar.d.ts +2 -0
  323. package/dist/components/terminals/TerminalsSidebar.d.ts.map +1 -0
  324. package/dist/components/terminals/TerminalsSidebar.js +34 -0
  325. package/dist/components/terminals/TerminalsSidebar.js.map +1 -0
  326. package/dist/components/terminals/TerminalsSidebarToggle.d.ts +2 -0
  327. package/dist/components/terminals/TerminalsSidebarToggle.d.ts.map +1 -0
  328. package/dist/components/terminals/TerminalsSidebarToggle.js +13 -0
  329. package/dist/components/terminals/TerminalsSidebarToggle.js.map +1 -0
  330. package/dist/components/terminals/index.d.ts +5 -0
  331. package/dist/components/terminals/index.d.ts.map +1 -0
  332. package/dist/components/terminals/index.js +5 -0
  333. package/dist/components/terminals/index.js.map +1 -0
  334. package/dist/components/ui/Button.d.ts +8 -0
  335. package/dist/components/ui/Button.d.ts.map +1 -0
  336. package/dist/components/ui/Button.js +19 -0
  337. package/dist/components/ui/Button.js.map +1 -0
  338. package/dist/components/ui/Card.d.ts +6 -0
  339. package/dist/components/ui/Card.d.ts.map +1 -0
  340. package/dist/components/ui/Card.js +7 -0
  341. package/dist/components/ui/Card.js.map +1 -0
  342. package/dist/components/ui/ConfirmationDialog.d.ts +2 -0
  343. package/dist/components/ui/ConfirmationDialog.d.ts.map +1 -0
  344. package/dist/components/ui/ConfirmationDialog.js +72 -0
  345. package/dist/components/ui/ConfirmationDialog.js.map +1 -0
  346. package/dist/components/ui/Input.d.ts +6 -0
  347. package/dist/components/ui/Input.d.ts.map +1 -0
  348. package/dist/components/ui/Input.js +7 -0
  349. package/dist/components/ui/Input.js.map +1 -0
  350. package/dist/components/ui/Modal.d.ts +14 -0
  351. package/dist/components/ui/Modal.d.ts.map +1 -0
  352. package/dist/components/ui/Modal.js +51 -0
  353. package/dist/components/ui/Modal.js.map +1 -0
  354. package/dist/components/ui/Textarea.d.ts +6 -0
  355. package/dist/components/ui/Textarea.d.ts.map +1 -0
  356. package/dist/components/ui/Textarea.js +7 -0
  357. package/dist/components/ui/Textarea.js.map +1 -0
  358. package/dist/components/ui/Toaster.d.ts +2 -0
  359. package/dist/components/ui/Toaster.d.ts.map +1 -0
  360. package/dist/components/ui/Toaster.js +41 -0
  361. package/dist/components/ui/Toaster.js.map +1 -0
  362. package/dist/components/ui/ToolApprovalDialog.d.ts +7 -0
  363. package/dist/components/ui/ToolApprovalDialog.d.ts.map +1 -0
  364. package/dist/components/ui/ToolApprovalDialog.js +57 -0
  365. package/dist/components/ui/ToolApprovalDialog.js.map +1 -0
  366. package/dist/hooks/index.d.ts +23 -0
  367. package/dist/hooks/index.d.ts.map +1 -0
  368. package/dist/hooks/index.js +24 -0
  369. package/dist/hooks/index.js.map +1 -0
  370. package/dist/hooks/useAuthStatus.d.ts +60 -0
  371. package/dist/hooks/useAuthStatus.d.ts.map +1 -0
  372. package/dist/hooks/useAuthStatus.js +247 -0
  373. package/dist/hooks/useAuthStatus.js.map +1 -0
  374. package/dist/hooks/useBranch.d.ts +5 -0
  375. package/dist/hooks/useBranch.d.ts.map +1 -0
  376. package/dist/hooks/useBranch.js +43 -0
  377. package/dist/hooks/useBranch.js.map +1 -0
  378. package/dist/hooks/useCommandSuggestions.d.ts +29 -0
  379. package/dist/hooks/useCommandSuggestions.d.ts.map +1 -0
  380. package/dist/hooks/useCommandSuggestions.js +85 -0
  381. package/dist/hooks/useCommandSuggestions.js.map +1 -0
  382. package/dist/hooks/useConfig.d.ts +35 -0
  383. package/dist/hooks/useConfig.d.ts.map +1 -0
  384. package/dist/hooks/useConfig.js +32 -0
  385. package/dist/hooks/useConfig.js.map +1 -0
  386. package/dist/hooks/useFileMention.d.ts +16 -0
  387. package/dist/hooks/useFileMention.d.ts.map +1 -0
  388. package/dist/hooks/useFileMention.js +56 -0
  389. package/dist/hooks/useFileMention.js.map +1 -0
  390. package/dist/hooks/useFileUpload.d.ts +34 -0
  391. package/dist/hooks/useFileUpload.d.ts.map +1 -0
  392. package/dist/hooks/useFileUpload.js +258 -0
  393. package/dist/hooks/useFileUpload.js.map +1 -0
  394. package/dist/hooks/useFiles.d.ts +9 -0
  395. package/dist/hooks/useFiles.d.ts.map +1 -0
  396. package/dist/hooks/useFiles.js +15 -0
  397. package/dist/hooks/useFiles.js.map +1 -0
  398. package/dist/hooks/useGit.d.ts +15 -0
  399. package/dist/hooks/useGit.d.ts.map +1 -0
  400. package/dist/hooks/useGit.js +99 -0
  401. package/dist/hooks/useGit.js.map +1 -0
  402. package/dist/hooks/useImageUpload.d.ts +28 -0
  403. package/dist/hooks/useImageUpload.d.ts.map +1 -0
  404. package/dist/hooks/useImageUpload.js +197 -0
  405. package/dist/hooks/useImageUpload.js.map +1 -0
  406. package/dist/hooks/useKeyboardShortcuts.d.ts +27 -0
  407. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  408. package/dist/hooks/useKeyboardShortcuts.js +242 -0
  409. package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
  410. package/dist/hooks/useMessages.d.ts +4 -0
  411. package/dist/hooks/useMessages.d.ts.map +1 -0
  412. package/dist/hooks/useMessages.js +25 -0
  413. package/dist/hooks/useMessages.js.map +1 -0
  414. package/dist/hooks/usePreferences.d.ts +10 -0
  415. package/dist/hooks/usePreferences.d.ts.map +1 -0
  416. package/dist/hooks/usePreferences.js +62 -0
  417. package/dist/hooks/usePreferences.js.map +1 -0
  418. package/dist/hooks/useQueueState.d.ts +15 -0
  419. package/dist/hooks/useQueueState.d.ts.map +1 -0
  420. package/dist/hooks/useQueueState.js +30 -0
  421. package/dist/hooks/useQueueState.js.map +1 -0
  422. package/dist/hooks/useResearch.d.ts +59 -0
  423. package/dist/hooks/useResearch.d.ts.map +1 -0
  424. package/dist/hooks/useResearch.js +138 -0
  425. package/dist/hooks/useResearch.js.map +1 -0
  426. package/dist/hooks/useSessionFiles.d.ts +2 -0
  427. package/dist/hooks/useSessionFiles.d.ts.map +1 -0
  428. package/dist/hooks/useSessionFiles.js +15 -0
  429. package/dist/hooks/useSessionFiles.js.map +1 -0
  430. package/dist/hooks/useSessionStream.d.ts +2 -0
  431. package/dist/hooks/useSessionStream.d.ts.map +1 -0
  432. package/dist/hooks/useSessionStream.js +455 -0
  433. package/dist/hooks/useSessionStream.js.map +1 -0
  434. package/dist/hooks/useSessions.d.ts +9 -0
  435. package/dist/hooks/useSessions.d.ts.map +1 -0
  436. package/dist/hooks/useSessions.js +43 -0
  437. package/dist/hooks/useSessions.js.map +1 -0
  438. package/dist/hooks/useSetuBalance.d.ts +4 -0
  439. package/dist/hooks/useSetuBalance.d.ts.map +1 -0
  440. package/dist/hooks/useSetuBalance.js +59 -0
  441. package/dist/hooks/useSetuBalance.js.map +1 -0
  442. package/dist/hooks/useSetuPayments.d.ts +2 -0
  443. package/dist/hooks/useSetuPayments.d.ts.map +1 -0
  444. package/dist/hooks/useSetuPayments.js +159 -0
  445. package/dist/hooks/useSetuPayments.js.map +1 -0
  446. package/dist/hooks/useShareStatus.d.ts +7 -0
  447. package/dist/hooks/useShareStatus.d.ts.map +1 -0
  448. package/dist/hooks/useShareStatus.js +12 -0
  449. package/dist/hooks/useShareStatus.js.map +1 -0
  450. package/dist/hooks/useTerminals.d.ts +37 -0
  451. package/dist/hooks/useTerminals.d.ts.map +1 -0
  452. package/dist/hooks/useTerminals.js +67 -0
  453. package/dist/hooks/useTerminals.js.map +1 -0
  454. package/dist/hooks/useTheme.d.ts +8 -0
  455. package/dist/hooks/useTheme.d.ts.map +1 -0
  456. package/dist/hooks/useTheme.js +57 -0
  457. package/dist/hooks/useTheme.js.map +1 -0
  458. package/dist/hooks/useToolApprovalShortcuts.d.ts +11 -0
  459. package/dist/hooks/useToolApprovalShortcuts.d.ts.map +1 -0
  460. package/dist/hooks/useToolApprovalShortcuts.js +88 -0
  461. package/dist/hooks/useToolApprovalShortcuts.js.map +1 -0
  462. package/dist/hooks/useTopupCallback.d.ts +2 -0
  463. package/dist/hooks/useTopupCallback.d.ts.map +1 -0
  464. package/dist/hooks/useTopupCallback.js +74 -0
  465. package/dist/hooks/useTopupCallback.js.map +1 -0
  466. package/dist/hooks/useVimMode.d.ts +16 -0
  467. package/dist/hooks/useVimMode.d.ts.map +1 -0
  468. package/dist/hooks/useVimMode.js +298 -0
  469. package/dist/hooks/useVimMode.js.map +1 -0
  470. package/dist/hooks/useWorkingDirectory.d.ts +2 -0
  471. package/dist/hooks/useWorkingDirectory.d.ts.map +1 -0
  472. package/dist/hooks/useWorkingDirectory.js +34 -0
  473. package/dist/hooks/useWorkingDirectory.js.map +1 -0
  474. package/dist/index.d.ts +7 -0
  475. package/dist/index.d.ts.map +1 -0
  476. package/dist/index.js +9 -0
  477. package/dist/index.js.map +1 -0
  478. package/dist/lib/api-client.d.ts +245 -0
  479. package/dist/lib/api-client.d.ts.map +1 -0
  480. package/dist/lib/api-client.js +783 -0
  481. package/dist/lib/api-client.js.map +1 -0
  482. package/dist/lib/commands.d.ts +16 -0
  483. package/dist/lib/commands.d.ts.map +1 -0
  484. package/dist/lib/commands.js +124 -0
  485. package/dist/lib/commands.js.map +1 -0
  486. package/dist/lib/config.d.ts +6 -0
  487. package/dist/lib/config.d.ts.map +1 -0
  488. package/dist/lib/config.js +28 -0
  489. package/dist/lib/config.js.map +1 -0
  490. package/dist/lib/index.d.ts +4 -0
  491. package/dist/lib/index.d.ts.map +1 -0
  492. package/dist/lib/index.js +5 -0
  493. package/dist/lib/index.js.map +1 -0
  494. package/dist/lib/open-url.d.ts +2 -0
  495. package/dist/lib/open-url.d.ts.map +1 -0
  496. package/dist/lib/open-url.js +9 -0
  497. package/dist/lib/open-url.js.map +1 -0
  498. package/dist/lib/parseResearchContext.d.ts +17 -0
  499. package/dist/lib/parseResearchContext.d.ts.map +1 -0
  500. package/dist/lib/parseResearchContext.js +30 -0
  501. package/dist/lib/parseResearchContext.js.map +1 -0
  502. package/dist/lib/sse-client.d.ts +13 -0
  503. package/dist/lib/sse-client.d.ts.map +1 -0
  504. package/dist/lib/sse-client.js +111 -0
  505. package/dist/lib/sse-client.js.map +1 -0
  506. package/dist/stores/confirmationStore.d.ts +23 -0
  507. package/dist/stores/confirmationStore.d.ts.map +1 -0
  508. package/dist/stores/confirmationStore.js +27 -0
  509. package/dist/stores/confirmationStore.js.map +1 -0
  510. package/dist/stores/focusStore.d.ts +14 -0
  511. package/dist/stores/focusStore.d.ts.map +1 -0
  512. package/dist/stores/focusStore.js +12 -0
  513. package/dist/stores/focusStore.js.map +1 -0
  514. package/dist/stores/gitStore.d.ts +24 -0
  515. package/dist/stores/gitStore.d.ts.map +1 -0
  516. package/dist/stores/gitStore.js +57 -0
  517. package/dist/stores/gitStore.js.map +1 -0
  518. package/dist/stores/index.d.ts +15 -0
  519. package/dist/stores/index.d.ts.map +1 -0
  520. package/dist/stores/index.js +15 -0
  521. package/dist/stores/index.js.map +1 -0
  522. package/dist/stores/onboardingStore.d.ts +46 -0
  523. package/dist/stores/onboardingStore.d.ts.map +1 -0
  524. package/dist/stores/onboardingStore.js +38 -0
  525. package/dist/stores/onboardingStore.js.map +1 -0
  526. package/dist/stores/pendingResearchStore.d.ts +17 -0
  527. package/dist/stores/pendingResearchStore.d.ts.map +1 -0
  528. package/dist/stores/pendingResearchStore.js +38 -0
  529. package/dist/stores/pendingResearchStore.js.map +1 -0
  530. package/dist/stores/queueStore.d.ts +8 -0
  531. package/dist/stores/queueStore.d.ts.map +1 -0
  532. package/dist/stores/queueStore.js +11 -0
  533. package/dist/stores/queueStore.js.map +1 -0
  534. package/dist/stores/researchStore.d.ts +14 -0
  535. package/dist/stores/researchStore.d.ts.map +1 -0
  536. package/dist/stores/researchStore.js +45 -0
  537. package/dist/stores/researchStore.js.map +1 -0
  538. package/dist/stores/sessionFilesStore.d.ts +17 -0
  539. package/dist/stores/sessionFilesStore.d.ts.map +1 -0
  540. package/dist/stores/sessionFilesStore.js +53 -0
  541. package/dist/stores/sessionFilesStore.js.map +1 -0
  542. package/dist/stores/settingsStore.d.ts +9 -0
  543. package/dist/stores/settingsStore.d.ts.map +1 -0
  544. package/dist/stores/settingsStore.js +23 -0
  545. package/dist/stores/settingsStore.js.map +1 -0
  546. package/dist/stores/setuStore.d.ts +22 -0
  547. package/dist/stores/setuStore.d.ts.map +1 -0
  548. package/dist/stores/setuStore.js +21 -0
  549. package/dist/stores/setuStore.js.map +1 -0
  550. package/dist/stores/sidebarStore.d.ts +20 -0
  551. package/dist/stores/sidebarStore.d.ts.map +1 -0
  552. package/dist/stores/sidebarStore.js +10 -0
  553. package/dist/stores/sidebarStore.js.map +1 -0
  554. package/dist/stores/terminalStore.d.ts +11 -0
  555. package/dist/stores/terminalStore.d.ts.map +1 -0
  556. package/dist/stores/terminalStore.js +25 -0
  557. package/dist/stores/terminalStore.js.map +1 -0
  558. package/dist/stores/toastStore.d.ts +32 -0
  559. package/dist/stores/toastStore.d.ts.map +1 -0
  560. package/dist/stores/toastStore.js +46 -0
  561. package/dist/stores/toastStore.js.map +1 -0
  562. package/dist/stores/toolApprovalStore.d.ts +18 -0
  563. package/dist/stores/toolApprovalStore.d.ts.map +1 -0
  564. package/dist/stores/toolApprovalStore.js +16 -0
  565. package/dist/stores/toolApprovalStore.js.map +1 -0
  566. package/dist/stores/topupApprovalStore.d.ts +20 -0
  567. package/dist/stores/topupApprovalStore.d.ts.map +1 -0
  568. package/dist/stores/topupApprovalStore.js +11 -0
  569. package/dist/stores/topupApprovalStore.js.map +1 -0
  570. package/dist/types/api.d.ts +269 -0
  571. package/dist/types/api.d.ts.map +1 -0
  572. package/dist/types/api.js +2 -0
  573. package/dist/types/api.js.map +1 -0
  574. package/package.json +94 -0
@@ -0,0 +1,138 @@
1
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
2
+ import { API_BASE_URL } from '../lib/config';
3
+ import { usePendingResearchStore } from '../stores/pendingResearchStore';
4
+ class ResearchApiClient {
5
+ get baseUrl() {
6
+ // Check for runtime injected URL first
7
+ const win = window;
8
+ if (win.OTTO_SERVER_URL) {
9
+ return win.OTTO_SERVER_URL;
10
+ }
11
+ // Check for Vite env var
12
+ if (import.meta.env?.VITE_API_BASE_URL) {
13
+ return import.meta.env.VITE_API_BASE_URL;
14
+ }
15
+ return API_BASE_URL;
16
+ }
17
+ async listResearchSessions(parentSessionId) {
18
+ const response = await fetch(`${this.baseUrl}/v1/sessions/${parentSessionId}/research`, {
19
+ method: 'GET',
20
+ headers: { 'Content-Type': 'application/json' },
21
+ });
22
+ if (!response.ok) {
23
+ const error = await response
24
+ .json()
25
+ .catch(() => ({ error: 'Failed to fetch research sessions' }));
26
+ throw new Error(error.error || 'Failed to fetch research sessions');
27
+ }
28
+ return response.json();
29
+ }
30
+ async createResearchSession(parentSessionId, data) {
31
+ const response = await fetch(`${this.baseUrl}/v1/sessions/${parentSessionId}/research`, {
32
+ method: 'POST',
33
+ headers: { 'Content-Type': 'application/json' },
34
+ body: JSON.stringify(data),
35
+ });
36
+ if (!response.ok) {
37
+ const error = await response
38
+ .json()
39
+ .catch(() => ({ error: 'Failed to create research session' }));
40
+ throw new Error(error.error || 'Failed to create research session');
41
+ }
42
+ return response.json();
43
+ }
44
+ async deleteResearchSession(researchId) {
45
+ const response = await fetch(`${this.baseUrl}/v1/research/${researchId}`, {
46
+ method: 'DELETE',
47
+ headers: { 'Content-Type': 'application/json' },
48
+ });
49
+ if (!response.ok) {
50
+ const error = await response
51
+ .json()
52
+ .catch(() => ({ error: 'Failed to delete research session' }));
53
+ throw new Error(error.error || 'Failed to delete research session');
54
+ }
55
+ return response.json();
56
+ }
57
+ async injectContext(parentSessionId, researchSessionId, label) {
58
+ const response = await fetch(`${this.baseUrl}/v1/sessions/${parentSessionId}/inject`, {
59
+ method: 'POST',
60
+ headers: { 'Content-Type': 'application/json' },
61
+ body: JSON.stringify({ researchSessionId, label }),
62
+ });
63
+ if (!response.ok) {
64
+ const error = await response
65
+ .json()
66
+ .catch(() => ({ error: 'Failed to inject context' }));
67
+ throw new Error(error.error || 'Failed to inject context');
68
+ }
69
+ return response.json();
70
+ }
71
+ async exportToNewSession(researchId, data) {
72
+ const response = await fetch(`${this.baseUrl}/v1/research/${researchId}/export`, {
73
+ method: 'POST',
74
+ headers: { 'Content-Type': 'application/json' },
75
+ body: JSON.stringify(data ?? {}),
76
+ });
77
+ if (!response.ok) {
78
+ const error = await response
79
+ .json()
80
+ .catch(() => ({ error: 'Failed to export to session' }));
81
+ throw new Error(error.error || 'Failed to export to session');
82
+ }
83
+ return response.json();
84
+ }
85
+ }
86
+ const researchApi = new ResearchApiClient();
87
+ export function useResearchSessions(parentSessionId) {
88
+ return useQuery({
89
+ queryKey: ['research', 'sessions', parentSessionId],
90
+ queryFn: () => researchApi.listResearchSessions(parentSessionId),
91
+ enabled: !!parentSessionId,
92
+ staleTime: 30000,
93
+ });
94
+ }
95
+ export function useCreateResearchSession() {
96
+ const queryClient = useQueryClient();
97
+ return useMutation({
98
+ mutationFn: ({ parentSessionId, data, }) => researchApi.createResearchSession(parentSessionId, data ?? {}),
99
+ onSuccess: (_, { parentSessionId }) => {
100
+ queryClient.invalidateQueries({
101
+ queryKey: ['research', 'sessions', parentSessionId],
102
+ });
103
+ },
104
+ });
105
+ }
106
+ export function useDeleteResearchSession() {
107
+ const queryClient = useQueryClient();
108
+ return useMutation({
109
+ mutationFn: (researchId) => researchApi.deleteResearchSession(researchId),
110
+ onSuccess: () => {
111
+ queryClient.invalidateQueries({ queryKey: ['research', 'sessions'] });
112
+ },
113
+ });
114
+ }
115
+ export function useInjectContext() {
116
+ const addContext = usePendingResearchStore((state) => state.addContext);
117
+ return useMutation({
118
+ mutationFn: ({ parentSessionId, researchSessionId, label, }) => researchApi.injectContext(parentSessionId, researchSessionId, label),
119
+ onSuccess: (data, { parentSessionId }) => {
120
+ addContext(parentSessionId, {
121
+ id: data.sessionId,
122
+ sessionId: data.sessionId,
123
+ label: data.label,
124
+ content: data.content,
125
+ });
126
+ },
127
+ });
128
+ }
129
+ export function useExportToSession() {
130
+ const queryClient = useQueryClient();
131
+ return useMutation({
132
+ mutationFn: ({ researchId, data, }) => researchApi.exportToNewSession(researchId, data),
133
+ onSuccess: () => {
134
+ queryClient.invalidateQueries({ queryKey: ['sessions'] });
135
+ },
136
+ });
137
+ }
138
+ //# sourceMappingURL=useResearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResearch.js","sourceRoot":"","sources":["../../src/hooks/useResearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function useSessionFiles(sessionId: string | undefined): import("@tanstack/react-query").UseQueryResult<import("..").SessionFilesResponse, Error>;
2
+ //# sourceMappingURL=useSessionFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionFiles.d.ts","sourceRoot":"","sources":["../../src/hooks/useSessionFiles.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,4FAW5D"}
@@ -0,0 +1,15 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { apiClient } from '../lib/api-client';
3
+ import { useSessionFilesStore } from '../stores/sessionFilesStore';
4
+ export function useSessionFiles(sessionId) {
5
+ const isExpanded = useSessionFilesStore((state) => state.isExpanded);
6
+ return useQuery({
7
+ queryKey: ['session', sessionId, 'files'],
8
+ queryFn: () => (sessionId ? apiClient.getSessionFiles(sessionId) : null),
9
+ enabled: !!sessionId,
10
+ refetchInterval: isExpanded ? 5000 : false,
11
+ retry: 1,
12
+ staleTime: 3000,
13
+ });
14
+ }
15
+ //# sourceMappingURL=useSessionFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionFiles.js","sourceRoot":"","sources":["../../src/hooks/useSessionFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,UAAU,eAAe,CAAC,SAA6B;IAC5D,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAErE,OAAO,QAAQ,CAAC;QACf,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;QACzC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,OAAO,EAAE,CAAC,CAAC,SAAS;QACpB,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QAC1C,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,IAAI;KACf,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function useSessionStream(sessionId: string | undefined): void;
2
+ //# sourceMappingURL=useSessionStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionStream.d.ts","sourceRoot":"","sources":["../../src/hooks/useSessionStream.ts"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,QA0f7D"}
@@ -0,0 +1,455 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { useQueryClient } from '@tanstack/react-query';
3
+ import { SSEClient } from '../lib/sse-client';
4
+ import { apiClient } from '../lib/api-client';
5
+ import { useToolApprovalStore } from '../stores/toolApprovalStore';
6
+ export function useSessionStream(sessionId) {
7
+ const queryClient = useQueryClient();
8
+ const clientRef = useRef(null);
9
+ const assistantMessageIdRef = useRef(null);
10
+ const lastInvalidationRef = useRef(0);
11
+ const { addPendingApproval, removePendingApproval, updatePendingApproval, setPendingApprovals, } = useToolApprovalStore();
12
+ useEffect(() => {
13
+ // console.log('[useSessionStream] Hook called with sessionId:', sessionId)
14
+ if (!sessionId) {
15
+ console.log('[useSessionStream] No sessionId, skipping');
16
+ return;
17
+ }
18
+ assistantMessageIdRef.current = null;
19
+ // Fetch pending approvals from server for this session
20
+ apiClient
21
+ .getPendingApprovals(sessionId)
22
+ .then((result) => {
23
+ if (result.ok && result.pending.length > 0) {
24
+ setPendingApprovals(result.pending);
25
+ }
26
+ else {
27
+ setPendingApprovals([]);
28
+ }
29
+ })
30
+ .catch(() => {
31
+ setPendingApprovals([]);
32
+ });
33
+ const client = new SSEClient();
34
+ clientRef.current = client;
35
+ const url = apiClient.getStreamUrl(sessionId);
36
+ console.log('[useSessionStream] Connecting to stream:', url);
37
+ client.connect(url);
38
+ const resolveAssistantTargetIndex = (messages) => {
39
+ if (assistantMessageIdRef.current) {
40
+ const byId = messages.findIndex((message) => message.id === assistantMessageIdRef.current);
41
+ if (byId !== -1)
42
+ return byId;
43
+ }
44
+ for (let i = messages.length - 1; i >= 0; i -= 1) {
45
+ const candidate = messages[i];
46
+ if (candidate.role === 'assistant' && candidate.status !== 'complete') {
47
+ return i;
48
+ }
49
+ }
50
+ return -1;
51
+ };
52
+ const extractText = (part) => {
53
+ if (part.contentJson &&
54
+ typeof part.contentJson === 'object' &&
55
+ !Array.isArray(part.contentJson) &&
56
+ 'text' in part.contentJson) {
57
+ return String(part.contentJson.text ?? '');
58
+ }
59
+ if (typeof part.content === 'string') {
60
+ try {
61
+ const parsed = JSON.parse(part.content);
62
+ if (parsed && typeof parsed.text === 'string')
63
+ return parsed.text;
64
+ }
65
+ catch { }
66
+ return part.content;
67
+ }
68
+ return '';
69
+ };
70
+ const applyReasoningDelta = (payload) => {
71
+ const messageId = typeof payload?.messageId === 'string' ? payload.messageId : null;
72
+ const partId = typeof payload?.partId === 'string' ? payload.partId : null;
73
+ const delta = typeof payload?.delta === 'string' ? payload.delta : null;
74
+ if (!messageId || !partId || delta === null)
75
+ return;
76
+ queryClient.setQueryData(['messages', sessionId], (oldMessages) => {
77
+ if (!oldMessages)
78
+ return oldMessages;
79
+ const nextMessages = [...oldMessages];
80
+ const messageIndex = nextMessages.findIndex((message) => message.id === messageId);
81
+ if (messageIndex === -1)
82
+ return oldMessages;
83
+ const targetMessage = nextMessages[messageIndex];
84
+ const parts = targetMessage.parts ? [...targetMessage.parts] : [];
85
+ let partIndex = parts.findIndex((part) => part.id === partId);
86
+ const stepIndex = typeof payload?.stepIndex === 'number' ? payload.stepIndex : null;
87
+ if (partIndex === -1) {
88
+ const newPart = {
89
+ id: partId,
90
+ messageId,
91
+ index: parts.length,
92
+ stepIndex,
93
+ type: 'reasoning',
94
+ content: JSON.stringify({ text: delta }),
95
+ contentJson: { text: delta },
96
+ agent: targetMessage.agent,
97
+ provider: targetMessage.provider,
98
+ model: targetMessage.model,
99
+ startedAt: Date.now(),
100
+ completedAt: null,
101
+ toolName: null,
102
+ toolCallId: null,
103
+ toolDurationMs: null,
104
+ };
105
+ parts.push(newPart);
106
+ partIndex = parts.length - 1;
107
+ }
108
+ else {
109
+ const existing = parts[partIndex];
110
+ const previous = extractText(existing);
111
+ const nextText = `${previous}${delta}`;
112
+ parts[partIndex] = {
113
+ ...existing,
114
+ content: JSON.stringify({ text: nextText }),
115
+ contentJson: { text: nextText },
116
+ stepIndex: stepIndex ?? existing.stepIndex ?? null,
117
+ completedAt: null,
118
+ };
119
+ }
120
+ nextMessages[messageIndex] = { ...targetMessage, parts };
121
+ return nextMessages;
122
+ });
123
+ };
124
+ const applyMessageDelta = (payload) => {
125
+ const messageId = typeof payload?.messageId === 'string' ? payload.messageId : null;
126
+ const partId = typeof payload?.partId === 'string' ? payload.partId : null;
127
+ const delta = typeof payload?.delta === 'string' ? payload.delta : null;
128
+ if (!messageId || !partId || delta === null)
129
+ return;
130
+ queryClient.setQueryData(['messages', sessionId], (oldMessages) => {
131
+ if (!oldMessages)
132
+ return oldMessages;
133
+ const nextMessages = [...oldMessages];
134
+ const messageIndex = nextMessages.findIndex((message) => message.id === messageId);
135
+ if (messageIndex === -1)
136
+ return oldMessages;
137
+ const targetMessage = nextMessages[messageIndex];
138
+ const parts = targetMessage.parts ? [...targetMessage.parts] : [];
139
+ let partIndex = parts.findIndex((part) => part.id === partId);
140
+ const stepIndex = typeof payload?.stepIndex === 'number' ? payload.stepIndex : null;
141
+ if (partIndex === -1) {
142
+ const newPart = {
143
+ id: partId,
144
+ messageId,
145
+ index: parts.length,
146
+ stepIndex,
147
+ type: 'text',
148
+ content: JSON.stringify({ text: delta }),
149
+ contentJson: { text: delta },
150
+ agent: targetMessage.agent,
151
+ provider: targetMessage.provider,
152
+ model: targetMessage.model,
153
+ startedAt: Date.now(),
154
+ completedAt: null,
155
+ toolName: null,
156
+ toolCallId: null,
157
+ toolDurationMs: null,
158
+ };
159
+ parts.push(newPart);
160
+ partIndex = parts.length - 1;
161
+ }
162
+ else {
163
+ const existing = parts[partIndex];
164
+ const previous = extractText(existing);
165
+ const nextText = `${previous}${delta}`;
166
+ parts[partIndex] = {
167
+ ...existing,
168
+ content: JSON.stringify({ text: nextText }),
169
+ contentJson: { text: nextText },
170
+ stepIndex: stepIndex ?? existing.stepIndex ?? null,
171
+ completedAt: null,
172
+ };
173
+ }
174
+ nextMessages[messageIndex] = { ...targetMessage, parts };
175
+ return nextMessages;
176
+ });
177
+ };
178
+ const upsertEphemeralToolCall = (payload) => {
179
+ if (!payload)
180
+ return;
181
+ const callId = typeof payload.callId === 'string' ? payload.callId : null;
182
+ const name = typeof payload.name === 'string' ? payload.name : null;
183
+ if (!name)
184
+ return;
185
+ queryClient.setQueryData(['messages', sessionId], (oldMessages) => {
186
+ if (!oldMessages)
187
+ return oldMessages;
188
+ const nextMessages = [...oldMessages];
189
+ let targetIndex = resolveAssistantTargetIndex(nextMessages);
190
+ if (typeof payload.messageId === 'string') {
191
+ const explicitIndex = nextMessages.findIndex((message) => message.id === payload.messageId);
192
+ if (explicitIndex !== -1)
193
+ targetIndex = explicitIndex;
194
+ }
195
+ if (targetIndex === -1)
196
+ return oldMessages;
197
+ const targetMessage = nextMessages[targetIndex];
198
+ const parts = targetMessage.parts ? [...targetMessage.parts] : [];
199
+ let partIndex = -1;
200
+ if (callId) {
201
+ partIndex = parts.findIndex((part) => part.toolCallId === callId && part.ephemeral);
202
+ }
203
+ // Only fallback to name match if we don't have a callId
204
+ if (partIndex === -1 && !callId) {
205
+ partIndex = parts.findIndex((part) => part.ephemeral && part.toolName === name);
206
+ }
207
+ const args = payload.args;
208
+ const stepIndex = typeof payload.stepIndex === 'number' ? payload.stepIndex : null;
209
+ const contentJsonBase = { name };
210
+ if (callId)
211
+ contentJsonBase.callId = callId;
212
+ if (args !== undefined)
213
+ contentJsonBase.args = args;
214
+ if (partIndex === -1) {
215
+ const newPart = {
216
+ id: callId
217
+ ? `ephemeral-tool-call-${callId}`
218
+ : `ephemeral-tool-call-${name}-${Date.now()}`,
219
+ messageId: targetMessage.id,
220
+ index: parts.length,
221
+ stepIndex,
222
+ type: 'tool_call',
223
+ content: JSON.stringify(contentJsonBase),
224
+ contentJson: contentJsonBase,
225
+ agent: targetMessage.agent,
226
+ provider: targetMessage.provider,
227
+ model: targetMessage.model,
228
+ startedAt: Date.now(),
229
+ completedAt: null,
230
+ toolName: name,
231
+ toolCallId: callId,
232
+ toolDurationMs: null,
233
+ ephemeral: true,
234
+ };
235
+ parts.push(newPart);
236
+ }
237
+ else {
238
+ const existing = parts[partIndex];
239
+ const nextContentJson = {
240
+ ...(typeof existing.contentJson === 'object' &&
241
+ !Array.isArray(existing.contentJson)
242
+ ? existing.contentJson
243
+ : {}),
244
+ name,
245
+ };
246
+ if (callId)
247
+ nextContentJson.callId = callId;
248
+ if (args !== undefined)
249
+ nextContentJson.args = args;
250
+ parts[partIndex] = {
251
+ ...existing,
252
+ content: JSON.stringify(nextContentJson),
253
+ contentJson: nextContentJson,
254
+ stepIndex: stepIndex ?? existing.stepIndex ?? null,
255
+ toolCallId: callId ?? existing.toolCallId,
256
+ toolName: name,
257
+ };
258
+ }
259
+ nextMessages[targetIndex] = { ...targetMessage, parts };
260
+ return nextMessages;
261
+ });
262
+ };
263
+ const removeEphemeralToolCall = (payload) => {
264
+ const callId = typeof payload?.callId === 'string' ? payload.callId : null;
265
+ if (!callId)
266
+ return;
267
+ queryClient.setQueryData(['messages', sessionId], (oldMessages) => {
268
+ if (!oldMessages)
269
+ return oldMessages;
270
+ let changed = false;
271
+ const nextMessages = oldMessages.map((message) => {
272
+ if (!message.parts?.length)
273
+ return message;
274
+ const filtered = message.parts.filter((part) => !(part.ephemeral && part.toolCallId === callId));
275
+ if (filtered.length === message.parts.length)
276
+ return message;
277
+ changed = true;
278
+ return { ...message, parts: filtered };
279
+ });
280
+ return changed ? nextMessages : oldMessages;
281
+ });
282
+ };
283
+ const clearEphemeralForMessage = (messageId) => {
284
+ if (!messageId)
285
+ return;
286
+ queryClient.setQueryData(['messages', sessionId], (oldMessages) => {
287
+ if (!oldMessages)
288
+ return oldMessages;
289
+ const targetIndex = oldMessages.findIndex((message) => message.id === messageId);
290
+ if (targetIndex === -1)
291
+ return oldMessages;
292
+ const target = oldMessages[targetIndex];
293
+ if (!target.parts?.some((part) => part.ephemeral))
294
+ return oldMessages;
295
+ const nextMessages = [...oldMessages];
296
+ nextMessages[targetIndex] = {
297
+ ...target,
298
+ parts: target.parts?.filter((part) => !part.ephemeral) ?? [],
299
+ };
300
+ return nextMessages;
301
+ });
302
+ };
303
+ const markMessageCompleted = (payload) => {
304
+ const id = typeof payload?.id === 'string' ? payload.id : null;
305
+ if (!id)
306
+ return;
307
+ queryClient.setQueryData(['messages', sessionId], (oldMessages) => {
308
+ if (!oldMessages)
309
+ return oldMessages;
310
+ const nextMessages = [...oldMessages];
311
+ const messageIndex = nextMessages.findIndex((message) => message.id === id);
312
+ if (messageIndex === -1)
313
+ return oldMessages;
314
+ const existing = nextMessages[messageIndex];
315
+ nextMessages[messageIndex] = {
316
+ ...existing,
317
+ status: 'complete',
318
+ completedAt: Date.now(),
319
+ };
320
+ return nextMessages;
321
+ });
322
+ };
323
+ // Throttle invalidations to prevent excessive re-renders
324
+ // Only invalidate at most once every 500ms during streaming
325
+ const throttledInvalidate = () => {
326
+ const now = Date.now();
327
+ if (now - lastInvalidationRef.current < 500) {
328
+ return; // Skip if we invalidated less than 500ms ago
329
+ }
330
+ lastInvalidationRef.current = now;
331
+ // console.log('[useSessionStream] Invalidating messages query (throttled)');
332
+ queryClient.invalidateQueries({ queryKey: ['messages', sessionId] });
333
+ };
334
+ const invalidatingEvents = new Set([
335
+ 'message.completed',
336
+ 'tool.result',
337
+ 'finish-step',
338
+ 'error', // Add error to invalidate and reload from DB
339
+ ]);
340
+ const unsubscribe = client.on('*', (event) => {
341
+ // console.log('[useSessionStream] Event received:', event);
342
+ const payload = event.payload;
343
+ switch (event.type) {
344
+ case 'message.created': {
345
+ const role = typeof payload?.role === 'string' ? payload.role : null;
346
+ const id = typeof payload?.id === 'string' ? payload.id : null;
347
+ if (role === 'assistant' && id) {
348
+ assistantMessageIdRef.current = id;
349
+ }
350
+ break;
351
+ }
352
+ case 'message.part.delta': {
353
+ applyMessageDelta(payload);
354
+ break;
355
+ }
356
+ case 'reasoning.delta': {
357
+ applyReasoningDelta(payload);
358
+ break;
359
+ }
360
+ case 'message.completed': {
361
+ const id = typeof payload?.id === 'string' ? payload.id : null;
362
+ if (id && assistantMessageIdRef.current === id) {
363
+ assistantMessageIdRef.current = null;
364
+ }
365
+ markMessageCompleted(payload);
366
+ clearEphemeralForMessage(id);
367
+ queryClient.invalidateQueries({ queryKey: ['sessions'] });
368
+ break;
369
+ }
370
+ case 'tool.delta': {
371
+ const channel = typeof payload?.channel === 'string' ? payload.channel : null;
372
+ if (channel === 'input') {
373
+ upsertEphemeralToolCall(payload);
374
+ }
375
+ break;
376
+ }
377
+ case 'tool.call': {
378
+ upsertEphemeralToolCall(payload);
379
+ break;
380
+ }
381
+ case 'tool.result': {
382
+ removeEphemeralToolCall(payload);
383
+ break;
384
+ }
385
+ case 'tool.approval.required': {
386
+ const callId = typeof payload?.callId === 'string' ? payload.callId : null;
387
+ const toolName = typeof payload?.toolName === 'string' ? payload.toolName : null;
388
+ const messageId = typeof payload?.messageId === 'string' ? payload.messageId : null;
389
+ const args = payload?.args;
390
+ if (callId && toolName && messageId) {
391
+ addPendingApproval({
392
+ callId,
393
+ toolName,
394
+ args,
395
+ messageId,
396
+ createdAt: Date.now(),
397
+ });
398
+ }
399
+ break;
400
+ }
401
+ case 'tool.approval.resolved': {
402
+ const callId = typeof payload?.callId === 'string' ? payload.callId : null;
403
+ if (callId) {
404
+ removePendingApproval(callId);
405
+ }
406
+ break;
407
+ }
408
+ case 'tool.approval.updated': {
409
+ const callId = typeof payload?.callId === 'string' ? payload.callId : null;
410
+ const args = payload?.args;
411
+ if (callId) {
412
+ updatePendingApproval(callId, args);
413
+ }
414
+ break;
415
+ }
416
+ case 'error': {
417
+ removeEphemeralToolCall(payload);
418
+ const messageId = typeof payload?.messageId === 'string' ? payload.messageId : null;
419
+ if (messageId) {
420
+ clearEphemeralForMessage(messageId);
421
+ }
422
+ // Error parts are created by the server and will be loaded via query invalidation
423
+ break;
424
+ }
425
+ case 'queue.updated': {
426
+ const queueState = {
427
+ currentMessageId: payload?.currentMessageId,
428
+ queuedMessages: (payload?.queuedMessages ?? []),
429
+ queueLength: (payload?.queueLength ?? 0),
430
+ };
431
+ queryClient.setQueryData(['queueState', sessionId], queueState);
432
+ break;
433
+ }
434
+ default:
435
+ break;
436
+ }
437
+ if (invalidatingEvents.has(event.type)) {
438
+ // Use throttled invalidation instead of immediate
439
+ throttledInvalidate();
440
+ }
441
+ });
442
+ return () => {
443
+ unsubscribe();
444
+ client.disconnect();
445
+ };
446
+ }, [
447
+ sessionId,
448
+ queryClient,
449
+ addPendingApproval,
450
+ removePendingApproval,
451
+ setPendingApprovals,
452
+ updatePendingApproval,
453
+ ]);
454
+ }
455
+ //# sourceMappingURL=useSessionStream.js.map