@arbidocs/react 0.5.110 → 0.5.112

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 (1011) hide show
  1. package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
  2. package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
  3. package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
  4. package/dist/account/client.js +96 -0
  5. package/dist/account/client.js.map +7 -0
  6. package/dist/account/delete.js +70 -0
  7. package/dist/account/delete.js.map +7 -0
  8. package/dist/account/didit.js +34 -0
  9. package/dist/account/didit.js.map +7 -0
  10. package/dist/account/dismissed-tips.js +33 -0
  11. package/dist/account/dismissed-tips.js.map +7 -0
  12. package/dist/account/email.js +84 -0
  13. package/dist/account/email.js.map +7 -0
  14. package/dist/account/entitlements.js +47 -0
  15. package/dist/account/entitlements.js.map +7 -0
  16. package/dist/account/identity.js +270 -0
  17. package/dist/account/identity.js.map +7 -0
  18. package/dist/account/index.js +93 -0
  19. package/dist/account/index.js.map +7 -0
  20. package/dist/account/notifications.js +59 -0
  21. package/dist/account/notifications.js.map +7 -0
  22. package/dist/account/password.js +103 -0
  23. package/dist/account/password.js.map +7 -0
  24. package/dist/account/profile.js +116 -0
  25. package/dist/account/profile.js.map +7 -0
  26. package/dist/account/recovery.js +13 -0
  27. package/dist/account/recovery.js.map +7 -0
  28. package/dist/account/relevance.js +82 -0
  29. package/dist/account/relevance.js.map +7 -0
  30. package/dist/account/sessions.js +37 -0
  31. package/dist/account/sessions.js.map +7 -0
  32. package/dist/account/settings.js +39 -0
  33. package/dist/account/settings.js.map +7 -0
  34. package/dist/account/table-views.js +16 -0
  35. package/dist/account/table-views.js.map +7 -0
  36. package/dist/ai/AiAnswer.js +83 -0
  37. package/dist/ai/AiAnswer.js.map +7 -0
  38. package/dist/ai/AiMarkdown.js +40 -0
  39. package/dist/ai/AiMarkdown.js.map +7 -0
  40. package/dist/ai/ArtifactCanvas.js +193 -0
  41. package/dist/ai/ArtifactCanvas.js.map +7 -0
  42. package/dist/ai/CitationRenderer.js +413 -0
  43. package/dist/ai/CitationRenderer.js.map +7 -0
  44. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  45. package/dist/ai/MarkdownRenderer.js.map +7 -0
  46. package/dist/ai/MessageArtifactCard.js +75 -0
  47. package/dist/ai/MessageArtifactCard.js.map +7 -0
  48. package/dist/ai/PassageCard.js +79 -0
  49. package/dist/ai/PassageCard.js.map +7 -0
  50. package/dist/ai/engine.js +110 -0
  51. package/dist/ai/engine.js.map +7 -0
  52. package/dist/ai/index.js +63 -0
  53. package/dist/ai/index.js.map +7 -0
  54. package/dist/ai/markdown-base-components.js +37 -0
  55. package/dist/ai/markdown-base-components.js.map +7 -0
  56. package/dist/ai/markdown-streaming-context.js +6 -0
  57. package/dist/ai/markdown-streaming-context.js.map +7 -0
  58. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  59. package/dist/ai/normalize-citations.js.map +7 -0
  60. package/dist/ai/redline.js +41 -0
  61. package/dist/ai/redline.js.map +7 -0
  62. package/dist/ai/split-markdown-blocks.js +40 -0
  63. package/dist/ai/split-markdown-blocks.js.map +7 -0
  64. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  65. package/dist/ai/stored-markdown.js.map +7 -0
  66. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  67. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  68. package/dist/annotations/AnnotationToolbar.js +398 -0
  69. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  70. package/dist/annotations/FreezeDialog.js +170 -0
  71. package/dist/annotations/FreezeDialog.js.map +7 -0
  72. package/dist/annotations/ProductionDialog.js +354 -0
  73. package/dist/annotations/ProductionDialog.js.map +7 -0
  74. package/dist/annotations/controller.js +49 -0
  75. package/dist/annotations/controller.js.map +7 -0
  76. package/dist/annotations/freeze/browser.js +21 -0
  77. package/dist/annotations/freeze/browser.js.map +7 -0
  78. package/dist/annotations/freeze/bundle.js +201 -0
  79. package/dist/annotations/freeze/bundle.js.map +7 -0
  80. package/dist/annotations/freeze/coords.js +37 -0
  81. package/dist/annotations/freeze/coords.js.map +7 -0
  82. package/dist/annotations/freeze/freeze.js +261 -0
  83. package/dist/annotations/freeze/freeze.js.map +7 -0
  84. package/dist/annotations/freeze/hash.js +28 -0
  85. package/dist/annotations/freeze/hash.js.map +7 -0
  86. package/dist/annotations/freeze/index-page.js +78 -0
  87. package/dist/annotations/freeze/index-page.js.map +7 -0
  88. package/dist/annotations/freeze/index.d.ts +1 -1
  89. package/dist/annotations/freeze/index.js +28 -22
  90. package/dist/annotations/freeze/index.js.map +7 -1
  91. package/dist/annotations/freeze/raster.js +208 -0
  92. package/dist/annotations/freeze/raster.js.map +7 -0
  93. package/dist/annotations/freeze/stamp.js +117 -0
  94. package/dist/annotations/freeze/stamp.js.map +7 -0
  95. package/dist/annotations/freeze/types.js +14 -0
  96. package/dist/annotations/freeze/types.js.map +7 -0
  97. package/dist/annotations/freeze/vector.js +283 -0
  98. package/dist/annotations/freeze/vector.js.map +7 -0
  99. package/dist/annotations/geometry.js +81 -0
  100. package/dist/annotations/geometry.js.map +7 -0
  101. package/dist/annotations/index.js +125 -6
  102. package/dist/annotations/index.js.map +7 -1
  103. package/dist/annotations/merge.js +53 -0
  104. package/dist/annotations/merge.js.map +7 -0
  105. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  106. package/dist/annotations/model.js.map +7 -0
  107. package/dist/annotations/overlay-geometry.js +41 -0
  108. package/dist/annotations/overlay-geometry.js.map +7 -0
  109. package/dist/annotations/redaction-log.js +33 -0
  110. package/dist/annotations/redaction-log.js.map +7 -0
  111. package/dist/annotations/selection-marks.js +122 -0
  112. package/dist/annotations/selection-marks.js.map +7 -0
  113. package/dist/annotations/state.js +140 -0
  114. package/dist/annotations/state.js.map +7 -0
  115. package/dist/annotations/store.js +49 -0
  116. package/dist/annotations/store.js.map +7 -0
  117. package/dist/annotations/useAnnotationLayer.js +306 -0
  118. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  119. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  120. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  121. package/dist/annotations/useTextSelectionMarks.js +100 -0
  122. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  123. package/dist/artifacts/artifact-kind.js +19 -0
  124. package/dist/artifacts/artifact-kind.js.map +7 -0
  125. package/dist/artifacts/index.cjs +13 -13
  126. package/dist/artifacts/index.js +89 -571
  127. package/dist/artifacts/index.js.map +7 -1
  128. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  129. package/dist/artifacts/normalize-markdown.js.map +7 -0
  130. package/dist/artifacts/redline-core.js +12 -3
  131. package/dist/artifacts/redline-core.js.map +7 -1
  132. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  133. package/dist/artifacts/redline-diff.js.map +7 -0
  134. package/dist/artifacts/redline-engine.js +14 -0
  135. package/dist/artifacts/redline-engine.js.map +7 -0
  136. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  137. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  138. package/dist/artifacts/useArtifactEditSession.js +183 -0
  139. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  140. package/dist/artifacts/useArtifactSession.js +173 -0
  141. package/dist/artifacts/useArtifactSession.js.map +7 -0
  142. package/dist/artifacts/useArtifactSource.js +16 -0
  143. package/dist/artifacts/useArtifactSource.js.map +7 -0
  144. package/dist/artifacts/useArtifactText.js +78 -0
  145. package/dist/artifacts/useArtifactText.js.map +7 -0
  146. package/dist/artifacts/useRedline.js +65 -0
  147. package/dist/artifacts/useRedline.js.map +7 -0
  148. package/dist/artifacts/useStreamedArtifact.js +74 -0
  149. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  150. package/dist/artifacts/versions.js +68 -0
  151. package/dist/artifacts/versions.js.map +7 -0
  152. package/dist/billing.js +200 -0
  153. package/dist/billing.js.map +7 -0
  154. package/dist/boot-timeout.js +19 -0
  155. package/dist/boot-timeout.js.map +7 -0
  156. package/dist/calendar/accounts.js +213 -0
  157. package/dist/calendar/accounts.js.map +7 -0
  158. package/dist/calendar/hooks.js +409 -0
  159. package/dist/calendar/hooks.js.map +7 -0
  160. package/dist/calendar/index.js +31 -0
  161. package/dist/calendar/index.js.map +7 -0
  162. package/dist/calendar/keys.js +5 -0
  163. package/dist/calendar/keys.js.map +7 -0
  164. package/dist/calendar/offline/outbox.js +231 -0
  165. package/dist/calendar/offline/outbox.js.map +7 -0
  166. package/dist/calendar/offline/runtime.js +109 -0
  167. package/dist/calendar/offline/runtime.js.map +7 -0
  168. package/dist/calendar/offline/support.js +41 -0
  169. package/dist/calendar/offline/support.js.map +7 -0
  170. package/dist/calendar/support.js +34 -0
  171. package/dist/calendar/support.js.map +7 -0
  172. package/dist/calls/actions.js +226 -0
  173. package/dist/calls/actions.js.map +7 -0
  174. package/dist/calls/events.js +138 -0
  175. package/dist/calls/events.js.map +7 -0
  176. package/dist/calls/gate.js +19 -0
  177. package/dist/calls/gate.js.map +7 -0
  178. package/dist/calls/hooks.js +115 -0
  179. package/dist/calls/hooks.js.map +7 -0
  180. package/dist/calls/in-call-chat.js +132 -0
  181. package/dist/calls/in-call-chat.js.map +7 -0
  182. package/dist/calls/index.js +24 -0
  183. package/dist/calls/index.js.map +7 -0
  184. package/dist/calls/keys.js +17 -0
  185. package/dist/calls/keys.js.map +7 -0
  186. package/dist/calls/livekit/index.cjs +48 -48
  187. package/dist/calls/livekit/index.js +6 -958
  188. package/dist/calls/livekit/index.js.map +7 -1
  189. package/dist/calls/livekit/room.js +98 -0
  190. package/dist/calls/livekit/room.js.map +7 -0
  191. package/dist/calls/livekit/useCallRecorder.js +219 -0
  192. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  193. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  194. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  195. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  196. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  197. package/dist/calls/livekit/useInCallChat.js +161 -0
  198. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  199. package/dist/calls/livekit/useWebinar.js +239 -0
  200. package/dist/calls/livekit/useWebinar.js.map +7 -0
  201. package/dist/calls/meeting-chat.js +149 -0
  202. package/dist/calls/meeting-chat.js.map +7 -0
  203. package/dist/calls/moderation.js +50 -0
  204. package/dist/calls/moderation.js.map +7 -0
  205. package/dist/calls/open-meeting-chat.js +29 -0
  206. package/dist/calls/open-meeting-chat.js.map +7 -0
  207. package/dist/calls/read-only.js +24 -0
  208. package/dist/calls/read-only.js.map +7 -0
  209. package/dist/calls/recording-media.js +218 -0
  210. package/dist/calls/recording-media.js.map +7 -0
  211. package/dist/calls/recording-playback.js +260 -0
  212. package/dist/calls/recording-playback.js.map +7 -0
  213. package/dist/calls/recording.js +268 -0
  214. package/dist/calls/recording.js.map +7 -0
  215. package/dist/calls/save-to-thread.js +80 -0
  216. package/dist/calls/save-to-thread.js.map +7 -0
  217. package/dist/calls/session.js +134 -0
  218. package/dist/calls/session.js.map +7 -0
  219. package/dist/calls/transcript-format.js +147 -0
  220. package/dist/calls/transcript-format.js.map +7 -0
  221. package/dist/calls/transcription.js +101 -0
  222. package/dist/calls/transcription.js.map +7 -0
  223. package/dist/calls/webinar.js +71 -0
  224. package/dist/calls/webinar.js.map +7 -0
  225. package/dist/charge-watch.js +71 -0
  226. package/dist/charge-watch.js.map +7 -0
  227. package/dist/chat/ChatBubble.js +146 -0
  228. package/dist/chat/ChatBubble.js.map +7 -0
  229. package/dist/chat/ConversationScope.js +30 -0
  230. package/dist/chat/ConversationScope.js.map +7 -0
  231. package/dist/chat/active-config.js +20 -0
  232. package/dist/chat/active-config.js.map +7 -0
  233. package/dist/chat/agent-chat-owner.js +25 -0
  234. package/dist/chat/agent-chat-owner.js.map +7 -0
  235. package/dist/chat/chat-artifacts.js +64 -0
  236. package/dist/chat/chat-artifacts.js.map +7 -0
  237. package/dist/chat/citations.js +32 -0
  238. package/dist/chat/citations.js.map +7 -0
  239. package/dist/chat/config-model.js +10 -0
  240. package/dist/chat/config-model.js.map +7 -0
  241. package/dist/chat/conversation-cache.js +676 -0
  242. package/dist/chat/conversation-cache.js.map +7 -0
  243. package/dist/chat/conversation-events.js +57 -0
  244. package/dist/chat/conversation-events.js.map +7 -0
  245. package/dist/chat/conversation-mentions.js +58 -0
  246. package/dist/chat/conversation-mentions.js.map +7 -0
  247. package/dist/chat/conversation-workspace.js +58 -0
  248. package/dist/chat/conversation-workspace.js.map +7 -0
  249. package/dist/chat/mentions.js +116 -0
  250. package/dist/chat/mentions.js.map +7 -0
  251. package/dist/chat/open-document.js +106 -0
  252. package/dist/chat/open-document.js.map +7 -0
  253. package/dist/chat/orphaned.js +44 -0
  254. package/dist/chat/orphaned.js.map +7 -0
  255. package/dist/chat/pendingFirstTurn.js +30 -0
  256. package/dist/chat/pendingFirstTurn.js.map +7 -0
  257. package/dist/chat/reply-target.js +12 -0
  258. package/dist/chat/reply-target.js.map +7 -0
  259. package/dist/chat/run-finished.js +28 -0
  260. package/dist/chat/run-finished.js.map +7 -0
  261. package/dist/chat/run-state.js +91 -0
  262. package/dist/chat/run-state.js.map +7 -0
  263. package/dist/chat/stream-handlers.js +419 -0
  264. package/dist/chat/stream-handlers.js.map +7 -0
  265. package/dist/chat/thread-binding.js +76 -0
  266. package/dist/chat/thread-binding.js.map +7 -0
  267. package/dist/chat/thread-document.js +53 -0
  268. package/dist/chat/thread-document.js.map +7 -0
  269. package/dist/chat/turn-control.js +79 -0
  270. package/dist/chat/turn-control.js.map +7 -0
  271. package/dist/chat/useAgentRunControl.js +36 -0
  272. package/dist/chat/useAgentRunControl.js.map +7 -0
  273. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  274. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  275. package/dist/chat/useAskAgain.js +32 -0
  276. package/dist/chat/useAskAgain.js.map +7 -0
  277. package/dist/chat/useAutoSendDraft.js +17 -0
  278. package/dist/chat/useAutoSendDraft.js.map +7 -0
  279. package/dist/chat/useBranchNavigation.js +97 -0
  280. package/dist/chat/useBranchNavigation.js.map +7 -0
  281. package/dist/chat/useConnectRunStream.js +169 -0
  282. package/dist/chat/useConnectRunStream.js.map +7 -0
  283. package/dist/chat/useConversation.js +431 -0
  284. package/dist/chat/useConversation.js.map +7 -0
  285. package/dist/chat/useConversationActions.js +662 -0
  286. package/dist/chat/useConversationActions.js.map +7 -0
  287. package/dist/chat/useConversationData.js +143 -0
  288. package/dist/chat/useConversationData.js.map +7 -0
  289. package/dist/chat/useConversationDocuments.js +41 -0
  290. package/dist/chat/useConversationDocuments.js.map +7 -0
  291. package/dist/chat/useConversationSettings.js +78 -0
  292. package/dist/chat/useConversationSettings.js.map +7 -0
  293. package/dist/chat/useConversationTurn.js +31 -0
  294. package/dist/chat/useConversationTurn.js.map +7 -0
  295. package/dist/chat/useConversationWorkspace.js +12 -0
  296. package/dist/chat/useConversationWorkspace.js.map +7 -0
  297. package/dist/chat/useDeleteMessage.js +15 -0
  298. package/dist/chat/useDeleteMessage.js.map +7 -0
  299. package/dist/chat/useDocumentAutoAdd.js +73 -0
  300. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  301. package/dist/chat/useMessageTimer.js +39 -0
  302. package/dist/chat/useMessageTimer.js.map +7 -0
  303. package/dist/chat/useThinkingContent.js +67 -0
  304. package/dist/chat/useThinkingContent.js.map +7 -0
  305. package/dist/chat/useThreadDocument.js +61 -0
  306. package/dist/chat/useThreadDocument.js.map +7 -0
  307. package/dist/chat/workflow-run-titles.js +50 -0
  308. package/dist/chat/workflow-run-titles.js.map +7 -0
  309. package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
  310. package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
  311. package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
  312. package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
  313. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  314. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  315. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  316. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  317. package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
  318. package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
  319. package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
  320. package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
  321. package/dist/chunk-PWGSIM3F.cjs +291 -0
  322. package/dist/chunk-PWGSIM3F.cjs.map +1 -0
  323. package/dist/chunk-QP3WQSAA.cjs +23 -0
  324. package/dist/chunk-QP3WQSAA.cjs.map +1 -0
  325. package/dist/chunk-T5FZICXN.cjs +50 -0
  326. package/dist/chunk-T5FZICXN.cjs.map +1 -0
  327. package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
  328. package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  329. package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
  330. package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
  331. package/dist/config/config-hooks.js +209 -0
  332. package/dist/config/config-hooks.js.map +7 -0
  333. package/dist/connectivity.js +72 -0
  334. package/dist/connectivity.js.map +7 -0
  335. package/dist/connectors/hooks.js +263 -0
  336. package/dist/connectors/hooks.js.map +7 -0
  337. package/dist/connectors/index.js +28 -0
  338. package/dist/connectors/index.js.map +7 -0
  339. package/dist/contacts.js +100 -0
  340. package/dist/contacts.js.map +7 -0
  341. package/dist/conversation-list.js +65 -0
  342. package/dist/conversation-list.js.map +7 -0
  343. package/dist/databases.js +195 -0
  344. package/dist/databases.js.map +7 -0
  345. package/dist/datasets/aggregate.js +281 -0
  346. package/dist/datasets/aggregate.js.map +7 -0
  347. package/dist/datasets/index.js +122 -0
  348. package/dist/datasets/index.js.map +7 -0
  349. package/dist/datasets/members.js +27 -0
  350. package/dist/datasets/members.js.map +7 -0
  351. package/dist/datasets/panel.js +44 -0
  352. package/dist/datasets/panel.js.map +7 -0
  353. package/dist/datasets/registry.js +47 -0
  354. package/dist/datasets/registry.js.map +7 -0
  355. package/dist/datasets/rows-source.js +44 -0
  356. package/dist/datasets/rows-source.js.map +7 -0
  357. package/dist/datasets/sources/activity.js +83 -0
  358. package/dist/datasets/sources/activity.js.map +7 -0
  359. package/dist/datasets/sources/conversations.js +74 -0
  360. package/dist/datasets/sources/conversations.js.map +7 -0
  361. package/dist/datasets/sources/database.js +209 -0
  362. package/dist/datasets/sources/database.js.map +7 -0
  363. package/dist/datasets/sources/documents.js +93 -0
  364. package/dist/datasets/sources/documents.js.map +7 -0
  365. package/dist/datasets/sources/facts.js +56 -0
  366. package/dist/datasets/sources/facts.js.map +7 -0
  367. package/dist/datasets/sources/projects.js +117 -0
  368. package/dist/datasets/sources/projects.js.map +7 -0
  369. package/dist/datasets/sources/tags.js +67 -0
  370. package/dist/datasets/sources/tags.js.map +7 -0
  371. package/dist/datasets/sources/usage.js +268 -0
  372. package/dist/datasets/sources/usage.js.map +7 -0
  373. package/dist/datasets/sources/workflows.js +91 -0
  374. package/dist/datasets/sources/workflows.js.map +7 -0
  375. package/dist/datasets/sources/workspaces.js +67 -0
  376. package/dist/datasets/sources/workspaces.js.map +7 -0
  377. package/dist/datasets/store.js +194 -0
  378. package/dist/datasets/store.js.map +7 -0
  379. package/dist/datasets/types.js +14 -0
  380. package/dist/datasets/types.js.map +7 -0
  381. package/dist/directmessages/ConversationList.js +148 -0
  382. package/dist/directmessages/ConversationList.js.map +7 -0
  383. package/dist/directmessages/DateSeparator.js +8 -0
  384. package/dist/directmessages/DateSeparator.js.map +7 -0
  385. package/dist/directmessages/DmAvatar.js +29 -0
  386. package/dist/directmessages/DmAvatar.js.map +7 -0
  387. package/dist/directmessages/DmComposer.js +201 -0
  388. package/dist/directmessages/DmComposer.js.map +7 -0
  389. package/dist/directmessages/arrivals.js +29 -0
  390. package/dist/directmessages/arrivals.js.map +7 -0
  391. package/dist/directmessages/chat-cache.js +192 -0
  392. package/dist/directmessages/chat-cache.js.map +7 -0
  393. package/dist/directmessages/grouping.js +26 -0
  394. package/dist/directmessages/grouping.js.map +7 -0
  395. package/dist/directmessages/index.js +81 -0
  396. package/dist/directmessages/index.js.map +7 -0
  397. package/dist/directmessages/useChats.js +266 -0
  398. package/dist/directmessages/useChats.js.map +7 -0
  399. package/dist/directmessages/utils.js +23 -0
  400. package/dist/directmessages/utils.js.map +7 -0
  401. package/dist/document-tools/can-annotate.js +7 -0
  402. package/dist/document-tools/can-annotate.js.map +7 -0
  403. package/dist/document-tools/core.cjs +99 -99
  404. package/dist/document-tools/core.d.ts +2 -2
  405. package/dist/document-tools/core.js +218 -12
  406. package/dist/document-tools/core.js.map +7 -1
  407. package/dist/document-tools/document-pdf.js +76 -0
  408. package/dist/document-tools/document-pdf.js.map +7 -0
  409. package/dist/document-tools/environment.js +136 -0
  410. package/dist/document-tools/environment.js.map +7 -0
  411. package/dist/document-tools/file-shares.js +112 -0
  412. package/dist/document-tools/file-shares.js.map +7 -0
  413. package/dist/document-tools/frozen-copy.js +27 -0
  414. package/dist/document-tools/frozen-copy.js.map +7 -0
  415. package/dist/document-tools/index.cjs +101 -101
  416. package/dist/document-tools/index.d.ts +1 -1
  417. package/dist/document-tools/index.js +26 -148
  418. package/dist/document-tools/index.js.map +7 -1
  419. package/dist/document-tools/markup-download.js +51 -0
  420. package/dist/document-tools/markup-download.js.map +7 -0
  421. package/dist/document-tools/markup-store.js +138 -0
  422. package/dist/document-tools/markup-store.js.map +7 -0
  423. package/dist/document-tools/markup-transfer.js +88 -0
  424. package/dist/document-tools/markup-transfer.js.map +7 -0
  425. package/dist/document-tools/production.js +147 -0
  426. package/dist/document-tools/production.js.map +7 -0
  427. package/dist/document-tools/saved-signature.js +90 -0
  428. package/dist/document-tools/saved-signature.js.map +7 -0
  429. package/dist/document-tools/signature-requests.js +310 -0
  430. package/dist/document-tools/signature-requests.js.map +7 -0
  431. package/dist/document-tools/signing.js +127 -0
  432. package/dist/document-tools/signing.js.map +7 -0
  433. package/dist/document-tools/useDocumentBytes.js +38 -0
  434. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  435. package/dist/document-tools/useDocumentMarkup.js +154 -0
  436. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  437. package/dist/document-tools/useIsOnline.js +13 -0
  438. package/dist/document-tools/useIsOnline.js.map +7 -0
  439. package/dist/document-tools/verification.js +60 -0
  440. package/dist/document-tools/verification.js.map +7 -0
  441. package/dist/documents/DocumentReview.js +220 -0
  442. package/dist/documents/DocumentReview.js.map +7 -0
  443. package/dist/documents/DraftTitleControls.js +41 -0
  444. package/dist/documents/DraftTitleControls.js.map +7 -0
  445. package/dist/documents/InlineMicButton.js +90 -0
  446. package/dist/documents/InlineMicButton.js.map +7 -0
  447. package/dist/documents/MicRecordingOverlay.js +29 -0
  448. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  449. package/dist/documents/MicWaveformIndicator.js +68 -0
  450. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  451. package/dist/documents/PhotoCapture.js +120 -0
  452. package/dist/documents/PhotoCapture.js.map +7 -0
  453. package/dist/documents/VideoCapture.js +129 -0
  454. package/dist/documents/VideoCapture.js.map +7 -0
  455. package/dist/documents/VoiceNoteRecorder.js +166 -0
  456. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  457. package/dist/documents/audio-segmenter.js +63 -0
  458. package/dist/documents/audio-segmenter.js.map +7 -0
  459. package/dist/documents/capture-frame.js +21 -0
  460. package/dist/documents/capture-frame.js.map +7 -0
  461. package/dist/documents/chunked-recorder.js +190 -0
  462. package/dist/documents/chunked-recorder.js.map +7 -0
  463. package/dist/documents/document-download.js +53 -0
  464. package/dist/documents/document-download.js.map +7 -0
  465. package/dist/documents/document-fields.js +109 -0
  466. package/dist/documents/document-fields.js.map +7 -0
  467. package/dist/documents/documents-cache.js +110 -0
  468. package/dist/documents/documents-cache.js.map +7 -0
  469. package/dist/documents/documents-data.js +128 -0
  470. package/dist/documents/documents-data.js.map +7 -0
  471. package/dist/documents/documents-loader.js +113 -0
  472. package/dist/documents/documents-loader.js.map +7 -0
  473. package/dist/documents/documents-writes.js +448 -0
  474. package/dist/documents/documents-writes.js.map +7 -0
  475. package/dist/documents/format-elapsed.js +10 -0
  476. package/dist/documents/format-elapsed.js.map +7 -0
  477. package/dist/documents/has-video-track.js +26 -0
  478. package/dist/documents/has-video-track.js.map +7 -0
  479. package/dist/documents/index.js +266 -0
  480. package/dist/documents/index.js.map +7 -0
  481. package/dist/documents/media-error.js +18 -0
  482. package/dist/documents/media-error.js.map +7 -0
  483. package/dist/documents/offline-documents.js +160 -0
  484. package/dist/documents/offline-documents.js.map +7 -0
  485. package/dist/documents/pending-sync.js +210 -0
  486. package/dist/documents/pending-sync.js.map +7 -0
  487. package/dist/documents/processing-live.js +122 -0
  488. package/dist/documents/processing-live.js.map +7 -0
  489. package/dist/documents/processing-order.js +59 -0
  490. package/dist/documents/processing-order.js.map +7 -0
  491. package/dist/documents/processing-settle.js +21 -0
  492. package/dist/documents/processing-settle.js.map +7 -0
  493. package/dist/documents/related-documents.js +133 -0
  494. package/dist/documents/related-documents.js.map +7 -0
  495. package/dist/documents/support.js +29 -0
  496. package/dist/documents/support.js.map +7 -0
  497. package/dist/documents/upload-files.js +169 -0
  498. package/dist/documents/upload-files.js.map +7 -0
  499. package/dist/documents/useAudioRecorder.js +315 -0
  500. package/dist/documents/useAudioRecorder.js.map +7 -0
  501. package/dist/documents/useCameraStream.js +35 -0
  502. package/dist/documents/useCameraStream.js.map +7 -0
  503. package/dist/documents/useDocumentThumbnails.js +71 -0
  504. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  505. package/dist/documents/useDownloadDocuments.js +90 -0
  506. package/dist/documents/useDownloadDocuments.js.map +7 -0
  507. package/dist/documents/usePassageQuotes.js +37 -0
  508. package/dist/documents/usePassageQuotes.js.map +7 -0
  509. package/dist/documents/useUploadFiles.js +165 -0
  510. package/dist/documents/useUploadFiles.js.map +7 -0
  511. package/dist/documents/useUploadFromUrls.js +63 -0
  512. package/dist/documents/useUploadFromUrls.js.map +7 -0
  513. package/dist/documents/useVideoRecorder.js +62 -0
  514. package/dist/documents/useVideoRecorder.js.map +7 -0
  515. package/dist/entities/AgentMarkers.js +61 -0
  516. package/dist/entities/AgentMarkers.js.map +7 -0
  517. package/dist/entities/DocumentEntity.js +125 -0
  518. package/dist/entities/DocumentEntity.js.map +7 -0
  519. package/dist/entities/EntityPill.js +250 -0
  520. package/dist/entities/EntityPill.js.map +7 -0
  521. package/dist/entities/ProjectEntity.js +61 -0
  522. package/dist/entities/ProjectEntity.js.map +7 -0
  523. package/dist/entities/ShieldIcon.js +49 -0
  524. package/dist/entities/ShieldIcon.js.map +7 -0
  525. package/dist/entities/TagEntity.js +79 -0
  526. package/dist/entities/TagEntity.js.map +7 -0
  527. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  528. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  529. package/dist/entities/UserEntity.js +211 -0
  530. package/dist/entities/UserEntity.js.map +7 -0
  531. package/dist/entities/VerifiedBadge.js +19 -0
  532. package/dist/entities/VerifiedBadge.js.map +7 -0
  533. package/dist/entities/agent-avatar-colors.js +26 -0
  534. package/dist/entities/agent-avatar-colors.js.map +7 -0
  535. package/dist/entities/colors.js +64 -0
  536. package/dist/entities/colors.js.map +7 -0
  537. package/dist/entities/file-type.js +151 -0
  538. package/dist/entities/file-type.js.map +7 -0
  539. package/dist/entities/index.js +100 -0
  540. package/dist/entities/index.js.map +7 -0
  541. package/dist/entities/media-type.js +61 -0
  542. package/dist/entities/media-type.js.map +7 -0
  543. package/dist/entities/registry.js +385 -0
  544. package/dist/entities/registry.js.map +7 -0
  545. package/dist/entities/status.js +43 -0
  546. package/dist/entities/status.js.map +7 -0
  547. package/dist/entities/tag-kinds.js +23 -0
  548. package/dist/entities/tag-kinds.js.map +7 -0
  549. package/dist/entities/tag-types.js +44 -0
  550. package/dist/entities/tag-types.js.map +7 -0
  551. package/dist/entities/vocabulary.js +12 -0
  552. package/dist/entities/vocabulary.js.map +7 -0
  553. package/dist/entity-extraction.js +25 -0
  554. package/dist/entity-extraction.js.map +7 -0
  555. package/dist/facts-search.js +57 -0
  556. package/dist/facts-search.js.map +7 -0
  557. package/dist/facts.js +69 -0
  558. package/dist/facts.js.map +7 -0
  559. package/dist/hooks.js +320 -0
  560. package/dist/hooks.js.map +7 -0
  561. package/dist/host/ArbiHost.js +24 -0
  562. package/dist/host/ArbiHost.js.map +7 -0
  563. package/dist/host/assistant-copy.js +54 -0
  564. package/dist/host/assistant-copy.js.map +7 -0
  565. package/dist/host/config.js +9 -0
  566. package/dist/host/config.js.map +7 -0
  567. package/dist/host/context.js +10 -0
  568. package/dist/host/context.js.map +7 -0
  569. package/dist/host/features.js +144 -0
  570. package/dist/host/features.js.map +7 -0
  571. package/dist/host/index.js +12 -0
  572. package/dist/host/index.js.map +7 -0
  573. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  574. package/dist/host/merge.js.map +7 -0
  575. package/dist/house-template.js +40 -0
  576. package/dist/house-template.js.map +7 -0
  577. package/dist/icons/AppleIcon.js +25 -0
  578. package/dist/icons/AppleIcon.js.map +7 -0
  579. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  580. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  581. package/dist/icons/ArbiIcon.js +24 -0
  582. package/dist/icons/ArbiIcon.js.map +7 -0
  583. package/dist/icons/AudIcon.js +56 -0
  584. package/dist/icons/AudIcon.js.map +7 -0
  585. package/dist/icons/ClaudeIcon.js +28 -0
  586. package/dist/icons/ClaudeIcon.js.map +7 -0
  587. package/dist/icons/DocIcon.js +56 -0
  588. package/dist/icons/DocIcon.js.map +7 -0
  589. package/dist/icons/EmlIcon.js +57 -0
  590. package/dist/icons/EmlIcon.js.map +7 -0
  591. package/dist/icons/FireworksIcon.js +47 -0
  592. package/dist/icons/FireworksIcon.js.map +7 -0
  593. package/dist/icons/GeminiIcon.js +37 -0
  594. package/dist/icons/GeminiIcon.js.map +7 -0
  595. package/dist/icons/GitHubIcon.js +32 -0
  596. package/dist/icons/GitHubIcon.js.map +7 -0
  597. package/dist/icons/GoogleIcon.js +53 -0
  598. package/dist/icons/GoogleIcon.js.map +7 -0
  599. package/dist/icons/HtmlIcon.js +56 -0
  600. package/dist/icons/HtmlIcon.js.map +7 -0
  601. package/dist/icons/ImgIcon.js +56 -0
  602. package/dist/icons/ImgIcon.js.map +7 -0
  603. package/dist/icons/LinkedInIcon.js +25 -0
  604. package/dist/icons/LinkedInIcon.js.map +7 -0
  605. package/dist/icons/OpenAIIcon.js +28 -0
  606. package/dist/icons/OpenAIIcon.js.map +7 -0
  607. package/dist/icons/PdfIcon.js +56 -0
  608. package/dist/icons/PdfIcon.js.map +7 -0
  609. package/dist/icons/ProviderIcon.js +42 -0
  610. package/dist/icons/ProviderIcon.js.map +7 -0
  611. package/dist/icons/TxtIcon.js +56 -0
  612. package/dist/icons/TxtIcon.js.map +7 -0
  613. package/dist/icons/VidIcon.js +56 -0
  614. package/dist/icons/VidIcon.js.map +7 -0
  615. package/dist/icons/XlsIcon.js +56 -0
  616. package/dist/icons/XlsIcon.js.map +7 -0
  617. package/dist/icons/arbi-mark.js +5 -0
  618. package/dist/icons/arbi-mark.js.map +7 -0
  619. package/dist/icons/colors.js +31 -0
  620. package/dist/icons/colors.js.map +7 -0
  621. package/dist/icons/file-type.js +105 -0
  622. package/dist/icons/file-type.js.map +7 -0
  623. package/dist/icons/index.js +55 -0
  624. package/dist/icons/index.js.map +7 -0
  625. package/dist/imagecrop/ImageCropModal.js +56 -0
  626. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  627. package/dist/imagecrop/ImageCropper.js +100 -0
  628. package/dist/imagecrop/ImageCropper.js.map +7 -0
  629. package/dist/imagecrop/cropImage.js +43 -0
  630. package/dist/imagecrop/cropImage.js.map +7 -0
  631. package/dist/imagecrop/index.js +13 -0
  632. package/dist/imagecrop/index.js.map +7 -0
  633. package/dist/index.cjs +1689 -1619
  634. package/dist/index.cjs.map +1 -1
  635. package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
  636. package/dist/index.d.ts +38 -8
  637. package/dist/index.js +702 -17060
  638. package/dist/index.js.map +7 -1
  639. package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
  640. package/dist/lazy-chunk.js +46 -0
  641. package/dist/lazy-chunk.js.map +7 -0
  642. package/dist/lib/collision-padding.js +13 -0
  643. package/dist/lib/collision-padding.js.map +7 -0
  644. package/dist/lib/format-friendly-date.js +55 -0
  645. package/dist/lib/format-friendly-date.js.map +7 -0
  646. package/dist/lib/format-relative-time.js +52 -0
  647. package/dist/lib/format-relative-time.js.map +7 -0
  648. package/dist/lib/markdown-to-text.js +35 -0
  649. package/dist/lib/markdown-to-text.js.map +7 -0
  650. package/dist/lib/toast-interaction.js +9 -0
  651. package/dist/lib/toast-interaction.js.map +7 -0
  652. package/dist/lib/utils.js +9 -0
  653. package/dist/lib/utils.js.map +7 -0
  654. package/dist/mail/client.js +103 -0
  655. package/dist/mail/client.js.map +7 -0
  656. package/dist/mail/document-attachment.js +38 -0
  657. package/dist/mail/document-attachment.js.map +7 -0
  658. package/dist/mail/filing.js +132 -0
  659. package/dist/mail/filing.js.map +7 -0
  660. package/dist/mail/hooks.js +393 -0
  661. package/dist/mail/hooks.js.map +7 -0
  662. package/dist/mail/index.js +120 -0
  663. package/dist/mail/index.js.map +7 -0
  664. package/dist/mail/offline/changes.js +258 -0
  665. package/dist/mail/offline/changes.js.map +7 -0
  666. package/dist/mail/offline/confirm-sign-out.js +37 -0
  667. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  668. package/dist/mail/offline/crypto.js +26 -0
  669. package/dist/mail/offline/crypto.js.map +7 -0
  670. package/dist/mail/offline/drafts.js +69 -0
  671. package/dist/mail/offline/drafts.js.map +7 -0
  672. package/dist/mail/offline/hooks.js +104 -0
  673. package/dist/mail/offline/hooks.js.map +7 -0
  674. package/dist/mail/offline/index.js +48 -0
  675. package/dist/mail/offline/index.js.map +7 -0
  676. package/dist/mail/offline/live.js +233 -0
  677. package/dist/mail/offline/live.js.map +7 -0
  678. package/dist/mail/offline/mailbox.js +191 -0
  679. package/dist/mail/offline/mailbox.js.map +7 -0
  680. package/dist/mail/offline/outbox.js +167 -0
  681. package/dist/mail/offline/outbox.js.map +7 -0
  682. package/dist/mail/offline/reads.js +159 -0
  683. package/dist/mail/offline/reads.js.map +7 -0
  684. package/dist/mail/offline/runtime.js +100 -0
  685. package/dist/mail/offline/runtime.js.map +7 -0
  686. package/dist/mail/offline/settings.js +84 -0
  687. package/dist/mail/offline/settings.js.map +7 -0
  688. package/dist/mail/offline/store.js +29 -0
  689. package/dist/mail/offline/store.js.map +7 -0
  690. package/dist/mail/offline/sync.js +251 -0
  691. package/dist/mail/offline/sync.js.map +7 -0
  692. package/dist/mail/offline/wipe.js +19 -0
  693. package/dist/mail/offline/wipe.js.map +7 -0
  694. package/dist/mail/thread-keys.js +53 -0
  695. package/dist/mail/thread-keys.js.map +7 -0
  696. package/dist/mail/threads.js +71 -0
  697. package/dist/mail/threads.js.map +7 -0
  698. package/dist/mail/useMailClient.js +42 -0
  699. package/dist/mail/useMailClient.js.map +7 -0
  700. package/dist/model-connections.js +58 -0
  701. package/dist/model-connections.js.map +7 -0
  702. package/dist/notifications/ActivityFeed.js +70 -0
  703. package/dist/notifications/ActivityFeed.js.map +7 -0
  704. package/dist/notifications/NotificationBell.js +200 -0
  705. package/dist/notifications/NotificationBell.js.map +7 -0
  706. package/dist/notifications/Toaster.js +24 -0
  707. package/dist/notifications/Toaster.js.map +7 -0
  708. package/dist/notifications/activity-types.js +65 -0
  709. package/dist/notifications/activity-types.js.map +7 -0
  710. package/dist/notifications/bell.js +24 -0
  711. package/dist/notifications/bell.js.map +7 -0
  712. package/dist/notifications/calendar-notifications.js +79 -0
  713. package/dist/notifications/calendar-notifications.js.map +7 -0
  714. package/dist/notifications/index.js +108 -0
  715. package/dist/notifications/index.js.map +7 -0
  716. package/dist/notifications/live.js +28 -0
  717. package/dist/notifications/live.js.map +7 -0
  718. package/dist/notifications/notification-types.js +127 -0
  719. package/dist/notifications/notification-types.js.map +7 -0
  720. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  721. package/dist/notifications/notify-store.js.map +7 -0
  722. package/dist/notifications/server-notifications.js +452 -0
  723. package/dist/notifications/server-notifications.js.map +7 -0
  724. package/dist/notifications/useNotifications.js +34 -0
  725. package/dist/notifications/useNotifications.js.map +7 -0
  726. package/dist/offline-store/network.js +11 -0
  727. package/dist/offline-store/network.js.map +7 -0
  728. package/dist/offline-store/store.js +136 -0
  729. package/dist/offline-store/store.js.map +7 -0
  730. package/dist/offline-store/wipe.js +8 -0
  731. package/dist/offline-store/wipe.js.map +7 -0
  732. package/dist/offline.js +58 -0
  733. package/dist/offline.js.map +7 -0
  734. package/dist/people.js +122 -0
  735. package/dist/people.js.map +7 -0
  736. package/dist/projects.js +30 -0
  737. package/dist/projects.js.map +7 -0
  738. package/dist/query-client.js +63 -0
  739. package/dist/query-client.js.map +7 -0
  740. package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
  741. package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
  742. package/dist/query-keys.js.map +7 -0
  743. package/dist/query-persist.js +66 -0
  744. package/dist/query-persist.js.map +7 -0
  745. package/dist/queued-writes.js +59 -0
  746. package/dist/queued-writes.js.map +7 -0
  747. package/dist/remote-control.js +67 -0
  748. package/dist/remote-control.js.map +7 -0
  749. package/dist/search/index.js +23 -0
  750. package/dist/search/index.js.map +7 -0
  751. package/dist/search/session.js +58 -0
  752. package/dist/search/session.js.map +7 -0
  753. package/dist/search/useSemanticSearch.js +82 -0
  754. package/dist/search/useSemanticSearch.js.map +7 -0
  755. package/dist/session/chat.js +512 -0
  756. package/dist/session/chat.js.map +7 -0
  757. package/dist/session/documents.js +196 -0
  758. package/dist/session/documents.js.map +7 -0
  759. package/dist/session/drafts.js +103 -0
  760. package/dist/session/drafts.js.map +7 -0
  761. package/dist/session/index.js +123 -0
  762. package/dist/session/index.js.map +7 -0
  763. package/dist/session/layout.js +339 -0
  764. package/dist/session/layout.js.map +7 -0
  765. package/dist/session/persist.js +106 -0
  766. package/dist/session/persist.js.map +7 -0
  767. package/dist/session/session-hooks.js +53 -0
  768. package/dist/session/session-hooks.js.map +7 -0
  769. package/dist/session/signed-in.js +36 -0
  770. package/dist/session/signed-in.js.map +7 -0
  771. package/dist/session/store.js +166 -0
  772. package/dist/session/store.js.map +7 -0
  773. package/dist/session/thread-tabs.js +121 -0
  774. package/dist/session/thread-tabs.js.map +7 -0
  775. package/dist/session/ui-state-storage.js +76 -0
  776. package/dist/session/ui-state-storage.js.map +7 -0
  777. package/dist/session/workspace.js +77 -0
  778. package/dist/session/workspace.js.map +7 -0
  779. package/dist/shell/index.cjs +37 -37
  780. package/dist/shell/index.js +43 -10
  781. package/dist/shell/index.js.map +7 -1
  782. package/dist/skill-pack.js +111 -0
  783. package/dist/skill-pack.js.map +7 -0
  784. package/dist/storage.js +186 -0
  785. package/dist/storage.js.map +7 -0
  786. package/dist/support/index.js +35 -0
  787. package/dist/support/index.js.map +7 -0
  788. package/dist/tags.js +204 -0
  789. package/dist/tags.js.map +7 -0
  790. package/dist/ui/DebouncedInput.js +109 -0
  791. package/dist/ui/DebouncedInput.js.map +7 -0
  792. package/dist/ui/DictateContext.js +8 -0
  793. package/dist/ui/DictateContext.js.map +7 -0
  794. package/dist/ui/IconToggle.js +79 -0
  795. package/dist/ui/IconToggle.js.map +7 -0
  796. package/dist/ui/VerifiedToggle.js +38 -0
  797. package/dist/ui/VerifiedToggle.js.map +7 -0
  798. package/dist/ui/VisibilityToggle.js +103 -0
  799. package/dist/ui/VisibilityToggle.js.map +7 -0
  800. package/dist/ui/avatar.js +40 -0
  801. package/dist/ui/avatar.js.map +7 -0
  802. package/dist/ui/badge.js +28 -0
  803. package/dist/ui/badge.js.map +7 -0
  804. package/dist/ui/button.js +48 -0
  805. package/dist/ui/button.js.map +7 -0
  806. package/dist/ui/card.js +90 -0
  807. package/dist/ui/card.js.map +7 -0
  808. package/dist/ui/checkbox.js +22 -0
  809. package/dist/ui/checkbox.js.map +7 -0
  810. package/dist/ui/collapsible.js +10 -0
  811. package/dist/ui/collapsible.js.map +7 -0
  812. package/dist/ui/command.js +103 -0
  813. package/dist/ui/command.js.map +7 -0
  814. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  815. package/dist/ui/dialog.js.map +7 -0
  816. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  817. package/dist/ui/dropdown-menu.js.map +7 -0
  818. package/dist/ui/hover-card.js +36 -0
  819. package/dist/ui/hover-card.js.map +7 -0
  820. package/dist/ui/index.cjs +167 -154
  821. package/dist/ui/index.d.ts +2 -1
  822. package/dist/ui/index.js +290 -9
  823. package/dist/ui/index.js.map +7 -1
  824. package/dist/ui/input.js +65 -0
  825. package/dist/ui/input.js.map +7 -0
  826. package/dist/ui/label.js +16 -0
  827. package/dist/ui/label.js.map +7 -0
  828. package/dist/ui/mark-menu.js +300 -0
  829. package/dist/ui/mark-menu.js.map +7 -0
  830. package/dist/ui/popover.js +40 -0
  831. package/dist/ui/popover.js.map +7 -0
  832. package/dist/ui/portal-container.js +17 -0
  833. package/dist/ui/portal-container.js.map +7 -0
  834. package/dist/ui/progress.js +24 -0
  835. package/dist/ui/progress.js.map +7 -0
  836. package/dist/ui/radio-group.js +29 -0
  837. package/dist/ui/radio-group.js.map +7 -0
  838. package/dist/ui/scroll-area.js +39 -0
  839. package/dist/ui/scroll-area.js.map +7 -0
  840. package/dist/ui/select.js +130 -0
  841. package/dist/ui/select.js.map +7 -0
  842. package/dist/ui/separator.js +23 -0
  843. package/dist/ui/separator.js.map +7 -0
  844. package/dist/ui/slider.js +23 -0
  845. package/dist/ui/slider.js.map +7 -0
  846. package/dist/ui/switch.js +28 -0
  847. package/dist/ui/switch.js.map +7 -0
  848. package/dist/ui/table.js +75 -0
  849. package/dist/ui/table.js.map +7 -0
  850. package/dist/ui/tabs.js +48 -0
  851. package/dist/ui/tabs.js.map +7 -0
  852. package/dist/ui/textarea.js +63 -0
  853. package/dist/ui/textarea.js.map +7 -0
  854. package/dist/ui/toggle-group.js +43 -0
  855. package/dist/ui/toggle-group.js.map +7 -0
  856. package/dist/ui/toggle.js +40 -0
  857. package/dist/ui/toggle.js.map +7 -0
  858. package/dist/ui/tooltip.js +215 -0
  859. package/dist/ui/tooltip.js.map +7 -0
  860. package/dist/usage-metered.js +8 -0
  861. package/dist/usage-metered.js.map +7 -0
  862. package/dist/useArbi.js +16 -0
  863. package/dist/useArbi.js.map +7 -0
  864. package/dist/useInstallSkillPack.js +81 -0
  865. package/dist/useInstallSkillPack.js.map +7 -0
  866. package/dist/usermenu/UserMenu.js +188 -0
  867. package/dist/usermenu/UserMenu.js.map +7 -0
  868. package/dist/usermenu/index.js +5 -0
  869. package/dist/usermenu/index.js.map +7 -0
  870. package/dist/users/index.js +15 -0
  871. package/dist/users/index.js.map +7 -0
  872. package/dist/users/user-display.js +60 -0
  873. package/dist/users/user-display.js.map +7 -0
  874. package/dist/viewers/AudioViewer.js +23 -0
  875. package/dist/viewers/AudioViewer.js.map +7 -0
  876. package/dist/viewers/DocxViewer.js +81 -0
  877. package/dist/viewers/DocxViewer.js.map +7 -0
  878. package/dist/viewers/ImageViewer.js +31 -0
  879. package/dist/viewers/ImageViewer.js.map +7 -0
  880. package/dist/viewers/PdfViewer.cjs +17 -0
  881. package/dist/viewers/PdfViewer.cjs.map +1 -0
  882. package/dist/viewers/PdfViewer.d.ts +9 -0
  883. package/dist/viewers/PdfViewer.js +20 -0
  884. package/dist/viewers/PdfViewer.js.map +7 -0
  885. package/dist/viewers/PdfViewerImpl.js +384 -0
  886. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  887. package/dist/viewers/VideoViewer.js +31 -0
  888. package/dist/viewers/VideoViewer.js.map +7 -0
  889. package/dist/viewers/XlsxViewer.js +102 -0
  890. package/dist/viewers/XlsxViewer.js.map +7 -0
  891. package/dist/viewers/index.cjs +79 -653
  892. package/dist/viewers/index.cjs.map +1 -1
  893. package/dist/viewers/index.d.ts +3 -1
  894. package/dist/viewers/index.js +60 -903
  895. package/dist/viewers/index.js.map +7 -1
  896. package/dist/viewers/page-scroll.js +59 -0
  897. package/dist/viewers/page-scroll.js.map +7 -0
  898. package/dist/viewers/pdf-viewer-constants.js +9 -0
  899. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  900. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  901. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  902. package/dist/viewers/selection-runs.js +38 -0
  903. package/dist/viewers/selection-runs.js.map +7 -0
  904. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  905. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  906. package/dist/viewers/useProcessedChunks.js +58 -0
  907. package/dist/viewers/useProcessedChunks.js.map +7 -0
  908. package/dist/viewers/viewer-zoom.js +163 -0
  909. package/dist/viewers/viewer-zoom.js.map +7 -0
  910. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  911. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  912. package/dist/websocket/context.js +14 -0
  913. package/dist/websocket/context.js.map +7 -0
  914. package/dist/websocket/hooks.js +30 -0
  915. package/dist/websocket/hooks.js.map +7 -0
  916. package/dist/websocket/index.js +22 -0
  917. package/dist/websocket/index.js.map +7 -0
  918. package/dist/websocket/live-updates.js +38 -0
  919. package/dist/websocket/live-updates.js.map +7 -0
  920. package/dist/websocket/reconnect.js +13 -0
  921. package/dist/websocket/reconnect.js.map +7 -0
  922. package/dist/websocket/store.js +58 -0
  923. package/dist/websocket/store.js.map +7 -0
  924. package/dist/workforce.js +607 -0
  925. package/dist/workforce.js.map +7 -0
  926. package/dist/workspaces/access-request.js +35 -0
  927. package/dist/workspaces/access-request.js.map +7 -0
  928. package/dist/workspaces/archive.js +59 -0
  929. package/dist/workspaces/archive.js.map +7 -0
  930. package/dist/workspaces/current.js +20 -0
  931. package/dist/workspaces/current.js.map +7 -0
  932. package/dist/workspaces/delete-workspaces.js +15 -0
  933. package/dist/workspaces/delete-workspaces.js.map +7 -0
  934. package/dist/workspaces/export-archive.js +40 -0
  935. package/dist/workspaces/export-archive.js.map +7 -0
  936. package/dist/workspaces/index.js +99 -0
  937. package/dist/workspaces/index.js.map +7 -0
  938. package/dist/workspaces/settings.js +45 -0
  939. package/dist/workspaces/settings.js.map +7 -0
  940. package/dist/workspaces/shell-workspaces.js +49 -0
  941. package/dist/workspaces/shell-workspaces.js.map +7 -0
  942. package/dist/workspaces/switch.js +234 -0
  943. package/dist/workspaces/switch.js.map +7 -0
  944. package/dist/workspaces/transfer.js +170 -0
  945. package/dist/workspaces/transfer.js.map +7 -0
  946. package/dist/workspaces/useShellWorkspaces.js +86 -0
  947. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  948. package/dist/workspaces/workspace-users.js +65 -0
  949. package/dist/workspaces/workspace-users.js.map +7 -0
  950. package/package.json +12 -4
  951. package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
  952. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  953. package/dist/annotations/freeze/index.d.cts +0 -205
  954. package/dist/annotations/index.d.cts +0 -360
  955. package/dist/artifacts/index.d.cts +0 -476
  956. package/dist/artifacts/redline-core.d.cts +0 -39
  957. package/dist/bundle-YNOX7VIL.js +0 -5
  958. package/dist/bundle-YNOX7VIL.js.map +0 -1
  959. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  960. package/dist/calls/livekit/index.d.cts +0 -280
  961. package/dist/chunk-47CCGUWR.js.map +0 -1
  962. package/dist/chunk-6H3O63TQ.js.map +0 -1
  963. package/dist/chunk-74N436VK.js.map +0 -1
  964. package/dist/chunk-APZZQZ6P.js +0 -147
  965. package/dist/chunk-APZZQZ6P.js.map +0 -1
  966. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  967. package/dist/chunk-CPQ3CU4B.js +0 -246
  968. package/dist/chunk-CPQ3CU4B.js.map +0 -1
  969. package/dist/chunk-DPYBZDJB.js.map +0 -1
  970. package/dist/chunk-DQALOQPI.js +0 -2766
  971. package/dist/chunk-DQALOQPI.js.map +0 -1
  972. package/dist/chunk-FZJMA32S.js +0 -1011
  973. package/dist/chunk-FZJMA32S.js.map +0 -1
  974. package/dist/chunk-H5M7FXLB.js +0 -2057
  975. package/dist/chunk-H5M7FXLB.js.map +0 -1
  976. package/dist/chunk-HDCRPPBW.js +0 -75
  977. package/dist/chunk-HDCRPPBW.js.map +0 -1
  978. package/dist/chunk-NIKPG4PW.js +0 -1128
  979. package/dist/chunk-NIKPG4PW.js.map +0 -1
  980. package/dist/chunk-NNAJLY6B.js +0 -4974
  981. package/dist/chunk-NNAJLY6B.js.map +0 -1
  982. package/dist/chunk-OYPKKHXY.js +0 -559
  983. package/dist/chunk-OYPKKHXY.js.map +0 -1
  984. package/dist/chunk-P6WLV5UY.js +0 -644
  985. package/dist/chunk-P6WLV5UY.js.map +0 -1
  986. package/dist/chunk-PTOP7OHG.js.map +0 -1
  987. package/dist/chunk-SN5YV6FF.js +0 -11
  988. package/dist/chunk-SN5YV6FF.js.map +0 -1
  989. package/dist/chunk-T3USOSVN.js.map +0 -1
  990. package/dist/chunk-T4CLW3DN.js +0 -2560
  991. package/dist/chunk-T4CLW3DN.js.map +0 -1
  992. package/dist/chunk-UW2SGTI5.js.map +0 -1
  993. package/dist/chunk-VSCU7K4V.js.map +0 -1
  994. package/dist/chunk-WL2Y2T47.js.map +0 -1
  995. package/dist/chunk-WUTL62MC.js.map +0 -1
  996. package/dist/chunk-Y3MTRA7D.js +0 -97
  997. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  998. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  999. package/dist/document-tools/core.d.cts +0 -883
  1000. package/dist/document-tools/index.d.cts +0 -90
  1001. package/dist/index.d-BMhTH98a.d.cts +0 -2035
  1002. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  1003. package/dist/index.d.cts +0 -15893
  1004. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  1005. package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
  1006. package/dist/shell/index.d.cts +0 -6
  1007. package/dist/store.d-GADDvC7w.d.cts +0 -35
  1008. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  1009. package/dist/ui/index.d.cts +0 -25
  1010. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  1011. package/dist/viewers/index.d.cts +0 -260
@@ -0,0 +1,163 @@
1
+ import { useCallback, useEffect, useLayoutEffect, useRef } from "react";
2
+ const MIN_ZOOM = 0.5;
3
+ const MAX_ZOOM = 4;
4
+ const DOUBLE_TAP_ZOOM = 2;
5
+ const MAX_CANVAS_PIXELS = 8e6;
6
+ const MAX_RENDER_DPR = 2;
7
+ function clampZoom(zoom) {
8
+ if (!Number.isFinite(zoom)) return 1;
9
+ return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100;
10
+ }
11
+ const ZOOM_PRESETS = [1.5, 2, 3];
12
+ function cycleZoom(zoom) {
13
+ return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1;
14
+ }
15
+ function doubleTapZoom(zoom) {
16
+ return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM;
17
+ }
18
+ function zoomLabel(zoom) {
19
+ return `${Math.round(zoom * 100)}%`;
20
+ }
21
+ function pinchZoom(startZoom, startDistance, distance2) {
22
+ if (startDistance <= 0) return startZoom;
23
+ return clampZoom(startZoom * distance2 / startDistance);
24
+ }
25
+ function anchoredScroll(scroll, focal, oldZoom, newZoom) {
26
+ if (oldZoom <= 0) return scroll;
27
+ return (scroll + focal) * newZoom / oldZoom - focal;
28
+ }
29
+ function renderDpr(cssWidth, cssHeight, devicePixelRatio, maxPixels = MAX_CANVAS_PIXELS) {
30
+ const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR);
31
+ const area = cssWidth * cssHeight;
32
+ if (area <= 0) return wanted;
33
+ const fits = Math.sqrt(maxPixels / area);
34
+ return Math.max(1, Math.min(wanted, fits));
35
+ }
36
+ function fitPageWidth(contentWidth, pageBorder) {
37
+ if (!Number.isFinite(contentWidth)) return 0;
38
+ return Math.max(0, Math.floor(contentWidth) - pageBorder);
39
+ }
40
+ function contentBoxWidth(el) {
41
+ const style = getComputedStyle(el);
42
+ const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
43
+ return Math.max(0, el.clientWidth - padding);
44
+ }
45
+ const distance = (a, b) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);
46
+ const INTERACTIVE = 'button, a, input, textarea, select, [role="button"]';
47
+ const DOUBLE_TAP_MS = 300;
48
+ const DOUBLE_TAP_SLOP_PX = 30;
49
+ function usePinchZoom({ containerRef, zoom, onZoomChange }) {
50
+ const zoomRef = useRef(zoom);
51
+ const onChangeRef = useRef(onZoomChange);
52
+ onChangeRef.current = onZoomChange;
53
+ const focalRef = useRef(null);
54
+ const appliedZoomRef = useRef(zoom);
55
+ const request = useCallback((next, focal) => {
56
+ const clamped = clampZoom(next);
57
+ if (clamped === zoomRef.current) return;
58
+ focalRef.current = focal;
59
+ zoomRef.current = clamped;
60
+ onChangeRef.current?.(clamped);
61
+ }, []);
62
+ useLayoutEffect(() => {
63
+ zoomRef.current = zoom;
64
+ const container = containerRef.current;
65
+ const previous = appliedZoomRef.current;
66
+ appliedZoomRef.current = zoom;
67
+ if (!container || previous === zoom) return;
68
+ const rect = container.getBoundingClientRect();
69
+ const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 };
70
+ focalRef.current = null;
71
+ container.dataset.zooming = "true";
72
+ container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom);
73
+ container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom);
74
+ requestAnimationFrame(
75
+ () => requestAnimationFrame(() => {
76
+ delete container.dataset.zooming;
77
+ })
78
+ );
79
+ }, [zoom, containerRef]);
80
+ useEffect(() => {
81
+ const el = containerRef.current;
82
+ if (!el) return;
83
+ let pinch = null;
84
+ let lastTap = null;
85
+ let frame = 0;
86
+ let pending = null;
87
+ const focalOf = (a, b) => {
88
+ const rect = el.getBoundingClientRect();
89
+ return {
90
+ x: (a.clientX + b.clientX) / 2 - rect.left,
91
+ y: (a.clientY + b.clientY) / 2 - rect.top
92
+ };
93
+ };
94
+ const flush = () => {
95
+ frame = 0;
96
+ if (pending) request(pending.zoom, pending.focal);
97
+ pending = null;
98
+ };
99
+ const onStart = (e) => {
100
+ if (e.touches.length === 2) {
101
+ pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current };
102
+ lastTap = null;
103
+ }
104
+ };
105
+ const onMove = (e) => {
106
+ if (!pinch || e.touches.length !== 2) return;
107
+ e.preventDefault();
108
+ pending = {
109
+ zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),
110
+ focal: focalOf(e.touches[0], e.touches[1])
111
+ };
112
+ if (!frame) frame = requestAnimationFrame(flush);
113
+ };
114
+ const onEnd = (e) => {
115
+ if (pinch && e.touches.length < 2) {
116
+ pinch = null;
117
+ return;
118
+ }
119
+ if (e.touches.length !== 0 || e.changedTouches.length !== 1) return;
120
+ const t = e.changedTouches[0];
121
+ if (e.target?.closest?.(INTERACTIVE)) return;
122
+ const now = e.timeStamp;
123
+ if (lastTap && now - lastTap.time < DOUBLE_TAP_MS && Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX) {
124
+ e.preventDefault();
125
+ const rect = el.getBoundingClientRect();
126
+ request(doubleTapZoom(zoomRef.current), {
127
+ x: t.clientX - rect.left,
128
+ y: t.clientY - rect.top
129
+ });
130
+ lastTap = null;
131
+ } else {
132
+ lastTap = { time: now, x: t.clientX, y: t.clientY };
133
+ }
134
+ };
135
+ el.addEventListener("touchstart", onStart, { passive: true });
136
+ el.addEventListener("touchmove", onMove, { passive: false });
137
+ el.addEventListener("touchend", onEnd, { passive: false });
138
+ el.addEventListener("touchcancel", onEnd, { passive: false });
139
+ return () => {
140
+ el.removeEventListener("touchstart", onStart);
141
+ el.removeEventListener("touchmove", onMove);
142
+ el.removeEventListener("touchend", onEnd);
143
+ el.removeEventListener("touchcancel", onEnd);
144
+ if (frame) cancelAnimationFrame(frame);
145
+ };
146
+ }, [containerRef, request]);
147
+ }
148
+ export {
149
+ MAX_CANVAS_PIXELS,
150
+ MAX_ZOOM,
151
+ MIN_ZOOM,
152
+ anchoredScroll,
153
+ clampZoom,
154
+ contentBoxWidth,
155
+ cycleZoom,
156
+ doubleTapZoom,
157
+ fitPageWidth,
158
+ pinchZoom,
159
+ renderDpr,
160
+ usePinchZoom,
161
+ zoomLabel
162
+ };
163
+ //# sourceMappingURL=viewer-zoom.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/viewers/viewer-zoom.ts"],
4
+ "sourcesContent": ["/**\n * Zoom for page-stacked viewers (PDF + parsed/HTML).\n *\n * Browser pinch-zoom only magnifies the bitmap the page already painted: a PDF canvas rendered at\n * fit-width stays blurry however far you pinch. The viewers therefore own the zoom: `zoom` is a\n * multiplier of the fit-width size (1 = fit width, 2 = twice as wide). The PDF viewer re-renders\n * its canvases at the new scale; the parsed viewer reflows its text. This module holds the pure\n * math and the touch gesture hook (pinch, double-tap) both use.\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport type { RefObject } from 'react'\n\nexport const MIN_ZOOM = 0.5\nexport const MAX_ZOOM = 4\nconst DOUBLE_TAP_ZOOM = 2\n/** Canvas pixel budget per page: iOS Safari fails above ~16.7M pixels in total, so stay well under. */\nexport const MAX_CANVAS_PIXELS = 8_000_000\n/** Device pixel ratio is capped: beyond 2x the extra sharpness is invisible and costs 2-3x memory. */\nconst MAX_RENDER_DPR = 2\n\nexport function clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) return 1\n return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100\n}\n\n/** The zoom levels the single zoom button steps through before it returns to fit width. */\nconst ZOOM_PRESETS = [1.5, 2, 3]\n\n/** The zoom button: the next preset above the current zoom, or back to fit width after the last. */\nexport function cycleZoom(zoom: number): number {\n return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1\n}\n\n/** Double-tap toggles between fit width and a comfortable reading zoom. */\nexport function doubleTapZoom(zoom: number): number {\n return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM\n}\n\nexport function zoomLabel(zoom: number): string {\n return `${Math.round(zoom * 100)}%`\n}\n\n/** The zoom a pinch has reached: the start zoom scaled by how far the fingers moved apart. */\nexport function pinchZoom(startZoom: number, startDistance: number, distance: number): number {\n if (startDistance <= 0) return startZoom\n return clampZoom((startZoom * distance) / startDistance)\n}\n\n/**\n * New scroll offset that keeps the content point under `focal` (a viewport coordinate) still while\n * the zoom changes from `oldZoom` to `newZoom`.\n */\nexport function anchoredScroll(\n scroll: number,\n focal: number,\n oldZoom: number,\n newZoom: number\n): number {\n if (oldZoom <= 0) return scroll\n return ((scroll + focal) * newZoom) / oldZoom - focal\n}\n\n/**\n * Device pixel ratio to rasterise a page of `cssWidth` x `cssHeight` at: the device's own, capped,\n * and lowered further when the page would otherwise exceed the canvas pixel budget.\n */\nexport function renderDpr(\n cssWidth: number,\n cssHeight: number,\n devicePixelRatio: number,\n maxPixels: number = MAX_CANVAS_PIXELS\n): number {\n const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR)\n const area = cssWidth * cssHeight\n if (area <= 0) return wanted\n const fits = Math.sqrt(maxPixels / area)\n return Math.max(1, Math.min(wanted, fits))\n}\n\n/**\n * Width a fit-width page's content gets in a scroller whose content box is `contentWidth` wide:\n * that box less the page's own border, floored so sub-pixel layout never rounds the page up past\n * the box into a sideways overflow.\n */\nexport function fitPageWidth(contentWidth: number, pageBorder: number): number {\n if (!Number.isFinite(contentWidth)) return 0\n return Math.max(0, Math.floor(contentWidth) - pageBorder)\n}\n\n/**\n * An element's content-box width: `clientWidth` (which, unlike `offsetWidth`, leaves out the\n * vertical scrollbar and the borders) less the horizontal padding.\n */\nexport function contentBoxWidth(el: HTMLElement): number {\n const style = getComputedStyle(el)\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0)\n return Math.max(0, el.clientWidth - padding)\n}\n\nconst distance = (a: Touch, b: Touch) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY)\nconst INTERACTIVE = 'button, a, input, textarea, select, [role=\"button\"]'\nconst DOUBLE_TAP_MS = 300\nconst DOUBLE_TAP_SLOP_PX = 30\n\ninterface PinchZoomOptions {\n containerRef: RefObject<HTMLElement | null>\n zoom: number\n onZoomChange?: (zoom: number) => void\n}\n\n/**\n * Pinch and double-tap zoom on a scroller, plus focal-point preservation for EVERY zoom change\n * (gesture, buttons, props): after the new zoom has laid out, the scroll offset is moved so the\n * content under the pinch centre (or the viewport centre) stays where it was.\n *\n * The scroller must carry `touch-action: pan-x pan-y` so the browser leaves two-finger gestures\n * to this hook instead of zooming the whole app.\n */\nexport function usePinchZoom({ containerRef, zoom, onZoomChange }: PinchZoomOptions): void {\n const zoomRef = useRef(zoom)\n const onChangeRef = useRef(onZoomChange)\n onChangeRef.current = onZoomChange\n const focalRef = useRef<{ x: number; y: number } | null>(null)\n const appliedZoomRef = useRef(zoom)\n\n const request = useCallback((next: number, focal: { x: number; y: number } | null) => {\n const clamped = clampZoom(next)\n if (clamped === zoomRef.current) return\n focalRef.current = focal\n zoomRef.current = clamped\n onChangeRef.current?.(clamped)\n }, [])\n\n // Zoom changed (from here or from outside): keep the focal point still once it has laid out.\n useLayoutEffect(() => {\n zoomRef.current = zoom\n const container = containerRef.current\n const previous = appliedZoomRef.current\n appliedZoomRef.current = zoom\n if (!container || previous === zoom) return\n const rect = container.getBoundingClientRect()\n const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 }\n focalRef.current = null\n // The page-anchoring observer must not also react to this resize.\n container.dataset.zooming = 'true'\n container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom)\n container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n delete container.dataset.zooming\n })\n )\n }, [zoom, containerRef])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n let pinch: { startDistance: number; startZoom: number } | null = null\n let lastTap: { time: number; x: number; y: number } | null = null\n let frame = 0\n let pending: { zoom: number; focal: { x: number; y: number } } | null = null\n\n const focalOf = (a: Touch, b: Touch) => {\n const rect = el.getBoundingClientRect()\n return {\n x: (a.clientX + b.clientX) / 2 - rect.left,\n y: (a.clientY + b.clientY) / 2 - rect.top,\n }\n }\n const flush = () => {\n frame = 0\n if (pending) request(pending.zoom, pending.focal)\n pending = null\n }\n\n const onStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current }\n lastTap = null\n }\n }\n const onMove = (e: TouchEvent) => {\n if (!pinch || e.touches.length !== 2) return\n e.preventDefault()\n pending = {\n zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),\n focal: focalOf(e.touches[0], e.touches[1]),\n }\n if (!frame) frame = requestAnimationFrame(flush)\n }\n const onEnd = (e: TouchEvent) => {\n if (pinch && e.touches.length < 2) {\n pinch = null\n return\n }\n if (e.touches.length !== 0 || e.changedTouches.length !== 1) return\n const t = e.changedTouches[0]\n if ((e.target as Element | null)?.closest?.(INTERACTIVE)) return\n const now = e.timeStamp\n if (\n lastTap &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX\n ) {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n request(doubleTapZoom(zoomRef.current), {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n })\n lastTap = null\n } else {\n lastTap = { time: now, x: t.clientX, y: t.clientY }\n }\n }\n\n el.addEventListener('touchstart', onStart, { passive: true })\n el.addEventListener('touchmove', onMove, { passive: false })\n el.addEventListener('touchend', onEnd, { passive: false })\n el.addEventListener('touchcancel', onEnd, { passive: false })\n return () => {\n el.removeEventListener('touchstart', onStart)\n el.removeEventListener('touchmove', onMove)\n el.removeEventListener('touchend', onEnd)\n el.removeEventListener('touchcancel', onEnd)\n if (frame) cancelAnimationFrame(frame)\n }\n }, [containerRef, request])\n}\n"],
5
+ "mappings": "AAUA,SAAS,aAAa,WAAW,iBAAiB,cAAc;AAGzD,MAAM,WAAW;AACjB,MAAM,WAAW;AACxB,MAAM,kBAAkB;AAEjB,MAAM,oBAAoB;AAEjC,MAAM,iBAAiB;AAEhB,SAAS,UAAU,MAAsB;AAC9C,MAAI,CAAC,OAAO,SAAS,IAAI,EAAG,QAAO;AACnC,SAAO,KAAK,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,IAAI,CAAC,IAAI,GAAG,IAAI;AAC1E;AAGA,MAAM,eAAe,CAAC,KAAK,GAAG,CAAC;AAGxB,SAAS,UAAU,MAAsB;AAC9C,SAAO,aAAa,KAAK,CAAC,WAAW,SAAS,OAAO,IAAI,KAAK;AAChE;AAGO,SAAS,cAAc,MAAsB;AAClD,SAAO,OAAO,OAAO,IAAI;AAC3B;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC;AAClC;AAGO,SAAS,UAAU,WAAmB,eAAuBA,WAA0B;AAC5F,MAAI,iBAAiB,EAAG,QAAO;AAC/B,SAAO,UAAW,YAAYA,YAAY,aAAa;AACzD;AAMO,SAAS,eACd,QACA,OACA,SACA,SACQ;AACR,MAAI,WAAW,EAAG,QAAO;AACzB,UAAS,SAAS,SAAS,UAAW,UAAU;AAClD;AAMO,SAAS,UACd,UACA,WACA,kBACA,YAAoB,mBACZ;AACR,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,oBAAoB,GAAG,CAAC,GAAG,cAAc;AAC1E,QAAM,OAAO,WAAW;AACxB,MAAI,QAAQ,EAAG,QAAO;AACtB,QAAM,OAAO,KAAK,KAAK,YAAY,IAAI;AACvC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,IAAI,CAAC;AAC3C;AAOO,SAAS,aAAa,cAAsB,YAA4B;AAC7E,MAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO;AAC3C,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,IAAI,UAAU;AAC1D;AAMO,SAAS,gBAAgB,IAAyB;AACvD,QAAM,QAAQ,iBAAiB,EAAE;AACjC,QAAM,WAAW,WAAW,MAAM,WAAW,KAAK,MAAM,WAAW,MAAM,YAAY,KAAK;AAC1F,SAAO,KAAK,IAAI,GAAG,GAAG,cAAc,OAAO;AAC7C;AAEA,MAAM,WAAW,CAAC,GAAU,MAAa,KAAK,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO;AAChG,MAAM,cAAc;AACpB,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAgBpB,SAAS,aAAa,EAAE,cAAc,MAAM,aAAa,GAA2B;AACzF,QAAM,UAAU,OAAO,IAAI;AAC3B,QAAM,cAAc,OAAO,YAAY;AACvC,cAAY,UAAU;AACtB,QAAM,WAAW,OAAwC,IAAI;AAC7D,QAAM,iBAAiB,OAAO,IAAI;AAElC,QAAM,UAAU,YAAY,CAAC,MAAc,UAA2C;AACpF,UAAM,UAAU,UAAU,IAAI;AAC9B,QAAI,YAAY,QAAQ,QAAS;AACjC,aAAS,UAAU;AACnB,YAAQ,UAAU;AAClB,gBAAY,UAAU,OAAO;AAAA,EAC/B,GAAG,CAAC,CAAC;AAGL,kBAAgB,MAAM;AACpB,YAAQ,UAAU;AAClB,UAAM,YAAY,aAAa;AAC/B,UAAM,WAAW,eAAe;AAChC,mBAAe,UAAU;AACzB,QAAI,CAAC,aAAa,aAAa,KAAM;AACrC,UAAM,OAAO,UAAU,sBAAsB;AAC7C,UAAM,QAAQ,SAAS,WAAW,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,SAAS,EAAE;AAC1E,aAAS,UAAU;AAEnB,cAAU,QAAQ,UAAU;AAC5B,cAAU,aAAa,eAAe,UAAU,YAAY,MAAM,GAAG,UAAU,IAAI;AACnF,cAAU,YAAY,eAAe,UAAU,WAAW,MAAM,GAAG,UAAU,IAAI;AACjF;AAAA,MAAsB,MACpB,sBAAsB,MAAM;AAC1B,eAAO,UAAU,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,YAAU,MAAM;AACd,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AACT,QAAI,QAA6D;AACjE,QAAI,UAAyD;AAC7D,QAAI,QAAQ;AACZ,QAAI,UAAoE;AAExE,UAAM,UAAU,CAAC,GAAU,MAAa;AACtC,YAAM,OAAO,GAAG,sBAAsB;AACtC,aAAO;AAAA,QACL,IAAI,EAAE,UAAU,EAAE,WAAW,IAAI,KAAK;AAAA,QACtC,IAAI,EAAE,UAAU,EAAE,WAAW,IAAI,KAAK;AAAA,MACxC;AAAA,IACF;AACA,UAAM,QAAQ,MAAM;AAClB,cAAQ;AACR,UAAI,QAAS,SAAQ,QAAQ,MAAM,QAAQ,KAAK;AAChD,gBAAU;AAAA,IACZ;AAEA,UAAM,UAAU,CAAC,MAAkB;AACjC,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,gBAAQ,EAAE,eAAe,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,WAAW,QAAQ,QAAQ;AAC1F,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,SAAS,CAAC,MAAkB;AAChC,UAAI,CAAC,SAAS,EAAE,QAAQ,WAAW,EAAG;AACtC,QAAE,eAAe;AACjB,gBAAU;AAAA,QACR,MAAM,UAAU,MAAM,WAAW,MAAM,eAAe,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,QAC1F,OAAO,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,MAC3C;AACA,UAAI,CAAC,MAAO,SAAQ,sBAAsB,KAAK;AAAA,IACjD;AACA,UAAM,QAAQ,CAAC,MAAkB;AAC/B,UAAI,SAAS,EAAE,QAAQ,SAAS,GAAG;AACjC,gBAAQ;AACR;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,WAAW,KAAK,EAAE,eAAe,WAAW,EAAG;AAC7D,YAAM,IAAI,EAAE,eAAe,CAAC;AAC5B,UAAK,EAAE,QAA2B,UAAU,WAAW,EAAG;AAC1D,YAAM,MAAM,EAAE;AACd,UACE,WACA,MAAM,QAAQ,OAAO,iBACrB,KAAK,MAAM,EAAE,UAAU,QAAQ,GAAG,EAAE,UAAU,QAAQ,CAAC,IAAI,oBAC3D;AACA,UAAE,eAAe;AACjB,cAAM,OAAO,GAAG,sBAAsB;AACtC,gBAAQ,cAAc,QAAQ,OAAO,GAAG;AAAA,UACtC,GAAG,EAAE,UAAU,KAAK;AAAA,UACpB,GAAG,EAAE,UAAU,KAAK;AAAA,QACtB,CAAC;AACD,kBAAU;AAAA,MACZ,OAAO;AACL,kBAAU,EAAE,MAAM,KAAK,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAAA,MACpD;AAAA,IACF;AAEA,OAAG,iBAAiB,cAAc,SAAS,EAAE,SAAS,KAAK,CAAC;AAC5D,OAAG,iBAAiB,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;AAC3D,OAAG,iBAAiB,YAAY,OAAO,EAAE,SAAS,MAAM,CAAC;AACzD,OAAG,iBAAiB,eAAe,OAAO,EAAE,SAAS,MAAM,CAAC;AAC5D,WAAO,MAAM;AACX,SAAG,oBAAoB,cAAc,OAAO;AAC5C,SAAG,oBAAoB,aAAa,MAAM;AAC1C,SAAG,oBAAoB,YAAY,KAAK;AACxC,SAAG,oBAAoB,eAAe,KAAK;AAC3C,UAAI,MAAO,sBAAqB,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,CAAC;AAC5B;",
6
+ "names": ["distance"]
7
+ }
@@ -0,0 +1,207 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef } from "react";
3
+ import { useQueryClient } from "@tanstack/react-query";
4
+ import { connectWithReconnect } from "@arbidocs/sdk/browser";
5
+ import {
6
+ isMessageType,
7
+ logger
8
+ } from "@arbidocs/client";
9
+ import { useArbi } from "../useArbi.js";
10
+ import { finishEntityExtraction } from "../entity-extraction.js";
11
+ import { useArbiWsStore } from "./store.js";
12
+ import { nextReconnectDelay, resolveSocketBaseUrl } from "./reconnect.js";
13
+ import { applyLiveUpdate } from "./live-updates.js";
14
+ import { applyRunFinished } from "../chat/run-finished.js";
15
+ import { useArbiSessionStore } from "../session/session-hooks.js";
16
+ import { applyChatEvent } from "../directmessages/chat-cache.js";
17
+ import { applyCallEvent } from "../calls/events.js";
18
+ import { applyNotificationRow, isNotificationRow } from "../notifications/live.js";
19
+ import { applyTaskEvent } from "../documents/processing-live.js";
20
+ import { refreshDocuments } from "../documents/documents-data.js";
21
+ import { arbiQueryKeys } from "../query-keys.js";
22
+ import { useFeature } from "../host/features.js";
23
+ import { useOnlineSync } from "../connectivity.js";
24
+ import { useArbiHost } from "../host/config.js";
25
+ import { ArbiWsContext } from "./context.js";
26
+ function signedInId(arbi) {
27
+ return arbi.isLoggedIn ? arbi.user.identity()?.externalId ?? null : null;
28
+ }
29
+ const EVICTED_CLOSE_CODE = 1008;
30
+ function ArbiWebSocketProvider({
31
+ enabled = true,
32
+ onAuthenticated,
33
+ handlers,
34
+ children
35
+ }) {
36
+ const arbi = useArbi();
37
+ const arbiRef = useRef(arbi);
38
+ arbiRef.current = arbi;
39
+ const queryClient = useQueryClient();
40
+ const subscribersRef = useRef(/* @__PURE__ */ new Set());
41
+ const setStatus = useArbiWsStore((s) => s.setStatus);
42
+ const applyTaskUpdate = useArbiWsStore((s) => s.applyTaskUpdate);
43
+ const applyPresence = useArbiWsStore((s) => s.applyPresence);
44
+ const reset = useArbiWsStore((s) => s.reset);
45
+ const setEvicted = useArbiWsStore((s) => s.setEvicted);
46
+ const onAuthenticatedRef = useRef(onAuthenticated);
47
+ onAuthenticatedRef.current = onAuthenticated;
48
+ const handlersRef = useRef(handlers);
49
+ handlersRef.current = handlers;
50
+ const session = useArbiSessionStore();
51
+ const sessionRef = useRef(session);
52
+ sessionRef.current = session;
53
+ const host = useArbiHost();
54
+ const hostRef = useRef(host);
55
+ hostRef.current = host;
56
+ const acceptRings = useFeature("calls");
57
+ const acceptRingsRef = useRef(acceptRings);
58
+ acceptRingsRef.current = acceptRings;
59
+ useOnlineSync();
60
+ const context = useMemo(
61
+ () => ({
62
+ subscribe: (fn) => {
63
+ subscribersRef.current.add(fn);
64
+ return () => {
65
+ subscribersRef.current.delete(fn);
66
+ };
67
+ }
68
+ }),
69
+ []
70
+ );
71
+ useEffect(() => {
72
+ if (!enabled) {
73
+ reset();
74
+ return;
75
+ }
76
+ let conn = null;
77
+ let cancelled = false;
78
+ let evicted = false;
79
+ const me = () => signedInId(arbiRef.current);
80
+ const onMessage = (msg) => {
81
+ const type = msg.type;
82
+ if (type === "connection_closed") {
83
+ evicted = true;
84
+ setEvicted(true);
85
+ } else if (isMessageType(msg, "task_update")) {
86
+ if (applyTaskUpdate(msg)) applyTaskEvent(queryClient, arbiRef.current, msg, me());
87
+ } else if (isMessageType(msg, "presence_update")) applyPresence(msg);
88
+ else if (isMessageType(msg, "response_complete"))
89
+ applyRunFinished(
90
+ queryClient,
91
+ arbiRef.current,
92
+ sessionRef.current,
93
+ msg,
94
+ (quota) => hostRef.current.chat?.onQuotaExceeded?.(quota)
95
+ );
96
+ else if (type === "error")
97
+ logger.error("[WebSocket] Server error:", msg.message);
98
+ else if (isMessageType(msg, "batch_complete")) {
99
+ if (msg.batch_type === "entity_extract") {
100
+ finishEntityExtraction(msg.doc_ext_ids ?? []);
101
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allFacts() });
102
+ }
103
+ if (msg.batch_type === "upload" || msg.batch_type === "entity_extract") {
104
+ if (msg.doc_ext_ids?.length)
105
+ void refreshDocuments(queryClient, arbiRef.current, msg.doc_ext_ids);
106
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allTags() });
107
+ }
108
+ } else if (type.startsWith("chat.") || type === "agent_dm_status")
109
+ void applyChatEvent(arbiRef.current, queryClient, msg);
110
+ else if (type.startsWith("call."))
111
+ applyCallEvent(queryClient, msg, { me: me(), acceptRings: acceptRingsRef.current });
112
+ else if (isNotificationRow(msg)) applyNotificationRow(queryClient, msg, me());
113
+ else void applyLiveUpdate(queryClient, msg);
114
+ try {
115
+ handlersRef.current?.[type]?.(msg);
116
+ } catch (error) {
117
+ logger.error(`[WebSocket] The host's ${type} handler failed:`, error);
118
+ }
119
+ for (const fn of subscribersRef.current) {
120
+ try {
121
+ fn(msg);
122
+ } catch {
123
+ }
124
+ }
125
+ };
126
+ let retryTimer = null;
127
+ let attempt = 0;
128
+ const scheduleRestart = () => {
129
+ if (cancelled || evicted || retryTimer) return;
130
+ setStatus("disconnected");
131
+ const delay = nextReconnectDelay(attempt);
132
+ attempt += 1;
133
+ retryTimer = setTimeout(() => {
134
+ retryTimer = null;
135
+ void start();
136
+ }, delay);
137
+ };
138
+ const start = async () => {
139
+ if (cancelled) return;
140
+ const info = arbiRef.current.getConnectionInfo();
141
+ if (!info) {
142
+ scheduleRestart();
143
+ return;
144
+ }
145
+ conn?.close();
146
+ conn = null;
147
+ setStatus("connecting");
148
+ try {
149
+ const c = await connectWithReconnect({
150
+ baseUrl: resolveSocketBaseUrl(
151
+ info.baseUrl,
152
+ typeof window === "undefined" ? void 0 : window.location.origin
153
+ ),
154
+ accessToken: info.accessToken,
155
+ // Resolve the freshest token on every (re)connect so rotation is picked up.
156
+ getAccessToken: () => arbiRef.current.getConnectionInfo()?.accessToken ?? null,
157
+ // A reconnect refused for its token re-logs in silently first.
158
+ refreshAuth: () => arbiRef.current.refreshAccess(),
159
+ onAuthenticated: (message) => onAuthenticatedRef.current?.(message),
160
+ // The session's: a sign-out closes the socket before the server revokes the token.
161
+ signal: info.signal,
162
+ onMessage,
163
+ onReconnecting: () => setStatus("reconnecting"),
164
+ onReconnected: () => {
165
+ attempt = 0;
166
+ setStatus("connected");
167
+ },
168
+ // Evicted (a newer session of the same user, or the server took this connection over for a
169
+ // newer one of this session): reconnecting would be evicted again, or evict that one.
170
+ shouldReconnect: (code) => {
171
+ if (code !== EVICTED_CLOSE_CODE && !evicted) return true;
172
+ evicted = true;
173
+ setEvicted(true);
174
+ setStatus("disconnected");
175
+ return false;
176
+ },
177
+ onReconnectFailed: scheduleRestart,
178
+ onClose: () => {
179
+ if (!cancelled) setStatus(evicted ? "disconnected" : "reconnecting");
180
+ }
181
+ });
182
+ if (cancelled) {
183
+ c.close();
184
+ return;
185
+ }
186
+ conn = c;
187
+ attempt = 0;
188
+ setStatus("connected");
189
+ } catch {
190
+ if (!info.signal.aborted) scheduleRestart();
191
+ }
192
+ };
193
+ setEvicted(false);
194
+ void start();
195
+ return () => {
196
+ cancelled = true;
197
+ if (retryTimer) clearTimeout(retryTimer);
198
+ conn?.close();
199
+ reset();
200
+ };
201
+ }, [enabled, queryClient, setStatus, setEvicted, applyTaskUpdate, applyPresence, reset]);
202
+ return /* @__PURE__ */ jsx(ArbiWsContext.Provider, { value: context, children });
203
+ }
204
+ export {
205
+ ArbiWebSocketProvider
206
+ };
207
+ //# sourceMappingURL=ArbiWebSocketProvider.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/websocket/ArbiWebSocketProvider.tsx"],
4
+ "sourcesContent": ["/**\n * ArbiWebSocketProvider \u2014 one shared, reconnecting WebSocket for the whole app.\n *\n * Opens a single authenticated socket (via the SDK transport's\n * `connectWithReconnect`, which handles auth, backoff, and live-token refresh),\n * feeds the canonical WS store, applies what every site applies (tasks, presence,\n * chats, calls, notification rows, finished runs, conversation, mail-draft and skill\n * events), then hands each message to the host's own `handlers` for its type and\n * fans it out to subscribers registered by the `useArbiWebSocket` /\n * `useArbiWsMessage` hooks.\n *\n * Mount it inside an `<ArbiHost>` with an `arbi` (it reads the Arbi instance for the base\n * URL + live access token). Gate it with `enabled` so it connects only once the\n * app is authenticated against a live backend.\n */\n\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { connectWithReconnect, type ReconnectableWsConnection } from '@arbidocs/sdk/browser'\nimport {\n isMessageType,\n type WebSocketServerMessage,\n type WsTaskUpdateMessage,\n type WsBatchCompleteMessage,\n type WsPresenceUpdateMessage,\n type WsAuthResultMessage,\n type WsResponseCompleteMessage,\n logger,\n} from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { finishEntityExtraction } from '../entity-extraction'\nimport { useArbiWsStore } from './store'\nimport { nextReconnectDelay, resolveSocketBaseUrl } from './reconnect'\nimport { applyLiveUpdate } from './live-updates'\nimport { applyRunFinished } from '../chat/run-finished'\nimport { useArbiSessionStore } from '../session/session-hooks'\nimport { applyChatEvent } from '../directmessages/chat-cache'\nimport { applyCallEvent } from '../calls/events'\nimport { applyNotificationRow, isNotificationRow } from '../notifications/live'\nimport { applyTaskEvent } from '../documents/processing-live'\nimport { refreshDocuments } from '../documents/documents-data'\nimport { arbiQueryKeys } from '../query-keys'\nimport { useFeature } from '../host/features'\nimport { useOnlineSync } from '../connectivity'\nimport { useArbiHost } from '../host/config'\nimport { ArbiWsContext, type ArbiWsContextValue, type ArbiWsSubscriber } from './context'\n\n/** A host's own handling of server messages, by message type (e.g. `remote_control`). */\nexport type ArbiWsHandlers = Partial<Record<string, (message: WebSocketServerMessage) => void>>\n\nexport interface ArbiWebSocketProviderProps {\n /**\n * Open the socket only when the app is authenticated against a live backend.\n * Defaults to `true`; pass the connection status so demo/logged-out sessions\n * don't try to connect.\n */\n enabled?: boolean\n /** Called each time the server accepts the socket's auth (e.g. to show the unread count). */\n onAuthenticated?: (message: WsAuthResultMessage) => void\n /**\n * The host's own handling of message types the provider does not apply (e.g. `remote_control`),\n * each called after the provider's own and before the subscribers. Read on each message, so a\n * new object never reopens the socket.\n */\n handlers?: ArbiWsHandlers\n children: ReactNode\n}\n\n/** The signed-in person's id on `arbi`, or null when nobody is signed in. */\nfunction signedInId(arbi: ReturnType<typeof useArbi>): string | null {\n return arbi.isLoggedIn ? (arbi.user.identity()?.externalId ?? null) : null\n}\n\n/** The close code of a server-side single-session eviction (a newer session of the same user). */\nconst EVICTED_CLOSE_CODE = 1008\n\nexport function ArbiWebSocketProvider({\n enabled = true,\n onAuthenticated,\n handlers,\n children,\n}: ArbiWebSocketProviderProps) {\n // The latest `Arbi`, read on each use: a host renews its instance (another server session, an\n // opened workspace) without that reopening the socket; the token is read afresh on each connect.\n const arbi = useArbi()\n const arbiRef = useRef(arbi)\n arbiRef.current = arbi\n const queryClient = useQueryClient()\n const subscribersRef = useRef<Set<ArbiWsSubscriber>>(new Set())\n const setStatus = useArbiWsStore((s) => s.setStatus)\n const applyTaskUpdate = useArbiWsStore((s) => s.applyTaskUpdate)\n const applyPresence = useArbiWsStore((s) => s.applyPresence)\n const reset = useArbiWsStore((s) => s.reset)\n const setEvicted = useArbiWsStore((s) => s.setEvicted)\n const onAuthenticatedRef = useRef(onAuthenticated)\n onAuthenticatedRef.current = onAuthenticated\n const handlersRef = useRef(handlers)\n handlersRef.current = handlers\n const session = useArbiSessionStore()\n const sessionRef = useRef(session)\n sessionRef.current = session\n const host = useArbiHost()\n const hostRef = useRef(host)\n hostRef.current = host\n // Calls ring only a person whose `calls` feature is on (ARBI: Settings \u2192 Experimental); unlisted, on.\n const acceptRings = useFeature('calls')\n const acceptRingsRef = useRef(acceptRings)\n acceptRingsRef.current = acceptRings\n // Online or not follows this connection too (and the network, and \"Work offline\").\n useOnlineSync()\n\n // Stable subscribe API \u2014 the subscriber set lives in a ref, so registering a\n // handler never re-opens the socket.\n const context = useMemo<ArbiWsContextValue>(\n () => ({\n subscribe: (fn) => {\n subscribersRef.current.add(fn)\n return () => {\n subscribersRef.current.delete(fn)\n }\n },\n }),\n []\n )\n\n useEffect(() => {\n if (!enabled) {\n reset()\n return\n }\n\n let conn: ReconnectableWsConnection | null = null\n let cancelled = false\n // Taken over by another connection of this session (the server says so, then closes):\n // reconnecting would take it back, and the two would evict each other in turn.\n let evicted = false\n\n const me = () => signedInId(arbiRef.current)\n\n // What every site applies, before the host's own subscribers hear the message.\n const onMessage = (msg: WebSocketServerMessage) => {\n const type = msg.type as string\n if (type === 'connection_closed') {\n evicted = true\n setEvicted(true)\n } else if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n // The live processing row, then the documents list (an upload's row, a finished re-read).\n if (applyTaskUpdate(msg)) applyTaskEvent(queryClient, arbiRef.current, msg, me())\n } else if (isMessageType<WsPresenceUpdateMessage>(msg, 'presence_update')) applyPresence(msg)\n else if (isMessageType<WsResponseCompleteMessage>(msg, 'response_complete'))\n // A run finished: its conversation stops generating, its follow-up leaves the queue, the\n // documents it saved are read again, the thread follows, and a run failed for the AI usage\n // says so the chat host's way.\n applyRunFinished(queryClient, arbiRef.current, sessionRef.current, msg, (quota) =>\n hostRef.current.chat?.onQuotaExceeded?.(quota)\n )\n else if (type === 'error')\n logger.error('[WebSocket] Server error:', (msg as { message?: unknown }).message)\n else if (isMessageType<WsBatchCompleteMessage>(msg, 'batch_complete')) {\n // An upload or an extraction finished: its documents are read again, and the tags (an\n // upload may create sender labels; an extraction creates people and organisations and\n // links facts). AI fields (`doctag_generate`) are the AI review's (blocks).\n if (msg.batch_type === 'entity_extract') {\n finishEntityExtraction(msg.doc_ext_ids ?? [])\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allFacts() })\n }\n if (msg.batch_type === 'upload' || msg.batch_type === 'entity_extract') {\n if (msg.doc_ext_ids?.length)\n void refreshDocuments(queryClient, arbiRef.current, msg.doc_ext_ids)\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allTags() })\n }\n } else if (type.startsWith('chat.') || type === 'agent_dm_status')\n // Chats (direct messages, agent DM progress).\n void applyChatEvent(arbiRef.current, queryClient, msg)\n else if (type.startsWith('call.'))\n applyCallEvent(queryClient, msg, { me: me(), acceptRings: acceptRingsRef.current })\n else if (isNotificationRow(msg)) applyNotificationRow(queryClient, msg, me())\n // Conversation, mail-draft and skill events.\n else void applyLiveUpdate(queryClient, msg as unknown as { type: string })\n\n // The host's own handler for this type, then the subscribers. A throwing handler must not\n // kill the stream.\n try {\n handlersRef.current?.[type]?.(msg)\n } catch (error) {\n logger.error(`[WebSocket] The host's ${type} handler failed:`, error)\n }\n for (const fn of subscribersRef.current) {\n try {\n fn(msg)\n } catch {\n /* swallow \u2014 one bad handler can't break the socket */\n }\n }\n }\n\n let retryTimer: ReturnType<typeof setTimeout> | null = null\n let attempt = 0\n\n // The socket is best-effort and never gives up: after the transport's own retries (or a failed\n // connect) a fresh one is opened after a capped backoff, offline meanwhile. It never ends the\n // session; that is the HTTP layer's job.\n const scheduleRestart = () => {\n if (cancelled || evicted || retryTimer) return\n setStatus('disconnected')\n const delay = nextReconnectDelay(attempt)\n attempt += 1\n retryTimer = setTimeout(() => {\n retryTimer = null\n void start()\n }, delay)\n }\n\n const start = async () => {\n if (cancelled) return\n const info = arbiRef.current.getConnectionInfo()\n if (!info) {\n // Not signed in on this client yet: try again shortly.\n scheduleRestart()\n return\n }\n conn?.close()\n conn = null\n setStatus('connecting')\n try {\n const c = await connectWithReconnect({\n baseUrl: resolveSocketBaseUrl(\n info.baseUrl,\n typeof window === 'undefined' ? undefined : window.location.origin\n ),\n accessToken: info.accessToken,\n // Resolve the freshest token on every (re)connect so rotation is picked up.\n getAccessToken: () => arbiRef.current.getConnectionInfo()?.accessToken ?? null,\n // A reconnect refused for its token re-logs in silently first.\n refreshAuth: () => arbiRef.current.refreshAccess(),\n onAuthenticated: (message) => onAuthenticatedRef.current?.(message),\n // The session's: a sign-out closes the socket before the server revokes the token.\n signal: info.signal,\n onMessage,\n onReconnecting: () => setStatus('reconnecting'),\n onReconnected: () => {\n attempt = 0\n setStatus('connected')\n },\n // Evicted (a newer session of the same user, or the server took this connection over for a\n // newer one of this session): reconnecting would be evicted again, or evict that one.\n shouldReconnect: (code) => {\n if (code !== EVICTED_CLOSE_CODE && !evicted) return true\n evicted = true\n setEvicted(true)\n setStatus('disconnected')\n return false\n },\n onReconnectFailed: scheduleRestart,\n onClose: () => {\n if (!cancelled) setStatus(evicted ? 'disconnected' : 'reconnecting')\n },\n })\n if (cancelled) {\n c.close()\n return\n }\n conn = c\n attempt = 0\n setStatus('connected')\n } catch {\n // Stopped by a sign-out: the session is gone, nothing to reopen.\n if (!info.signal.aborted) scheduleRestart()\n }\n }\n setEvicted(false)\n void start()\n\n return () => {\n cancelled = true\n if (retryTimer) clearTimeout(retryTimer)\n conn?.close()\n reset()\n }\n }, [enabled, queryClient, setStatus, setEvicted, applyTaskUpdate, applyPresence, reset])\n\n return <ArbiWsContext.Provider value={context}>{children}</ArbiWsContext.Provider>\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import { createContext, useContext } from "react";
2
+ const ArbiWsContext = createContext(null);
3
+ function useArbiWsContext() {
4
+ const ctx = useContext(ArbiWsContext);
5
+ if (!ctx) {
6
+ throw new Error("useArbiWebSocket hooks must be used within an <ArbiWebSocketProvider>");
7
+ }
8
+ return ctx;
9
+ }
10
+ export {
11
+ ArbiWsContext,
12
+ useArbiWsContext
13
+ };
14
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/websocket/context.ts"],
4
+ "sourcesContent": ["/**\n * Context for the shared WebSocket \u2014 the subscribe registry the provider fills\n * and the hooks read. Kept separate from the provider component so both can be\n * imported without tripping react-refresh's component-only-export rule.\n */\n\nimport { createContext, useContext } from 'react'\nimport type { WebSocketServerMessage } from '@arbidocs/client'\n\nexport type ArbiWsSubscriber = (msg: WebSocketServerMessage) => void\n\nexport interface ArbiWsContextValue {\n subscribe: (fn: ArbiWsSubscriber) => () => void\n}\n\nexport const ArbiWsContext = createContext<ArbiWsContextValue | null>(null)\n\nexport function useArbiWsContext(): ArbiWsContextValue {\n const ctx = useContext(ArbiWsContext)\n if (!ctx) {\n throw new Error('useArbiWebSocket hooks must be used within an <ArbiWebSocketProvider>')\n }\n return ctx\n}\n"],
5
+ "mappings": "AAMA,SAAS,eAAe,kBAAkB;AASnC,MAAM,gBAAgB,cAAyC,IAAI;AAEnE,SAAS,mBAAuC;AACrD,QAAM,MAAM,WAAW,aAAa;AACpC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,30 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { isMessageType } from "@arbidocs/client";
3
+ import { useArbiWsContext } from "./context.js";
4
+ import { useArbiWsStore } from "./store.js";
5
+ function useArbiWebSocket(onMessage) {
6
+ const { subscribe } = useArbiWsContext();
7
+ const handlerRef = useRef(onMessage);
8
+ handlerRef.current = onMessage;
9
+ useEffect(() => subscribe((msg) => handlerRef.current(msg)), [subscribe]);
10
+ }
11
+ function useArbiWsMessage(type, handler) {
12
+ const { subscribe } = useArbiWsContext();
13
+ const handlerRef = useRef(handler);
14
+ handlerRef.current = handler;
15
+ useEffect(
16
+ () => subscribe((msg) => {
17
+ if (isMessageType(msg, type)) handlerRef.current(msg);
18
+ }),
19
+ [subscribe, type]
20
+ );
21
+ }
22
+ function useArbiWsStatus() {
23
+ return useArbiWsStore((s) => s.status);
24
+ }
25
+ export {
26
+ useArbiWebSocket,
27
+ useArbiWsMessage,
28
+ useArbiWsStatus
29
+ };
30
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/websocket/hooks.ts"],
4
+ "sourcesContent": ["/**\n * Typed subscription + selector hooks for the shared WebSocket.\n *\n * All message typing flows from the OpenAPI-derived `WebSocketServerMessage`\n * union \u2014 handlers are narrowed by the discriminant `type`, exactly like the\n * rest of the SDK.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { isMessageType, type WebSocketServerMessage } from '@arbidocs/client'\nimport { useArbiWsContext } from './context'\nimport { useArbiWsStore, type ArbiWsStatus } from './store'\n\n/**\n * Subscribe to every server message. The handler is kept in a ref, so passing a\n * new inline function each render does not resubscribe.\n */\nexport function useArbiWebSocket(onMessage: (msg: WebSocketServerMessage) => void): void {\n const { subscribe } = useArbiWsContext()\n const handlerRef = useRef(onMessage)\n handlerRef.current = onMessage\n useEffect(() => subscribe((msg) => handlerRef.current(msg)), [subscribe])\n}\n\n/**\n * Subscribe to a single message type, fully narrowed to that variant.\n *\n * @example\n * useArbiWsMessage<WsBatchCompleteMessage>('batch_complete', (msg) => {\n * // msg.batch_type, msg.doc_ext_ids are typed\n * })\n */\nexport function useArbiWsMessage<T extends WebSocketServerMessage>(\n type: T['type'],\n handler: (msg: T) => void\n): void {\n const { subscribe } = useArbiWsContext()\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n useEffect(\n () =>\n subscribe((msg) => {\n if (isMessageType<T>(msg, type)) handlerRef.current(msg)\n }),\n [subscribe, type]\n )\n}\n\n/** Live connection status of the shared socket. */\nexport function useArbiWsStatus(): ArbiWsStatus {\n return useArbiWsStore((s) => s.status)\n}\n"],
5
+ "mappings": "AAQA,SAAS,WAAW,cAAc;AAClC,SAAS,qBAAkD;AAC3D,SAAS,wBAAwB;AACjC,SAAS,sBAAyC;AAM3C,SAAS,iBAAiB,WAAwD;AACvF,QAAM,EAAE,UAAU,IAAI,iBAAiB;AACvC,QAAM,aAAa,OAAO,SAAS;AACnC,aAAW,UAAU;AACrB,YAAU,MAAM,UAAU,CAAC,QAAQ,WAAW,QAAQ,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1E;AAUO,SAAS,iBACd,MACA,SACM;AACN,QAAM,EAAE,UAAU,IAAI,iBAAiB;AACvC,QAAM,aAAa,OAAO,OAAO;AACjC,aAAW,UAAU;AACrB;AAAA,IACE,MACE,UAAU,CAAC,QAAQ;AACjB,UAAI,cAAiB,KAAK,IAAI,EAAG,YAAW,QAAQ,GAAG;AAAA,IACzD,CAAC;AAAA,IACH,CAAC,WAAW,IAAI;AAAA,EAClB;AACF;AAGO,SAAS,kBAAgC;AAC9C,SAAO,eAAe,CAAC,MAAM,EAAE,MAAM;AACvC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
1
+ import {
2
+ ArbiWebSocketProvider
3
+ } from "./ArbiWebSocketProvider.js";
4
+ import { useArbiWsContext } from "./context.js";
5
+ import { useArbiWebSocket, useArbiWsMessage, useArbiWsStatus } from "./hooks.js";
6
+ import { applyLiveUpdate, LIVE_UPDATE_TYPES } from "./live-updates.js";
7
+ import {
8
+ useArbiWsStore,
9
+ DISMISSED_TASK_TTL_MS
10
+ } from "./store.js";
11
+ export {
12
+ ArbiWebSocketProvider,
13
+ DISMISSED_TASK_TTL_MS,
14
+ LIVE_UPDATE_TYPES,
15
+ applyLiveUpdate,
16
+ useArbiWebSocket,
17
+ useArbiWsContext,
18
+ useArbiWsMessage,
19
+ useArbiWsStatus,
20
+ useArbiWsStore
21
+ };
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/websocket/index.ts"],
4
+ "sourcesContent": ["/**\n * Shared WebSocket layer for @arbidocs/react.\n *\n * One reconnecting socket per app, a canonical WS store, typed subscription\n * hooks, and a drop-in document-sync hook that replaces polling.\n */\n\nexport {\n ArbiWebSocketProvider,\n type ArbiWebSocketProviderProps,\n type ArbiWsHandlers,\n} from './ArbiWebSocketProvider'\nexport { useArbiWsContext, type ArbiWsContextValue } from './context'\nexport { useArbiWebSocket, useArbiWsMessage, useArbiWsStatus } from './hooks'\nexport { applyLiveUpdate, LIVE_UPDATE_TYPES } from './live-updates'\nexport {\n useArbiWsStore,\n DISMISSED_TASK_TTL_MS,\n type ArbiWsState,\n type ArbiWsStatus,\n type LiveTask,\n} from './store'\n"],
5
+ "mappings": "AAOA;AAAA,EACE;AAAA,OAGK;AACP,SAAS,wBAAiD;AAC1D,SAAS,kBAAkB,kBAAkB,uBAAuB;AACpE,SAAS,iBAAiB,yBAAyB;AACnD;AAAA,EACE;AAAA,EACA;AAAA,OAIK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,38 @@
1
+ import { applyConversationEvent } from "../chat/conversation-events.js";
2
+ import { announceMailDraftReplaced } from "../mail/hooks.js";
3
+ import { arbiQueryKeys, mailQueryKeys } from "../query-keys.js";
4
+ const LIVE_UPDATE_TYPES = [
5
+ "conversation.message_posted",
6
+ "conversation.title_updated",
7
+ "conversation.document_binding_changed",
8
+ "mail.draft_replaced",
9
+ "skills_updated"
10
+ ];
11
+ async function applyLiveUpdate(queryClient, message) {
12
+ switch (message.type) {
13
+ case "conversation.message_posted":
14
+ case "conversation.title_updated":
15
+ case "conversation.document_binding_changed":
16
+ await applyConversationEvent(queryClient, message);
17
+ return true;
18
+ case "mail.draft_replaced": {
19
+ const oldId = message.old_id;
20
+ const newId = message.new_id;
21
+ if (!oldId || !newId) return true;
22
+ void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allMessages() });
23
+ void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allFolders() });
24
+ announceMailDraftReplaced(oldId, newId);
25
+ return true;
26
+ }
27
+ case "skills_updated":
28
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.skills() });
29
+ return true;
30
+ default:
31
+ return false;
32
+ }
33
+ }
34
+ export {
35
+ LIVE_UPDATE_TYPES,
36
+ applyLiveUpdate
37
+ };
38
+ //# sourceMappingURL=live-updates.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/websocket/live-updates.ts"],
4
+ "sourcesContent": ["/**\n * The live updates every site applies from the server's WebSocket, cache side only: a message\n * somebody else posted, a generated title, a thread's document binding, a mail draft saved under a\n * new id, and a changed skill. `ArbiWebSocketProvider` applies them itself; a host with its own\n * socket routes these messages here, so there is one implementation.\n */\n\nimport type { QueryClient } from '@tanstack/react-query'\nimport { applyConversationEvent } from '../chat/conversation-events'\nimport { announceMailDraftReplaced } from '../mail/hooks'\nimport { arbiQueryKeys, mailQueryKeys } from '../query-keys'\n\n/** The message types `applyLiveUpdate` handles. */\nexport const LIVE_UPDATE_TYPES = [\n 'conversation.message_posted',\n 'conversation.title_updated',\n 'conversation.document_binding_changed',\n 'mail.draft_replaced',\n 'skills_updated',\n] as const\n\n/**\n * Apply one server message to the cache. Resolves `true` when it was one of `LIVE_UPDATE_TYPES`,\n * `false` (nothing done) for any other.\n */\nexport async function applyLiveUpdate(\n queryClient: QueryClient,\n message: { type: string; [field: string]: unknown }\n): Promise<boolean> {\n switch (message.type) {\n case 'conversation.message_posted':\n case 'conversation.title_updated':\n case 'conversation.document_binding_changed':\n await applyConversationEvent(queryClient, message)\n return true\n case 'mail.draft_replaced': {\n // A native draft saved again under a new id (by ARBI in a private chat, or in another tab):\n // the Mail lists refresh and an open composer showing the old id follows it.\n const oldId = message.old_id as string | undefined\n const newId = message.new_id as string | undefined\n if (!oldId || !newId) return true\n void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allMessages() })\n void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allFolders() })\n announceMailDraftReplaced(oldId, newId)\n return true\n }\n case 'skills_updated':\n // A skill changed server-side (saved by an agent, deleted, published): the cached\n // marketplace list is never re-read on its own.\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.skills() })\n return true\n default:\n return false\n }\n}\n"],
5
+ "mappings": "AAQA,SAAS,8BAA8B;AACvC,SAAS,iCAAiC;AAC1C,SAAS,eAAe,qBAAqB;AAGtC,MAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,eAAsB,gBACpB,aACA,SACkB;AAClB,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,YAAM,uBAAuB,aAAa,OAAO;AACjD,aAAO;AAAA,IACT,KAAK,uBAAuB;AAG1B,YAAM,QAAQ,QAAQ;AACtB,YAAM,QAAQ,QAAQ;AACtB,UAAI,CAAC,SAAS,CAAC,MAAO,QAAO;AAC7B,WAAK,YAAY,kBAAkB,EAAE,UAAU,cAAc,YAAY,EAAE,CAAC;AAC5E,WAAK,YAAY,kBAAkB,EAAE,UAAU,cAAc,WAAW,EAAE,CAAC;AAC3E,gCAA0B,OAAO,KAAK;AACtC,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AAGH,WAAK,YAAY,kBAAkB,EAAE,UAAU,cAAc,OAAO,EAAE,CAAC;AACvE,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ const INITIAL_RECONNECT_DELAY_MS = 1e3;
2
+ const MAX_RECONNECT_DELAY_MS = 3e4;
3
+ function nextReconnectDelay(attempt) {
4
+ return Math.min(INITIAL_RECONNECT_DELAY_MS * 2 ** Math.max(0, attempt), MAX_RECONNECT_DELAY_MS);
5
+ }
6
+ function resolveSocketBaseUrl(configured, origin) {
7
+ return /^https?:\/\//.test(configured) || !origin ? configured : origin;
8
+ }
9
+ export {
10
+ nextReconnectDelay,
11
+ resolveSocketBaseUrl
12
+ };
13
+ //# sourceMappingURL=reconnect.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/websocket/reconnect.ts"],
4
+ "sourcesContent": ["/** The shared socket's reconnect policy and where it opens. */\n\nconst INITIAL_RECONNECT_DELAY_MS = 1_000\nconst MAX_RECONNECT_DELAY_MS = 30_000\n\n/** Capped exponential backoff before a fresh connect after the transport gave up. */\nexport function nextReconnectDelay(attempt: number): number {\n return Math.min(INITIAL_RECONNECT_DELAY_MS * 2 ** Math.max(0, attempt), MAX_RECONNECT_DELAY_MS)\n}\n\n/**\n * The HTTP origin to open the socket on. A same-origin deployment configures the API as `''` (or\n * a relative prefix), from which no WebSocket URL can be built: the page's origin is used then.\n */\nexport function resolveSocketBaseUrl(configured: string, origin: string | undefined): string {\n return /^https?:\\/\\//.test(configured) || !origin ? configured : origin\n}\n"],
5
+ "mappings": "AAEA,MAAM,6BAA6B;AACnC,MAAM,yBAAyB;AAGxB,SAAS,mBAAmB,SAAyB;AAC1D,SAAO,KAAK,IAAI,6BAA6B,KAAK,KAAK,IAAI,GAAG,OAAO,GAAG,sBAAsB;AAChG;AAMO,SAAS,qBAAqB,YAAoB,QAAoC;AAC3F,SAAO,eAAe,KAAK,UAAU,KAAK,CAAC,SAAS,aAAa;AACnE;",
6
+ "names": []
7
+ }