@arbidocs/react 0.5.111 → 0.5.113

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 (972) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/config/config-hooks.js +209 -0
  304. package/dist/config/config-hooks.js.map +7 -0
  305. package/dist/connectivity.js +72 -0
  306. package/dist/connectivity.js.map +7 -0
  307. package/dist/connectors/hooks.js +263 -0
  308. package/dist/connectors/hooks.js.map +7 -0
  309. package/dist/connectors/index.js +28 -0
  310. package/dist/connectors/index.js.map +7 -0
  311. package/dist/contacts.js +100 -0
  312. package/dist/contacts.js.map +7 -0
  313. package/dist/conversation-list.js +65 -0
  314. package/dist/conversation-list.js.map +7 -0
  315. package/dist/databases.js +195 -0
  316. package/dist/databases.js.map +7 -0
  317. package/dist/datasets/aggregate.js +281 -0
  318. package/dist/datasets/aggregate.js.map +7 -0
  319. package/dist/datasets/index.js +122 -0
  320. package/dist/datasets/index.js.map +7 -0
  321. package/dist/datasets/members.js +27 -0
  322. package/dist/datasets/members.js.map +7 -0
  323. package/dist/datasets/panel.js +44 -0
  324. package/dist/datasets/panel.js.map +7 -0
  325. package/dist/datasets/registry.js +47 -0
  326. package/dist/datasets/registry.js.map +7 -0
  327. package/dist/datasets/rows-source.js +44 -0
  328. package/dist/datasets/rows-source.js.map +7 -0
  329. package/dist/datasets/sources/activity.js +83 -0
  330. package/dist/datasets/sources/activity.js.map +7 -0
  331. package/dist/datasets/sources/conversations.js +74 -0
  332. package/dist/datasets/sources/conversations.js.map +7 -0
  333. package/dist/datasets/sources/database.js +209 -0
  334. package/dist/datasets/sources/database.js.map +7 -0
  335. package/dist/datasets/sources/documents.js +93 -0
  336. package/dist/datasets/sources/documents.js.map +7 -0
  337. package/dist/datasets/sources/facts.js +56 -0
  338. package/dist/datasets/sources/facts.js.map +7 -0
  339. package/dist/datasets/sources/projects.js +117 -0
  340. package/dist/datasets/sources/projects.js.map +7 -0
  341. package/dist/datasets/sources/tags.js +67 -0
  342. package/dist/datasets/sources/tags.js.map +7 -0
  343. package/dist/datasets/sources/usage.js +268 -0
  344. package/dist/datasets/sources/usage.js.map +7 -0
  345. package/dist/datasets/sources/workflows.js +91 -0
  346. package/dist/datasets/sources/workflows.js.map +7 -0
  347. package/dist/datasets/sources/workspaces.js +67 -0
  348. package/dist/datasets/sources/workspaces.js.map +7 -0
  349. package/dist/datasets/store.js +194 -0
  350. package/dist/datasets/store.js.map +7 -0
  351. package/dist/datasets/types.js +14 -0
  352. package/dist/datasets/types.js.map +7 -0
  353. package/dist/directmessages/ConversationList.js +148 -0
  354. package/dist/directmessages/ConversationList.js.map +7 -0
  355. package/dist/directmessages/DateSeparator.js +8 -0
  356. package/dist/directmessages/DateSeparator.js.map +7 -0
  357. package/dist/directmessages/DmAvatar.js +29 -0
  358. package/dist/directmessages/DmAvatar.js.map +7 -0
  359. package/dist/directmessages/DmComposer.js +201 -0
  360. package/dist/directmessages/DmComposer.js.map +7 -0
  361. package/dist/directmessages/arrivals.js +29 -0
  362. package/dist/directmessages/arrivals.js.map +7 -0
  363. package/dist/directmessages/chat-cache.js +192 -0
  364. package/dist/directmessages/chat-cache.js.map +7 -0
  365. package/dist/directmessages/grouping.js +26 -0
  366. package/dist/directmessages/grouping.js.map +7 -0
  367. package/dist/directmessages/index.js +81 -0
  368. package/dist/directmessages/index.js.map +7 -0
  369. package/dist/directmessages/useChats.js +266 -0
  370. package/dist/directmessages/useChats.js.map +7 -0
  371. package/dist/directmessages/utils.js +23 -0
  372. package/dist/directmessages/utils.js.map +7 -0
  373. package/dist/document-tools/can-annotate.js +7 -0
  374. package/dist/document-tools/can-annotate.js.map +7 -0
  375. package/dist/document-tools/core.js +218 -12
  376. package/dist/document-tools/core.js.map +7 -1
  377. package/dist/document-tools/document-pdf.js +76 -0
  378. package/dist/document-tools/document-pdf.js.map +7 -0
  379. package/dist/document-tools/environment.js +136 -0
  380. package/dist/document-tools/environment.js.map +7 -0
  381. package/dist/document-tools/file-shares.js +112 -0
  382. package/dist/document-tools/file-shares.js.map +7 -0
  383. package/dist/document-tools/frozen-copy.js +27 -0
  384. package/dist/document-tools/frozen-copy.js.map +7 -0
  385. package/dist/document-tools/index.js +26 -148
  386. package/dist/document-tools/index.js.map +7 -1
  387. package/dist/document-tools/markup-download.js +51 -0
  388. package/dist/document-tools/markup-download.js.map +7 -0
  389. package/dist/document-tools/markup-store.js +138 -0
  390. package/dist/document-tools/markup-store.js.map +7 -0
  391. package/dist/document-tools/markup-transfer.js +88 -0
  392. package/dist/document-tools/markup-transfer.js.map +7 -0
  393. package/dist/document-tools/production.js +147 -0
  394. package/dist/document-tools/production.js.map +7 -0
  395. package/dist/document-tools/saved-signature.js +90 -0
  396. package/dist/document-tools/saved-signature.js.map +7 -0
  397. package/dist/document-tools/signature-requests.js +310 -0
  398. package/dist/document-tools/signature-requests.js.map +7 -0
  399. package/dist/document-tools/signing.js +127 -0
  400. package/dist/document-tools/signing.js.map +7 -0
  401. package/dist/document-tools/useDocumentBytes.js +38 -0
  402. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  403. package/dist/document-tools/useDocumentMarkup.js +154 -0
  404. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  405. package/dist/document-tools/useIsOnline.js +13 -0
  406. package/dist/document-tools/useIsOnline.js.map +7 -0
  407. package/dist/document-tools/verification.js +60 -0
  408. package/dist/document-tools/verification.js.map +7 -0
  409. package/dist/documents/DocumentReview.js +220 -0
  410. package/dist/documents/DocumentReview.js.map +7 -0
  411. package/dist/documents/DraftTitleControls.js +41 -0
  412. package/dist/documents/DraftTitleControls.js.map +7 -0
  413. package/dist/documents/InlineMicButton.js +90 -0
  414. package/dist/documents/InlineMicButton.js.map +7 -0
  415. package/dist/documents/MicRecordingOverlay.js +29 -0
  416. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  417. package/dist/documents/MicWaveformIndicator.js +68 -0
  418. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  419. package/dist/documents/PhotoCapture.js +120 -0
  420. package/dist/documents/PhotoCapture.js.map +7 -0
  421. package/dist/documents/VideoCapture.js +129 -0
  422. package/dist/documents/VideoCapture.js.map +7 -0
  423. package/dist/documents/VoiceNoteRecorder.js +166 -0
  424. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  425. package/dist/documents/audio-segmenter.js +63 -0
  426. package/dist/documents/audio-segmenter.js.map +7 -0
  427. package/dist/documents/capture-frame.js +21 -0
  428. package/dist/documents/capture-frame.js.map +7 -0
  429. package/dist/documents/chunked-recorder.js +190 -0
  430. package/dist/documents/chunked-recorder.js.map +7 -0
  431. package/dist/documents/document-download.js +53 -0
  432. package/dist/documents/document-download.js.map +7 -0
  433. package/dist/documents/document-fields.js +109 -0
  434. package/dist/documents/document-fields.js.map +7 -0
  435. package/dist/documents/documents-cache.js +110 -0
  436. package/dist/documents/documents-cache.js.map +7 -0
  437. package/dist/documents/documents-data.js +128 -0
  438. package/dist/documents/documents-data.js.map +7 -0
  439. package/dist/documents/documents-loader.js +113 -0
  440. package/dist/documents/documents-loader.js.map +7 -0
  441. package/dist/documents/documents-writes.js +448 -0
  442. package/dist/documents/documents-writes.js.map +7 -0
  443. package/dist/documents/format-elapsed.js +10 -0
  444. package/dist/documents/format-elapsed.js.map +7 -0
  445. package/dist/documents/has-video-track.js +26 -0
  446. package/dist/documents/has-video-track.js.map +7 -0
  447. package/dist/documents/index.js +266 -0
  448. package/dist/documents/index.js.map +7 -0
  449. package/dist/documents/media-error.js +18 -0
  450. package/dist/documents/media-error.js.map +7 -0
  451. package/dist/documents/offline-documents.js +160 -0
  452. package/dist/documents/offline-documents.js.map +7 -0
  453. package/dist/documents/pending-sync.js +210 -0
  454. package/dist/documents/pending-sync.js.map +7 -0
  455. package/dist/documents/processing-live.js +122 -0
  456. package/dist/documents/processing-live.js.map +7 -0
  457. package/dist/documents/processing-order.js +59 -0
  458. package/dist/documents/processing-order.js.map +7 -0
  459. package/dist/documents/processing-settle.js +21 -0
  460. package/dist/documents/processing-settle.js.map +7 -0
  461. package/dist/documents/related-documents.js +133 -0
  462. package/dist/documents/related-documents.js.map +7 -0
  463. package/dist/documents/support.js +29 -0
  464. package/dist/documents/support.js.map +7 -0
  465. package/dist/documents/upload-files.js +169 -0
  466. package/dist/documents/upload-files.js.map +7 -0
  467. package/dist/documents/useAudioRecorder.js +315 -0
  468. package/dist/documents/useAudioRecorder.js.map +7 -0
  469. package/dist/documents/useCameraStream.js +35 -0
  470. package/dist/documents/useCameraStream.js.map +7 -0
  471. package/dist/documents/useDocumentThumbnails.js +71 -0
  472. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  473. package/dist/documents/useDownloadDocuments.js +90 -0
  474. package/dist/documents/useDownloadDocuments.js.map +7 -0
  475. package/dist/documents/usePassageQuotes.js +37 -0
  476. package/dist/documents/usePassageQuotes.js.map +7 -0
  477. package/dist/documents/useUploadFiles.js +165 -0
  478. package/dist/documents/useUploadFiles.js.map +7 -0
  479. package/dist/documents/useUploadFromUrls.js +63 -0
  480. package/dist/documents/useUploadFromUrls.js.map +7 -0
  481. package/dist/documents/useVideoRecorder.js +62 -0
  482. package/dist/documents/useVideoRecorder.js.map +7 -0
  483. package/dist/entities/AgentMarkers.js +61 -0
  484. package/dist/entities/AgentMarkers.js.map +7 -0
  485. package/dist/entities/DocumentEntity.js +125 -0
  486. package/dist/entities/DocumentEntity.js.map +7 -0
  487. package/dist/entities/EntityPill.js +250 -0
  488. package/dist/entities/EntityPill.js.map +7 -0
  489. package/dist/entities/ProjectEntity.js +61 -0
  490. package/dist/entities/ProjectEntity.js.map +7 -0
  491. package/dist/entities/ShieldIcon.js +49 -0
  492. package/dist/entities/ShieldIcon.js.map +7 -0
  493. package/dist/entities/TagEntity.js +79 -0
  494. package/dist/entities/TagEntity.js.map +7 -0
  495. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  496. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  497. package/dist/entities/UserEntity.js +211 -0
  498. package/dist/entities/UserEntity.js.map +7 -0
  499. package/dist/entities/VerifiedBadge.js +19 -0
  500. package/dist/entities/VerifiedBadge.js.map +7 -0
  501. package/dist/entities/agent-avatar-colors.js +26 -0
  502. package/dist/entities/agent-avatar-colors.js.map +7 -0
  503. package/dist/entities/colors.js +64 -0
  504. package/dist/entities/colors.js.map +7 -0
  505. package/dist/entities/file-type.js +151 -0
  506. package/dist/entities/file-type.js.map +7 -0
  507. package/dist/entities/index.js +100 -0
  508. package/dist/entities/index.js.map +7 -0
  509. package/dist/entities/media-type.js +61 -0
  510. package/dist/entities/media-type.js.map +7 -0
  511. package/dist/entities/registry.js +385 -0
  512. package/dist/entities/registry.js.map +7 -0
  513. package/dist/entities/status.js +43 -0
  514. package/dist/entities/status.js.map +7 -0
  515. package/dist/entities/tag-kinds.js +23 -0
  516. package/dist/entities/tag-kinds.js.map +7 -0
  517. package/dist/entities/tag-types.js +44 -0
  518. package/dist/entities/tag-types.js.map +7 -0
  519. package/dist/entities/vocabulary.js +12 -0
  520. package/dist/entities/vocabulary.js.map +7 -0
  521. package/dist/entity-extraction.js +25 -0
  522. package/dist/entity-extraction.js.map +7 -0
  523. package/dist/facts-search.js +57 -0
  524. package/dist/facts-search.js.map +7 -0
  525. package/dist/facts.js +69 -0
  526. package/dist/facts.js.map +7 -0
  527. package/dist/hooks.js +320 -0
  528. package/dist/hooks.js.map +7 -0
  529. package/dist/host/ArbiHost.js +24 -0
  530. package/dist/host/ArbiHost.js.map +7 -0
  531. package/dist/host/assistant-copy.js +54 -0
  532. package/dist/host/assistant-copy.js.map +7 -0
  533. package/dist/host/config.js +9 -0
  534. package/dist/host/config.js.map +7 -0
  535. package/dist/host/context.js +10 -0
  536. package/dist/host/context.js.map +7 -0
  537. package/dist/host/features.js +144 -0
  538. package/dist/host/features.js.map +7 -0
  539. package/dist/host/index.js +12 -0
  540. package/dist/host/index.js.map +7 -0
  541. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  542. package/dist/host/merge.js.map +7 -0
  543. package/dist/house-template.js +40 -0
  544. package/dist/house-template.js.map +7 -0
  545. package/dist/icons/AppleIcon.js +25 -0
  546. package/dist/icons/AppleIcon.js.map +7 -0
  547. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  548. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  549. package/dist/icons/ArbiIcon.js +24 -0
  550. package/dist/icons/ArbiIcon.js.map +7 -0
  551. package/dist/icons/AudIcon.js +56 -0
  552. package/dist/icons/AudIcon.js.map +7 -0
  553. package/dist/icons/ClaudeIcon.js +28 -0
  554. package/dist/icons/ClaudeIcon.js.map +7 -0
  555. package/dist/icons/DocIcon.js +56 -0
  556. package/dist/icons/DocIcon.js.map +7 -0
  557. package/dist/icons/EmlIcon.js +57 -0
  558. package/dist/icons/EmlIcon.js.map +7 -0
  559. package/dist/icons/FireworksIcon.js +47 -0
  560. package/dist/icons/FireworksIcon.js.map +7 -0
  561. package/dist/icons/GeminiIcon.js +37 -0
  562. package/dist/icons/GeminiIcon.js.map +7 -0
  563. package/dist/icons/GitHubIcon.js +32 -0
  564. package/dist/icons/GitHubIcon.js.map +7 -0
  565. package/dist/icons/GoogleIcon.js +53 -0
  566. package/dist/icons/GoogleIcon.js.map +7 -0
  567. package/dist/icons/HtmlIcon.js +56 -0
  568. package/dist/icons/HtmlIcon.js.map +7 -0
  569. package/dist/icons/ImgIcon.js +56 -0
  570. package/dist/icons/ImgIcon.js.map +7 -0
  571. package/dist/icons/LinkedInIcon.js +25 -0
  572. package/dist/icons/LinkedInIcon.js.map +7 -0
  573. package/dist/icons/OpenAIIcon.js +28 -0
  574. package/dist/icons/OpenAIIcon.js.map +7 -0
  575. package/dist/icons/PdfIcon.js +56 -0
  576. package/dist/icons/PdfIcon.js.map +7 -0
  577. package/dist/icons/ProviderIcon.js +42 -0
  578. package/dist/icons/ProviderIcon.js.map +7 -0
  579. package/dist/icons/TxtIcon.js +56 -0
  580. package/dist/icons/TxtIcon.js.map +7 -0
  581. package/dist/icons/VidIcon.js +56 -0
  582. package/dist/icons/VidIcon.js.map +7 -0
  583. package/dist/icons/XlsIcon.js +56 -0
  584. package/dist/icons/XlsIcon.js.map +7 -0
  585. package/dist/icons/arbi-mark.js +5 -0
  586. package/dist/icons/arbi-mark.js.map +7 -0
  587. package/dist/icons/colors.js +31 -0
  588. package/dist/icons/colors.js.map +7 -0
  589. package/dist/icons/file-type.js +105 -0
  590. package/dist/icons/file-type.js.map +7 -0
  591. package/dist/icons/index.js +55 -0
  592. package/dist/icons/index.js.map +7 -0
  593. package/dist/imagecrop/ImageCropModal.js +56 -0
  594. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  595. package/dist/imagecrop/ImageCropper.js +100 -0
  596. package/dist/imagecrop/ImageCropper.js.map +7 -0
  597. package/dist/imagecrop/cropImage.js +43 -0
  598. package/dist/imagecrop/cropImage.js.map +7 -0
  599. package/dist/imagecrop/index.js +13 -0
  600. package/dist/imagecrop/index.js.map +7 -0
  601. package/dist/index.js +702 -17116
  602. package/dist/index.js.map +7 -1
  603. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  604. package/dist/lazy-chunk.js.map +7 -0
  605. package/dist/lib/collision-padding.js +13 -0
  606. package/dist/lib/collision-padding.js.map +7 -0
  607. package/dist/lib/format-friendly-date.js +55 -0
  608. package/dist/lib/format-friendly-date.js.map +7 -0
  609. package/dist/lib/format-relative-time.js +52 -0
  610. package/dist/lib/format-relative-time.js.map +7 -0
  611. package/dist/lib/markdown-to-text.js +35 -0
  612. package/dist/lib/markdown-to-text.js.map +7 -0
  613. package/dist/lib/toast-interaction.js +9 -0
  614. package/dist/lib/toast-interaction.js.map +7 -0
  615. package/dist/lib/utils.js +9 -0
  616. package/dist/lib/utils.js.map +7 -0
  617. package/dist/mail/client.js +103 -0
  618. package/dist/mail/client.js.map +7 -0
  619. package/dist/mail/document-attachment.js +38 -0
  620. package/dist/mail/document-attachment.js.map +7 -0
  621. package/dist/mail/filing.js +132 -0
  622. package/dist/mail/filing.js.map +7 -0
  623. package/dist/mail/hooks.js +393 -0
  624. package/dist/mail/hooks.js.map +7 -0
  625. package/dist/mail/index.js +120 -0
  626. package/dist/mail/index.js.map +7 -0
  627. package/dist/mail/offline/changes.js +258 -0
  628. package/dist/mail/offline/changes.js.map +7 -0
  629. package/dist/mail/offline/confirm-sign-out.js +37 -0
  630. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  631. package/dist/mail/offline/crypto.js +26 -0
  632. package/dist/mail/offline/crypto.js.map +7 -0
  633. package/dist/mail/offline/drafts.js +69 -0
  634. package/dist/mail/offline/drafts.js.map +7 -0
  635. package/dist/mail/offline/hooks.js +104 -0
  636. package/dist/mail/offline/hooks.js.map +7 -0
  637. package/dist/mail/offline/index.js +48 -0
  638. package/dist/mail/offline/index.js.map +7 -0
  639. package/dist/mail/offline/live.js +233 -0
  640. package/dist/mail/offline/live.js.map +7 -0
  641. package/dist/mail/offline/mailbox.js +191 -0
  642. package/dist/mail/offline/mailbox.js.map +7 -0
  643. package/dist/mail/offline/outbox.js +167 -0
  644. package/dist/mail/offline/outbox.js.map +7 -0
  645. package/dist/mail/offline/reads.js +159 -0
  646. package/dist/mail/offline/reads.js.map +7 -0
  647. package/dist/mail/offline/runtime.js +100 -0
  648. package/dist/mail/offline/runtime.js.map +7 -0
  649. package/dist/mail/offline/settings.js +84 -0
  650. package/dist/mail/offline/settings.js.map +7 -0
  651. package/dist/mail/offline/store.js +29 -0
  652. package/dist/mail/offline/store.js.map +7 -0
  653. package/dist/mail/offline/sync.js +251 -0
  654. package/dist/mail/offline/sync.js.map +7 -0
  655. package/dist/mail/offline/wipe.js +19 -0
  656. package/dist/mail/offline/wipe.js.map +7 -0
  657. package/dist/mail/thread-keys.js +53 -0
  658. package/dist/mail/thread-keys.js.map +7 -0
  659. package/dist/mail/threads.js +71 -0
  660. package/dist/mail/threads.js.map +7 -0
  661. package/dist/mail/useMailClient.js +42 -0
  662. package/dist/mail/useMailClient.js.map +7 -0
  663. package/dist/model-connections.js +58 -0
  664. package/dist/model-connections.js.map +7 -0
  665. package/dist/notifications/ActivityFeed.js +70 -0
  666. package/dist/notifications/ActivityFeed.js.map +7 -0
  667. package/dist/notifications/NotificationBell.js +200 -0
  668. package/dist/notifications/NotificationBell.js.map +7 -0
  669. package/dist/notifications/Toaster.js +24 -0
  670. package/dist/notifications/Toaster.js.map +7 -0
  671. package/dist/notifications/activity-types.js +65 -0
  672. package/dist/notifications/activity-types.js.map +7 -0
  673. package/dist/notifications/bell.js +24 -0
  674. package/dist/notifications/bell.js.map +7 -0
  675. package/dist/notifications/calendar-notifications.js +79 -0
  676. package/dist/notifications/calendar-notifications.js.map +7 -0
  677. package/dist/notifications/index.js +108 -0
  678. package/dist/notifications/index.js.map +7 -0
  679. package/dist/notifications/live.js +28 -0
  680. package/dist/notifications/live.js.map +7 -0
  681. package/dist/notifications/notification-types.js +127 -0
  682. package/dist/notifications/notification-types.js.map +7 -0
  683. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  684. package/dist/notifications/notify-store.js.map +7 -0
  685. package/dist/notifications/server-notifications.js +452 -0
  686. package/dist/notifications/server-notifications.js.map +7 -0
  687. package/dist/notifications/useNotifications.js +34 -0
  688. package/dist/notifications/useNotifications.js.map +7 -0
  689. package/dist/offline-store/network.js +11 -0
  690. package/dist/offline-store/network.js.map +7 -0
  691. package/dist/offline-store/store.js +136 -0
  692. package/dist/offline-store/store.js.map +7 -0
  693. package/dist/offline-store/wipe.js +8 -0
  694. package/dist/offline-store/wipe.js.map +7 -0
  695. package/dist/offline.js +58 -0
  696. package/dist/offline.js.map +7 -0
  697. package/dist/people.js +122 -0
  698. package/dist/people.js.map +7 -0
  699. package/dist/projects.js +30 -0
  700. package/dist/projects.js.map +7 -0
  701. package/dist/query-client.js +63 -0
  702. package/dist/query-client.js.map +7 -0
  703. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  704. package/dist/query-keys.js.map +7 -0
  705. package/dist/query-persist.js +66 -0
  706. package/dist/query-persist.js.map +7 -0
  707. package/dist/queued-writes.js +59 -0
  708. package/dist/queued-writes.js.map +7 -0
  709. package/dist/remote-control.js +67 -0
  710. package/dist/remote-control.js.map +7 -0
  711. package/dist/search/index.js +23 -0
  712. package/dist/search/index.js.map +7 -0
  713. package/dist/search/session.js +58 -0
  714. package/dist/search/session.js.map +7 -0
  715. package/dist/search/useSemanticSearch.js +82 -0
  716. package/dist/search/useSemanticSearch.js.map +7 -0
  717. package/dist/session/chat.js +512 -0
  718. package/dist/session/chat.js.map +7 -0
  719. package/dist/session/documents.js +196 -0
  720. package/dist/session/documents.js.map +7 -0
  721. package/dist/session/drafts.js +103 -0
  722. package/dist/session/drafts.js.map +7 -0
  723. package/dist/session/index.js +123 -0
  724. package/dist/session/index.js.map +7 -0
  725. package/dist/session/layout.js +339 -0
  726. package/dist/session/layout.js.map +7 -0
  727. package/dist/session/persist.js +106 -0
  728. package/dist/session/persist.js.map +7 -0
  729. package/dist/session/session-hooks.js +53 -0
  730. package/dist/session/session-hooks.js.map +7 -0
  731. package/dist/session/signed-in.js +36 -0
  732. package/dist/session/signed-in.js.map +7 -0
  733. package/dist/session/store.js +166 -0
  734. package/dist/session/store.js.map +7 -0
  735. package/dist/session/thread-tabs.js +121 -0
  736. package/dist/session/thread-tabs.js.map +7 -0
  737. package/dist/session/ui-state-storage.js +76 -0
  738. package/dist/session/ui-state-storage.js.map +7 -0
  739. package/dist/session/workspace.js +77 -0
  740. package/dist/session/workspace.js.map +7 -0
  741. package/dist/shell/index.js +43 -10
  742. package/dist/shell/index.js.map +7 -1
  743. package/dist/skill-pack.js +111 -0
  744. package/dist/skill-pack.js.map +7 -0
  745. package/dist/storage.js +186 -0
  746. package/dist/storage.js.map +7 -0
  747. package/dist/support/index.js +35 -0
  748. package/dist/support/index.js.map +7 -0
  749. package/dist/tags.js +204 -0
  750. package/dist/tags.js.map +7 -0
  751. package/dist/ui/DebouncedInput.js +109 -0
  752. package/dist/ui/DebouncedInput.js.map +7 -0
  753. package/dist/ui/DictateContext.js +8 -0
  754. package/dist/ui/DictateContext.js.map +7 -0
  755. package/dist/ui/IconToggle.js +79 -0
  756. package/dist/ui/IconToggle.js.map +7 -0
  757. package/dist/ui/VerifiedToggle.js +38 -0
  758. package/dist/ui/VerifiedToggle.js.map +7 -0
  759. package/dist/ui/VisibilityToggle.js +103 -0
  760. package/dist/ui/VisibilityToggle.js.map +7 -0
  761. package/dist/ui/avatar.js +40 -0
  762. package/dist/ui/avatar.js.map +7 -0
  763. package/dist/ui/badge.js +28 -0
  764. package/dist/ui/badge.js.map +7 -0
  765. package/dist/ui/button.js +48 -0
  766. package/dist/ui/button.js.map +7 -0
  767. package/dist/ui/card.js +90 -0
  768. package/dist/ui/card.js.map +7 -0
  769. package/dist/ui/checkbox.js +22 -0
  770. package/dist/ui/checkbox.js.map +7 -0
  771. package/dist/ui/collapsible.js +10 -0
  772. package/dist/ui/collapsible.js.map +7 -0
  773. package/dist/ui/command.js +103 -0
  774. package/dist/ui/command.js.map +7 -0
  775. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  776. package/dist/ui/dialog.js.map +7 -0
  777. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  778. package/dist/ui/dropdown-menu.js.map +7 -0
  779. package/dist/ui/hover-card.js +36 -0
  780. package/dist/ui/hover-card.js.map +7 -0
  781. package/dist/ui/index.js +290 -10
  782. package/dist/ui/index.js.map +7 -1
  783. package/dist/ui/input.js +65 -0
  784. package/dist/ui/input.js.map +7 -0
  785. package/dist/ui/label.js +16 -0
  786. package/dist/ui/label.js.map +7 -0
  787. package/dist/ui/mark-menu.js +300 -0
  788. package/dist/ui/mark-menu.js.map +7 -0
  789. package/dist/ui/popover.js +40 -0
  790. package/dist/ui/popover.js.map +7 -0
  791. package/dist/ui/portal-container.js +17 -0
  792. package/dist/ui/portal-container.js.map +7 -0
  793. package/dist/ui/progress.js +24 -0
  794. package/dist/ui/progress.js.map +7 -0
  795. package/dist/ui/radio-group.js +29 -0
  796. package/dist/ui/radio-group.js.map +7 -0
  797. package/dist/ui/scroll-area.js +39 -0
  798. package/dist/ui/scroll-area.js.map +7 -0
  799. package/dist/ui/select.js +130 -0
  800. package/dist/ui/select.js.map +7 -0
  801. package/dist/ui/separator.js +23 -0
  802. package/dist/ui/separator.js.map +7 -0
  803. package/dist/ui/slider.js +23 -0
  804. package/dist/ui/slider.js.map +7 -0
  805. package/dist/ui/switch.js +28 -0
  806. package/dist/ui/switch.js.map +7 -0
  807. package/dist/ui/table.js +75 -0
  808. package/dist/ui/table.js.map +7 -0
  809. package/dist/ui/tabs.js +48 -0
  810. package/dist/ui/tabs.js.map +7 -0
  811. package/dist/ui/textarea.js +63 -0
  812. package/dist/ui/textarea.js.map +7 -0
  813. package/dist/ui/toggle-group.js +43 -0
  814. package/dist/ui/toggle-group.js.map +7 -0
  815. package/dist/ui/toggle.js +40 -0
  816. package/dist/ui/toggle.js.map +7 -0
  817. package/dist/ui/tooltip.js +215 -0
  818. package/dist/ui/tooltip.js.map +7 -0
  819. package/dist/usage-metered.js +8 -0
  820. package/dist/usage-metered.js.map +7 -0
  821. package/dist/useArbi.js +16 -0
  822. package/dist/useArbi.js.map +7 -0
  823. package/dist/useInstallSkillPack.js +81 -0
  824. package/dist/useInstallSkillPack.js.map +7 -0
  825. package/dist/usermenu/UserMenu.js +188 -0
  826. package/dist/usermenu/UserMenu.js.map +7 -0
  827. package/dist/usermenu/index.js +5 -0
  828. package/dist/usermenu/index.js.map +7 -0
  829. package/dist/users/index.js +15 -0
  830. package/dist/users/index.js.map +7 -0
  831. package/dist/users/user-display.js +60 -0
  832. package/dist/users/user-display.js.map +7 -0
  833. package/dist/viewers/AudioViewer.js +23 -0
  834. package/dist/viewers/AudioViewer.js.map +7 -0
  835. package/dist/viewers/DocxViewer.js +81 -0
  836. package/dist/viewers/DocxViewer.js.map +7 -0
  837. package/dist/viewers/ImageViewer.js +31 -0
  838. package/dist/viewers/ImageViewer.js.map +7 -0
  839. package/dist/viewers/PdfViewer.js +19 -3
  840. package/dist/viewers/PdfViewer.js.map +7 -1
  841. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  842. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  843. package/dist/viewers/VideoViewer.js +31 -0
  844. package/dist/viewers/VideoViewer.js.map +7 -0
  845. package/dist/viewers/XlsxViewer.js +102 -0
  846. package/dist/viewers/XlsxViewer.js.map +7 -0
  847. package/dist/viewers/index.js +61 -271
  848. package/dist/viewers/index.js.map +7 -1
  849. package/dist/viewers/page-scroll.js +59 -0
  850. package/dist/viewers/page-scroll.js.map +7 -0
  851. package/dist/viewers/pdf-viewer-constants.js +9 -0
  852. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  853. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  854. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  855. package/dist/viewers/selection-runs.js +38 -0
  856. package/dist/viewers/selection-runs.js.map +7 -0
  857. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  858. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  859. package/dist/viewers/useProcessedChunks.js +58 -0
  860. package/dist/viewers/useProcessedChunks.js.map +7 -0
  861. package/dist/viewers/viewer-zoom.js +163 -0
  862. package/dist/viewers/viewer-zoom.js.map +7 -0
  863. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  864. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  865. package/dist/websocket/context.js +14 -0
  866. package/dist/websocket/context.js.map +7 -0
  867. package/dist/websocket/hooks.js +30 -0
  868. package/dist/websocket/hooks.js.map +7 -0
  869. package/dist/websocket/index.js +22 -0
  870. package/dist/websocket/index.js.map +7 -0
  871. package/dist/websocket/live-updates.js +38 -0
  872. package/dist/websocket/live-updates.js.map +7 -0
  873. package/dist/websocket/reconnect.js +13 -0
  874. package/dist/websocket/reconnect.js.map +7 -0
  875. package/dist/websocket/store.js +58 -0
  876. package/dist/websocket/store.js.map +7 -0
  877. package/dist/workforce.js +607 -0
  878. package/dist/workforce.js.map +7 -0
  879. package/dist/workspaces/access-request.js +35 -0
  880. package/dist/workspaces/access-request.js.map +7 -0
  881. package/dist/workspaces/archive.js +59 -0
  882. package/dist/workspaces/archive.js.map +7 -0
  883. package/dist/workspaces/current.js +20 -0
  884. package/dist/workspaces/current.js.map +7 -0
  885. package/dist/workspaces/delete-workspaces.js +15 -0
  886. package/dist/workspaces/delete-workspaces.js.map +7 -0
  887. package/dist/workspaces/export-archive.js +40 -0
  888. package/dist/workspaces/export-archive.js.map +7 -0
  889. package/dist/workspaces/index.js +99 -0
  890. package/dist/workspaces/index.js.map +7 -0
  891. package/dist/workspaces/settings.js +45 -0
  892. package/dist/workspaces/settings.js.map +7 -0
  893. package/dist/workspaces/shell-workspaces.js +49 -0
  894. package/dist/workspaces/shell-workspaces.js.map +7 -0
  895. package/dist/workspaces/switch.js +234 -0
  896. package/dist/workspaces/switch.js.map +7 -0
  897. package/dist/workspaces/transfer.js +170 -0
  898. package/dist/workspaces/transfer.js.map +7 -0
  899. package/dist/workspaces/useShellWorkspaces.js +86 -0
  900. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  901. package/dist/workspaces/workspace-users.js +65 -0
  902. package/dist/workspaces/workspace-users.js.map +7 -0
  903. package/package.json +4 -4
  904. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  905. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  906. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  907. package/dist/annotations/freeze/index.d.cts +0 -205
  908. package/dist/annotations/index.d.cts +0 -360
  909. package/dist/artifacts/index.d.cts +0 -476
  910. package/dist/artifacts/redline-core.d.cts +0 -39
  911. package/dist/bundle-YNOX7VIL.js +0 -5
  912. package/dist/bundle-YNOX7VIL.js.map +0 -1
  913. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  914. package/dist/calls/livekit/index.d.cts +0 -280
  915. package/dist/chunk-47CCGUWR.js.map +0 -1
  916. package/dist/chunk-4FL3X3LA.js +0 -2057
  917. package/dist/chunk-4FL3X3LA.js.map +0 -1
  918. package/dist/chunk-6QNBSXCE.js +0 -271
  919. package/dist/chunk-6QNBSXCE.js.map +0 -1
  920. package/dist/chunk-74N436VK.js.map +0 -1
  921. package/dist/chunk-APZZQZ6P.js +0 -147
  922. package/dist/chunk-APZZQZ6P.js.map +0 -1
  923. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  924. package/dist/chunk-DPYBZDJB.js.map +0 -1
  925. package/dist/chunk-DZKRL5H3.js +0 -2766
  926. package/dist/chunk-DZKRL5H3.js.map +0 -1
  927. package/dist/chunk-HDCRPPBW.js +0 -75
  928. package/dist/chunk-HDCRPPBW.js.map +0 -1
  929. package/dist/chunk-L2IPPTVC.js +0 -20
  930. package/dist/chunk-L2IPPTVC.js.map +0 -1
  931. package/dist/chunk-LSU4UPS5.js +0 -1011
  932. package/dist/chunk-LSU4UPS5.js.map +0 -1
  933. package/dist/chunk-NIKPG4PW.js +0 -1128
  934. package/dist/chunk-NIKPG4PW.js.map +0 -1
  935. package/dist/chunk-NNAJLY6B.js +0 -4974
  936. package/dist/chunk-NNAJLY6B.js.map +0 -1
  937. package/dist/chunk-OYPKKHXY.js +0 -559
  938. package/dist/chunk-OYPKKHXY.js.map +0 -1
  939. package/dist/chunk-PTOP7OHG.js.map +0 -1
  940. package/dist/chunk-QMY2JKBI.js +0 -246
  941. package/dist/chunk-QMY2JKBI.js.map +0 -1
  942. package/dist/chunk-SN5YV6FF.js +0 -11
  943. package/dist/chunk-SN5YV6FF.js.map +0 -1
  944. package/dist/chunk-SSXFVWCT.js.map +0 -1
  945. package/dist/chunk-T3USOSVN.js.map +0 -1
  946. package/dist/chunk-T4CLW3DN.js +0 -2560
  947. package/dist/chunk-T4CLW3DN.js.map +0 -1
  948. package/dist/chunk-UW2SGTI5.js.map +0 -1
  949. package/dist/chunk-VSCU7K4V.js.map +0 -1
  950. package/dist/chunk-WL2Y2T47.js.map +0 -1
  951. package/dist/chunk-WUTL62MC.js.map +0 -1
  952. package/dist/chunk-XWPLOFDN.js +0 -644
  953. package/dist/chunk-XWPLOFDN.js.map +0 -1
  954. package/dist/chunk-Y3MTRA7D.js +0 -97
  955. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  956. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  957. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  958. package/dist/document-tools/core.d.cts +0 -883
  959. package/dist/document-tools/index.d.cts +0 -90
  960. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  961. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  962. package/dist/index.d.cts +0 -15923
  963. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  964. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  965. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  966. package/dist/shell/index.d.cts +0 -6
  967. package/dist/store.d-GADDvC7w.d.cts +0 -35
  968. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  969. package/dist/ui/index.d.cts +0 -26
  970. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  971. package/dist/viewers/PdfViewer.d.cts +0 -9
  972. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,73 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { notify } from "../shell/index.js";
3
+ import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
4
+ function useDocumentAutoAdd({
5
+ selectedWorkspaceId,
6
+ allWorkspaceDocuments,
7
+ hasContent = false
8
+ }) {
9
+ const session = useArbiSessionStore();
10
+ const currentConversationId = useArbiSessionState((state) => state.conversationId);
11
+ const convKey = currentConversationId || "new";
12
+ const observedRef = useRef(null);
13
+ const offeredRef = useRef(/* @__PURE__ */ new Set());
14
+ useEffect(() => {
15
+ if (!selectedWorkspaceId) return;
16
+ const docs = (allWorkspaceDocuments ?? []).filter((doc) => doc?.external_id);
17
+ if (!docs.length) return;
18
+ const state = session.getState();
19
+ const current = state.conversationDocuments[convKey];
20
+ const autoAdd = state.conversationDocumentAutoAdd[convKey];
21
+ const key = `${selectedWorkspaceId}:${convKey}`;
22
+ const previous = observedRef.current;
23
+ const arrivals = previous?.key === key ? docs.filter((doc) => !previous.ids.has(doc.external_id)) : [];
24
+ observedRef.current = { key, ids: new Set(docs.map((doc) => doc.external_id)) };
25
+ const selected = new Set((current ?? []).map((doc) => doc.docId));
26
+ const missing = docs.filter((doc) => !selected.has(doc.external_id));
27
+ const legacySelection = autoAdd === void 0 && current !== void 0;
28
+ if (hasContent || legacySelection || autoAdd === false) {
29
+ const available = (legacySelection && !hasContent ? missing : arrivals).filter(
30
+ (doc) => !selected.has(doc.external_id)
31
+ );
32
+ const offerKey = `${key}:${available.map((doc) => doc.external_id).sort().join(",")}`;
33
+ if (available.length && (convKey !== "new" || current !== void 0) && !offeredRef.current.has(offerKey)) {
34
+ offeredRef.current.add(offerKey);
35
+ notify.info(
36
+ `${available.length} workspace document${available.length === 1 ? "" : "s"} available to add`,
37
+ {
38
+ record: false,
39
+ workspaceId: selectedWorkspaceId,
40
+ duration: 1e4,
41
+ action: {
42
+ label: "Add to chat",
43
+ onClick: () => {
44
+ const latest = session.getState();
45
+ if (latest.workspaceId !== selectedWorkspaceId || (latest.conversationId || "new") !== convKey || // The 'new' slot is reused after sending. Its immutable selection
46
+ // object identifies the draft this offer was actually made for.
47
+ convKey === "new" && latest.conversationDocuments.new !== current)
48
+ return;
49
+ const existing = latest.conversationDocuments[convKey] ?? [];
50
+ const included = new Set(existing.map((doc) => doc.docId));
51
+ session.setConversationDocuments(convKey, [
52
+ ...existing,
53
+ ...available.filter((doc) => !included.has(doc.external_id)).map((doc) => ({ docId: doc.external_id, isPinned: false }))
54
+ ]);
55
+ }
56
+ }
57
+ }
58
+ );
59
+ }
60
+ return;
61
+ }
62
+ if (autoAdd && !missing.length) return;
63
+ session.setConversationDocuments(
64
+ convKey,
65
+ [...current ?? [], ...missing.map((doc) => ({ docId: doc.external_id, isPinned: false }))],
66
+ true
67
+ );
68
+ }, [selectedWorkspaceId, convKey, allWorkspaceDocuments, hasContent, session]);
69
+ }
70
+ export {
71
+ useDocumentAutoAdd
72
+ };
73
+ //# sourceMappingURL=useDocumentAutoAdd.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/chat/useDocumentAutoAdd.ts"],
4
+ "sourcesContent": ["/**\n * useDocumentAutoAdd Hook\n *\n * Automatically adds all documents to conversation context\n * while the chat is empty. Populated chats keep their chosen sources.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { notify } from '../shell'\nimport { useArbiSessionState, useArbiSessionStore } from '../session'\n\n/** A document the conversation may read: only its id matters here. */\ntype Doc = { external_id: string }\n\ninterface UseDocumentAutoAddOptions {\n selectedWorkspaceId: string | null\n allWorkspaceDocuments: Doc[]\n /** Existing messages (including a saved conversation still loading) freeze auto-add. */\n hasContent?: boolean\n}\n\nexport function useDocumentAutoAdd({\n selectedWorkspaceId,\n allWorkspaceDocuments,\n hasContent = false,\n}: UseDocumentAutoAddOptions) {\n const session = useArbiSessionStore()\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n\n const convKey = currentConversationId || 'new'\n const observedRef = useRef<{ key: string; ids: Set<string> } | null>(null)\n const offeredRef = useRef(new Set<string>())\n\n useEffect(() => {\n if (!selectedWorkspaceId) return\n const docs = (allWorkspaceDocuments ?? []).filter((doc) => doc?.external_id)\n if (!docs.length) return\n\n const state = session.getState()\n const current = state.conversationDocuments[convKey]\n const autoAdd = state.conversationDocumentAutoAdd[convKey]\n const key = `${selectedWorkspaceId}:${convKey}`\n const previous = observedRef.current\n const arrivals =\n previous?.key === key ? docs.filter((doc) => !previous.ids.has(doc.external_id)) : []\n observedRef.current = { key, ids: new Set(docs.map((doc) => doc.external_id)) }\n const selected = new Set((current ?? []).map((doc) => doc.docId))\n const missing = docs.filter((doc) => !selected.has(doc.external_id))\n const legacySelection = autoAdd === undefined && current !== undefined\n\n // Old drafts have no selection provenance. Offer the missing sources; never\n // guess whether an old partial/empty selection was automatic or deliberate.\n if (hasContent || legacySelection || autoAdd === false) {\n const available = (legacySelection && !hasContent ? missing : arrivals).filter(\n (doc) => !selected.has(doc.external_id)\n )\n const offerKey = `${key}:${available\n .map((doc) => doc.external_id)\n .sort()\n .join(',')}`\n if (\n available.length &&\n (convKey !== 'new' || current !== undefined) &&\n !offeredRef.current.has(offerKey)\n ) {\n offeredRef.current.add(offerKey)\n notify.info(\n `${available.length} workspace document${available.length === 1 ? '' : 's'} available to add`,\n {\n record: false,\n workspaceId: selectedWorkspaceId,\n duration: 10000,\n action: {\n label: 'Add to chat',\n onClick: () => {\n const latest = session.getState()\n if (\n latest.workspaceId !== selectedWorkspaceId ||\n (latest.conversationId || 'new') !== convKey ||\n // The 'new' slot is reused after sending. Its immutable selection\n // object identifies the draft this offer was actually made for.\n (convKey === 'new' && latest.conversationDocuments.new !== current)\n )\n return\n const existing = latest.conversationDocuments[convKey] ?? []\n const included = new Set(existing.map((doc) => doc.docId))\n session.setConversationDocuments(convKey, [\n ...existing,\n ...available\n .filter((doc) => !included.has(doc.external_id))\n .map((doc) => ({ docId: doc.external_id, isPinned: false })),\n ])\n },\n },\n }\n )\n }\n return\n }\n if (autoAdd && !missing.length) return\n session.setConversationDocuments(\n convKey,\n [...(current ?? []), ...missing.map((doc) => ({ docId: doc.external_id, isPinned: false }))],\n true\n )\n }, [selectedWorkspaceId, convKey, allWorkspaceDocuments, hasContent, session])\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
3
+ function useMessageTimer({
4
+ conversationId,
5
+ messageId,
6
+ isUser,
7
+ isGenerating
8
+ }) {
9
+ const session = useArbiSessionStore();
10
+ const convId = conversationId || "new";
11
+ const timerKey = `${convId}:${messageId}`;
12
+ const generationStartTime = useArbiSessionState((s) => s.generating[convId]?.startTime ?? null);
13
+ const storedElapsed = useArbiSessionState((s) => s.messageTimers[timerKey]?.elapsedTime);
14
+ const [elapsedTime, setElapsedTime] = useState(0);
15
+ const lastElapsedRef = useRef(0);
16
+ useEffect(() => {
17
+ if (!isUser && !isGenerating && storedElapsed) setElapsedTime(storedElapsed);
18
+ }, [isUser, isGenerating, storedElapsed]);
19
+ useEffect(() => {
20
+ if (isUser || !isGenerating || !generationStartTime) return;
21
+ const startTime = generationStartTime;
22
+ const key = timerKey;
23
+ const interval = setInterval(() => {
24
+ const elapsed = (Date.now() - startTime) / 1e3;
25
+ lastElapsedRef.current = elapsed;
26
+ setElapsedTime(elapsed);
27
+ }, 100);
28
+ return () => {
29
+ clearInterval(interval);
30
+ const finalElapsed = lastElapsedRef.current || (Date.now() - startTime) / 1e3;
31
+ session.setMessageTimer(key, { startTime, elapsedTime: finalElapsed });
32
+ };
33
+ }, [isUser, isGenerating, generationStartTime, timerKey, session]);
34
+ return { elapsedTime };
35
+ }
36
+ export {
37
+ useMessageTimer
38
+ };
39
+ //# sourceMappingURL=useMessageTimer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/chat/useMessageTimer.ts"],
4
+ "sourcesContent": ["/**\n * The time an answer has taken: counted on the client while its turn runs (separately from the\n * server's step times), and saved when it stops showing, so a finished answer keeps its time and a\n * re-attached run keeps counting from its real start.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '../session'\n\nexport interface UseMessageTimerOptions {\n conversationId: string | undefined\n messageId: string | undefined\n isUser: boolean\n isGenerating: boolean\n}\n\nexport interface MessageTimerResult {\n /** Seconds. */\n elapsedTime: number\n}\n\nexport function useMessageTimer({\n conversationId,\n messageId,\n isUser,\n isGenerating,\n}: UseMessageTimerOptions): MessageTimerResult {\n const session = useArbiSessionStore()\n const convId = conversationId || 'new'\n const timerKey = `${convId}:${messageId}`\n\n const generationStartTime = useArbiSessionState((s) => s.generating[convId]?.startTime ?? null)\n const storedElapsed = useArbiSessionState((s) => s.messageTimers[timerKey]?.elapsedTime)\n\n const [elapsedTime, setElapsedTime] = useState(0)\n // The latest elapsed time, for the cleanup to save without depending on it.\n const lastElapsedRef = useRef(0)\n\n // A finished answer shows its saved time.\n useEffect(() => {\n if (!isUser && !isGenerating && storedElapsed) setElapsedTime(storedElapsed)\n }, [isUser, isGenerating, storedElapsed])\n\n // Count while the turn runs. The cleanup saves the final time through the store's current state,\n // so the saved timer is not a dependency (saving would re-run the effect, which saves again...).\n useEffect(() => {\n if (isUser || !isGenerating || !generationStartTime) return\n const startTime = generationStartTime\n const key = timerKey\n const interval = setInterval(() => {\n const elapsed = (Date.now() - startTime) / 1000\n lastElapsedRef.current = elapsed\n setElapsedTime(elapsed)\n }, 100)\n return () => {\n clearInterval(interval)\n const finalElapsed = lastElapsedRef.current || (Date.now() - startTime) / 1000\n session.setMessageTimer(key, { startTime, elapsedTime: finalElapsed })\n }\n }, [isUser, isGenerating, generationStartTime, timerKey, session])\n\n return { elapsedTime }\n}\n"],
5
+ "mappings": "AAMA,SAAS,WAAW,QAAQ,gBAAgB;AAC5C,SAAS,qBAAqB,2BAA2B;AAclD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,QAAM,UAAU,oBAAoB;AACpC,QAAM,SAAS,kBAAkB;AACjC,QAAM,WAAW,GAAG,MAAM,IAAI,SAAS;AAEvC,QAAM,sBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG,aAAa,IAAI;AAC9F,QAAM,gBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,QAAQ,GAAG,WAAW;AAEvF,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAEhD,QAAM,iBAAiB,OAAO,CAAC;AAG/B,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,gBAAgB,cAAe,gBAAe,aAAa;AAAA,EAC7E,GAAG,CAAC,QAAQ,cAAc,aAAa,CAAC;AAIxC,YAAU,MAAM;AACd,QAAI,UAAU,CAAC,gBAAgB,CAAC,oBAAqB;AACrD,UAAM,YAAY;AAClB,UAAM,MAAM;AACZ,UAAM,WAAW,YAAY,MAAM;AACjC,YAAM,WAAW,KAAK,IAAI,IAAI,aAAa;AAC3C,qBAAe,UAAU;AACzB,qBAAe,OAAO;AAAA,IACxB,GAAG,GAAG;AACN,WAAO,MAAM;AACX,oBAAc,QAAQ;AACtB,YAAM,eAAe,eAAe,YAAY,KAAK,IAAI,IAAI,aAAa;AAC1E,cAAQ,gBAAgB,KAAK,EAAE,WAAW,aAAa,aAAa,CAAC;AAAA,IACvE;AAAA,EACF,GAAG,CAAC,QAAQ,cAAc,qBAAqB,UAAU,OAAO,CAAC;AAEjE,SAAO,EAAE,YAAY;AACvB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,67 @@
1
+ import { useMemo } from "react";
2
+ function useThinkingContent({
3
+ content,
4
+ modelName,
5
+ isUser,
6
+ isGenerating
7
+ }) {
8
+ return useMemo(() => {
9
+ if (isUser || !content) {
10
+ return {
11
+ responseContent: content || "",
12
+ thinkingContent: "",
13
+ isThinking: false,
14
+ hasThinkTag: false
15
+ };
16
+ }
17
+ const isQ235TModel = modelName === "Q235T@ARBICITY";
18
+ const hasCloseThinkTag = content.includes("</think>");
19
+ const closeThinkIndex = content.indexOf("</think>");
20
+ let responseContent = content;
21
+ let thinkingContent = "";
22
+ let isThinking = false;
23
+ let hasThinkTag = false;
24
+ let thinkStartPos = -1;
25
+ let beforeThinkContent = "";
26
+ if (isQ235TModel) {
27
+ hasThinkTag = true;
28
+ thinkStartPos = 0;
29
+ } else if (content.includes("<think>")) {
30
+ hasThinkTag = true;
31
+ const thinkIndex = content.indexOf("<think>");
32
+ thinkStartPos = thinkIndex + 7;
33
+ beforeThinkContent = content.substring(0, thinkIndex).trim();
34
+ }
35
+ if (hasThinkTag && thinkStartPos >= 0) {
36
+ if (hasCloseThinkTag) {
37
+ thinkingContent = content.substring(thinkStartPos, closeThinkIndex).trim();
38
+ responseContent = beforeThinkContent;
39
+ const afterThinking = content.substring(closeThinkIndex + 8).trim();
40
+ if (afterThinking) {
41
+ responseContent = responseContent + (responseContent ? " " : "") + afterThinking;
42
+ }
43
+ } else {
44
+ thinkingContent = content.substring(thinkStartPos).trim();
45
+ responseContent = beforeThinkContent;
46
+ isThinking = isGenerating && thinkingContent.length > 0;
47
+ }
48
+ } else if (hasCloseThinkTag) {
49
+ const lastClose = content.lastIndexOf("</think>");
50
+ hasThinkTag = true;
51
+ thinkingContent = content.substring(0, lastClose).trim();
52
+ responseContent = content.substring(lastClose + 8).trim();
53
+ }
54
+ responseContent = responseContent.replace(/<\/?think>/gi, "").trim();
55
+ thinkingContent = thinkingContent.replace(/<\/?think>/gi, "").trim();
56
+ return {
57
+ responseContent,
58
+ thinkingContent,
59
+ isThinking,
60
+ hasThinkTag
61
+ };
62
+ }, [content, modelName, isUser, isGenerating]);
63
+ }
64
+ export {
65
+ useThinkingContent
66
+ };
67
+ //# sourceMappingURL=useThinkingContent.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/chat/useThinkingContent.ts"],
4
+ "sourcesContent": ["/**\n * useThinkingContent Hook\n *\n * Extracts thinking content from AI message responses.\n * Handles both explicit <think> tags and model-specific thinking patterns.\n * Returns parsed thinking content and response content separately.\n */\n\nimport { useMemo } from 'react'\n\ninterface ThinkingContentResult {\n /** The main response content (without thinking tags) */\n responseContent: string\n /** The extracted thinking/reasoning content */\n thinkingContent: string\n /** Whether the model is currently in thinking mode */\n isThinking: boolean\n /** Whether the message contains thinking content */\n hasThinkTag: boolean\n}\n\ninterface UseThinkingContentOptions {\n /** The raw message content */\n content: string\n /** The model name to check for model-specific behavior */\n modelName: string | null\n /** Whether the message is from the user (skip processing) */\n isUser: boolean\n /** Whether the message is currently being generated */\n isGenerating: boolean\n}\n\n/**\n * Hook to extract thinking content from AI responses.\n * Some models use explicit <think></think> tags, while others\n * (like Q235T@ARBICITY) start with thinking content implicitly.\n */\nexport function useThinkingContent({\n content,\n modelName,\n isUser,\n isGenerating,\n}: UseThinkingContentOptions): ThinkingContentResult {\n return useMemo(() => {\n // Default values for user messages or empty content\n if (isUser || !content) {\n return {\n responseContent: content || '',\n thinkingContent: '',\n isThinking: false,\n hasThinkTag: false,\n }\n }\n\n const isQ235TModel = modelName === 'Q235T@ARBICITY'\n const hasCloseThinkTag = content.includes('</think>')\n const closeThinkIndex = content.indexOf('</think>')\n\n let responseContent = content\n let thinkingContent = ''\n let isThinking = false\n let hasThinkTag = false\n\n // Determine thinking start position\n let thinkStartPos = -1\n let beforeThinkContent = ''\n\n if (isQ235TModel) {\n // Q235T@ARBICITY: No <think> tag, content starts as thinking at position 0\n hasThinkTag = true\n thinkStartPos = 0\n } else if (content.includes('<think>')) {\n // Other models: Look for explicit <think> tag\n hasThinkTag = true\n const thinkIndex = content.indexOf('<think>')\n thinkStartPos = thinkIndex + 7\n beforeThinkContent = content.substring(0, thinkIndex).trim()\n }\n\n // Process thinking content if we have thinking\n if (hasThinkTag && thinkStartPos >= 0) {\n if (hasCloseThinkTag) {\n // Complete thinking block\n thinkingContent = content.substring(thinkStartPos, closeThinkIndex).trim()\n responseContent = beforeThinkContent\n const afterThinking = content.substring(closeThinkIndex + 8).trim()\n if (afterThinking) {\n responseContent = responseContent + (responseContent ? ' ' : '') + afterThinking\n }\n } else {\n // Still thinking - only if actively generating\n thinkingContent = content.substring(thinkStartPos).trim()\n responseContent = beforeThinkContent\n // Only mark as \"thinking\" if actively generating (not aborted/stopped)\n isThinking = isGenerating && thinkingContent.length > 0\n }\n } else if (hasCloseThinkTag) {\n // Orphan `</think>` with no matching `<think>` \u2014 vLLM's qwen3 reasoning\n // parser sometimes strips the opening tag while leaving the closing one\n // (and a model may emit several closing tags). Treat everything up to\n // the LAST `</think>` as leaked reasoning and surface what follows as\n // the real answer, so users don't see raw `</think>` in their replies.\n const lastClose = content.lastIndexOf('</think>')\n hasThinkTag = true\n thinkingContent = content.substring(0, lastClose).trim()\n responseContent = content.substring(lastClose + 8).trim()\n }\n\n // Final defensive sweep: strip any stray <think>/</think> tags that\n // survived the parsing above (e.g. extra opening or closing tags from a\n // model that emitted nested or unbalanced reasoning markers).\n responseContent = responseContent.replace(/<\\/?think>/gi, '').trim()\n thinkingContent = thinkingContent.replace(/<\\/?think>/gi, '').trim()\n\n return {\n responseContent,\n thinkingContent,\n isThinking,\n hasThinkTag,\n }\n }, [content, modelName, isUser, isGenerating])\n}\n"],
5
+ "mappings": "AAQA,SAAS,eAAe;AA6BjB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,SAAO,QAAQ,MAAM;AAEnB,QAAI,UAAU,CAAC,SAAS;AACtB,aAAO;AAAA,QACL,iBAAiB,WAAW;AAAA,QAC5B,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,eAAe,cAAc;AACnC,UAAM,mBAAmB,QAAQ,SAAS,UAAU;AACpD,UAAM,kBAAkB,QAAQ,QAAQ,UAAU;AAElD,QAAI,kBAAkB;AACtB,QAAI,kBAAkB;AACtB,QAAI,aAAa;AACjB,QAAI,cAAc;AAGlB,QAAI,gBAAgB;AACpB,QAAI,qBAAqB;AAEzB,QAAI,cAAc;AAEhB,oBAAc;AACd,sBAAgB;AAAA,IAClB,WAAW,QAAQ,SAAS,SAAS,GAAG;AAEtC,oBAAc;AACd,YAAM,aAAa,QAAQ,QAAQ,SAAS;AAC5C,sBAAgB,aAAa;AAC7B,2BAAqB,QAAQ,UAAU,GAAG,UAAU,EAAE,KAAK;AAAA,IAC7D;AAGA,QAAI,eAAe,iBAAiB,GAAG;AACrC,UAAI,kBAAkB;AAEpB,0BAAkB,QAAQ,UAAU,eAAe,eAAe,EAAE,KAAK;AACzE,0BAAkB;AAClB,cAAM,gBAAgB,QAAQ,UAAU,kBAAkB,CAAC,EAAE,KAAK;AAClE,YAAI,eAAe;AACjB,4BAAkB,mBAAmB,kBAAkB,MAAM,MAAM;AAAA,QACrE;AAAA,MACF,OAAO;AAEL,0BAAkB,QAAQ,UAAU,aAAa,EAAE,KAAK;AACxD,0BAAkB;AAElB,qBAAa,gBAAgB,gBAAgB,SAAS;AAAA,MACxD;AAAA,IACF,WAAW,kBAAkB;AAM3B,YAAM,YAAY,QAAQ,YAAY,UAAU;AAChD,oBAAc;AACd,wBAAkB,QAAQ,UAAU,GAAG,SAAS,EAAE,KAAK;AACvD,wBAAkB,QAAQ,UAAU,YAAY,CAAC,EAAE,KAAK;AAAA,IAC1D;AAKA,sBAAkB,gBAAgB,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AACnE,sBAAkB,gBAAgB,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAEnE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,QAAQ,YAAY,CAAC;AAC/C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,61 @@
1
+ import { useCallback, useEffect, useSyncExternalStore } from "react";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+ import { notify } from "../shell/index.js";
4
+ import { useConversations } from "../hooks.js";
5
+ import { useArbi } from "../useArbi.js";
6
+ import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
7
+ import { bindThreadDocument, migrateLegacyThreadDocuments, threadBinding } from "./thread-binding.js";
8
+ const migratedWorkspaces = /* @__PURE__ */ new Set();
9
+ function useThreadDocument() {
10
+ const arbi = useArbi();
11
+ const queryClient = useQueryClient();
12
+ const session = useArbiSessionStore();
13
+ const conversationId = useArbiSessionState((s) => s.conversationId);
14
+ const workspaceId = useArbiSessionState((s) => s.workspaceId);
15
+ const newChatDocumentId = useArbiSessionState((s) => s.newChatDocumentId);
16
+ const subscribe = useCallback(
17
+ (onChange) => queryClient.getQueryCache().subscribe(onChange),
18
+ [queryClient]
19
+ );
20
+ const savedDocumentId = useSyncExternalStore(
21
+ subscribe,
22
+ () => threadBinding(queryClient, conversationId).documentId,
23
+ () => null
24
+ );
25
+ const unavailable = useSyncExternalStore(
26
+ subscribe,
27
+ () => threadBinding(queryClient, conversationId).unavailable,
28
+ () => false
29
+ );
30
+ const { data: conversations, isPlaceholderData } = useConversations(workspaceId ?? void 0);
31
+ useEffect(() => {
32
+ if (!workspaceId || !conversations || isPlaceholderData || migratedWorkspaces.has(workspaceId))
33
+ return;
34
+ migratedWorkspaces.add(workspaceId);
35
+ void migrateLegacyThreadDocuments(arbi, queryClient, conversations);
36
+ }, [arbi, queryClient, workspaceId, conversations, isPlaceholderData]);
37
+ const bind = useCallback(
38
+ (documentId) => {
39
+ const { conversationId: open } = session.getState();
40
+ if (!open) {
41
+ session.setNewChatDocumentId(documentId);
42
+ return;
43
+ }
44
+ bindThreadDocument(arbi, queryClient, open, documentId).catch(
45
+ () => notify.error(
46
+ documentId ? "Could not attach the document to this thread" : "Could not unbind the document"
47
+ )
48
+ );
49
+ },
50
+ [arbi, queryClient, session]
51
+ );
52
+ return {
53
+ documentId: conversationId ? savedDocumentId : newChatDocumentId,
54
+ unavailable: conversationId ? unavailable : false,
55
+ bind
56
+ };
57
+ }
58
+ export {
59
+ useThreadDocument
60
+ };
61
+ //# sourceMappingURL=useThreadDocument.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/chat/useThreadDocument.ts"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useSyncExternalStore } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { notify } from '../shell'\nimport { useConversations } from '../hooks'\nimport { useArbi } from '../useArbi'\nimport { useArbiSessionState, useArbiSessionStore } from '../session'\nimport { bindThreadDocument, migrateLegacyThreadDocuments, threadBinding } from './thread-binding'\n\n/** The workspaces whose locally kept bindings were moved to the server in this visit. */\nconst migratedWorkspaces = new Set<string>()\n\n/**\n * The open conversation's bound document, and how to bind or (null) unbind it. A saved thread's\n * binding is the server's (attach and unbind write it there); a new chat's is the session's until\n * its first turn. `unavailable`: the thread is bound to a document this person cannot open.\n */\nexport function useThreadDocument(): {\n documentId: string | null\n unavailable: boolean\n bind: (documentId: string | null) => void\n} {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n const session = useArbiSessionStore()\n const conversationId = useArbiSessionState((s) => s.conversationId)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const newChatDocumentId = useArbiSessionState((s) => s.newChatDocumentId)\n const subscribe = useCallback(\n (onChange: () => void) => queryClient.getQueryCache().subscribe(onChange),\n [queryClient]\n )\n const savedDocumentId = useSyncExternalStore(\n subscribe,\n () => threadBinding(queryClient, conversationId).documentId,\n () => null\n )\n const unavailable = useSyncExternalStore(\n subscribe,\n () => threadBinding(queryClient, conversationId).unavailable,\n () => false\n )\n\n // Bindings kept on this device before the server held them move there once.\n // (Never from the previous workspace's list, shown while this one loads.)\n const { data: conversations, isPlaceholderData } = useConversations(workspaceId ?? undefined)\n useEffect(() => {\n if (!workspaceId || !conversations || isPlaceholderData || migratedWorkspaces.has(workspaceId))\n return\n migratedWorkspaces.add(workspaceId)\n void migrateLegacyThreadDocuments(arbi, queryClient, conversations)\n }, [arbi, queryClient, workspaceId, conversations, isPlaceholderData])\n\n const bind = useCallback(\n (documentId: string | null) => {\n const { conversationId: open } = session.getState()\n if (!open) {\n session.setNewChatDocumentId(documentId)\n return\n }\n bindThreadDocument(arbi, queryClient, open, documentId).catch(() =>\n notify.error(\n documentId\n ? 'Could not attach the document to this thread'\n : 'Could not unbind the document'\n )\n )\n },\n [arbi, queryClient, session]\n )\n return {\n documentId: conversationId ? savedDocumentId : newChatDocumentId,\n unavailable: conversationId ? unavailable : false,\n bind,\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,aAAa,WAAW,4BAA4B;AAC7D,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,wBAAwB;AACjC,SAAS,eAAe;AACxB,SAAS,qBAAqB,2BAA2B;AACzD,SAAS,oBAAoB,8BAA8B,qBAAqB;AAGhF,MAAM,qBAAqB,oBAAI,IAAY;AAOpC,SAAS,oBAId;AACA,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAc,eAAe;AACnC,QAAM,UAAU,oBAAoB;AACpC,QAAM,iBAAiB,oBAAoB,CAAC,MAAM,EAAE,cAAc;AAClE,QAAM,cAAc,oBAAoB,CAAC,MAAM,EAAE,WAAW;AAC5D,QAAM,oBAAoB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB;AACxE,QAAM,YAAY;AAAA,IAChB,CAAC,aAAyB,YAAY,cAAc,EAAE,UAAU,QAAQ;AAAA,IACxE,CAAC,WAAW;AAAA,EACd;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,MAAM,cAAc,aAAa,cAAc,EAAE;AAAA,IACjD,MAAM;AAAA,EACR;AACA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,MAAM,cAAc,aAAa,cAAc,EAAE;AAAA,IACjD,MAAM;AAAA,EACR;AAIA,QAAM,EAAE,MAAM,eAAe,kBAAkB,IAAI,iBAAiB,eAAe,MAAS;AAC5F,YAAU,MAAM;AACd,QAAI,CAAC,eAAe,CAAC,iBAAiB,qBAAqB,mBAAmB,IAAI,WAAW;AAC3F;AACF,uBAAmB,IAAI,WAAW;AAClC,SAAK,6BAA6B,MAAM,aAAa,aAAa;AAAA,EACpE,GAAG,CAAC,MAAM,aAAa,aAAa,eAAe,iBAAiB,CAAC;AAErE,QAAM,OAAO;AAAA,IACX,CAAC,eAA8B;AAC7B,YAAM,EAAE,gBAAgB,KAAK,IAAI,QAAQ,SAAS;AAClD,UAAI,CAAC,MAAM;AACT,gBAAQ,qBAAqB,UAAU;AACvC;AAAA,MACF;AACA,yBAAmB,MAAM,aAAa,MAAM,UAAU,EAAE;AAAA,QAAM,MAC5D,OAAO;AAAA,UACL,aACI,iDACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,aAAa,OAAO;AAAA,EAC7B;AACA,SAAO;AAAA,IACL,YAAY,iBAAiB,kBAAkB;AAAA,IAC/C,aAAa,iBAAiB,cAAc;AAAA,IAC5C;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,50 @@
1
+ import { useEffect, useMemo, useRef } from "react";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+ import { arbiQueryKeys } from "../hooks.js";
4
+ import { useArbi } from "../useArbi.js";
5
+ import { useCanEditShared, useUpdateConversation, useWorkflows } from "../workforce.js";
6
+ function workflowRunTitle(workflowName, createdAt) {
7
+ const day = new Date(createdAt).toLocaleDateString(void 0, { day: "numeric", month: "short" });
8
+ return `${workflowName} \u2014 ${day}`;
9
+ }
10
+ function useWorkflowRunTitles(conversations, openId, workspaceId) {
11
+ const hasUntitledRun = conversations.some((c) => !c.title && c.workflow_ext_id && c.created_at);
12
+ const { data: workflows } = useWorkflows({ enabled: hasUntitledRun });
13
+ const titles = useMemo(() => {
14
+ const names = new Map((workflows ?? []).map((w) => [w.external_id, w.name]));
15
+ const out = {};
16
+ for (const c of conversations) {
17
+ const name = !c.title && c.workflow_ext_id ? names.get(c.workflow_ext_id) : void 0;
18
+ if (name && c.created_at) out[c.external_id] = workflowRunTitle(name, c.created_at);
19
+ }
20
+ return out;
21
+ }, [workflows, conversations]);
22
+ const arbi = useArbi();
23
+ const queryClient = useQueryClient();
24
+ const canEditShared = useCanEditShared();
25
+ const { mutateAsync: rename } = useUpdateConversation();
26
+ const titled = useRef(/* @__PURE__ */ new Set());
27
+ const open = openId ? conversations.find((c) => c.external_id === openId) : void 0;
28
+ const openTitle = openId ? titles[openId] : void 0;
29
+ const mayEdit = !!open && (open.is_owner === true || open.is_shared === true && canEditShared);
30
+ useEffect(() => {
31
+ if (!openId || !openTitle || !mayEdit || !workspaceId || titled.current.has(openId)) return;
32
+ titled.current.add(openId);
33
+ void (async () => {
34
+ const fresh = await queryClient.fetchQuery({
35
+ queryKey: arbiQueryKeys.conversations(workspaceId),
36
+ queryFn: () => arbi.conversations.list({ workspaceId }),
37
+ staleTime: 0
38
+ });
39
+ if (fresh.find((c) => c.external_id === openId)?.title) return;
40
+ await rename({ conversationId: openId, patch: { title: openTitle } });
41
+ })().catch(() => {
42
+ });
43
+ }, [openId, openTitle, mayEdit, workspaceId, arbi, queryClient, rename]);
44
+ return titles;
45
+ }
46
+ export {
47
+ useWorkflowRunTitles,
48
+ workflowRunTitle
49
+ };
50
+ //# sourceMappingURL=workflow-run-titles.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/chat/workflow-run-titles.ts"],
4
+ "sourcesContent": ["/**\n * A saved workflow's run (a thread its trigger or \"Run now\" started on the server) starts\n * untitled: the server holds no workspace key to write a title, and there is no question of the\n * person's to name it after. Thread lists name it after its workflow and the day it started, and\n * the open one is titled so on the server once, so every other list shows the same name.\n */\n\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { arbiQueryKeys } from '../hooks'\nimport { useArbi } from '../useArbi'\nimport { useCanEditShared, useUpdateConversation, useWorkflows } from '../workforce'\n\n/** An untitled run's name: the workflow and the day it started (\"Weekly review \u2014 28 Oct\"). */\nexport function workflowRunTitle(workflowName: string, createdAt: string): string {\n const day = new Date(createdAt).toLocaleDateString(undefined, { day: 'numeric', month: 'short' })\n return `${workflowName} \u2014 ${day}`\n}\n\n/** What a run's name is made from (a conversation list's row). */\nexport interface WorkflowRunRow {\n external_id: string\n title?: string | null\n workflow_ext_id?: string | null\n created_at?: string | null\n is_owner?: boolean\n is_shared?: boolean\n}\n\n/**\n * Names for the untitled saved-workflow runs among `conversations` (the list of `workspaceId`),\n * by id (runs of a workflow the caller cannot list keep no name). The open one (`openId`) is\n * titled with its name on the server, when the viewer may edit it (its owner, or an editor of a\n * shared one) and it is still untitled when the list is read again just before (a rename in\n * another tab wins).\n */\nexport function useWorkflowRunTitles(\n conversations: readonly WorkflowRunRow[],\n openId: string | null,\n workspaceId: string | undefined\n): Record<string, string> {\n const hasUntitledRun = conversations.some((c) => !c.title && c.workflow_ext_id && c.created_at)\n const { data: workflows } = useWorkflows({ enabled: hasUntitledRun })\n const titles = useMemo(() => {\n const names = new Map((workflows ?? []).map((w) => [w.external_id, w.name]))\n const out: Record<string, string> = {}\n for (const c of conversations) {\n const name = !c.title && c.workflow_ext_id ? names.get(c.workflow_ext_id) : undefined\n if (name && c.created_at) out[c.external_id] = workflowRunTitle(name, c.created_at)\n }\n return out\n }, [workflows, conversations])\n\n const arbi = useArbi()\n const queryClient = useQueryClient()\n const canEditShared = useCanEditShared()\n const { mutateAsync: rename } = useUpdateConversation()\n const titled = useRef(new Set<string>())\n const open = openId ? conversations.find((c) => c.external_id === openId) : undefined\n const openTitle = openId ? titles[openId] : undefined\n const mayEdit = !!open && (open.is_owner === true || (open.is_shared === true && canEditShared))\n useEffect(() => {\n if (!openId || !openTitle || !mayEdit || !workspaceId || titled.current.has(openId)) return\n titled.current.add(openId)\n void (async () => {\n // The list as the server has it now, not as cached: a title given meanwhile is kept.\n const fresh = await queryClient.fetchQuery({\n queryKey: arbiQueryKeys.conversations(workspaceId),\n queryFn: () => arbi.conversations.list({ workspaceId }),\n staleTime: 0,\n })\n if (fresh.find((c) => c.external_id === openId)?.title) return\n await rename({ conversationId: openId, patch: { title: openTitle } })\n })().catch(() => {\n // Naming is a courtesy: the list keeps showing the name either way.\n })\n }, [openId, openTitle, mayEdit, workspaceId, arbi, queryClient, rename])\n return titles\n}\n"],
5
+ "mappings": "AAOA,SAAS,WAAW,SAAS,cAAc;AAC3C,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,kBAAkB,uBAAuB,oBAAoB;AAG/D,SAAS,iBAAiB,cAAsB,WAA2B;AAChF,QAAM,MAAM,IAAI,KAAK,SAAS,EAAE,mBAAmB,QAAW,EAAE,KAAK,WAAW,OAAO,QAAQ,CAAC;AAChG,SAAO,GAAG,YAAY,WAAM,GAAG;AACjC;AAmBO,SAAS,qBACd,eACA,QACA,aACwB;AACxB,QAAM,iBAAiB,cAAc,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,UAAU;AAC9F,QAAM,EAAE,MAAM,UAAU,IAAI,aAAa,EAAE,SAAS,eAAe,CAAC;AACpE,QAAM,SAAS,QAAQ,MAAM;AAC3B,UAAM,QAAQ,IAAI,KAAK,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AAC3E,UAAM,MAA8B,CAAC;AACrC,eAAW,KAAK,eAAe;AAC7B,YAAM,OAAO,CAAC,EAAE,SAAS,EAAE,kBAAkB,MAAM,IAAI,EAAE,eAAe,IAAI;AAC5E,UAAI,QAAQ,EAAE,WAAY,KAAI,EAAE,WAAW,IAAI,iBAAiB,MAAM,EAAE,UAAU;AAAA,IACpF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,aAAa,CAAC;AAE7B,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAc,eAAe;AACnC,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,EAAE,aAAa,OAAO,IAAI,sBAAsB;AACtD,QAAM,SAAS,OAAO,oBAAI,IAAY,CAAC;AACvC,QAAM,OAAO,SAAS,cAAc,KAAK,CAAC,MAAM,EAAE,gBAAgB,MAAM,IAAI;AAC5E,QAAM,YAAY,SAAS,OAAO,MAAM,IAAI;AAC5C,QAAM,UAAU,CAAC,CAAC,SAAS,KAAK,aAAa,QAAS,KAAK,cAAc,QAAQ;AACjF,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,eAAe,OAAO,QAAQ,IAAI,MAAM,EAAG;AACrF,WAAO,QAAQ,IAAI,MAAM;AACzB,UAAM,YAAY;AAEhB,YAAM,QAAQ,MAAM,YAAY,WAAW;AAAA,QACzC,UAAU,cAAc,cAAc,WAAW;AAAA,QACjD,SAAS,MAAM,KAAK,cAAc,KAAK,EAAE,YAAY,CAAC;AAAA,QACtD,WAAW;AAAA,MACb,CAAC;AACD,UAAI,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB,MAAM,GAAG,MAAO;AACxD,YAAM,OAAO,EAAE,gBAAgB,QAAQ,OAAO,EAAE,OAAO,UAAU,EAAE,CAAC;AAAA,IACtE,GAAG,EAAE,MAAM,MAAM;AAAA,IAEjB,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,WAAW,SAAS,aAAa,MAAM,aAAa,MAAM,CAAC;AACvE,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,209 @@
1
+ import { useCallback, useRef } from "react";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { useArbi } from "../useArbi.js";
4
+ import { arbiQueryKeys } from "../query-keys.js";
5
+ import { useAvailableModels, useConfig } from "../hooks.js";
6
+ import { useUserSettings } from "../account/settings.js";
7
+ import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
8
+ import { notify } from "../notifications/notify-store.js";
9
+ function isFullConfig(config) {
10
+ return config != null && "QueryLLM" in config;
11
+ }
12
+ function formatConfigValidationError(error) {
13
+ const apiError = error?.apiError;
14
+ const detail = apiError?.detail ?? error?.detail;
15
+ if (Array.isArray(detail)) {
16
+ const parts = detail.map((item) => {
17
+ if (!item || typeof item !== "object") return null;
18
+ const e = item;
19
+ const field = Array.isArray(e.loc) && e.loc.length > 0 ? e.loc.filter((p) => p !== "body").join(".") : "";
20
+ return field ? `${field}: ${e.msg ?? "invalid value"}` : e.msg ?? null;
21
+ }).filter(Boolean);
22
+ if (parts.length > 0) return parts.join("; ");
23
+ }
24
+ if (typeof detail === "string") return detail;
25
+ if (error instanceof Error) return error.message;
26
+ return "Invalid configuration value (out of range)";
27
+ }
28
+ function useConfigSchema() {
29
+ const arbi = useArbi();
30
+ return useQuery({
31
+ queryKey: arbiQueryKeys.configSchema(),
32
+ queryFn: () => arbi.agentConfig.getSchema(),
33
+ enabled: arbi.isLoggedIn
34
+ });
35
+ }
36
+ function useSaveConfig() {
37
+ const arbi = useArbi();
38
+ const queryClient = useQueryClient();
39
+ return useMutation({
40
+ mutationFn: (body) => arbi.agentConfig.save(body),
41
+ onSuccess: () => {
42
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() });
43
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() });
44
+ },
45
+ onError: (error) => {
46
+ notify.error(formatConfigValidationError(error), {
47
+ description: "Configuration not saved \u2014 fix the highlighted values and try again."
48
+ });
49
+ }
50
+ });
51
+ }
52
+ function useDeleteConfig() {
53
+ const arbi = useArbi();
54
+ const queryClient = useQueryClient();
55
+ return useMutation({
56
+ mutationFn: (configId) => arbi.agentConfig.delete(configId),
57
+ onSuccess: () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() })
58
+ });
59
+ }
60
+ function configDelta(active, defaults) {
61
+ const delta = {};
62
+ for (const [instrument, value] of Object.entries(active)) {
63
+ if (typeof value !== "object" || value === null) continue;
64
+ const defaultInstrument = defaults[instrument];
65
+ if (typeof defaultInstrument !== "object" || defaultInstrument === null) continue;
66
+ const fieldDelta = {};
67
+ for (const [field, fieldValue] of Object.entries(value)) {
68
+ if (JSON.stringify(fieldValue) !== JSON.stringify(defaultInstrument[field])) {
69
+ fieldDelta[field] = fieldValue;
70
+ }
71
+ }
72
+ if (Object.keys(fieldDelta).length > 0) delta[instrument] = fieldDelta;
73
+ }
74
+ return delta;
75
+ }
76
+ function deltaOnto(changes, active, defaults) {
77
+ const delta = configDelta(active, defaults);
78
+ for (const [instrument, fields] of Object.entries(changes)) {
79
+ delta[instrument] = { ...delta[instrument] ?? {}, ...fields };
80
+ const defaultInstrument = defaults[instrument];
81
+ if (defaultInstrument) {
82
+ const instrumentDelta = delta[instrument];
83
+ for (const [field, value] of Object.entries(fields)) {
84
+ if (JSON.stringify(value) === JSON.stringify(defaultInstrument[field])) {
85
+ delete instrumentDelta[field];
86
+ }
87
+ }
88
+ if (Object.keys(instrumentDelta).length === 0) delete delta[instrument];
89
+ }
90
+ }
91
+ return delta;
92
+ }
93
+ function useSaveConfigField(baseConfigId) {
94
+ const arbi = useArbi();
95
+ const queryClient = useQueryClient();
96
+ const saveConfig = useSaveConfig();
97
+ const { data: defaultConfig } = useConfig("default");
98
+ const chatModel = useArbiSessionState((state) => state.chatModel);
99
+ const { data: userSettings } = useUserSettings();
100
+ const activeConfigId = baseConfigId || chatModel || userSettings?.last_config || "default";
101
+ const { data: activeConfigData } = useConfig(activeConfigId);
102
+ const session = useArbiSessionStore();
103
+ const chain = useRef(null);
104
+ const buildDelta = (changes) => deltaOnto(
105
+ changes,
106
+ activeConfigData ?? {},
107
+ defaultConfig ?? {}
108
+ );
109
+ const readConfig = (configId) => queryClient.fetchQuery({
110
+ queryKey: arbiQueryKeys.config(configId),
111
+ queryFn: () => arbi.agentConfig.get(configId),
112
+ staleTime: 10 * 60 * 1e3
113
+ });
114
+ const saveOnBase = (base, changes, title) => {
115
+ const current = chain.current?.ids.has(base) ? chain.current : null;
116
+ const ids = current?.ids ?? /* @__PURE__ */ new Set([base]);
117
+ const from = current?.latest ?? Promise.resolve(base);
118
+ const saved = from.then(async (configId) => {
119
+ const [defaults, active] = await Promise.all([
120
+ readConfig("default"),
121
+ readConfig(configId)
122
+ ]).catch((error) => {
123
+ notify.error(formatConfigValidationError(error), {
124
+ description: "Configuration not saved \u2014 the settings it builds on could not be read."
125
+ });
126
+ throw error;
127
+ });
128
+ const response = await saveConfig.mutateAsync({
129
+ ...deltaOnto(changes, active ?? {}, defaults ?? {}),
130
+ title
131
+ });
132
+ if (response?.external_id) {
133
+ ids.add(response.external_id);
134
+ const { chatModel: chatModel2 } = session.getState();
135
+ const followsSettings = !chatModel2 && base === userSettings?.last_config;
136
+ if (chain.current?.ids === ids && !followsSettings) {
137
+ session.setChatModel(response.external_id);
138
+ }
139
+ }
140
+ return { response, configId: response?.external_id ?? configId };
141
+ });
142
+ chain.current = {
143
+ ids,
144
+ latest: Promise.all([from, saved]).then(
145
+ ([, done]) => done.configId,
146
+ () => from
147
+ )
148
+ };
149
+ return saved.then(({ response }) => response);
150
+ };
151
+ return {
152
+ save: (instrument, field, value, title) => {
153
+ const changes = { [instrument]: { [field]: value } };
154
+ const name = title ?? `prefs-${Date.now()}`;
155
+ if (baseConfigId) return void saveOnBase(baseConfigId, changes, name).catch(() => {
156
+ });
157
+ saveConfig.mutate({ ...buildDelta(changes), title: name });
158
+ },
159
+ saveDelta: (changes, title) => {
160
+ const name = title ?? `prefs-${Date.now()}`;
161
+ if (baseConfigId) return saveOnBase(baseConfigId, changes, name);
162
+ return saveConfig.mutateAsync({ ...buildDelta(changes), title: name });
163
+ },
164
+ isPending: saveConfig.isPending
165
+ };
166
+ }
167
+ const AUTO_CHAT_MODEL = "auto";
168
+ const chatModelSaves = /* @__PURE__ */ new WeakMap();
169
+ function pendingChatModelSave(session) {
170
+ return chatModelSaves.get(session);
171
+ }
172
+ function useApplyChatModel() {
173
+ const session = useArbiSessionStore();
174
+ const { data: availableModels } = useAvailableModels();
175
+ const configField = useSaveConfigField();
176
+ return useCallback(
177
+ async (model, label) => {
178
+ session.setChatModelName(model);
179
+ const agents = model === AUTO_CHAT_MODEL ? { AGENT_MODEL_NAME: AUTO_CHAT_MODEL, ENABLED: true } : {
180
+ AGENT_MODEL_NAME: model,
181
+ AGENT_API_TYPE: availableModels?.models?.find((m) => m.model_name === model)?.api_type || "remote",
182
+ ENABLED: true
183
+ };
184
+ const save = configField.saveDelta({ Agents: agents }, label).then((response) => {
185
+ if (chatModelSaves.get(session) === save && response?.external_id)
186
+ session.setChatModel(response.external_id);
187
+ });
188
+ chatModelSaves.set(session, save);
189
+ try {
190
+ await save;
191
+ } finally {
192
+ if (chatModelSaves.get(session) === save) chatModelSaves.delete(session);
193
+ }
194
+ },
195
+ [availableModels, configField, session]
196
+ );
197
+ }
198
+ export {
199
+ AUTO_CHAT_MODEL,
200
+ formatConfigValidationError,
201
+ isFullConfig,
202
+ pendingChatModelSave,
203
+ useApplyChatModel,
204
+ useConfigSchema,
205
+ useDeleteConfig,
206
+ useSaveConfig,
207
+ useSaveConfigField
208
+ };
209
+ //# sourceMappingURL=config-hooks.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/config/config-hooks.ts"],
4
+ "sourcesContent": ["/**\n * Saved assistant configurations (configs): the schema their forms are drawn from, saving one,\n * deleting one, and saving a change on top of the person's active config (only what differs\n * from the defaults is sent). The chat's model choice (`useApplyChatModel`) goes through here.\n */\n\nimport { useCallback, useRef } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { components } from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../query-keys'\nimport { useAvailableModels, useConfig } from '../hooks'\nimport { useUserSettings } from '../account/settings'\nimport { useArbiSessionState, useArbiSessionStore } from '../session'\nimport { notify } from '../notifications/notify-store'\n\ntype AllConfigs = components['schemas']['AllConfigs']\ntype NonDeveloperConfig = components['schemas']['NonDeveloperConfig']\n/** A config to save: only the fields that differ from the defaults, and a title. */\nexport type ConfigUpdate = components['schemas']['ConfigUpdateData']\n\n/**\n * Whether a config is the full one (a developer's): a non-developer's exposes only its Agents\n * and ArtifactLLM sections.\n */\nexport function isFullConfig(\n config: AllConfigs | NonDeveloperConfig | undefined | null\n): config is AllConfigs {\n return config != null && 'QueryLLM' in config\n}\n\n/** A refused save, in words: each invalid field and why (FastAPI's 422), else the message. */\nexport function formatConfigValidationError(error: unknown): string {\n const apiError = (error as { apiError?: { detail?: unknown } } | null)?.apiError\n const detail = apiError?.detail ?? (error as { detail?: unknown } | null)?.detail\n if (Array.isArray(detail)) {\n const parts = detail\n .map((item) => {\n if (!item || typeof item !== 'object') return null\n const e = item as { loc?: unknown[]; msg?: string }\n const field =\n Array.isArray(e.loc) && e.loc.length > 0\n ? e.loc.filter((p) => p !== 'body').join('.')\n : ''\n return field ? `${field}: ${e.msg ?? 'invalid value'}` : (e.msg ?? null)\n })\n .filter(Boolean)\n if (parts.length > 0) return parts.join('; ')\n }\n if (typeof detail === 'string') return detail\n if (error instanceof Error) return error.message\n return 'Invalid configuration value (out of range)'\n}\n\n/** The JSON schema of every config section (what the config forms draw). */\nexport function useConfigSchema() {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.configSchema(),\n queryFn: () => arbi.agentConfig.getSchema(),\n enabled: arbi.isLoggedIn,\n })\n}\n\n/**\n * Save a config (the server makes it the person's active one). A refused save says which values\n * were wrong.\n */\nexport function useSaveConfig() {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (body: ConfigUpdate) => arbi.agentConfig.save(body),\n onSuccess: () => {\n // Every config read refreshes, and the settings name the new active config.\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() })\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() })\n },\n onError: (error) => {\n notify.error(formatConfigValidationError(error), {\n description: 'Configuration not saved \u2014 fix the highlighted values and try again.',\n })\n },\n })\n}\n\n/** Delete one of the person's saved configs. */\nexport function useDeleteConfig() {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (configId: string) => arbi.agentConfig.delete(configId),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() }),\n })\n}\n\n/** The instrument-level fields of `active` that differ from `defaults`. */\nfunction configDelta(\n active: Record<string, unknown>,\n defaults: Record<string, unknown>\n): Record<string, unknown> {\n const delta: Record<string, unknown> = {}\n for (const [instrument, value] of Object.entries(active)) {\n if (typeof value !== 'object' || value === null) continue\n const defaultInstrument = defaults[instrument]\n if (typeof defaultInstrument !== 'object' || defaultInstrument === null) continue\n const fieldDelta: Record<string, unknown> = {}\n for (const [field, fieldValue] of Object.entries(value as Record<string, unknown>)) {\n if (\n JSON.stringify(fieldValue) !==\n JSON.stringify((defaultInstrument as Record<string, unknown>)[field])\n ) {\n fieldDelta[field] = fieldValue\n }\n }\n if (Object.keys(fieldDelta).length > 0) delta[instrument] = fieldDelta\n }\n return delta\n}\n\n/** `changes` on top of `active`'s overrides, without any field back at its default. */\nfunction deltaOnto(\n changes: Record<string, Record<string, unknown>>,\n active: Record<string, unknown>,\n defaults: Record<string, unknown>\n): Record<string, unknown> {\n const delta = configDelta(active, defaults)\n for (const [instrument, fields] of Object.entries(changes)) {\n delta[instrument] = { ...((delta[instrument] as Record<string, unknown>) ?? {}), ...fields }\n // A field back at its default is not an override.\n const defaultInstrument = defaults[instrument] as Record<string, unknown> | undefined\n if (defaultInstrument) {\n const instrumentDelta = delta[instrument] as Record<string, unknown>\n for (const [field, value] of Object.entries(fields)) {\n if (JSON.stringify(value) === JSON.stringify(defaultInstrument[field])) {\n delete instrumentDelta[field]\n }\n }\n if (Object.keys(instrumentDelta).length === 0) delete delta[instrument]\n }\n }\n return delta\n}\n\n/**\n * Save changes on top of the active config (the chat's choice, else the person's last, else the\n * defaults), keeping its other overrides and sending only what differs from the defaults.\n *\n * save(instrument, field, value, title?) one field (a switch)\n * saveDelta(changes, title?) several at once: { Agents: { ENABLED: true, \u2026 } }\n *\n * `baseConfigId`: the config a host shows (it can differ from the chat's), which saves build on\n * instead. Each save reads it first, so one made while it loads keeps its overrides, and builds on\n * the config the previous save made, so quick edits keep each other, also once the host shows a\n * config one of them made. The config a save makes becomes the chat's (`session.chatModel`), so\n * the host shows and uses it. A base that cannot be read is reported like a refused save.\n */\nexport function useSaveConfigField(baseConfigId?: string | null) {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n const saveConfig = useSaveConfig()\n const { data: defaultConfig } = useConfig('default')\n const chatModel = useArbiSessionState((state) => state.chatModel)\n const { data: userSettings } = useUserSettings()\n const activeConfigId = baseConfigId || chatModel || userSettings?.last_config || 'default'\n const { data: activeConfigData } = useConfig(activeConfigId)\n const session = useArbiSessionStore()\n // The saves on the shown config, one after another: every config id they started from or made\n // (the host shows the one a save made once the settings refetch), and the config the latest one\n // leaves (its own on success, the one it started from if refused), which never rejects.\n const chain = useRef<{ ids: Set<string>; latest: Promise<string> } | null>(null)\n\n const buildDelta = (changes: Record<string, Record<string, unknown>>) =>\n deltaOnto(\n changes,\n (activeConfigData ?? {}) as Record<string, unknown>,\n (defaultConfig ?? {}) as Record<string, unknown>\n )\n\n const readConfig = (configId: string) =>\n queryClient.fetchQuery({\n queryKey: arbiQueryKeys.config(configId),\n queryFn: () => arbi.agentConfig.get(configId),\n staleTime: 10 * 60 * 1000,\n }) as Promise<Record<string, unknown>>\n\n const saveOnBase = (\n base: string,\n changes: Record<string, Record<string, unknown>>,\n title: string\n ) => {\n // The shown config is one this chain made or started from: build on whatever it leaves.\n // Anything else is a config the host moved to: start a new chain there.\n const current = chain.current?.ids.has(base) ? chain.current : null\n const ids = current?.ids ?? new Set([base])\n const from = current?.latest ?? Promise.resolve(base)\n const saved = from.then(async (configId) => {\n const [defaults, active] = await Promise.all([\n readConfig('default'),\n readConfig(configId),\n ]).catch((error: unknown) => {\n notify.error(formatConfigValidationError(error), {\n description: 'Configuration not saved \u2014 the settings it builds on could not be read.',\n })\n throw error\n })\n const response = await saveConfig.mutateAsync({\n ...deltaOnto(changes, active ?? {}, defaults ?? {}),\n title,\n } as ConfigUpdate)\n if (response?.external_id) {\n ids.add(response.external_id)\n // The host shows the config this save made: the settings refetch does that for the\n // person's last config; one the chat (or a reply) runs on follows it here, as a model\n // pick does. A chain the host has since left does not pull it back.\n const { chatModel } = session.getState()\n const followsSettings = !chatModel && base === userSettings?.last_config\n if (chain.current?.ids === ids && !followsSettings) {\n session.setChatModel(response.external_id)\n }\n }\n return { response, configId: response?.external_id ?? configId }\n })\n chain.current = {\n ids,\n latest: Promise.all([from, saved]).then(\n ([, done]) => done.configId,\n () => from\n ),\n }\n return saved.then(({ response }) => response)\n }\n\n return {\n save: (instrument: string, field: string, value: unknown, title?: string) => {\n const changes = { [instrument]: { [field]: value } }\n const name = title ?? `prefs-${Date.now()}`\n // A refused save, or a base that could not be read, is already reported.\n if (baseConfigId) return void saveOnBase(baseConfigId, changes, name).catch(() => {})\n saveConfig.mutate({ ...buildDelta(changes), title: name } as ConfigUpdate)\n },\n saveDelta: (changes: Record<string, Record<string, unknown>>, title?: string) => {\n const name = title ?? `prefs-${Date.now()}`\n if (baseConfigId) return saveOnBase(baseConfigId, changes, name)\n return saveConfig.mutateAsync({ ...buildDelta(changes), title: name } as ConfigUpdate)\n },\n isPending: saveConfig.isPending,\n }\n}\n\n/** The model a chat runs on when no one picked one: the server chooses per turn. */\nexport const AUTO_CHAT_MODEL = 'auto'\n\n/** Each session's latest model save (a pick the next turn must run on), while it is in flight. */\nconst chatModelSaves = new WeakMap<object, Promise<unknown>>()\n\n/**\n * The chat's model save still in flight, if any: a send waits for it, so the turn runs on the model\n * the picker shows rather than on the config before the pick.\n */\nexport function pendingChatModelSave(session: object): Promise<unknown> | undefined {\n return chatModelSaves.get(session)\n}\n\n/**\n * Run the chat on a model (`auto` for the server's choice): the picker shows it at once, and it is\n * saved as a config delta (the Agents model, under `label`) that the next turn runs on. A send made\n * before the save lands waits for it; of two quick picks, the later one wins.\n */\nexport function useApplyChatModel(): (model: string, label: string) => Promise<void> {\n const session = useArbiSessionStore()\n const { data: availableModels } = useAvailableModels()\n const configField = useSaveConfigField()\n return useCallback(\n async (model, label) => {\n session.setChatModelName(model)\n const agents =\n model === AUTO_CHAT_MODEL\n ? { AGENT_MODEL_NAME: AUTO_CHAT_MODEL, ENABLED: true }\n : {\n AGENT_MODEL_NAME: model,\n AGENT_API_TYPE:\n availableModels?.models?.find((m) => m.model_name === model)?.api_type || 'remote',\n ENABLED: true,\n }\n const save = configField.saveDelta({ Agents: agents }, label).then((response) => {\n if (chatModelSaves.get(session) === save && response?.external_id)\n session.setChatModel(response.external_id)\n })\n chatModelSaves.set(session, save)\n try {\n await save\n } finally {\n if (chatModelSaves.get(session) === save) chatModelSaves.delete(session)\n }\n },\n [availableModels, configField, session]\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["chatModel"]
7
+ }