@arbidocs/react 0.5.111 → 0.5.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (972) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/config/config-hooks.js +209 -0
  304. package/dist/config/config-hooks.js.map +7 -0
  305. package/dist/connectivity.js +72 -0
  306. package/dist/connectivity.js.map +7 -0
  307. package/dist/connectors/hooks.js +263 -0
  308. package/dist/connectors/hooks.js.map +7 -0
  309. package/dist/connectors/index.js +28 -0
  310. package/dist/connectors/index.js.map +7 -0
  311. package/dist/contacts.js +100 -0
  312. package/dist/contacts.js.map +7 -0
  313. package/dist/conversation-list.js +65 -0
  314. package/dist/conversation-list.js.map +7 -0
  315. package/dist/databases.js +195 -0
  316. package/dist/databases.js.map +7 -0
  317. package/dist/datasets/aggregate.js +281 -0
  318. package/dist/datasets/aggregate.js.map +7 -0
  319. package/dist/datasets/index.js +122 -0
  320. package/dist/datasets/index.js.map +7 -0
  321. package/dist/datasets/members.js +27 -0
  322. package/dist/datasets/members.js.map +7 -0
  323. package/dist/datasets/panel.js +44 -0
  324. package/dist/datasets/panel.js.map +7 -0
  325. package/dist/datasets/registry.js +47 -0
  326. package/dist/datasets/registry.js.map +7 -0
  327. package/dist/datasets/rows-source.js +44 -0
  328. package/dist/datasets/rows-source.js.map +7 -0
  329. package/dist/datasets/sources/activity.js +83 -0
  330. package/dist/datasets/sources/activity.js.map +7 -0
  331. package/dist/datasets/sources/conversations.js +74 -0
  332. package/dist/datasets/sources/conversations.js.map +7 -0
  333. package/dist/datasets/sources/database.js +209 -0
  334. package/dist/datasets/sources/database.js.map +7 -0
  335. package/dist/datasets/sources/documents.js +93 -0
  336. package/dist/datasets/sources/documents.js.map +7 -0
  337. package/dist/datasets/sources/facts.js +56 -0
  338. package/dist/datasets/sources/facts.js.map +7 -0
  339. package/dist/datasets/sources/projects.js +117 -0
  340. package/dist/datasets/sources/projects.js.map +7 -0
  341. package/dist/datasets/sources/tags.js +67 -0
  342. package/dist/datasets/sources/tags.js.map +7 -0
  343. package/dist/datasets/sources/usage.js +268 -0
  344. package/dist/datasets/sources/usage.js.map +7 -0
  345. package/dist/datasets/sources/workflows.js +91 -0
  346. package/dist/datasets/sources/workflows.js.map +7 -0
  347. package/dist/datasets/sources/workspaces.js +67 -0
  348. package/dist/datasets/sources/workspaces.js.map +7 -0
  349. package/dist/datasets/store.js +194 -0
  350. package/dist/datasets/store.js.map +7 -0
  351. package/dist/datasets/types.js +14 -0
  352. package/dist/datasets/types.js.map +7 -0
  353. package/dist/directmessages/ConversationList.js +148 -0
  354. package/dist/directmessages/ConversationList.js.map +7 -0
  355. package/dist/directmessages/DateSeparator.js +8 -0
  356. package/dist/directmessages/DateSeparator.js.map +7 -0
  357. package/dist/directmessages/DmAvatar.js +29 -0
  358. package/dist/directmessages/DmAvatar.js.map +7 -0
  359. package/dist/directmessages/DmComposer.js +201 -0
  360. package/dist/directmessages/DmComposer.js.map +7 -0
  361. package/dist/directmessages/arrivals.js +29 -0
  362. package/dist/directmessages/arrivals.js.map +7 -0
  363. package/dist/directmessages/chat-cache.js +192 -0
  364. package/dist/directmessages/chat-cache.js.map +7 -0
  365. package/dist/directmessages/grouping.js +26 -0
  366. package/dist/directmessages/grouping.js.map +7 -0
  367. package/dist/directmessages/index.js +81 -0
  368. package/dist/directmessages/index.js.map +7 -0
  369. package/dist/directmessages/useChats.js +266 -0
  370. package/dist/directmessages/useChats.js.map +7 -0
  371. package/dist/directmessages/utils.js +23 -0
  372. package/dist/directmessages/utils.js.map +7 -0
  373. package/dist/document-tools/can-annotate.js +7 -0
  374. package/dist/document-tools/can-annotate.js.map +7 -0
  375. package/dist/document-tools/core.js +218 -12
  376. package/dist/document-tools/core.js.map +7 -1
  377. package/dist/document-tools/document-pdf.js +76 -0
  378. package/dist/document-tools/document-pdf.js.map +7 -0
  379. package/dist/document-tools/environment.js +136 -0
  380. package/dist/document-tools/environment.js.map +7 -0
  381. package/dist/document-tools/file-shares.js +112 -0
  382. package/dist/document-tools/file-shares.js.map +7 -0
  383. package/dist/document-tools/frozen-copy.js +27 -0
  384. package/dist/document-tools/frozen-copy.js.map +7 -0
  385. package/dist/document-tools/index.js +26 -148
  386. package/dist/document-tools/index.js.map +7 -1
  387. package/dist/document-tools/markup-download.js +51 -0
  388. package/dist/document-tools/markup-download.js.map +7 -0
  389. package/dist/document-tools/markup-store.js +138 -0
  390. package/dist/document-tools/markup-store.js.map +7 -0
  391. package/dist/document-tools/markup-transfer.js +88 -0
  392. package/dist/document-tools/markup-transfer.js.map +7 -0
  393. package/dist/document-tools/production.js +147 -0
  394. package/dist/document-tools/production.js.map +7 -0
  395. package/dist/document-tools/saved-signature.js +90 -0
  396. package/dist/document-tools/saved-signature.js.map +7 -0
  397. package/dist/document-tools/signature-requests.js +310 -0
  398. package/dist/document-tools/signature-requests.js.map +7 -0
  399. package/dist/document-tools/signing.js +127 -0
  400. package/dist/document-tools/signing.js.map +7 -0
  401. package/dist/document-tools/useDocumentBytes.js +38 -0
  402. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  403. package/dist/document-tools/useDocumentMarkup.js +154 -0
  404. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  405. package/dist/document-tools/useIsOnline.js +13 -0
  406. package/dist/document-tools/useIsOnline.js.map +7 -0
  407. package/dist/document-tools/verification.js +60 -0
  408. package/dist/document-tools/verification.js.map +7 -0
  409. package/dist/documents/DocumentReview.js +220 -0
  410. package/dist/documents/DocumentReview.js.map +7 -0
  411. package/dist/documents/DraftTitleControls.js +41 -0
  412. package/dist/documents/DraftTitleControls.js.map +7 -0
  413. package/dist/documents/InlineMicButton.js +90 -0
  414. package/dist/documents/InlineMicButton.js.map +7 -0
  415. package/dist/documents/MicRecordingOverlay.js +29 -0
  416. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  417. package/dist/documents/MicWaveformIndicator.js +68 -0
  418. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  419. package/dist/documents/PhotoCapture.js +120 -0
  420. package/dist/documents/PhotoCapture.js.map +7 -0
  421. package/dist/documents/VideoCapture.js +129 -0
  422. package/dist/documents/VideoCapture.js.map +7 -0
  423. package/dist/documents/VoiceNoteRecorder.js +166 -0
  424. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  425. package/dist/documents/audio-segmenter.js +63 -0
  426. package/dist/documents/audio-segmenter.js.map +7 -0
  427. package/dist/documents/capture-frame.js +21 -0
  428. package/dist/documents/capture-frame.js.map +7 -0
  429. package/dist/documents/chunked-recorder.js +190 -0
  430. package/dist/documents/chunked-recorder.js.map +7 -0
  431. package/dist/documents/document-download.js +53 -0
  432. package/dist/documents/document-download.js.map +7 -0
  433. package/dist/documents/document-fields.js +109 -0
  434. package/dist/documents/document-fields.js.map +7 -0
  435. package/dist/documents/documents-cache.js +110 -0
  436. package/dist/documents/documents-cache.js.map +7 -0
  437. package/dist/documents/documents-data.js +128 -0
  438. package/dist/documents/documents-data.js.map +7 -0
  439. package/dist/documents/documents-loader.js +113 -0
  440. package/dist/documents/documents-loader.js.map +7 -0
  441. package/dist/documents/documents-writes.js +448 -0
  442. package/dist/documents/documents-writes.js.map +7 -0
  443. package/dist/documents/format-elapsed.js +10 -0
  444. package/dist/documents/format-elapsed.js.map +7 -0
  445. package/dist/documents/has-video-track.js +26 -0
  446. package/dist/documents/has-video-track.js.map +7 -0
  447. package/dist/documents/index.js +266 -0
  448. package/dist/documents/index.js.map +7 -0
  449. package/dist/documents/media-error.js +18 -0
  450. package/dist/documents/media-error.js.map +7 -0
  451. package/dist/documents/offline-documents.js +160 -0
  452. package/dist/documents/offline-documents.js.map +7 -0
  453. package/dist/documents/pending-sync.js +210 -0
  454. package/dist/documents/pending-sync.js.map +7 -0
  455. package/dist/documents/processing-live.js +122 -0
  456. package/dist/documents/processing-live.js.map +7 -0
  457. package/dist/documents/processing-order.js +59 -0
  458. package/dist/documents/processing-order.js.map +7 -0
  459. package/dist/documents/processing-settle.js +21 -0
  460. package/dist/documents/processing-settle.js.map +7 -0
  461. package/dist/documents/related-documents.js +133 -0
  462. package/dist/documents/related-documents.js.map +7 -0
  463. package/dist/documents/support.js +29 -0
  464. package/dist/documents/support.js.map +7 -0
  465. package/dist/documents/upload-files.js +169 -0
  466. package/dist/documents/upload-files.js.map +7 -0
  467. package/dist/documents/useAudioRecorder.js +315 -0
  468. package/dist/documents/useAudioRecorder.js.map +7 -0
  469. package/dist/documents/useCameraStream.js +35 -0
  470. package/dist/documents/useCameraStream.js.map +7 -0
  471. package/dist/documents/useDocumentThumbnails.js +71 -0
  472. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  473. package/dist/documents/useDownloadDocuments.js +90 -0
  474. package/dist/documents/useDownloadDocuments.js.map +7 -0
  475. package/dist/documents/usePassageQuotes.js +37 -0
  476. package/dist/documents/usePassageQuotes.js.map +7 -0
  477. package/dist/documents/useUploadFiles.js +165 -0
  478. package/dist/documents/useUploadFiles.js.map +7 -0
  479. package/dist/documents/useUploadFromUrls.js +63 -0
  480. package/dist/documents/useUploadFromUrls.js.map +7 -0
  481. package/dist/documents/useVideoRecorder.js +62 -0
  482. package/dist/documents/useVideoRecorder.js.map +7 -0
  483. package/dist/entities/AgentMarkers.js +61 -0
  484. package/dist/entities/AgentMarkers.js.map +7 -0
  485. package/dist/entities/DocumentEntity.js +125 -0
  486. package/dist/entities/DocumentEntity.js.map +7 -0
  487. package/dist/entities/EntityPill.js +250 -0
  488. package/dist/entities/EntityPill.js.map +7 -0
  489. package/dist/entities/ProjectEntity.js +61 -0
  490. package/dist/entities/ProjectEntity.js.map +7 -0
  491. package/dist/entities/ShieldIcon.js +49 -0
  492. package/dist/entities/ShieldIcon.js.map +7 -0
  493. package/dist/entities/TagEntity.js +79 -0
  494. package/dist/entities/TagEntity.js.map +7 -0
  495. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  496. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  497. package/dist/entities/UserEntity.js +211 -0
  498. package/dist/entities/UserEntity.js.map +7 -0
  499. package/dist/entities/VerifiedBadge.js +19 -0
  500. package/dist/entities/VerifiedBadge.js.map +7 -0
  501. package/dist/entities/agent-avatar-colors.js +26 -0
  502. package/dist/entities/agent-avatar-colors.js.map +7 -0
  503. package/dist/entities/colors.js +64 -0
  504. package/dist/entities/colors.js.map +7 -0
  505. package/dist/entities/file-type.js +151 -0
  506. package/dist/entities/file-type.js.map +7 -0
  507. package/dist/entities/index.js +100 -0
  508. package/dist/entities/index.js.map +7 -0
  509. package/dist/entities/media-type.js +61 -0
  510. package/dist/entities/media-type.js.map +7 -0
  511. package/dist/entities/registry.js +385 -0
  512. package/dist/entities/registry.js.map +7 -0
  513. package/dist/entities/status.js +43 -0
  514. package/dist/entities/status.js.map +7 -0
  515. package/dist/entities/tag-kinds.js +23 -0
  516. package/dist/entities/tag-kinds.js.map +7 -0
  517. package/dist/entities/tag-types.js +44 -0
  518. package/dist/entities/tag-types.js.map +7 -0
  519. package/dist/entities/vocabulary.js +12 -0
  520. package/dist/entities/vocabulary.js.map +7 -0
  521. package/dist/entity-extraction.js +25 -0
  522. package/dist/entity-extraction.js.map +7 -0
  523. package/dist/facts-search.js +57 -0
  524. package/dist/facts-search.js.map +7 -0
  525. package/dist/facts.js +69 -0
  526. package/dist/facts.js.map +7 -0
  527. package/dist/hooks.js +320 -0
  528. package/dist/hooks.js.map +7 -0
  529. package/dist/host/ArbiHost.js +24 -0
  530. package/dist/host/ArbiHost.js.map +7 -0
  531. package/dist/host/assistant-copy.js +54 -0
  532. package/dist/host/assistant-copy.js.map +7 -0
  533. package/dist/host/config.js +9 -0
  534. package/dist/host/config.js.map +7 -0
  535. package/dist/host/context.js +10 -0
  536. package/dist/host/context.js.map +7 -0
  537. package/dist/host/features.js +144 -0
  538. package/dist/host/features.js.map +7 -0
  539. package/dist/host/index.js +12 -0
  540. package/dist/host/index.js.map +7 -0
  541. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  542. package/dist/host/merge.js.map +7 -0
  543. package/dist/house-template.js +40 -0
  544. package/dist/house-template.js.map +7 -0
  545. package/dist/icons/AppleIcon.js +25 -0
  546. package/dist/icons/AppleIcon.js.map +7 -0
  547. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  548. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  549. package/dist/icons/ArbiIcon.js +24 -0
  550. package/dist/icons/ArbiIcon.js.map +7 -0
  551. package/dist/icons/AudIcon.js +56 -0
  552. package/dist/icons/AudIcon.js.map +7 -0
  553. package/dist/icons/ClaudeIcon.js +28 -0
  554. package/dist/icons/ClaudeIcon.js.map +7 -0
  555. package/dist/icons/DocIcon.js +56 -0
  556. package/dist/icons/DocIcon.js.map +7 -0
  557. package/dist/icons/EmlIcon.js +57 -0
  558. package/dist/icons/EmlIcon.js.map +7 -0
  559. package/dist/icons/FireworksIcon.js +47 -0
  560. package/dist/icons/FireworksIcon.js.map +7 -0
  561. package/dist/icons/GeminiIcon.js +37 -0
  562. package/dist/icons/GeminiIcon.js.map +7 -0
  563. package/dist/icons/GitHubIcon.js +32 -0
  564. package/dist/icons/GitHubIcon.js.map +7 -0
  565. package/dist/icons/GoogleIcon.js +53 -0
  566. package/dist/icons/GoogleIcon.js.map +7 -0
  567. package/dist/icons/HtmlIcon.js +56 -0
  568. package/dist/icons/HtmlIcon.js.map +7 -0
  569. package/dist/icons/ImgIcon.js +56 -0
  570. package/dist/icons/ImgIcon.js.map +7 -0
  571. package/dist/icons/LinkedInIcon.js +25 -0
  572. package/dist/icons/LinkedInIcon.js.map +7 -0
  573. package/dist/icons/OpenAIIcon.js +28 -0
  574. package/dist/icons/OpenAIIcon.js.map +7 -0
  575. package/dist/icons/PdfIcon.js +56 -0
  576. package/dist/icons/PdfIcon.js.map +7 -0
  577. package/dist/icons/ProviderIcon.js +42 -0
  578. package/dist/icons/ProviderIcon.js.map +7 -0
  579. package/dist/icons/TxtIcon.js +56 -0
  580. package/dist/icons/TxtIcon.js.map +7 -0
  581. package/dist/icons/VidIcon.js +56 -0
  582. package/dist/icons/VidIcon.js.map +7 -0
  583. package/dist/icons/XlsIcon.js +56 -0
  584. package/dist/icons/XlsIcon.js.map +7 -0
  585. package/dist/icons/arbi-mark.js +5 -0
  586. package/dist/icons/arbi-mark.js.map +7 -0
  587. package/dist/icons/colors.js +31 -0
  588. package/dist/icons/colors.js.map +7 -0
  589. package/dist/icons/file-type.js +105 -0
  590. package/dist/icons/file-type.js.map +7 -0
  591. package/dist/icons/index.js +55 -0
  592. package/dist/icons/index.js.map +7 -0
  593. package/dist/imagecrop/ImageCropModal.js +56 -0
  594. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  595. package/dist/imagecrop/ImageCropper.js +100 -0
  596. package/dist/imagecrop/ImageCropper.js.map +7 -0
  597. package/dist/imagecrop/cropImage.js +43 -0
  598. package/dist/imagecrop/cropImage.js.map +7 -0
  599. package/dist/imagecrop/index.js +13 -0
  600. package/dist/imagecrop/index.js.map +7 -0
  601. package/dist/index.js +702 -17116
  602. package/dist/index.js.map +7 -1
  603. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  604. package/dist/lazy-chunk.js.map +7 -0
  605. package/dist/lib/collision-padding.js +13 -0
  606. package/dist/lib/collision-padding.js.map +7 -0
  607. package/dist/lib/format-friendly-date.js +55 -0
  608. package/dist/lib/format-friendly-date.js.map +7 -0
  609. package/dist/lib/format-relative-time.js +52 -0
  610. package/dist/lib/format-relative-time.js.map +7 -0
  611. package/dist/lib/markdown-to-text.js +35 -0
  612. package/dist/lib/markdown-to-text.js.map +7 -0
  613. package/dist/lib/toast-interaction.js +9 -0
  614. package/dist/lib/toast-interaction.js.map +7 -0
  615. package/dist/lib/utils.js +9 -0
  616. package/dist/lib/utils.js.map +7 -0
  617. package/dist/mail/client.js +103 -0
  618. package/dist/mail/client.js.map +7 -0
  619. package/dist/mail/document-attachment.js +38 -0
  620. package/dist/mail/document-attachment.js.map +7 -0
  621. package/dist/mail/filing.js +132 -0
  622. package/dist/mail/filing.js.map +7 -0
  623. package/dist/mail/hooks.js +393 -0
  624. package/dist/mail/hooks.js.map +7 -0
  625. package/dist/mail/index.js +120 -0
  626. package/dist/mail/index.js.map +7 -0
  627. package/dist/mail/offline/changes.js +258 -0
  628. package/dist/mail/offline/changes.js.map +7 -0
  629. package/dist/mail/offline/confirm-sign-out.js +37 -0
  630. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  631. package/dist/mail/offline/crypto.js +26 -0
  632. package/dist/mail/offline/crypto.js.map +7 -0
  633. package/dist/mail/offline/drafts.js +69 -0
  634. package/dist/mail/offline/drafts.js.map +7 -0
  635. package/dist/mail/offline/hooks.js +104 -0
  636. package/dist/mail/offline/hooks.js.map +7 -0
  637. package/dist/mail/offline/index.js +48 -0
  638. package/dist/mail/offline/index.js.map +7 -0
  639. package/dist/mail/offline/live.js +233 -0
  640. package/dist/mail/offline/live.js.map +7 -0
  641. package/dist/mail/offline/mailbox.js +191 -0
  642. package/dist/mail/offline/mailbox.js.map +7 -0
  643. package/dist/mail/offline/outbox.js +167 -0
  644. package/dist/mail/offline/outbox.js.map +7 -0
  645. package/dist/mail/offline/reads.js +159 -0
  646. package/dist/mail/offline/reads.js.map +7 -0
  647. package/dist/mail/offline/runtime.js +100 -0
  648. package/dist/mail/offline/runtime.js.map +7 -0
  649. package/dist/mail/offline/settings.js +84 -0
  650. package/dist/mail/offline/settings.js.map +7 -0
  651. package/dist/mail/offline/store.js +29 -0
  652. package/dist/mail/offline/store.js.map +7 -0
  653. package/dist/mail/offline/sync.js +251 -0
  654. package/dist/mail/offline/sync.js.map +7 -0
  655. package/dist/mail/offline/wipe.js +19 -0
  656. package/dist/mail/offline/wipe.js.map +7 -0
  657. package/dist/mail/thread-keys.js +53 -0
  658. package/dist/mail/thread-keys.js.map +7 -0
  659. package/dist/mail/threads.js +71 -0
  660. package/dist/mail/threads.js.map +7 -0
  661. package/dist/mail/useMailClient.js +42 -0
  662. package/dist/mail/useMailClient.js.map +7 -0
  663. package/dist/model-connections.js +58 -0
  664. package/dist/model-connections.js.map +7 -0
  665. package/dist/notifications/ActivityFeed.js +70 -0
  666. package/dist/notifications/ActivityFeed.js.map +7 -0
  667. package/dist/notifications/NotificationBell.js +200 -0
  668. package/dist/notifications/NotificationBell.js.map +7 -0
  669. package/dist/notifications/Toaster.js +24 -0
  670. package/dist/notifications/Toaster.js.map +7 -0
  671. package/dist/notifications/activity-types.js +65 -0
  672. package/dist/notifications/activity-types.js.map +7 -0
  673. package/dist/notifications/bell.js +24 -0
  674. package/dist/notifications/bell.js.map +7 -0
  675. package/dist/notifications/calendar-notifications.js +79 -0
  676. package/dist/notifications/calendar-notifications.js.map +7 -0
  677. package/dist/notifications/index.js +108 -0
  678. package/dist/notifications/index.js.map +7 -0
  679. package/dist/notifications/live.js +28 -0
  680. package/dist/notifications/live.js.map +7 -0
  681. package/dist/notifications/notification-types.js +127 -0
  682. package/dist/notifications/notification-types.js.map +7 -0
  683. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  684. package/dist/notifications/notify-store.js.map +7 -0
  685. package/dist/notifications/server-notifications.js +452 -0
  686. package/dist/notifications/server-notifications.js.map +7 -0
  687. package/dist/notifications/useNotifications.js +34 -0
  688. package/dist/notifications/useNotifications.js.map +7 -0
  689. package/dist/offline-store/network.js +11 -0
  690. package/dist/offline-store/network.js.map +7 -0
  691. package/dist/offline-store/store.js +136 -0
  692. package/dist/offline-store/store.js.map +7 -0
  693. package/dist/offline-store/wipe.js +8 -0
  694. package/dist/offline-store/wipe.js.map +7 -0
  695. package/dist/offline.js +58 -0
  696. package/dist/offline.js.map +7 -0
  697. package/dist/people.js +122 -0
  698. package/dist/people.js.map +7 -0
  699. package/dist/projects.js +30 -0
  700. package/dist/projects.js.map +7 -0
  701. package/dist/query-client.js +63 -0
  702. package/dist/query-client.js.map +7 -0
  703. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  704. package/dist/query-keys.js.map +7 -0
  705. package/dist/query-persist.js +66 -0
  706. package/dist/query-persist.js.map +7 -0
  707. package/dist/queued-writes.js +59 -0
  708. package/dist/queued-writes.js.map +7 -0
  709. package/dist/remote-control.js +67 -0
  710. package/dist/remote-control.js.map +7 -0
  711. package/dist/search/index.js +23 -0
  712. package/dist/search/index.js.map +7 -0
  713. package/dist/search/session.js +58 -0
  714. package/dist/search/session.js.map +7 -0
  715. package/dist/search/useSemanticSearch.js +82 -0
  716. package/dist/search/useSemanticSearch.js.map +7 -0
  717. package/dist/session/chat.js +512 -0
  718. package/dist/session/chat.js.map +7 -0
  719. package/dist/session/documents.js +196 -0
  720. package/dist/session/documents.js.map +7 -0
  721. package/dist/session/drafts.js +103 -0
  722. package/dist/session/drafts.js.map +7 -0
  723. package/dist/session/index.js +123 -0
  724. package/dist/session/index.js.map +7 -0
  725. package/dist/session/layout.js +339 -0
  726. package/dist/session/layout.js.map +7 -0
  727. package/dist/session/persist.js +106 -0
  728. package/dist/session/persist.js.map +7 -0
  729. package/dist/session/session-hooks.js +53 -0
  730. package/dist/session/session-hooks.js.map +7 -0
  731. package/dist/session/signed-in.js +36 -0
  732. package/dist/session/signed-in.js.map +7 -0
  733. package/dist/session/store.js +166 -0
  734. package/dist/session/store.js.map +7 -0
  735. package/dist/session/thread-tabs.js +121 -0
  736. package/dist/session/thread-tabs.js.map +7 -0
  737. package/dist/session/ui-state-storage.js +76 -0
  738. package/dist/session/ui-state-storage.js.map +7 -0
  739. package/dist/session/workspace.js +77 -0
  740. package/dist/session/workspace.js.map +7 -0
  741. package/dist/shell/index.js +43 -10
  742. package/dist/shell/index.js.map +7 -1
  743. package/dist/skill-pack.js +111 -0
  744. package/dist/skill-pack.js.map +7 -0
  745. package/dist/storage.js +186 -0
  746. package/dist/storage.js.map +7 -0
  747. package/dist/support/index.js +35 -0
  748. package/dist/support/index.js.map +7 -0
  749. package/dist/tags.js +204 -0
  750. package/dist/tags.js.map +7 -0
  751. package/dist/ui/DebouncedInput.js +109 -0
  752. package/dist/ui/DebouncedInput.js.map +7 -0
  753. package/dist/ui/DictateContext.js +8 -0
  754. package/dist/ui/DictateContext.js.map +7 -0
  755. package/dist/ui/IconToggle.js +79 -0
  756. package/dist/ui/IconToggle.js.map +7 -0
  757. package/dist/ui/VerifiedToggle.js +38 -0
  758. package/dist/ui/VerifiedToggle.js.map +7 -0
  759. package/dist/ui/VisibilityToggle.js +103 -0
  760. package/dist/ui/VisibilityToggle.js.map +7 -0
  761. package/dist/ui/avatar.js +40 -0
  762. package/dist/ui/avatar.js.map +7 -0
  763. package/dist/ui/badge.js +28 -0
  764. package/dist/ui/badge.js.map +7 -0
  765. package/dist/ui/button.js +48 -0
  766. package/dist/ui/button.js.map +7 -0
  767. package/dist/ui/card.js +90 -0
  768. package/dist/ui/card.js.map +7 -0
  769. package/dist/ui/checkbox.js +22 -0
  770. package/dist/ui/checkbox.js.map +7 -0
  771. package/dist/ui/collapsible.js +10 -0
  772. package/dist/ui/collapsible.js.map +7 -0
  773. package/dist/ui/command.js +103 -0
  774. package/dist/ui/command.js.map +7 -0
  775. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  776. package/dist/ui/dialog.js.map +7 -0
  777. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  778. package/dist/ui/dropdown-menu.js.map +7 -0
  779. package/dist/ui/hover-card.js +36 -0
  780. package/dist/ui/hover-card.js.map +7 -0
  781. package/dist/ui/index.js +290 -10
  782. package/dist/ui/index.js.map +7 -1
  783. package/dist/ui/input.js +65 -0
  784. package/dist/ui/input.js.map +7 -0
  785. package/dist/ui/label.js +16 -0
  786. package/dist/ui/label.js.map +7 -0
  787. package/dist/ui/mark-menu.js +300 -0
  788. package/dist/ui/mark-menu.js.map +7 -0
  789. package/dist/ui/popover.js +40 -0
  790. package/dist/ui/popover.js.map +7 -0
  791. package/dist/ui/portal-container.js +17 -0
  792. package/dist/ui/portal-container.js.map +7 -0
  793. package/dist/ui/progress.js +24 -0
  794. package/dist/ui/progress.js.map +7 -0
  795. package/dist/ui/radio-group.js +29 -0
  796. package/dist/ui/radio-group.js.map +7 -0
  797. package/dist/ui/scroll-area.js +39 -0
  798. package/dist/ui/scroll-area.js.map +7 -0
  799. package/dist/ui/select.js +130 -0
  800. package/dist/ui/select.js.map +7 -0
  801. package/dist/ui/separator.js +23 -0
  802. package/dist/ui/separator.js.map +7 -0
  803. package/dist/ui/slider.js +23 -0
  804. package/dist/ui/slider.js.map +7 -0
  805. package/dist/ui/switch.js +28 -0
  806. package/dist/ui/switch.js.map +7 -0
  807. package/dist/ui/table.js +75 -0
  808. package/dist/ui/table.js.map +7 -0
  809. package/dist/ui/tabs.js +48 -0
  810. package/dist/ui/tabs.js.map +7 -0
  811. package/dist/ui/textarea.js +63 -0
  812. package/dist/ui/textarea.js.map +7 -0
  813. package/dist/ui/toggle-group.js +43 -0
  814. package/dist/ui/toggle-group.js.map +7 -0
  815. package/dist/ui/toggle.js +40 -0
  816. package/dist/ui/toggle.js.map +7 -0
  817. package/dist/ui/tooltip.js +215 -0
  818. package/dist/ui/tooltip.js.map +7 -0
  819. package/dist/usage-metered.js +8 -0
  820. package/dist/usage-metered.js.map +7 -0
  821. package/dist/useArbi.js +16 -0
  822. package/dist/useArbi.js.map +7 -0
  823. package/dist/useInstallSkillPack.js +81 -0
  824. package/dist/useInstallSkillPack.js.map +7 -0
  825. package/dist/usermenu/UserMenu.js +188 -0
  826. package/dist/usermenu/UserMenu.js.map +7 -0
  827. package/dist/usermenu/index.js +5 -0
  828. package/dist/usermenu/index.js.map +7 -0
  829. package/dist/users/index.js +15 -0
  830. package/dist/users/index.js.map +7 -0
  831. package/dist/users/user-display.js +60 -0
  832. package/dist/users/user-display.js.map +7 -0
  833. package/dist/viewers/AudioViewer.js +23 -0
  834. package/dist/viewers/AudioViewer.js.map +7 -0
  835. package/dist/viewers/DocxViewer.js +81 -0
  836. package/dist/viewers/DocxViewer.js.map +7 -0
  837. package/dist/viewers/ImageViewer.js +31 -0
  838. package/dist/viewers/ImageViewer.js.map +7 -0
  839. package/dist/viewers/PdfViewer.js +19 -3
  840. package/dist/viewers/PdfViewer.js.map +7 -1
  841. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  842. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  843. package/dist/viewers/VideoViewer.js +31 -0
  844. package/dist/viewers/VideoViewer.js.map +7 -0
  845. package/dist/viewers/XlsxViewer.js +102 -0
  846. package/dist/viewers/XlsxViewer.js.map +7 -0
  847. package/dist/viewers/index.js +61 -271
  848. package/dist/viewers/index.js.map +7 -1
  849. package/dist/viewers/page-scroll.js +59 -0
  850. package/dist/viewers/page-scroll.js.map +7 -0
  851. package/dist/viewers/pdf-viewer-constants.js +9 -0
  852. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  853. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  854. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  855. package/dist/viewers/selection-runs.js +38 -0
  856. package/dist/viewers/selection-runs.js.map +7 -0
  857. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  858. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  859. package/dist/viewers/useProcessedChunks.js +58 -0
  860. package/dist/viewers/useProcessedChunks.js.map +7 -0
  861. package/dist/viewers/viewer-zoom.js +163 -0
  862. package/dist/viewers/viewer-zoom.js.map +7 -0
  863. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  864. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  865. package/dist/websocket/context.js +14 -0
  866. package/dist/websocket/context.js.map +7 -0
  867. package/dist/websocket/hooks.js +30 -0
  868. package/dist/websocket/hooks.js.map +7 -0
  869. package/dist/websocket/index.js +22 -0
  870. package/dist/websocket/index.js.map +7 -0
  871. package/dist/websocket/live-updates.js +38 -0
  872. package/dist/websocket/live-updates.js.map +7 -0
  873. package/dist/websocket/reconnect.js +13 -0
  874. package/dist/websocket/reconnect.js.map +7 -0
  875. package/dist/websocket/store.js +58 -0
  876. package/dist/websocket/store.js.map +7 -0
  877. package/dist/workforce.js +607 -0
  878. package/dist/workforce.js.map +7 -0
  879. package/dist/workspaces/access-request.js +35 -0
  880. package/dist/workspaces/access-request.js.map +7 -0
  881. package/dist/workspaces/archive.js +59 -0
  882. package/dist/workspaces/archive.js.map +7 -0
  883. package/dist/workspaces/current.js +20 -0
  884. package/dist/workspaces/current.js.map +7 -0
  885. package/dist/workspaces/delete-workspaces.js +15 -0
  886. package/dist/workspaces/delete-workspaces.js.map +7 -0
  887. package/dist/workspaces/export-archive.js +40 -0
  888. package/dist/workspaces/export-archive.js.map +7 -0
  889. package/dist/workspaces/index.js +99 -0
  890. package/dist/workspaces/index.js.map +7 -0
  891. package/dist/workspaces/settings.js +45 -0
  892. package/dist/workspaces/settings.js.map +7 -0
  893. package/dist/workspaces/shell-workspaces.js +49 -0
  894. package/dist/workspaces/shell-workspaces.js.map +7 -0
  895. package/dist/workspaces/switch.js +234 -0
  896. package/dist/workspaces/switch.js.map +7 -0
  897. package/dist/workspaces/transfer.js +170 -0
  898. package/dist/workspaces/transfer.js.map +7 -0
  899. package/dist/workspaces/useShellWorkspaces.js +86 -0
  900. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  901. package/dist/workspaces/workspace-users.js +65 -0
  902. package/dist/workspaces/workspace-users.js.map +7 -0
  903. package/package.json +4 -4
  904. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  905. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  906. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  907. package/dist/annotations/freeze/index.d.cts +0 -205
  908. package/dist/annotations/index.d.cts +0 -360
  909. package/dist/artifacts/index.d.cts +0 -476
  910. package/dist/artifacts/redline-core.d.cts +0 -39
  911. package/dist/bundle-YNOX7VIL.js +0 -5
  912. package/dist/bundle-YNOX7VIL.js.map +0 -1
  913. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  914. package/dist/calls/livekit/index.d.cts +0 -280
  915. package/dist/chunk-47CCGUWR.js.map +0 -1
  916. package/dist/chunk-4FL3X3LA.js +0 -2057
  917. package/dist/chunk-4FL3X3LA.js.map +0 -1
  918. package/dist/chunk-6QNBSXCE.js +0 -271
  919. package/dist/chunk-6QNBSXCE.js.map +0 -1
  920. package/dist/chunk-74N436VK.js.map +0 -1
  921. package/dist/chunk-APZZQZ6P.js +0 -147
  922. package/dist/chunk-APZZQZ6P.js.map +0 -1
  923. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  924. package/dist/chunk-DPYBZDJB.js.map +0 -1
  925. package/dist/chunk-DZKRL5H3.js +0 -2766
  926. package/dist/chunk-DZKRL5H3.js.map +0 -1
  927. package/dist/chunk-HDCRPPBW.js +0 -75
  928. package/dist/chunk-HDCRPPBW.js.map +0 -1
  929. package/dist/chunk-L2IPPTVC.js +0 -20
  930. package/dist/chunk-L2IPPTVC.js.map +0 -1
  931. package/dist/chunk-LSU4UPS5.js +0 -1011
  932. package/dist/chunk-LSU4UPS5.js.map +0 -1
  933. package/dist/chunk-NIKPG4PW.js +0 -1128
  934. package/dist/chunk-NIKPG4PW.js.map +0 -1
  935. package/dist/chunk-NNAJLY6B.js +0 -4974
  936. package/dist/chunk-NNAJLY6B.js.map +0 -1
  937. package/dist/chunk-OYPKKHXY.js +0 -559
  938. package/dist/chunk-OYPKKHXY.js.map +0 -1
  939. package/dist/chunk-PTOP7OHG.js.map +0 -1
  940. package/dist/chunk-QMY2JKBI.js +0 -246
  941. package/dist/chunk-QMY2JKBI.js.map +0 -1
  942. package/dist/chunk-SN5YV6FF.js +0 -11
  943. package/dist/chunk-SN5YV6FF.js.map +0 -1
  944. package/dist/chunk-SSXFVWCT.js.map +0 -1
  945. package/dist/chunk-T3USOSVN.js.map +0 -1
  946. package/dist/chunk-T4CLW3DN.js +0 -2560
  947. package/dist/chunk-T4CLW3DN.js.map +0 -1
  948. package/dist/chunk-UW2SGTI5.js.map +0 -1
  949. package/dist/chunk-VSCU7K4V.js.map +0 -1
  950. package/dist/chunk-WL2Y2T47.js.map +0 -1
  951. package/dist/chunk-WUTL62MC.js.map +0 -1
  952. package/dist/chunk-XWPLOFDN.js +0 -644
  953. package/dist/chunk-XWPLOFDN.js.map +0 -1
  954. package/dist/chunk-Y3MTRA7D.js +0 -97
  955. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  956. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  957. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  958. package/dist/document-tools/core.d.cts +0 -883
  959. package/dist/document-tools/index.d.cts +0 -90
  960. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  961. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  962. package/dist/index.d.cts +0 -15923
  963. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  964. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  965. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  966. package/dist/shell/index.d.cts +0 -6
  967. package/dist/store.d-GADDvC7w.d.cts +0 -35
  968. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  969. package/dist/ui/index.d.cts +0 -26
  970. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  971. package/dist/viewers/PdfViewer.d.cts +0 -9
  972. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,201 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRef, useState } from "react";
3
+ import { Loader2, Paperclip, Send, X } from "lucide-react";
4
+ import { chats, formatFileSize } from "@arbidocs/sdk/browser";
5
+ import { Button } from "../ui/button.js";
6
+ import { Textarea } from "../ui/textarea.js";
7
+ import { cn } from "../lib/utils.js";
8
+ function DmComposer({
9
+ placeholder,
10
+ disabled,
11
+ busy,
12
+ onSend,
13
+ allowAttachments,
14
+ error,
15
+ children,
16
+ classNames
17
+ }) {
18
+ const [draft, setDraft] = useState("");
19
+ const [files, setFiles] = useState([]);
20
+ const [attachError, setAttachError] = useState(null);
21
+ const [dragging, setDragging] = useState(false);
22
+ const inputRef = useRef(null);
23
+ const fileInputRef = useRef(null);
24
+ const addFiles = (added) => {
25
+ if (!allowAttachments || added.length === 0) return;
26
+ const next = [...files, ...added];
27
+ try {
28
+ chats.checkChatAttachmentLimits(next);
29
+ setFiles(next);
30
+ setAttachError(null);
31
+ } catch (err) {
32
+ setAttachError(err instanceof Error ? err.message : "Could not attach the file");
33
+ }
34
+ };
35
+ const removeFile = (index) => {
36
+ setFiles((current) => current.filter((_, i) => i !== index));
37
+ setAttachError(null);
38
+ };
39
+ const submit = async () => {
40
+ const text = draft.trim();
41
+ if (!text && files.length === 0 || disabled || busy) return;
42
+ const sending = files;
43
+ setDraft("");
44
+ setFiles([]);
45
+ setAttachError(null);
46
+ try {
47
+ await onSend(text, sending);
48
+ inputRef.current?.focus();
49
+ } catch {
50
+ setDraft(text);
51
+ setFiles(sending);
52
+ }
53
+ };
54
+ const onKeyDown = (e) => {
55
+ if (e.key === "Enter" && !e.shiftKey) {
56
+ e.preventDefault();
57
+ void submit();
58
+ }
59
+ };
60
+ const onPaste = (e) => {
61
+ if (!allowAttachments) return;
62
+ const pasted = Array.from(e.clipboardData?.files ?? []);
63
+ if (pasted.length === 0) return;
64
+ e.preventDefault();
65
+ addFiles(pasted);
66
+ };
67
+ const hasFiles = (e) => Array.from(e.dataTransfer?.types ?? []).includes("Files");
68
+ const dropHandlers = allowAttachments ? {
69
+ onDragOver: (e) => {
70
+ if (!hasFiles(e) || disabled) return;
71
+ e.preventDefault();
72
+ setDragging(true);
73
+ },
74
+ onDragLeave: (e) => {
75
+ if (e.currentTarget.contains(e.relatedTarget)) return;
76
+ setDragging(false);
77
+ },
78
+ onDrop: (e) => {
79
+ setDragging(false);
80
+ const dropped = Array.from(e.dataTransfer?.files ?? []);
81
+ if (dropped.length === 0 || disabled) return;
82
+ e.preventDefault();
83
+ addFiles(dropped);
84
+ }
85
+ } : {};
86
+ return /* @__PURE__ */ jsxs(
87
+ "div",
88
+ {
89
+ className: cn(
90
+ "border-t border-border p-3",
91
+ dragging && "bg-muted/60 outline-dashed outline-2 -outline-offset-4 outline-primary"
92
+ ),
93
+ "data-testid": "arbi-dm-composer",
94
+ ...dropHandlers,
95
+ children: [
96
+ children,
97
+ files.length > 0 && /* @__PURE__ */ jsx("ul", { className: "mb-2 flex flex-wrap gap-2", "aria-label": "Attached files", children: files.map((f, index) => /* @__PURE__ */ jsxs(
98
+ "li",
99
+ {
100
+ "data-testid": "arbi-dm-attachment-chip",
101
+ className: "flex max-w-full items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-2.5 py-1.5 text-xs",
102
+ children: [
103
+ /* @__PURE__ */ jsx(Paperclip, { className: "size-3 shrink-0", "aria-hidden": "true" }),
104
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: f.name }),
105
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", children: formatFileSize(f.size) }),
106
+ /* @__PURE__ */ jsx(
107
+ "button",
108
+ {
109
+ type: "button",
110
+ disabled: busy,
111
+ "aria-label": `Remove ${f.name}`,
112
+ onClick: () => removeFile(index),
113
+ className: "shrink-0 rounded focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
114
+ children: /* @__PURE__ */ jsx(X, { className: "size-3" })
115
+ }
116
+ )
117
+ ]
118
+ },
119
+ `${f.name}-${index}`
120
+ )) }),
121
+ /* @__PURE__ */ jsxs("div", { className: "flex items-end gap-2", children: [
122
+ allowAttachments && /* @__PURE__ */ jsxs(Fragment, { children: [
123
+ /* @__PURE__ */ jsx(
124
+ Button,
125
+ {
126
+ type: "button",
127
+ variant: "ghost",
128
+ size: "icon",
129
+ disabled: disabled || busy,
130
+ onClick: () => fileInputRef.current?.click(),
131
+ "aria-label": "Attach files",
132
+ title: "Attach files (or paste / drop them here)",
133
+ "data-testid": "arbi-dm-attach",
134
+ className: "min-h-[44px] shrink-0",
135
+ children: /* @__PURE__ */ jsx(Paperclip, { className: "size-4" })
136
+ }
137
+ ),
138
+ /* @__PURE__ */ jsx(
139
+ "input",
140
+ {
141
+ ref: fileInputRef,
142
+ type: "file",
143
+ multiple: true,
144
+ hidden: true,
145
+ "data-testid": "arbi-dm-file-input",
146
+ onChange: (e) => {
147
+ addFiles(Array.from(e.target.files ?? []));
148
+ e.target.value = "";
149
+ }
150
+ }
151
+ )
152
+ ] }),
153
+ /* @__PURE__ */ jsx(
154
+ Textarea,
155
+ {
156
+ ref: inputRef,
157
+ value: draft,
158
+ onChange: (e) => setDraft(e.target.value),
159
+ onKeyDown,
160
+ onPaste,
161
+ placeholder,
162
+ rows: 1,
163
+ disabled,
164
+ className: "max-h-40 min-h-[44px] resize-none",
165
+ "data-testid": "arbi-dm-input"
166
+ }
167
+ ),
168
+ /* @__PURE__ */ jsxs(
169
+ Button,
170
+ {
171
+ type: "button",
172
+ onClick: () => void submit(),
173
+ disabled: disabled || busy || !draft.trim() && files.length === 0,
174
+ className: cn(classNames?.sendButton),
175
+ "data-testid": "arbi-dm-send",
176
+ "aria-label": "Send message",
177
+ children: [
178
+ busy ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsx(Send, { className: "size-4" }),
179
+ " Send"
180
+ ]
181
+ }
182
+ )
183
+ ] }),
184
+ attachError && /* @__PURE__ */ jsx(
185
+ "p",
186
+ {
187
+ className: "mt-2 text-xs text-destructive",
188
+ role: "alert",
189
+ "data-testid": "arbi-dm-attach-error",
190
+ children: attachError
191
+ }
192
+ ),
193
+ error && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-destructive", "data-testid": "arbi-dm-error", children: error })
194
+ ]
195
+ }
196
+ );
197
+ }
198
+ export {
199
+ DmComposer
200
+ };
201
+ //# sourceMappingURL=DmComposer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/DmComposer.tsx"],
4
+ "sourcesContent": ["/**\n * The message composer: an auto-sizing textarea + send button. Enter sends,\n * Shift+Enter inserts a newline.\n *\n * With `allowAttachments`, files can be added with the paperclip, pasted (an\n * image copied to the clipboard) or dropped onto the composer. They show as\n * removable chips and are handed to `onSend` alongside the text; the host\n * encrypts and uploads them. The DM limits (10 files, 15 MB each) are checked\n * here so an oversized file is refused before any work starts.\n */\n\nimport { useRef, useState } from 'react'\nimport { Loader2, Paperclip, Send, X } from 'lucide-react'\nimport { chats, formatFileSize } from '@arbidocs/sdk/browser'\nimport { Button } from '../ui/button'\nimport { Textarea } from '../ui/textarea'\nimport { cn } from '../lib/utils'\nimport type { DmClassNames } from './types'\n\nexport interface DmComposerProps {\n /** Placeholder, e.g. \"Message Eleanor\u2026\". */\n placeholder?: string\n disabled?: boolean\n /**\n * A send is in flight: swaps the icon for a spinner and blocks a second\n * submit, so a slow encrypt-and-post can't be fired twice by an impatient\n * Enter.\n */\n busy?: boolean\n /**\n * Called with the trimmed text and any attached files when the user sends.\n * The text may be empty when files are attached. May reject if the send\n * fails, in which case the text and files are given back.\n */\n onSend: (text: string, files: File[]) => void | Promise<void>\n /** Offer attaching files (button, paste, drag-and-drop). Off by default. */\n allowAttachments?: boolean\n /** Shown under the box when the last send failed. */\n error?: string | null\n /** Extra content between the box and the border (e.g. a peer-specific action). */\n children?: React.ReactNode\n classNames?: Pick<DmClassNames, 'sendButton'>\n}\n\nexport function DmComposer({\n placeholder,\n disabled,\n busy,\n onSend,\n allowAttachments,\n error,\n children,\n classNames,\n}: DmComposerProps) {\n const [draft, setDraft] = useState('')\n const [files, setFiles] = useState<File[]>([])\n const [attachError, setAttachError] = useState<string | null>(null)\n const [dragging, setDragging] = useState(false)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const addFiles = (added: File[]) => {\n if (!allowAttachments || added.length === 0) return\n const next = [...files, ...added]\n try {\n chats.checkChatAttachmentLimits(next)\n setFiles(next)\n setAttachError(null)\n } catch (err) {\n setAttachError(err instanceof Error ? err.message : 'Could not attach the file')\n }\n }\n\n const removeFile = (index: number) => {\n setFiles((current) => current.filter((_, i) => i !== index))\n setAttachError(null)\n }\n\n const submit = async () => {\n const text = draft.trim()\n if ((!text && files.length === 0) || disabled || busy) return\n const sending = files\n setDraft('')\n setFiles([])\n setAttachError(null)\n try {\n await onSend(text, sending)\n // Keep the caret in the box so a reply can follow straight on.\n inputRef.current?.focus()\n } catch {\n // The send failed (the error surfaces via `error`) \u2014 give the text and\n // files back rather than losing what the user wrote.\n setDraft(text)\n setFiles(sending)\n }\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n void submit()\n }\n }\n\n const onPaste = (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!allowAttachments) return\n const pasted = Array.from(e.clipboardData?.files ?? [])\n if (pasted.length === 0) return\n e.preventDefault()\n addFiles(pasted)\n }\n\n const hasFiles = (e: React.DragEvent) => Array.from(e.dataTransfer?.types ?? []).includes('Files')\n\n const dropHandlers = allowAttachments\n ? {\n onDragOver: (e: React.DragEvent) => {\n if (!hasFiles(e) || disabled) return\n e.preventDefault()\n setDragging(true)\n },\n onDragLeave: (e: React.DragEvent) => {\n if (e.currentTarget.contains(e.relatedTarget as Node | null)) return\n setDragging(false)\n },\n onDrop: (e: React.DragEvent) => {\n setDragging(false)\n const dropped = Array.from(e.dataTransfer?.files ?? [])\n if (dropped.length === 0 || disabled) return\n e.preventDefault()\n addFiles(dropped)\n },\n }\n : {}\n\n return (\n <div\n className={cn(\n 'border-t border-border p-3',\n dragging && 'bg-muted/60 outline-dashed outline-2 -outline-offset-4 outline-primary'\n )}\n data-testid=\"arbi-dm-composer\"\n {...dropHandlers}\n >\n {children}\n {files.length > 0 && (\n <ul className=\"mb-2 flex flex-wrap gap-2\" aria-label=\"Attached files\">\n {files.map((f, index) => (\n <li\n key={`${f.name}-${index}`}\n data-testid=\"arbi-dm-attachment-chip\"\n className=\"flex max-w-full items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-2.5 py-1.5 text-xs\"\n >\n <Paperclip className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n <span className=\"truncate\">{f.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatFileSize(f.size)}</span>\n <button\n type=\"button\"\n disabled={busy}\n aria-label={`Remove ${f.name}`}\n onClick={() => removeFile(index)}\n className=\"shrink-0 rounded focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <X className=\"size-3\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n <div className=\"flex items-end gap-2\">\n {allowAttachments && (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled || busy}\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach files\"\n title=\"Attach files (or paste / drop them here)\"\n data-testid=\"arbi-dm-attach\"\n className=\"min-h-[44px] shrink-0\"\n >\n <Paperclip className=\"size-4\" />\n </Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n data-testid=\"arbi-dm-file-input\"\n onChange={(e) => {\n addFiles(Array.from(e.target.files ?? []))\n // Let the same file be picked again after it was removed.\n e.target.value = ''\n }}\n />\n </>\n )}\n <Textarea\n ref={inputRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n placeholder={placeholder}\n rows={1}\n disabled={disabled}\n className=\"max-h-40 min-h-[44px] resize-none\"\n data-testid=\"arbi-dm-input\"\n />\n <Button\n type=\"button\"\n onClick={() => void submit()}\n disabled={disabled || busy || (!draft.trim() && files.length === 0)}\n className={cn(classNames?.sendButton)}\n data-testid=\"arbi-dm-send\"\n aria-label=\"Send message\"\n >\n {busy ? <Loader2 className=\"size-4 animate-spin\" /> : <Send className=\"size-4\" />} Send\n </Button>\n </div>\n {attachError && (\n <p\n className=\"mt-2 text-xs text-destructive\"\n role=\"alert\"\n data-testid=\"arbi-dm-attach-error\"\n >\n {attachError}\n </p>\n )}\n {error && (\n <p className=\"mt-2 text-xs text-destructive\" data-testid=\"arbi-dm-error\">\n {error}\n </p>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ import { useQueryClient } from "@tanstack/react-query";
2
+ import { useArbi } from "../useArbi.js";
3
+ import { arbiQueryKeys } from "../query-keys.js";
4
+ import { useArbiWsMessage } from "../websocket/hooks.js";
5
+ import { cachedChat, getOpenChat, myChatId } from "./chat-cache.js";
6
+ function useChatArrivals(onArrival) {
7
+ const arbi = useArbi();
8
+ const queryClient = useQueryClient();
9
+ useArbiWsMessage("chat.message", (message) => {
10
+ const senderId = message.message.sender_ext_id;
11
+ if (!senderId || senderId === myChatId(arbi)) return;
12
+ if (message.message.kind !== "text" || getOpenChat() === message.chat_ext_id) return;
13
+ const muted = queryClient.getQueriesData({ queryKey: arbiQueryKeys.userSettings() }).map(([, data]) => data).find(Boolean)?.muted_users;
14
+ if (muted?.includes(senderId)) return;
15
+ const chat = cachedChat(queryClient, message.chat_ext_id);
16
+ const sender = chat?.members.find((m) => m.user.external_id === senderId)?.user;
17
+ onArrival({
18
+ chatId: message.chat_ext_id,
19
+ chat,
20
+ sender,
21
+ senderId,
22
+ replyTo: chat?.kind === "direct" ? senderId : message.chat_ext_id
23
+ });
24
+ });
25
+ }
26
+ export {
27
+ useChatArrivals
28
+ };
29
+ //# sourceMappingURL=arrivals.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/arrivals.ts"],
4
+ "sourcesContent": ["/**\n * Someone else's message arriving in one of my chats that is not open: what a host announces (a\n * toast pointing at the thread). Text messages only, never from a person I muted; no preview (the\n * text is end-to-end encrypted, the announcement stays a pointer). The chat cache itself follows\n * by itself (`<ArbiWebSocketProvider>` applies the event first).\n */\n\nimport { useQueryClient } from '@tanstack/react-query'\nimport type { WsChatMessageMessage } from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../query-keys'\nimport { useArbiWsMessage } from '../websocket/hooks'\nimport { cachedChat, getOpenChat, myChatId, type ChatResponse } from './chat-cache'\n\n/** A chat message to announce. */\nexport interface ChatArrival {\n chatId: string\n chat: ChatResponse | undefined\n /** The sender, when the chat list knows them. */\n sender: ChatResponse['members'][number]['user'] | undefined\n senderId: string\n /** Where \"Reply\" goes: the person for a direct chat, the chat otherwise. */\n replyTo: string\n}\n\n/** Call `onArrival` for each chat message to announce (see the module comment). */\nexport function useChatArrivals(onArrival: (arrival: ChatArrival) => void): void {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n useArbiWsMessage<WsChatMessageMessage>('chat.message', (message) => {\n const senderId = message.message.sender_ext_id\n if (!senderId || senderId === myChatId(arbi)) return\n if (message.message.kind !== 'text' || getOpenChat() === message.chat_ext_id) return\n const muted = queryClient\n .getQueriesData<{ muted_users?: string[] }>({ queryKey: arbiQueryKeys.userSettings() })\n .map(([, data]) => data)\n .find(Boolean)?.muted_users\n if (muted?.includes(senderId)) return\n const chat = cachedChat(queryClient, message.chat_ext_id)\n const sender = chat?.members.find((m) => m.user.external_id === senderId)?.user\n onArrival({\n chatId: message.chat_ext_id,\n chat,\n sender,\n senderId,\n replyTo: chat?.kind === 'direct' ? senderId : message.chat_ext_id,\n })\n })\n}\n"],
5
+ "mappings": "AAOA,SAAS,sBAAsB;AAE/B,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AACjC,SAAS,YAAY,aAAa,gBAAmC;AAc9D,SAAS,gBAAgB,WAAiD;AAC/E,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAc,eAAe;AACnC,mBAAuC,gBAAgB,CAAC,YAAY;AAClE,UAAM,WAAW,QAAQ,QAAQ;AACjC,QAAI,CAAC,YAAY,aAAa,SAAS,IAAI,EAAG;AAC9C,QAAI,QAAQ,QAAQ,SAAS,UAAU,YAAY,MAAM,QAAQ,YAAa;AAC9E,UAAM,QAAQ,YACX,eAA2C,EAAE,UAAU,cAAc,aAAa,EAAE,CAAC,EACrF,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI,EACtB,KAAK,OAAO,GAAG;AAClB,QAAI,OAAO,SAAS,QAAQ,EAAG;AAC/B,UAAM,OAAO,WAAW,aAAa,QAAQ,WAAW;AACxD,UAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,gBAAgB,QAAQ,GAAG;AAC3E,cAAU;AAAA,MACR,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,MAAM,SAAS,WAAW,WAAW,QAAQ;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,192 @@
1
+ import { chats } from "@arbidocs/sdk/browser";
2
+ import { arbiQueryKeys } from "../hooks.js";
3
+ function myChatId(arbi) {
4
+ try {
5
+ return arbi.user.identity()?.externalId ?? null;
6
+ } catch {
7
+ return null;
8
+ }
9
+ }
10
+ let openChatExtId = null;
11
+ function setOpenChat(chatExtId) {
12
+ openChatExtId = chatExtId;
13
+ }
14
+ function getOpenChat() {
15
+ return openChatExtId;
16
+ }
17
+ function byActivity(a, b) {
18
+ const at = Date.parse(a.last_message_at ?? a.created_at);
19
+ const bt = Date.parse(b.last_message_at ?? b.created_at);
20
+ return bt - at;
21
+ }
22
+ function cachedChats(queryClient) {
23
+ return queryClient.getQueryData(arbiQueryKeys.chatList()) ?? [];
24
+ }
25
+ function cachedChat(queryClient, chatExtId) {
26
+ return cachedChats(queryClient).find((c) => c.external_id === chatExtId);
27
+ }
28
+ function upsertChat(queryClient, chat) {
29
+ queryClient.setQueryData(arbiQueryKeys.chatList(), (old) => {
30
+ if (!old) return old;
31
+ const rest = old.filter((c) => c.external_id !== chat.external_id);
32
+ return [chat, ...rest].sort(byActivity);
33
+ });
34
+ }
35
+ function removeChat(queryClient, chatExtId) {
36
+ queryClient.setQueryData(
37
+ arbiQueryKeys.chatList(),
38
+ (old) => old?.filter((c) => c.external_id !== chatExtId)
39
+ );
40
+ queryClient.removeQueries({ queryKey: arbiQueryKeys.chatThread(chatExtId) });
41
+ }
42
+ function appendToThread(queryClient, chatExtId, message, replaceOptimisticId) {
43
+ queryClient.setQueryData(arbiQueryKeys.chatThread(chatExtId), (old) => {
44
+ if (!old) return old;
45
+ const without = old.messages.filter(
46
+ (m) => m.external_id !== message.external_id && m.external_id !== replaceOptimisticId
47
+ );
48
+ return { ...old, messages: [...without, message] };
49
+ });
50
+ }
51
+ function dropFromThread(queryClient, chatExtId, messageExtId) {
52
+ queryClient.setQueryData(
53
+ arbiQueryKeys.chatThread(chatExtId),
54
+ (old) => old ? { ...old, messages: old.messages.filter((m) => m.external_id !== messageExtId) } : old
55
+ );
56
+ }
57
+ function replaceInThread(queryClient, chatExtId, message) {
58
+ queryClient.setQueryData(arbiQueryKeys.chatThread(chatExtId), (old) => {
59
+ if (!old || !old.messages.some((m) => m.external_id === message.external_id)) return old;
60
+ return {
61
+ ...old,
62
+ messages: old.messages.map((m) => m.external_id === message.external_id ? message : m)
63
+ };
64
+ });
65
+ }
66
+ function patchLastMessage(queryClient, chatExtId, message) {
67
+ queryClient.setQueryData(
68
+ arbiQueryKeys.chatList(),
69
+ (old) => old?.map(
70
+ (c) => c.external_id === chatExtId && c.last_message?.external_id === message.external_id ? { ...c, last_message: message } : c
71
+ )
72
+ );
73
+ }
74
+ async function deleteChatMessage(arbi, queryClient, chatExtId, messageExtId) {
75
+ const thread = queryClient.getQueryData(arbiQueryKeys.chatThread(chatExtId));
76
+ const before = thread?.messages.find((m) => m.external_id === messageExtId);
77
+ const listed = cachedChat(queryClient, chatExtId);
78
+ const wasLast = listed?.last_message?.external_id === messageExtId ? listed.last_message : null;
79
+ if (before) replaceInThread(queryClient, chatExtId, chats.chatMessageTombstone(before));
80
+ if (wasLast) patchLastMessage(queryClient, chatExtId, chats.chatMessageTombstone(wasLast));
81
+ try {
82
+ await arbi.chats.deleteMessage(chatExtId, messageExtId);
83
+ } catch (err) {
84
+ if (before) replaceInThread(queryClient, chatExtId, before);
85
+ if (wasLast) patchLastMessage(queryClient, chatExtId, wasLast);
86
+ throw err;
87
+ }
88
+ }
89
+ async function applyChangedMessage(arbi, queryClient, chatExtId, message) {
90
+ if (message.deleted) {
91
+ replaceInThread(queryClient, chatExtId, chats.chatMessageTombstone(message));
92
+ patchLastMessage(queryClient, chatExtId, chats.chatMessageTombstone(message));
93
+ return;
94
+ }
95
+ const chat = cachedChat(queryClient, chatExtId);
96
+ if (!chat || !queryClient.getQueryData(arbiQueryKeys.chatThread(chatExtId))) return;
97
+ try {
98
+ replaceInThread(queryClient, chatExtId, await arbi.chats.decrypt(chat, message));
99
+ } catch (err) {
100
+ console.error("[chats] could not decrypt a changed message", err);
101
+ }
102
+ }
103
+ async function applyChatMessage(arbi, queryClient, chatExtId, message) {
104
+ if (message.deleted) return applyChangedMessage(arbi, queryClient, chatExtId, message);
105
+ const me = myChatId(arbi);
106
+ const chat = cachedChat(queryClient, chatExtId);
107
+ if (!chat) {
108
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.chatList() });
109
+ return;
110
+ }
111
+ const mine = message.sender_ext_id === me;
112
+ const isOpen = openChatExtId === chatExtId;
113
+ upsertChat(queryClient, {
114
+ ...chat,
115
+ last_message: message,
116
+ last_message_at: message.created_at,
117
+ unread_count: mine ? 0 : isOpen ? chat.unread_count : chat.unread_count + 1,
118
+ members: mine ? chat.members.map(
119
+ (m) => m.user.external_id === me ? { ...m, last_read_at: message.created_at } : m
120
+ ) : chat.members
121
+ });
122
+ if (queryClient.getQueryData(arbiQueryKeys.chatThread(chatExtId))) {
123
+ try {
124
+ appendToThread(queryClient, chatExtId, await arbi.chats.decrypt(chat, message));
125
+ } catch (err) {
126
+ console.error("[chats] could not decrypt a live message", err);
127
+ }
128
+ }
129
+ }
130
+ function applyChatRead(arbi, queryClient, chatExtId, userExtId, lastReadAt) {
131
+ const me = myChatId(arbi);
132
+ queryClient.setQueryData(
133
+ arbiQueryKeys.chatList(),
134
+ (old) => old?.map(
135
+ (c) => c.external_id !== chatExtId ? c : {
136
+ ...c,
137
+ unread_count: userExtId === me ? 0 : c.unread_count,
138
+ members: c.members.map(
139
+ (m) => m.user.external_id === userExtId ? { ...m, last_read_at: lastReadAt } : m
140
+ )
141
+ }
142
+ )
143
+ );
144
+ }
145
+ async function applyChatUpdated(arbi, queryClient, chatExtId, message) {
146
+ if (message) await applyChangedMessage(arbi, queryClient, chatExtId, message);
147
+ let chat;
148
+ try {
149
+ chat = await arbi.chats.get(chatExtId);
150
+ } catch {
151
+ removeChat(queryClient, chatExtId);
152
+ return;
153
+ }
154
+ if (chat.rotation_required) {
155
+ chat = await arbi.chats.ready(chat).catch(() => chat);
156
+ }
157
+ upsertChat(queryClient, chat);
158
+ if (!message)
159
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.chatThread(chatExtId) });
160
+ }
161
+ function applyAgentDmStatus(queryClient, status) {
162
+ if (!["queued", "working", "done", "failed"].includes(status.status)) return;
163
+ queryClient.setQueryData(arbiQueryKeys.agentDmStatus(status.agent_ext_id), status);
164
+ }
165
+ async function applyChatEvent(arbi, queryClient, event) {
166
+ const e = event;
167
+ if (e.type === "chat.message")
168
+ return applyChatMessage(arbi, queryClient, e.chat_ext_id, e.message);
169
+ if (e.type === "chat.read")
170
+ return applyChatRead(arbi, queryClient, e.chat_ext_id, e.user_ext_id, e.last_read_at);
171
+ if (e.type === "chat.updated")
172
+ return applyChatUpdated(arbi, queryClient, e.chat_ext_id, e.message);
173
+ if (e.type === "agent_dm_status") applyAgentDmStatus(queryClient, e);
174
+ }
175
+ export {
176
+ appendToThread,
177
+ applyAgentDmStatus,
178
+ applyChatEvent,
179
+ applyChatMessage,
180
+ applyChatRead,
181
+ applyChatUpdated,
182
+ cachedChat,
183
+ cachedChats,
184
+ deleteChatMessage,
185
+ dropFromThread,
186
+ getOpenChat,
187
+ myChatId,
188
+ removeChat,
189
+ setOpenChat,
190
+ upsertChat
191
+ };
192
+ //# sourceMappingURL=chat-cache.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/chat-cache.ts"],
4
+ "sourcesContent": ["/**\n * The one chat cache: my chat list (`arbiQueryKeys.chatList()`, raw \u2014 titles and last messages\n * stay ciphertext) and each open thread (`arbiQueryKeys.chatThread(id)`, decrypted). Every reader\n * (the messenger, unread badges, the DM kit, a call's chat) and every writer (a send, a delete,\n * a WebSocket event) goes through here, so one change shows everywhere at once.\n *\n * Live events: `<ArbiWebSocketProvider>` applies them itself; a host with its own socket passes each\n * chat event to `applyChatEvent`.\n */\n\nimport type { QueryClient } from '@tanstack/react-query'\nimport type { WsAgentDmStatusMessage } from '@arbidocs/client'\nimport { chats, type Arbi } from '@arbidocs/sdk/browser'\nimport { arbiQueryKeys } from '../hooks'\n\nexport type ChatResponse = chats.ChatResponse\nexport type ChatMessageResponse = chats.ChatMessageResponse\nexport type DecryptedChatMessage = chats.DecryptedChatMessage\nexport type ChatAttachmentFile = chats.ChatAttachmentFile\nexport type ChatMemberKey = chats.ChatMemberKey\n\n/** A message in an open thread; an optimistic row carries a local id until the server echoes it. */\nexport type ChatThreadMessage = DecryptedChatMessage & { optimistic?: boolean }\n\n/** An open thread's cache entry: decrypted messages, oldest first. */\nexport interface ChatThreadData {\n messages: ChatThreadMessage[]\n /** False once the oldest page has been loaded. */\n hasMore: boolean\n}\n\n/** The signed-in user's external id, or null when signed out. */\nexport function myChatId(arbi: Arbi): string | null {\n try {\n return arbi.user.identity()?.externalId ?? null\n } catch {\n return null\n }\n}\n\n// \u2500\u2500 The chat open in a messenger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** The chat open in a messenger, if any: its new messages do not count as unread. */\nlet openChatExtId: string | null = null\nexport function setOpenChat(chatExtId: string | null): void {\n openChatExtId = chatExtId\n}\nexport function getOpenChat(): string | null {\n return openChatExtId\n}\n\n// \u2500\u2500 Writers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction byActivity(a: ChatResponse, b: ChatResponse): number {\n const at = Date.parse(a.last_message_at ?? a.created_at)\n const bt = Date.parse(b.last_message_at ?? b.created_at)\n return bt - at\n}\n\n/** My chats as the cache holds them (empty until the list has loaded). */\nexport function cachedChats(queryClient: QueryClient): ChatResponse[] {\n return queryClient.getQueryData<ChatResponse[]>(arbiQueryKeys.chatList()) ?? []\n}\n\n/** One of my chats from the cache, if the list has it. */\nexport function cachedChat(queryClient: QueryClient, chatExtId: string): ChatResponse | undefined {\n return cachedChats(queryClient).find((c) => c.external_id === chatExtId)\n}\n\n/** Put a chat (new or updated) into the list, keeping the list newest first. */\nexport function upsertChat(queryClient: QueryClient, chat: ChatResponse): void {\n queryClient.setQueryData<ChatResponse[]>(arbiQueryKeys.chatList(), (old) => {\n if (!old) return old\n const rest = old.filter((c) => c.external_id !== chat.external_id)\n return [chat, ...rest].sort(byActivity)\n })\n}\n\n/** Drop a chat I left or lost, with its thread. */\nexport function removeChat(queryClient: QueryClient, chatExtId: string): void {\n queryClient.setQueryData<ChatResponse[]>(arbiQueryKeys.chatList(), (old) =>\n old?.filter((c) => c.external_id !== chatExtId)\n )\n queryClient.removeQueries({ queryKey: arbiQueryKeys.chatThread(chatExtId) })\n}\n\n/** Append a message to a loaded thread (deduplicated, replacing its optimistic copy). */\nexport function appendToThread(\n queryClient: QueryClient,\n chatExtId: string,\n message: ChatThreadMessage,\n replaceOptimisticId?: string\n): void {\n queryClient.setQueryData<ChatThreadData>(arbiQueryKeys.chatThread(chatExtId), (old) => {\n if (!old) return old\n const without = old.messages.filter(\n (m) => m.external_id !== message.external_id && m.external_id !== replaceOptimisticId\n )\n return { ...old, messages: [...without, message] }\n })\n}\n\n/** Take a message out of a loaded thread (a failed optimistic send). */\nexport function dropFromThread(queryClient: QueryClient, chatExtId: string, messageExtId: string) {\n queryClient.setQueryData<ChatThreadData>(arbiQueryKeys.chatThread(chatExtId), (old) =>\n old ? { ...old, messages: old.messages.filter((m) => m.external_id !== messageExtId) } : old\n )\n}\n\n/** Replace a message of a loaded thread where it stands (no-op when it is not loaded). */\nfunction replaceInThread(\n queryClient: QueryClient,\n chatExtId: string,\n message: ChatThreadMessage\n): void {\n queryClient.setQueryData<ChatThreadData>(arbiQueryKeys.chatThread(chatExtId), (old) => {\n if (!old || !old.messages.some((m) => m.external_id === message.external_id)) return old\n return {\n ...old,\n messages: old.messages.map((m) => (m.external_id === message.external_id ? message : m)),\n }\n })\n}\n\n/** Swap a chat's `last_message` in the list when it is still `message`. */\nfunction patchLastMessage(\n queryClient: QueryClient,\n chatExtId: string,\n message: ChatMessageResponse\n): void {\n queryClient.setQueryData<ChatResponse[]>(arbiQueryKeys.chatList(), (old) =>\n old?.map((c) =>\n c.external_id === chatExtId && c.last_message?.external_id === message.external_id\n ? { ...c, last_message: message }\n : c\n )\n )\n}\n\n/**\n * Delete one of my messages. The server keeps it in place as a tombstone (`deleted: true`), so\n * the cache marks it the same way at once \u2014 a refetch then returns exactly what is shown. Rolled\n * back (and rethrown) when the delete fails.\n */\nexport async function deleteChatMessage(\n arbi: Arbi,\n queryClient: QueryClient,\n chatExtId: string,\n messageExtId: string\n): Promise<void> {\n const thread = queryClient.getQueryData<ChatThreadData>(arbiQueryKeys.chatThread(chatExtId))\n const before = thread?.messages.find((m) => m.external_id === messageExtId)\n const listed = cachedChat(queryClient, chatExtId)\n const wasLast = listed?.last_message?.external_id === messageExtId ? listed.last_message : null\n if (before) replaceInThread(queryClient, chatExtId, chats.chatMessageTombstone(before))\n if (wasLast) patchLastMessage(queryClient, chatExtId, chats.chatMessageTombstone(wasLast))\n try {\n await arbi.chats.deleteMessage(chatExtId, messageExtId)\n } catch (err) {\n if (before) replaceInThread(queryClient, chatExtId, before)\n if (wasLast) patchLastMessage(queryClient, chatExtId, wasLast)\n throw err\n }\n}\n\n// \u2500\u2500 Live events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A message changed in place (a deleted message's tombstone): update it where it stands. */\nasync function applyChangedMessage(\n arbi: Arbi,\n queryClient: QueryClient,\n chatExtId: string,\n message: ChatMessageResponse\n): Promise<void> {\n if (message.deleted) {\n replaceInThread(queryClient, chatExtId, chats.chatMessageTombstone(message))\n patchLastMessage(queryClient, chatExtId, chats.chatMessageTombstone(message))\n return\n }\n const chat = cachedChat(queryClient, chatExtId)\n if (!chat || !queryClient.getQueryData(arbiQueryKeys.chatThread(chatExtId))) return\n try {\n replaceInThread(queryClient, chatExtId, await arbi.chats.decrypt(chat, message))\n } catch (err) {\n console.error('[chats] could not decrypt a changed message', err)\n }\n}\n\n/** `chat.message`: a new message in one of my chats. */\nexport async function applyChatMessage(\n arbi: Arbi,\n queryClient: QueryClient,\n chatExtId: string,\n message: ChatMessageResponse\n): Promise<void> {\n // Not new: a tombstone replaces the message where it stands (never unread, never the preview).\n if (message.deleted) return applyChangedMessage(arbi, queryClient, chatExtId, message)\n const me = myChatId(arbi)\n const chat = cachedChat(queryClient, chatExtId)\n if (!chat) {\n // A chat I was just added to: fetch the list fresh.\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.chatList() })\n return\n }\n const mine = message.sender_ext_id === me\n const isOpen = openChatExtId === chatExtId\n upsertChat(queryClient, {\n ...chat,\n last_message: message,\n last_message_at: message.created_at,\n unread_count: mine ? 0 : isOpen ? chat.unread_count : chat.unread_count + 1,\n members: mine\n ? chat.members.map((m) =>\n m.user.external_id === me ? { ...m, last_read_at: message.created_at } : m\n )\n : chat.members,\n })\n if (queryClient.getQueryData(arbiQueryKeys.chatThread(chatExtId))) {\n try {\n appendToThread(queryClient, chatExtId, await arbi.chats.decrypt(chat, message))\n } catch (err) {\n console.error('[chats] could not decrypt a live message', err)\n }\n }\n}\n\n/** `chat.read`: a member's watermark moved (a read receipt). */\nexport function applyChatRead(\n arbi: Arbi,\n queryClient: QueryClient,\n chatExtId: string,\n userExtId: string,\n lastReadAt: string\n): void {\n const me = myChatId(arbi)\n queryClient.setQueryData<ChatResponse[]>(arbiQueryKeys.chatList(), (old) =>\n old?.map((c) =>\n c.external_id !== chatExtId\n ? c\n : {\n ...c,\n unread_count: userExtId === me ? 0 : c.unread_count,\n members: c.members.map((m) =>\n m.user.external_id === userExtId ? { ...m, last_read_at: lastReadAt } : m\n ),\n }\n )\n )\n}\n\n/**\n * `chat.updated`: members, keys, title or a deleted message changed. Refetch the chat; when it now\n * needs a new epoch and I am still in it, seal one. A changed `message` (a deleted message's\n * tombstone) is applied in place; without one the open thread is reloaded.\n */\nexport async function applyChatUpdated(\n arbi: Arbi,\n queryClient: QueryClient,\n chatExtId: string,\n message?: ChatMessageResponse | null\n): Promise<void> {\n if (message) await applyChangedMessage(arbi, queryClient, chatExtId, message)\n let chat: ChatResponse\n try {\n chat = await arbi.chats.get(chatExtId)\n } catch {\n // Removed from it (or it is gone).\n removeChat(queryClient, chatExtId)\n return\n }\n if (chat.rotation_required) {\n // Best effort: whoever posts next rotates first.\n chat = await arbi.chats.ready(chat).catch(() => chat)\n }\n upsertChat(queryClient, chat)\n // Members, keys or a new epoch: reload the open thread. A changed message is already in place.\n if (!message)\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.chatThread(chatExtId) })\n}\n\n/** My own agent's progress on a message I sent it (`agent_dm_status`). */\nexport type AgentDmStatus = WsAgentDmStatusMessage\n\n/** `agent_dm_status`: remember my agent's latest progress (read by `useAgentDmStatus`). */\nexport function applyAgentDmStatus(queryClient: QueryClient, status: AgentDmStatus): void {\n if (!['queued', 'working', 'done', 'failed'].includes(status.status)) return\n queryClient.setQueryData(arbiQueryKeys.agentDmStatus(status.agent_ext_id), status)\n}\n\n/** The chat events of the server's WebSocket, as `applyChatEvent` takes them. */\nexport type ChatEvent =\n | { type: 'chat.message'; chat_ext_id: string; message: ChatMessageResponse }\n | { type: 'chat.read'; chat_ext_id: string; user_ext_id: string; last_read_at: string }\n | { type: 'chat.updated'; chat_ext_id: string; message?: ChatMessageResponse | null }\n | AgentDmStatus\n\n/** Apply one chat event of the server's WebSocket to the cache. Other messages are ignored. */\nexport async function applyChatEvent(\n arbi: Arbi,\n queryClient: QueryClient,\n event: { type: string }\n): Promise<void> {\n const e = event as ChatEvent\n if (e.type === 'chat.message')\n return applyChatMessage(arbi, queryClient, e.chat_ext_id, e.message)\n if (e.type === 'chat.read')\n return applyChatRead(arbi, queryClient, e.chat_ext_id, e.user_ext_id, e.last_read_at)\n if (e.type === 'chat.updated')\n return applyChatUpdated(arbi, queryClient, e.chat_ext_id, e.message)\n if (e.type === 'agent_dm_status') applyAgentDmStatus(queryClient, e)\n}\n"],
5
+ "mappings": "AAYA,SAAS,aAAwB;AACjC,SAAS,qBAAqB;AAmBvB,SAAS,SAAS,MAA2B;AAClD,MAAI;AACF,WAAO,KAAK,KAAK,SAAS,GAAG,cAAc;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,IAAI,gBAA+B;AAC5B,SAAS,YAAY,WAAgC;AAC1D,kBAAgB;AAClB;AACO,SAAS,cAA6B;AAC3C,SAAO;AACT;AAIA,SAAS,WAAW,GAAiB,GAAyB;AAC5D,QAAM,KAAK,KAAK,MAAM,EAAE,mBAAmB,EAAE,UAAU;AACvD,QAAM,KAAK,KAAK,MAAM,EAAE,mBAAmB,EAAE,UAAU;AACvD,SAAO,KAAK;AACd;AAGO,SAAS,YAAY,aAA0C;AACpE,SAAO,YAAY,aAA6B,cAAc,SAAS,CAAC,KAAK,CAAC;AAChF;AAGO,SAAS,WAAW,aAA0B,WAA6C;AAChG,SAAO,YAAY,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,SAAS;AACzE;AAGO,SAAS,WAAW,aAA0B,MAA0B;AAC7E,cAAY,aAA6B,cAAc,SAAS,GAAG,CAAC,QAAQ;AAC1E,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,gBAAgB,KAAK,WAAW;AACjE,WAAO,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,UAAU;AAAA,EACxC,CAAC;AACH;AAGO,SAAS,WAAW,aAA0B,WAAyB;AAC5E,cAAY;AAAA,IAA6B,cAAc,SAAS;AAAA,IAAG,CAAC,QAClE,KAAK,OAAO,CAAC,MAAM,EAAE,gBAAgB,SAAS;AAAA,EAChD;AACA,cAAY,cAAc,EAAE,UAAU,cAAc,WAAW,SAAS,EAAE,CAAC;AAC7E;AAGO,SAAS,eACd,aACA,WACA,SACA,qBACM;AACN,cAAY,aAA6B,cAAc,WAAW,SAAS,GAAG,CAAC,QAAQ;AACrF,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,UAAU,IAAI,SAAS;AAAA,MAC3B,CAAC,MAAM,EAAE,gBAAgB,QAAQ,eAAe,EAAE,gBAAgB;AAAA,IACpE;AACA,WAAO,EAAE,GAAG,KAAK,UAAU,CAAC,GAAG,SAAS,OAAO,EAAE;AAAA,EACnD,CAAC;AACH;AAGO,SAAS,eAAe,aAA0B,WAAmB,cAAsB;AAChG,cAAY;AAAA,IAA6B,cAAc,WAAW,SAAS;AAAA,IAAG,CAAC,QAC7E,MAAM,EAAE,GAAG,KAAK,UAAU,IAAI,SAAS,OAAO,CAAC,MAAM,EAAE,gBAAgB,YAAY,EAAE,IAAI;AAAA,EAC3F;AACF;AAGA,SAAS,gBACP,aACA,WACA,SACM;AACN,cAAY,aAA6B,cAAc,WAAW,SAAS,GAAG,CAAC,QAAQ;AACrF,QAAI,CAAC,OAAO,CAAC,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,gBAAgB,QAAQ,WAAW,EAAG,QAAO;AACrF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,IAAI,SAAS,IAAI,CAAC,MAAO,EAAE,gBAAgB,QAAQ,cAAc,UAAU,CAAE;AAAA,IACzF;AAAA,EACF,CAAC;AACH;AAGA,SAAS,iBACP,aACA,WACA,SACM;AACN,cAAY;AAAA,IAA6B,cAAc,SAAS;AAAA,IAAG,CAAC,QAClE,KAAK;AAAA,MAAI,CAAC,MACR,EAAE,gBAAgB,aAAa,EAAE,cAAc,gBAAgB,QAAQ,cACnE,EAAE,GAAG,GAAG,cAAc,QAAQ,IAC9B;AAAA,IACN;AAAA,EACF;AACF;AAOA,eAAsB,kBACpB,MACA,aACA,WACA,cACe;AACf,QAAM,SAAS,YAAY,aAA6B,cAAc,WAAW,SAAS,CAAC;AAC3F,QAAM,SAAS,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,gBAAgB,YAAY;AAC1E,QAAM,SAAS,WAAW,aAAa,SAAS;AAChD,QAAM,UAAU,QAAQ,cAAc,gBAAgB,eAAe,OAAO,eAAe;AAC3F,MAAI,OAAQ,iBAAgB,aAAa,WAAW,MAAM,qBAAqB,MAAM,CAAC;AACtF,MAAI,QAAS,kBAAiB,aAAa,WAAW,MAAM,qBAAqB,OAAO,CAAC;AACzF,MAAI;AACF,UAAM,KAAK,MAAM,cAAc,WAAW,YAAY;AAAA,EACxD,SAAS,KAAK;AACZ,QAAI,OAAQ,iBAAgB,aAAa,WAAW,MAAM;AAC1D,QAAI,QAAS,kBAAiB,aAAa,WAAW,OAAO;AAC7D,UAAM;AAAA,EACR;AACF;AAKA,eAAe,oBACb,MACA,aACA,WACA,SACe;AACf,MAAI,QAAQ,SAAS;AACnB,oBAAgB,aAAa,WAAW,MAAM,qBAAqB,OAAO,CAAC;AAC3E,qBAAiB,aAAa,WAAW,MAAM,qBAAqB,OAAO,CAAC;AAC5E;AAAA,EACF;AACA,QAAM,OAAO,WAAW,aAAa,SAAS;AAC9C,MAAI,CAAC,QAAQ,CAAC,YAAY,aAAa,cAAc,WAAW,SAAS,CAAC,EAAG;AAC7E,MAAI;AACF,oBAAgB,aAAa,WAAW,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,EACjF,SAAS,KAAK;AACZ,YAAQ,MAAM,+CAA+C,GAAG;AAAA,EAClE;AACF;AAGA,eAAsB,iBACpB,MACA,aACA,WACA,SACe;AAEf,MAAI,QAAQ,QAAS,QAAO,oBAAoB,MAAM,aAAa,WAAW,OAAO;AACrF,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,OAAO,WAAW,aAAa,SAAS;AAC9C,MAAI,CAAC,MAAM;AAET,SAAK,YAAY,kBAAkB,EAAE,UAAU,cAAc,SAAS,EAAE,CAAC;AACzE;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,kBAAkB;AACvC,QAAM,SAAS,kBAAkB;AACjC,aAAW,aAAa;AAAA,IACtB,GAAG;AAAA,IACH,cAAc;AAAA,IACd,iBAAiB,QAAQ;AAAA,IACzB,cAAc,OAAO,IAAI,SAAS,KAAK,eAAe,KAAK,eAAe;AAAA,IAC1E,SAAS,OACL,KAAK,QAAQ;AAAA,MAAI,CAAC,MAChB,EAAE,KAAK,gBAAgB,KAAK,EAAE,GAAG,GAAG,cAAc,QAAQ,WAAW,IAAI;AAAA,IAC3E,IACA,KAAK;AAAA,EACX,CAAC;AACD,MAAI,YAAY,aAAa,cAAc,WAAW,SAAS,CAAC,GAAG;AACjE,QAAI;AACF,qBAAe,aAAa,WAAW,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,IAChF,SAAS,KAAK;AACZ,cAAQ,MAAM,4CAA4C,GAAG;AAAA,IAC/D;AAAA,EACF;AACF;AAGO,SAAS,cACd,MACA,aACA,WACA,WACA,YACM;AACN,QAAM,KAAK,SAAS,IAAI;AACxB,cAAY;AAAA,IAA6B,cAAc,SAAS;AAAA,IAAG,CAAC,QAClE,KAAK;AAAA,MAAI,CAAC,MACR,EAAE,gBAAgB,YACd,IACA;AAAA,QACE,GAAG;AAAA,QACH,cAAc,cAAc,KAAK,IAAI,EAAE;AAAA,QACvC,SAAS,EAAE,QAAQ;AAAA,UAAI,CAAC,MACtB,EAAE,KAAK,gBAAgB,YAAY,EAAE,GAAG,GAAG,cAAc,WAAW,IAAI;AAAA,QAC1E;AAAA,MACF;AAAA,IACN;AAAA,EACF;AACF;AAOA,eAAsB,iBACpB,MACA,aACA,WACA,SACe;AACf,MAAI,QAAS,OAAM,oBAAoB,MAAM,aAAa,WAAW,OAAO;AAC5E,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,KAAK,MAAM,IAAI,SAAS;AAAA,EACvC,QAAQ;AAEN,eAAW,aAAa,SAAS;AACjC;AAAA,EACF;AACA,MAAI,KAAK,mBAAmB;AAE1B,WAAO,MAAM,KAAK,MAAM,MAAM,IAAI,EAAE,MAAM,MAAM,IAAI;AAAA,EACtD;AACA,aAAW,aAAa,IAAI;AAE5B,MAAI,CAAC;AACH,SAAK,YAAY,kBAAkB,EAAE,UAAU,cAAc,WAAW,SAAS,EAAE,CAAC;AACxF;AAMO,SAAS,mBAAmB,aAA0B,QAA6B;AACxF,MAAI,CAAC,CAAC,UAAU,WAAW,QAAQ,QAAQ,EAAE,SAAS,OAAO,MAAM,EAAG;AACtE,cAAY,aAAa,cAAc,cAAc,OAAO,YAAY,GAAG,MAAM;AACnF;AAUA,eAAsB,eACpB,MACA,aACA,OACe;AACf,QAAM,IAAI;AACV,MAAI,EAAE,SAAS;AACb,WAAO,iBAAiB,MAAM,aAAa,EAAE,aAAa,EAAE,OAAO;AACrE,MAAI,EAAE,SAAS;AACb,WAAO,cAAc,MAAM,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY;AACtF,MAAI,EAAE,SAAS;AACb,WAAO,iBAAiB,MAAM,aAAa,EAAE,aAAa,EAAE,OAAO;AACrE,MAAI,EAAE,SAAS,kBAAmB,oBAAmB,aAAa,CAAC;AACrE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ const RUN_WINDOW_MS = 2 * 60 * 1e3;
2
+ function dayKey(iso) {
3
+ const d = new Date(iso);
4
+ if (Number.isNaN(d.getTime())) return iso;
5
+ return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`;
6
+ }
7
+ function annotateThread(messages, accessors, runWindowMs = RUN_WINDOW_MS) {
8
+ const { senderId, createdAt } = accessors;
9
+ return messages.map((message, i) => {
10
+ const next = messages[i + 1];
11
+ const prev = messages[i - 1];
12
+ const day = dayKey(createdAt(message));
13
+ const continuesIntoNext = !!next && senderId(next) === senderId(message) && dayKey(createdAt(next)) === day && Date.parse(createdAt(next)) - Date.parse(createdAt(message)) < runWindowMs;
14
+ return {
15
+ message,
16
+ isLastOfRun: !continuesIntoNext,
17
+ isFirstOfDay: !prev || dayKey(createdAt(prev)) !== day
18
+ };
19
+ });
20
+ }
21
+ export {
22
+ RUN_WINDOW_MS,
23
+ annotateThread,
24
+ dayKey
25
+ };
26
+ //# sourceMappingURL=grouping.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/grouping.ts"],
4
+ "sourcesContent": ["/**\n * Thread grouping: the two annotations a readable message list needs.\n *\n * A run is a burst from one sender close together in time; only its last\n * message carries the meta row (sender, time, receipt), so ten rapid messages\n * read as one block instead of ten stamped rows. A day boundary gets a\n * separator so a thread spanning weeks stays navigable.\n *\n * Generic over the message shape because the two consumers hold different ones \u2014\n * the block's `DmMessage` and the ARBI app's decrypted notification rows \u2014 and\n * duplicating this logic is exactly how they drifted apart before.\n */\n\n/** Two messages belong to the same run when same sender and within this gap. */\nexport const RUN_WINDOW_MS = 2 * 60 * 1000\n\nexport interface ThreadItem<T> {\n message: T\n /** Last of a same-sender run: render the meta row here. */\n isLastOfRun: boolean\n /** First message on its calendar day: render a date separator above it. */\n isFirstOfDay: boolean\n}\n\nexport interface ThreadAccessors<T> {\n senderId: (message: T) => string\n createdAt: (message: T) => string\n}\n\n/**\n * Local calendar day for a timestamp.\n *\n * Deliberately local rather than UTC: a message sent at 23:30 in the reader's\n * zone belongs under that day's separator, not tomorrow's. Falls back to the\n * raw string for an unparseable timestamp so such a message still buckets\n * consistently with itself rather than joining an arbitrary day.\n */\nexport function dayKey(iso: string): string {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`\n}\n\n/** Annotate messages (ascending time order) with run and day boundaries. */\nexport function annotateThread<T>(\n messages: T[],\n accessors: ThreadAccessors<T>,\n runWindowMs: number = RUN_WINDOW_MS\n): ThreadItem<T>[] {\n const { senderId, createdAt } = accessors\n return messages.map((message, i) => {\n const next = messages[i + 1]\n const prev = messages[i - 1]\n const day = dayKey(createdAt(message))\n\n const continuesIntoNext =\n !!next &&\n senderId(next) === senderId(message) &&\n dayKey(createdAt(next)) === day &&\n Date.parse(createdAt(next)) - Date.parse(createdAt(message)) < runWindowMs\n\n return {\n message,\n isLastOfRun: !continuesIntoNext,\n isFirstOfDay: !prev || dayKey(createdAt(prev)) !== day,\n }\n })\n}\n"],
5
+ "mappings": "AAcO,MAAM,gBAAgB,IAAI,KAAK;AAuB/B,SAAS,OAAO,KAAqB;AAC1C,QAAM,IAAI,IAAI,KAAK,GAAG;AACtB,MAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AACtC,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC9D;AAGO,SAAS,eACd,UACA,WACA,cAAsB,eACL;AACjB,QAAM,EAAE,UAAU,UAAU,IAAI;AAChC,SAAO,SAAS,IAAI,CAAC,SAAS,MAAM;AAClC,UAAM,OAAO,SAAS,IAAI,CAAC;AAC3B,UAAM,OAAO,SAAS,IAAI,CAAC;AAC3B,UAAM,MAAM,OAAO,UAAU,OAAO,CAAC;AAErC,UAAM,oBACJ,CAAC,CAAC,QACF,SAAS,IAAI,MAAM,SAAS,OAAO,KACnC,OAAO,UAAU,IAAI,CAAC,MAAM,OAC5B,KAAK,MAAM,UAAU,IAAI,CAAC,IAAI,KAAK,MAAM,UAAU,OAAO,CAAC,IAAI;AAEjE,WAAO;AAAA,MACL;AAAA,MACA,aAAa,CAAC;AAAA,MACd,cAAc,CAAC,QAAQ,OAAO,UAAU,IAAI,CAAC,MAAM;AAAA,IACrD;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,81 @@
1
+ import { ConversationList } from "./ConversationList.js";
2
+ import { DmComposer } from "./DmComposer.js";
3
+ import { DmAvatar } from "./DmAvatar.js";
4
+ import {
5
+ applyAgentDmStatus,
6
+ applyChatEvent,
7
+ applyChatMessage,
8
+ applyChatRead,
9
+ applyChatUpdated,
10
+ appendToThread,
11
+ cachedChat,
12
+ cachedChats,
13
+ getOpenChat,
14
+ myChatId,
15
+ removeChat,
16
+ setOpenChat,
17
+ upsertChat
18
+ } from "./chat-cache.js";
19
+ import {
20
+ useAddChatMembers,
21
+ useAgentDmStatus,
22
+ useChatPost,
23
+ useChats,
24
+ useChatSummaries,
25
+ useChatThread,
26
+ useChatUnreadTotal,
27
+ useCreateGroupChat,
28
+ useDeleteChatMessage,
29
+ useMarkChatRead,
30
+ useRemoveChatMember,
31
+ useRenameChat,
32
+ useUnreadByPeer
33
+ } from "./useChats.js";
34
+ import { useChatArrivals } from "./arrivals.js";
35
+ import { userDisplayName, userInitials, formatRelativeTime } from "./utils.js";
36
+ import { DateSeparator } from "./DateSeparator.js";
37
+ import {
38
+ annotateThread,
39
+ dayKey,
40
+ RUN_WINDOW_MS
41
+ } from "./grouping.js";
42
+ export {
43
+ ConversationList,
44
+ DateSeparator,
45
+ DmAvatar,
46
+ DmComposer,
47
+ RUN_WINDOW_MS,
48
+ annotateThread,
49
+ appendToThread,
50
+ applyAgentDmStatus,
51
+ applyChatEvent,
52
+ applyChatMessage,
53
+ applyChatRead,
54
+ applyChatUpdated,
55
+ cachedChat,
56
+ cachedChats,
57
+ dayKey,
58
+ formatRelativeTime,
59
+ getOpenChat,
60
+ myChatId,
61
+ removeChat,
62
+ setOpenChat,
63
+ upsertChat,
64
+ useAddChatMembers,
65
+ useAgentDmStatus,
66
+ useChatArrivals,
67
+ useChatPost,
68
+ useChatSummaries,
69
+ useChatThread,
70
+ useChatUnreadTotal,
71
+ useChats,
72
+ useCreateGroupChat,
73
+ useDeleteChatMessage,
74
+ useMarkChatRead,
75
+ useRemoveChatMember,
76
+ useRenameChat,
77
+ useUnreadByPeer,
78
+ userDisplayName,
79
+ userInitials
80
+ };
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/index.ts"],
4
+ "sourcesContent": ["/**\n * Direct messages: the one chat cache (direct, group and meeting chats), its hooks, and the\n * presentational parts (conversation rail, composer, avatar). The connected messenger, as a side\n * panel or a messages page, is `ConnectedMessenger` in `@arbidocs/blocks/connect`.\n */\n\nexport { ConversationList, type ConversationListProps } from './ConversationList'\nexport { DmComposer, type DmComposerProps } from './DmComposer'\nexport { DmAvatar, type DmAvatarProps } from './DmAvatar'\n// The one chat cache (direct, group and meeting chats) and its hooks.\nexport {\n applyAgentDmStatus,\n applyChatEvent,\n applyChatMessage,\n applyChatRead,\n applyChatUpdated,\n appendToThread,\n cachedChat,\n cachedChats,\n getOpenChat,\n myChatId,\n removeChat,\n setOpenChat,\n upsertChat,\n type AgentDmStatus,\n type ChatAttachmentFile,\n type ChatEvent,\n type ChatMemberKey,\n type ChatMessageResponse,\n type ChatResponse,\n type ChatThreadData,\n type ChatThreadMessage,\n type DecryptedChatMessage,\n} from './chat-cache'\nexport {\n useAddChatMembers,\n useAgentDmStatus,\n useChatPost,\n useChats,\n useChatSummaries,\n useChatThread,\n useChatUnreadTotal,\n useCreateGroupChat,\n useDeleteChatMessage,\n useMarkChatRead,\n useRemoveChatMember,\n useRenameChat,\n useUnreadByPeer,\n type ChatPost,\n type ChatSummary,\n} from './useChats'\n// Someone else's message arriving in a chat that is not open (a host's toast).\nexport { useChatArrivals, type ChatArrival } from './arrivals'\nexport type { DmConversation, DmMessage, DmUser, DmClassNames } from './types'\nexport { userDisplayName, userInitials, formatRelativeTime } from './utils'\nexport { DateSeparator, type DateSeparatorProps } from './DateSeparator'\nexport {\n annotateThread,\n dayKey,\n RUN_WINDOW_MS,\n type ThreadItem,\n type ThreadAccessors,\n} from './grouping'\n"],
5
+ "mappings": "AAMA,SAAS,wBAAoD;AAC7D,SAAS,kBAAwC;AACjD,SAAS,gBAAoC;AAE7C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAUK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP,SAAS,uBAAyC;AAElD,SAAS,iBAAiB,cAAc,0BAA0B;AAClE,SAAS,qBAA8C;AACvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;",
6
+ "names": []
7
+ }