@arbidocs/react 0.5.111 → 0.5.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (983) 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/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  304. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  305. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  306. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  307. package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
  308. package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  309. package/dist/config/config-hooks.js +209 -0
  310. package/dist/config/config-hooks.js.map +7 -0
  311. package/dist/connectivity.js +72 -0
  312. package/dist/connectivity.js.map +7 -0
  313. package/dist/connectors/hooks.js +263 -0
  314. package/dist/connectors/hooks.js.map +7 -0
  315. package/dist/connectors/index.js +28 -0
  316. package/dist/connectors/index.js.map +7 -0
  317. package/dist/contacts.js +100 -0
  318. package/dist/contacts.js.map +7 -0
  319. package/dist/conversation-list.js +65 -0
  320. package/dist/conversation-list.js.map +7 -0
  321. package/dist/databases.js +195 -0
  322. package/dist/databases.js.map +7 -0
  323. package/dist/datasets/aggregate.js +281 -0
  324. package/dist/datasets/aggregate.js.map +7 -0
  325. package/dist/datasets/index.js +122 -0
  326. package/dist/datasets/index.js.map +7 -0
  327. package/dist/datasets/members.js +27 -0
  328. package/dist/datasets/members.js.map +7 -0
  329. package/dist/datasets/panel.js +44 -0
  330. package/dist/datasets/panel.js.map +7 -0
  331. package/dist/datasets/registry.js +47 -0
  332. package/dist/datasets/registry.js.map +7 -0
  333. package/dist/datasets/rows-source.js +44 -0
  334. package/dist/datasets/rows-source.js.map +7 -0
  335. package/dist/datasets/sources/activity.js +83 -0
  336. package/dist/datasets/sources/activity.js.map +7 -0
  337. package/dist/datasets/sources/conversations.js +74 -0
  338. package/dist/datasets/sources/conversations.js.map +7 -0
  339. package/dist/datasets/sources/database.js +209 -0
  340. package/dist/datasets/sources/database.js.map +7 -0
  341. package/dist/datasets/sources/documents.js +93 -0
  342. package/dist/datasets/sources/documents.js.map +7 -0
  343. package/dist/datasets/sources/facts.js +56 -0
  344. package/dist/datasets/sources/facts.js.map +7 -0
  345. package/dist/datasets/sources/projects.js +117 -0
  346. package/dist/datasets/sources/projects.js.map +7 -0
  347. package/dist/datasets/sources/tags.js +67 -0
  348. package/dist/datasets/sources/tags.js.map +7 -0
  349. package/dist/datasets/sources/usage.js +268 -0
  350. package/dist/datasets/sources/usage.js.map +7 -0
  351. package/dist/datasets/sources/workflows.js +91 -0
  352. package/dist/datasets/sources/workflows.js.map +7 -0
  353. package/dist/datasets/sources/workspaces.js +67 -0
  354. package/dist/datasets/sources/workspaces.js.map +7 -0
  355. package/dist/datasets/store.js +194 -0
  356. package/dist/datasets/store.js.map +7 -0
  357. package/dist/datasets/types.js +14 -0
  358. package/dist/datasets/types.js.map +7 -0
  359. package/dist/directmessages/ConversationList.js +148 -0
  360. package/dist/directmessages/ConversationList.js.map +7 -0
  361. package/dist/directmessages/DateSeparator.js +8 -0
  362. package/dist/directmessages/DateSeparator.js.map +7 -0
  363. package/dist/directmessages/DmAvatar.js +29 -0
  364. package/dist/directmessages/DmAvatar.js.map +7 -0
  365. package/dist/directmessages/DmComposer.js +201 -0
  366. package/dist/directmessages/DmComposer.js.map +7 -0
  367. package/dist/directmessages/arrivals.js +29 -0
  368. package/dist/directmessages/arrivals.js.map +7 -0
  369. package/dist/directmessages/chat-cache.js +192 -0
  370. package/dist/directmessages/chat-cache.js.map +7 -0
  371. package/dist/directmessages/grouping.js +26 -0
  372. package/dist/directmessages/grouping.js.map +7 -0
  373. package/dist/directmessages/index.js +81 -0
  374. package/dist/directmessages/index.js.map +7 -0
  375. package/dist/directmessages/useChats.js +266 -0
  376. package/dist/directmessages/useChats.js.map +7 -0
  377. package/dist/directmessages/utils.js +23 -0
  378. package/dist/directmessages/utils.js.map +7 -0
  379. package/dist/document-tools/can-annotate.js +7 -0
  380. package/dist/document-tools/can-annotate.js.map +7 -0
  381. package/dist/document-tools/core.cjs +80 -80
  382. package/dist/document-tools/core.js +218 -12
  383. package/dist/document-tools/core.js.map +7 -1
  384. package/dist/document-tools/document-pdf.js +76 -0
  385. package/dist/document-tools/document-pdf.js.map +7 -0
  386. package/dist/document-tools/environment.js +136 -0
  387. package/dist/document-tools/environment.js.map +7 -0
  388. package/dist/document-tools/file-shares.js +112 -0
  389. package/dist/document-tools/file-shares.js.map +7 -0
  390. package/dist/document-tools/frozen-copy.js +27 -0
  391. package/dist/document-tools/frozen-copy.js.map +7 -0
  392. package/dist/document-tools/index.cjs +80 -80
  393. package/dist/document-tools/index.js +26 -148
  394. package/dist/document-tools/index.js.map +7 -1
  395. package/dist/document-tools/markup-download.js +51 -0
  396. package/dist/document-tools/markup-download.js.map +7 -0
  397. package/dist/document-tools/markup-store.js +138 -0
  398. package/dist/document-tools/markup-store.js.map +7 -0
  399. package/dist/document-tools/markup-transfer.js +88 -0
  400. package/dist/document-tools/markup-transfer.js.map +7 -0
  401. package/dist/document-tools/production.js +147 -0
  402. package/dist/document-tools/production.js.map +7 -0
  403. package/dist/document-tools/saved-signature.js +90 -0
  404. package/dist/document-tools/saved-signature.js.map +7 -0
  405. package/dist/document-tools/signature-requests.js +310 -0
  406. package/dist/document-tools/signature-requests.js.map +7 -0
  407. package/dist/document-tools/signing.js +127 -0
  408. package/dist/document-tools/signing.js.map +7 -0
  409. package/dist/document-tools/useDocumentBytes.js +38 -0
  410. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  411. package/dist/document-tools/useDocumentMarkup.js +154 -0
  412. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  413. package/dist/document-tools/useIsOnline.js +13 -0
  414. package/dist/document-tools/useIsOnline.js.map +7 -0
  415. package/dist/document-tools/verification.js +60 -0
  416. package/dist/document-tools/verification.js.map +7 -0
  417. package/dist/documents/DocumentReview.js +220 -0
  418. package/dist/documents/DocumentReview.js.map +7 -0
  419. package/dist/documents/DraftTitleControls.js +41 -0
  420. package/dist/documents/DraftTitleControls.js.map +7 -0
  421. package/dist/documents/InlineMicButton.js +90 -0
  422. package/dist/documents/InlineMicButton.js.map +7 -0
  423. package/dist/documents/MicRecordingOverlay.js +29 -0
  424. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  425. package/dist/documents/MicWaveformIndicator.js +68 -0
  426. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  427. package/dist/documents/PhotoCapture.js +120 -0
  428. package/dist/documents/PhotoCapture.js.map +7 -0
  429. package/dist/documents/VideoCapture.js +129 -0
  430. package/dist/documents/VideoCapture.js.map +7 -0
  431. package/dist/documents/VoiceNoteRecorder.js +166 -0
  432. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  433. package/dist/documents/audio-segmenter.js +63 -0
  434. package/dist/documents/audio-segmenter.js.map +7 -0
  435. package/dist/documents/capture-frame.js +21 -0
  436. package/dist/documents/capture-frame.js.map +7 -0
  437. package/dist/documents/chunked-recorder.js +190 -0
  438. package/dist/documents/chunked-recorder.js.map +7 -0
  439. package/dist/documents/document-download.js +53 -0
  440. package/dist/documents/document-download.js.map +7 -0
  441. package/dist/documents/document-fields.js +109 -0
  442. package/dist/documents/document-fields.js.map +7 -0
  443. package/dist/documents/documents-cache.js +110 -0
  444. package/dist/documents/documents-cache.js.map +7 -0
  445. package/dist/documents/documents-data.js +128 -0
  446. package/dist/documents/documents-data.js.map +7 -0
  447. package/dist/documents/documents-loader.js +113 -0
  448. package/dist/documents/documents-loader.js.map +7 -0
  449. package/dist/documents/documents-writes.js +448 -0
  450. package/dist/documents/documents-writes.js.map +7 -0
  451. package/dist/documents/format-elapsed.js +10 -0
  452. package/dist/documents/format-elapsed.js.map +7 -0
  453. package/dist/documents/has-video-track.js +26 -0
  454. package/dist/documents/has-video-track.js.map +7 -0
  455. package/dist/documents/index.js +266 -0
  456. package/dist/documents/index.js.map +7 -0
  457. package/dist/documents/media-error.js +18 -0
  458. package/dist/documents/media-error.js.map +7 -0
  459. package/dist/documents/offline-documents.js +160 -0
  460. package/dist/documents/offline-documents.js.map +7 -0
  461. package/dist/documents/pending-sync.js +210 -0
  462. package/dist/documents/pending-sync.js.map +7 -0
  463. package/dist/documents/processing-live.js +122 -0
  464. package/dist/documents/processing-live.js.map +7 -0
  465. package/dist/documents/processing-order.js +59 -0
  466. package/dist/documents/processing-order.js.map +7 -0
  467. package/dist/documents/processing-settle.js +21 -0
  468. package/dist/documents/processing-settle.js.map +7 -0
  469. package/dist/documents/related-documents.js +133 -0
  470. package/dist/documents/related-documents.js.map +7 -0
  471. package/dist/documents/support.js +29 -0
  472. package/dist/documents/support.js.map +7 -0
  473. package/dist/documents/upload-files.js +169 -0
  474. package/dist/documents/upload-files.js.map +7 -0
  475. package/dist/documents/useAudioRecorder.js +315 -0
  476. package/dist/documents/useAudioRecorder.js.map +7 -0
  477. package/dist/documents/useCameraStream.js +35 -0
  478. package/dist/documents/useCameraStream.js.map +7 -0
  479. package/dist/documents/useDocumentThumbnails.js +71 -0
  480. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  481. package/dist/documents/useDownloadDocuments.js +90 -0
  482. package/dist/documents/useDownloadDocuments.js.map +7 -0
  483. package/dist/documents/usePassageQuotes.js +37 -0
  484. package/dist/documents/usePassageQuotes.js.map +7 -0
  485. package/dist/documents/useUploadFiles.js +165 -0
  486. package/dist/documents/useUploadFiles.js.map +7 -0
  487. package/dist/documents/useUploadFromUrls.js +63 -0
  488. package/dist/documents/useUploadFromUrls.js.map +7 -0
  489. package/dist/documents/useVideoRecorder.js +62 -0
  490. package/dist/documents/useVideoRecorder.js.map +7 -0
  491. package/dist/entities/AgentMarkers.js +61 -0
  492. package/dist/entities/AgentMarkers.js.map +7 -0
  493. package/dist/entities/DocumentEntity.js +125 -0
  494. package/dist/entities/DocumentEntity.js.map +7 -0
  495. package/dist/entities/EntityPill.js +250 -0
  496. package/dist/entities/EntityPill.js.map +7 -0
  497. package/dist/entities/ProjectEntity.js +61 -0
  498. package/dist/entities/ProjectEntity.js.map +7 -0
  499. package/dist/entities/ShieldIcon.js +49 -0
  500. package/dist/entities/ShieldIcon.js.map +7 -0
  501. package/dist/entities/TagEntity.js +79 -0
  502. package/dist/entities/TagEntity.js.map +7 -0
  503. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  504. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  505. package/dist/entities/UserEntity.js +211 -0
  506. package/dist/entities/UserEntity.js.map +7 -0
  507. package/dist/entities/VerifiedBadge.js +19 -0
  508. package/dist/entities/VerifiedBadge.js.map +7 -0
  509. package/dist/entities/agent-avatar-colors.js +26 -0
  510. package/dist/entities/agent-avatar-colors.js.map +7 -0
  511. package/dist/entities/colors.js +64 -0
  512. package/dist/entities/colors.js.map +7 -0
  513. package/dist/entities/file-type.js +151 -0
  514. package/dist/entities/file-type.js.map +7 -0
  515. package/dist/entities/index.js +100 -0
  516. package/dist/entities/index.js.map +7 -0
  517. package/dist/entities/media-type.js +61 -0
  518. package/dist/entities/media-type.js.map +7 -0
  519. package/dist/entities/registry.js +385 -0
  520. package/dist/entities/registry.js.map +7 -0
  521. package/dist/entities/status.js +43 -0
  522. package/dist/entities/status.js.map +7 -0
  523. package/dist/entities/tag-kinds.js +23 -0
  524. package/dist/entities/tag-kinds.js.map +7 -0
  525. package/dist/entities/tag-types.js +44 -0
  526. package/dist/entities/tag-types.js.map +7 -0
  527. package/dist/entities/vocabulary.js +12 -0
  528. package/dist/entities/vocabulary.js.map +7 -0
  529. package/dist/entity-extraction.js +25 -0
  530. package/dist/entity-extraction.js.map +7 -0
  531. package/dist/facts-search.js +57 -0
  532. package/dist/facts-search.js.map +7 -0
  533. package/dist/facts.js +69 -0
  534. package/dist/facts.js.map +7 -0
  535. package/dist/hooks.js +320 -0
  536. package/dist/hooks.js.map +7 -0
  537. package/dist/host/ArbiHost.js +24 -0
  538. package/dist/host/ArbiHost.js.map +7 -0
  539. package/dist/host/assistant-copy.js +54 -0
  540. package/dist/host/assistant-copy.js.map +7 -0
  541. package/dist/host/config.js +9 -0
  542. package/dist/host/config.js.map +7 -0
  543. package/dist/host/context.js +10 -0
  544. package/dist/host/context.js.map +7 -0
  545. package/dist/host/features.js +144 -0
  546. package/dist/host/features.js.map +7 -0
  547. package/dist/host/index.js +12 -0
  548. package/dist/host/index.js.map +7 -0
  549. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  550. package/dist/host/merge.js.map +7 -0
  551. package/dist/house-template.js +40 -0
  552. package/dist/house-template.js.map +7 -0
  553. package/dist/icons/AppleIcon.js +25 -0
  554. package/dist/icons/AppleIcon.js.map +7 -0
  555. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  556. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  557. package/dist/icons/ArbiIcon.js +24 -0
  558. package/dist/icons/ArbiIcon.js.map +7 -0
  559. package/dist/icons/AudIcon.js +56 -0
  560. package/dist/icons/AudIcon.js.map +7 -0
  561. package/dist/icons/ClaudeIcon.js +28 -0
  562. package/dist/icons/ClaudeIcon.js.map +7 -0
  563. package/dist/icons/DocIcon.js +56 -0
  564. package/dist/icons/DocIcon.js.map +7 -0
  565. package/dist/icons/EmlIcon.js +57 -0
  566. package/dist/icons/EmlIcon.js.map +7 -0
  567. package/dist/icons/FireworksIcon.js +47 -0
  568. package/dist/icons/FireworksIcon.js.map +7 -0
  569. package/dist/icons/GeminiIcon.js +37 -0
  570. package/dist/icons/GeminiIcon.js.map +7 -0
  571. package/dist/icons/GitHubIcon.js +32 -0
  572. package/dist/icons/GitHubIcon.js.map +7 -0
  573. package/dist/icons/GoogleIcon.js +53 -0
  574. package/dist/icons/GoogleIcon.js.map +7 -0
  575. package/dist/icons/HtmlIcon.js +56 -0
  576. package/dist/icons/HtmlIcon.js.map +7 -0
  577. package/dist/icons/ImgIcon.js +56 -0
  578. package/dist/icons/ImgIcon.js.map +7 -0
  579. package/dist/icons/LinkedInIcon.js +25 -0
  580. package/dist/icons/LinkedInIcon.js.map +7 -0
  581. package/dist/icons/OpenAIIcon.js +28 -0
  582. package/dist/icons/OpenAIIcon.js.map +7 -0
  583. package/dist/icons/PdfIcon.js +56 -0
  584. package/dist/icons/PdfIcon.js.map +7 -0
  585. package/dist/icons/ProviderIcon.js +42 -0
  586. package/dist/icons/ProviderIcon.js.map +7 -0
  587. package/dist/icons/TxtIcon.js +56 -0
  588. package/dist/icons/TxtIcon.js.map +7 -0
  589. package/dist/icons/VidIcon.js +56 -0
  590. package/dist/icons/VidIcon.js.map +7 -0
  591. package/dist/icons/XlsIcon.js +56 -0
  592. package/dist/icons/XlsIcon.js.map +7 -0
  593. package/dist/icons/arbi-mark.js +5 -0
  594. package/dist/icons/arbi-mark.js.map +7 -0
  595. package/dist/icons/colors.js +31 -0
  596. package/dist/icons/colors.js.map +7 -0
  597. package/dist/icons/file-type.js +105 -0
  598. package/dist/icons/file-type.js.map +7 -0
  599. package/dist/icons/index.js +55 -0
  600. package/dist/icons/index.js.map +7 -0
  601. package/dist/imagecrop/ImageCropModal.js +56 -0
  602. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  603. package/dist/imagecrop/ImageCropper.js +100 -0
  604. package/dist/imagecrop/ImageCropper.js.map +7 -0
  605. package/dist/imagecrop/cropImage.js +43 -0
  606. package/dist/imagecrop/cropImage.js.map +7 -0
  607. package/dist/imagecrop/index.js +13 -0
  608. package/dist/imagecrop/index.js.map +7 -0
  609. package/dist/index.cjs +282 -282
  610. package/dist/index.js +702 -17116
  611. package/dist/index.js.map +7 -1
  612. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  613. package/dist/lazy-chunk.js.map +7 -0
  614. package/dist/lib/collision-padding.js +13 -0
  615. package/dist/lib/collision-padding.js.map +7 -0
  616. package/dist/lib/format-friendly-date.js +55 -0
  617. package/dist/lib/format-friendly-date.js.map +7 -0
  618. package/dist/lib/format-relative-time.js +52 -0
  619. package/dist/lib/format-relative-time.js.map +7 -0
  620. package/dist/lib/markdown-to-text.js +35 -0
  621. package/dist/lib/markdown-to-text.js.map +7 -0
  622. package/dist/lib/toast-interaction.js +9 -0
  623. package/dist/lib/toast-interaction.js.map +7 -0
  624. package/dist/lib/utils.js +9 -0
  625. package/dist/lib/utils.js.map +7 -0
  626. package/dist/mail/client.js +103 -0
  627. package/dist/mail/client.js.map +7 -0
  628. package/dist/mail/document-attachment.js +38 -0
  629. package/dist/mail/document-attachment.js.map +7 -0
  630. package/dist/mail/filing.js +132 -0
  631. package/dist/mail/filing.js.map +7 -0
  632. package/dist/mail/hooks.js +393 -0
  633. package/dist/mail/hooks.js.map +7 -0
  634. package/dist/mail/index.js +120 -0
  635. package/dist/mail/index.js.map +7 -0
  636. package/dist/mail/offline/changes.js +258 -0
  637. package/dist/mail/offline/changes.js.map +7 -0
  638. package/dist/mail/offline/confirm-sign-out.js +37 -0
  639. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  640. package/dist/mail/offline/crypto.js +26 -0
  641. package/dist/mail/offline/crypto.js.map +7 -0
  642. package/dist/mail/offline/drafts.js +69 -0
  643. package/dist/mail/offline/drafts.js.map +7 -0
  644. package/dist/mail/offline/hooks.js +104 -0
  645. package/dist/mail/offline/hooks.js.map +7 -0
  646. package/dist/mail/offline/index.js +48 -0
  647. package/dist/mail/offline/index.js.map +7 -0
  648. package/dist/mail/offline/live.js +233 -0
  649. package/dist/mail/offline/live.js.map +7 -0
  650. package/dist/mail/offline/mailbox.js +191 -0
  651. package/dist/mail/offline/mailbox.js.map +7 -0
  652. package/dist/mail/offline/outbox.js +167 -0
  653. package/dist/mail/offline/outbox.js.map +7 -0
  654. package/dist/mail/offline/reads.js +159 -0
  655. package/dist/mail/offline/reads.js.map +7 -0
  656. package/dist/mail/offline/runtime.js +100 -0
  657. package/dist/mail/offline/runtime.js.map +7 -0
  658. package/dist/mail/offline/settings.js +84 -0
  659. package/dist/mail/offline/settings.js.map +7 -0
  660. package/dist/mail/offline/store.js +29 -0
  661. package/dist/mail/offline/store.js.map +7 -0
  662. package/dist/mail/offline/sync.js +251 -0
  663. package/dist/mail/offline/sync.js.map +7 -0
  664. package/dist/mail/offline/wipe.js +19 -0
  665. package/dist/mail/offline/wipe.js.map +7 -0
  666. package/dist/mail/thread-keys.js +53 -0
  667. package/dist/mail/thread-keys.js.map +7 -0
  668. package/dist/mail/threads.js +71 -0
  669. package/dist/mail/threads.js.map +7 -0
  670. package/dist/mail/useMailClient.js +42 -0
  671. package/dist/mail/useMailClient.js.map +7 -0
  672. package/dist/model-connections.js +58 -0
  673. package/dist/model-connections.js.map +7 -0
  674. package/dist/notifications/ActivityFeed.js +70 -0
  675. package/dist/notifications/ActivityFeed.js.map +7 -0
  676. package/dist/notifications/NotificationBell.js +200 -0
  677. package/dist/notifications/NotificationBell.js.map +7 -0
  678. package/dist/notifications/Toaster.js +24 -0
  679. package/dist/notifications/Toaster.js.map +7 -0
  680. package/dist/notifications/activity-types.js +65 -0
  681. package/dist/notifications/activity-types.js.map +7 -0
  682. package/dist/notifications/bell.js +24 -0
  683. package/dist/notifications/bell.js.map +7 -0
  684. package/dist/notifications/calendar-notifications.js +79 -0
  685. package/dist/notifications/calendar-notifications.js.map +7 -0
  686. package/dist/notifications/index.js +108 -0
  687. package/dist/notifications/index.js.map +7 -0
  688. package/dist/notifications/live.js +28 -0
  689. package/dist/notifications/live.js.map +7 -0
  690. package/dist/notifications/notification-types.js +127 -0
  691. package/dist/notifications/notification-types.js.map +7 -0
  692. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  693. package/dist/notifications/notify-store.js.map +7 -0
  694. package/dist/notifications/server-notifications.js +452 -0
  695. package/dist/notifications/server-notifications.js.map +7 -0
  696. package/dist/notifications/useNotifications.js +34 -0
  697. package/dist/notifications/useNotifications.js.map +7 -0
  698. package/dist/offline-store/network.js +11 -0
  699. package/dist/offline-store/network.js.map +7 -0
  700. package/dist/offline-store/store.js +136 -0
  701. package/dist/offline-store/store.js.map +7 -0
  702. package/dist/offline-store/wipe.js +8 -0
  703. package/dist/offline-store/wipe.js.map +7 -0
  704. package/dist/offline.js +58 -0
  705. package/dist/offline.js.map +7 -0
  706. package/dist/people.js +122 -0
  707. package/dist/people.js.map +7 -0
  708. package/dist/projects.js +30 -0
  709. package/dist/projects.js.map +7 -0
  710. package/dist/query-client.js +63 -0
  711. package/dist/query-client.js.map +7 -0
  712. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  713. package/dist/query-keys.js.map +7 -0
  714. package/dist/query-persist.js +66 -0
  715. package/dist/query-persist.js.map +7 -0
  716. package/dist/queued-writes.js +59 -0
  717. package/dist/queued-writes.js.map +7 -0
  718. package/dist/remote-control.js +67 -0
  719. package/dist/remote-control.js.map +7 -0
  720. package/dist/search/index.js +23 -0
  721. package/dist/search/index.js.map +7 -0
  722. package/dist/search/session.js +58 -0
  723. package/dist/search/session.js.map +7 -0
  724. package/dist/search/useSemanticSearch.js +82 -0
  725. package/dist/search/useSemanticSearch.js.map +7 -0
  726. package/dist/session/chat.js +512 -0
  727. package/dist/session/chat.js.map +7 -0
  728. package/dist/session/documents.js +196 -0
  729. package/dist/session/documents.js.map +7 -0
  730. package/dist/session/drafts.js +103 -0
  731. package/dist/session/drafts.js.map +7 -0
  732. package/dist/session/index.js +123 -0
  733. package/dist/session/index.js.map +7 -0
  734. package/dist/session/layout.js +339 -0
  735. package/dist/session/layout.js.map +7 -0
  736. package/dist/session/persist.js +106 -0
  737. package/dist/session/persist.js.map +7 -0
  738. package/dist/session/session-hooks.js +53 -0
  739. package/dist/session/session-hooks.js.map +7 -0
  740. package/dist/session/signed-in.js +36 -0
  741. package/dist/session/signed-in.js.map +7 -0
  742. package/dist/session/store.js +166 -0
  743. package/dist/session/store.js.map +7 -0
  744. package/dist/session/thread-tabs.js +121 -0
  745. package/dist/session/thread-tabs.js.map +7 -0
  746. package/dist/session/ui-state-storage.js +76 -0
  747. package/dist/session/ui-state-storage.js.map +7 -0
  748. package/dist/session/workspace.js +77 -0
  749. package/dist/session/workspace.js.map +7 -0
  750. package/dist/shell/index.cjs +37 -37
  751. package/dist/shell/index.js +43 -10
  752. package/dist/shell/index.js.map +7 -1
  753. package/dist/skill-pack.js +111 -0
  754. package/dist/skill-pack.js.map +7 -0
  755. package/dist/storage.js +186 -0
  756. package/dist/storage.js.map +7 -0
  757. package/dist/support/index.js +35 -0
  758. package/dist/support/index.js.map +7 -0
  759. package/dist/tags.js +204 -0
  760. package/dist/tags.js.map +7 -0
  761. package/dist/ui/DebouncedInput.js +109 -0
  762. package/dist/ui/DebouncedInput.js.map +7 -0
  763. package/dist/ui/DictateContext.js +8 -0
  764. package/dist/ui/DictateContext.js.map +7 -0
  765. package/dist/ui/IconToggle.js +79 -0
  766. package/dist/ui/IconToggle.js.map +7 -0
  767. package/dist/ui/VerifiedToggle.js +38 -0
  768. package/dist/ui/VerifiedToggle.js.map +7 -0
  769. package/dist/ui/VisibilityToggle.js +103 -0
  770. package/dist/ui/VisibilityToggle.js.map +7 -0
  771. package/dist/ui/avatar.js +40 -0
  772. package/dist/ui/avatar.js.map +7 -0
  773. package/dist/ui/badge.js +28 -0
  774. package/dist/ui/badge.js.map +7 -0
  775. package/dist/ui/button.js +48 -0
  776. package/dist/ui/button.js.map +7 -0
  777. package/dist/ui/card.js +90 -0
  778. package/dist/ui/card.js.map +7 -0
  779. package/dist/ui/checkbox.js +22 -0
  780. package/dist/ui/checkbox.js.map +7 -0
  781. package/dist/ui/collapsible.js +10 -0
  782. package/dist/ui/collapsible.js.map +7 -0
  783. package/dist/ui/command.js +103 -0
  784. package/dist/ui/command.js.map +7 -0
  785. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  786. package/dist/ui/dialog.js.map +7 -0
  787. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  788. package/dist/ui/dropdown-menu.js.map +7 -0
  789. package/dist/ui/hover-card.js +36 -0
  790. package/dist/ui/hover-card.js.map +7 -0
  791. package/dist/ui/index.cjs +154 -154
  792. package/dist/ui/index.js +290 -10
  793. package/dist/ui/index.js.map +7 -1
  794. package/dist/ui/input.js +65 -0
  795. package/dist/ui/input.js.map +7 -0
  796. package/dist/ui/label.js +16 -0
  797. package/dist/ui/label.js.map +7 -0
  798. package/dist/ui/mark-menu.js +300 -0
  799. package/dist/ui/mark-menu.js.map +7 -0
  800. package/dist/ui/popover.js +40 -0
  801. package/dist/ui/popover.js.map +7 -0
  802. package/dist/ui/portal-container.js +17 -0
  803. package/dist/ui/portal-container.js.map +7 -0
  804. package/dist/ui/progress.js +24 -0
  805. package/dist/ui/progress.js.map +7 -0
  806. package/dist/ui/radio-group.js +29 -0
  807. package/dist/ui/radio-group.js.map +7 -0
  808. package/dist/ui/scroll-area.js +39 -0
  809. package/dist/ui/scroll-area.js.map +7 -0
  810. package/dist/ui/select.js +130 -0
  811. package/dist/ui/select.js.map +7 -0
  812. package/dist/ui/separator.js +23 -0
  813. package/dist/ui/separator.js.map +7 -0
  814. package/dist/ui/slider.js +23 -0
  815. package/dist/ui/slider.js.map +7 -0
  816. package/dist/ui/switch.js +28 -0
  817. package/dist/ui/switch.js.map +7 -0
  818. package/dist/ui/table.js +75 -0
  819. package/dist/ui/table.js.map +7 -0
  820. package/dist/ui/tabs.js +48 -0
  821. package/dist/ui/tabs.js.map +7 -0
  822. package/dist/ui/textarea.js +63 -0
  823. package/dist/ui/textarea.js.map +7 -0
  824. package/dist/ui/toggle-group.js +43 -0
  825. package/dist/ui/toggle-group.js.map +7 -0
  826. package/dist/ui/toggle.js +40 -0
  827. package/dist/ui/toggle.js.map +7 -0
  828. package/dist/ui/tooltip.js +215 -0
  829. package/dist/ui/tooltip.js.map +7 -0
  830. package/dist/usage-metered.js +8 -0
  831. package/dist/usage-metered.js.map +7 -0
  832. package/dist/useArbi.js +16 -0
  833. package/dist/useArbi.js.map +7 -0
  834. package/dist/useInstallSkillPack.js +81 -0
  835. package/dist/useInstallSkillPack.js.map +7 -0
  836. package/dist/usermenu/UserMenu.js +188 -0
  837. package/dist/usermenu/UserMenu.js.map +7 -0
  838. package/dist/usermenu/index.js +5 -0
  839. package/dist/usermenu/index.js.map +7 -0
  840. package/dist/users/index.js +15 -0
  841. package/dist/users/index.js.map +7 -0
  842. package/dist/users/user-display.js +60 -0
  843. package/dist/users/user-display.js.map +7 -0
  844. package/dist/viewers/AudioViewer.js +23 -0
  845. package/dist/viewers/AudioViewer.js.map +7 -0
  846. package/dist/viewers/DocxViewer.js +81 -0
  847. package/dist/viewers/DocxViewer.js.map +7 -0
  848. package/dist/viewers/ImageViewer.js +31 -0
  849. package/dist/viewers/ImageViewer.js.map +7 -0
  850. package/dist/viewers/PdfViewer.js +19 -3
  851. package/dist/viewers/PdfViewer.js.map +7 -1
  852. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  853. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  854. package/dist/viewers/VideoViewer.js +31 -0
  855. package/dist/viewers/VideoViewer.js.map +7 -0
  856. package/dist/viewers/XlsxViewer.js +102 -0
  857. package/dist/viewers/XlsxViewer.js.map +7 -0
  858. package/dist/viewers/index.js +61 -271
  859. package/dist/viewers/index.js.map +7 -1
  860. package/dist/viewers/page-scroll.js +59 -0
  861. package/dist/viewers/page-scroll.js.map +7 -0
  862. package/dist/viewers/pdf-viewer-constants.js +9 -0
  863. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  864. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  865. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  866. package/dist/viewers/selection-runs.js +38 -0
  867. package/dist/viewers/selection-runs.js.map +7 -0
  868. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  869. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  870. package/dist/viewers/useProcessedChunks.js +58 -0
  871. package/dist/viewers/useProcessedChunks.js.map +7 -0
  872. package/dist/viewers/viewer-zoom.js +163 -0
  873. package/dist/viewers/viewer-zoom.js.map +7 -0
  874. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  875. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  876. package/dist/websocket/context.js +14 -0
  877. package/dist/websocket/context.js.map +7 -0
  878. package/dist/websocket/hooks.js +30 -0
  879. package/dist/websocket/hooks.js.map +7 -0
  880. package/dist/websocket/index.js +22 -0
  881. package/dist/websocket/index.js.map +7 -0
  882. package/dist/websocket/live-updates.js +38 -0
  883. package/dist/websocket/live-updates.js.map +7 -0
  884. package/dist/websocket/reconnect.js +13 -0
  885. package/dist/websocket/reconnect.js.map +7 -0
  886. package/dist/websocket/store.js +58 -0
  887. package/dist/websocket/store.js.map +7 -0
  888. package/dist/workforce.js +607 -0
  889. package/dist/workforce.js.map +7 -0
  890. package/dist/workspaces/access-request.js +35 -0
  891. package/dist/workspaces/access-request.js.map +7 -0
  892. package/dist/workspaces/archive.js +59 -0
  893. package/dist/workspaces/archive.js.map +7 -0
  894. package/dist/workspaces/current.js +20 -0
  895. package/dist/workspaces/current.js.map +7 -0
  896. package/dist/workspaces/delete-workspaces.js +15 -0
  897. package/dist/workspaces/delete-workspaces.js.map +7 -0
  898. package/dist/workspaces/export-archive.js +40 -0
  899. package/dist/workspaces/export-archive.js.map +7 -0
  900. package/dist/workspaces/index.js +99 -0
  901. package/dist/workspaces/index.js.map +7 -0
  902. package/dist/workspaces/settings.js +45 -0
  903. package/dist/workspaces/settings.js.map +7 -0
  904. package/dist/workspaces/shell-workspaces.js +49 -0
  905. package/dist/workspaces/shell-workspaces.js.map +7 -0
  906. package/dist/workspaces/switch.js +234 -0
  907. package/dist/workspaces/switch.js.map +7 -0
  908. package/dist/workspaces/transfer.js +170 -0
  909. package/dist/workspaces/transfer.js.map +7 -0
  910. package/dist/workspaces/useShellWorkspaces.js +86 -0
  911. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  912. package/dist/workspaces/workspace-users.js +65 -0
  913. package/dist/workspaces/workspace-users.js.map +7 -0
  914. package/package.json +4 -4
  915. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  916. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  917. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  918. package/dist/annotations/freeze/index.d.cts +0 -205
  919. package/dist/annotations/index.d.cts +0 -360
  920. package/dist/artifacts/index.d.cts +0 -476
  921. package/dist/artifacts/redline-core.d.cts +0 -39
  922. package/dist/bundle-YNOX7VIL.js +0 -5
  923. package/dist/bundle-YNOX7VIL.js.map +0 -1
  924. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  925. package/dist/calls/livekit/index.d.cts +0 -280
  926. package/dist/chunk-47CCGUWR.js.map +0 -1
  927. package/dist/chunk-4FL3X3LA.js +0 -2057
  928. package/dist/chunk-4FL3X3LA.js.map +0 -1
  929. package/dist/chunk-6QNBSXCE.js +0 -271
  930. package/dist/chunk-6QNBSXCE.js.map +0 -1
  931. package/dist/chunk-74N436VK.js.map +0 -1
  932. package/dist/chunk-APZZQZ6P.js +0 -147
  933. package/dist/chunk-APZZQZ6P.js.map +0 -1
  934. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  935. package/dist/chunk-DPYBZDJB.js.map +0 -1
  936. package/dist/chunk-DZKRL5H3.js +0 -2766
  937. package/dist/chunk-DZKRL5H3.js.map +0 -1
  938. package/dist/chunk-HDCRPPBW.js +0 -75
  939. package/dist/chunk-HDCRPPBW.js.map +0 -1
  940. package/dist/chunk-L2IPPTVC.js +0 -20
  941. package/dist/chunk-L2IPPTVC.js.map +0 -1
  942. package/dist/chunk-LSU4UPS5.js +0 -1011
  943. package/dist/chunk-LSU4UPS5.js.map +0 -1
  944. package/dist/chunk-NIKPG4PW.js +0 -1128
  945. package/dist/chunk-NIKPG4PW.js.map +0 -1
  946. package/dist/chunk-NNAJLY6B.js +0 -4974
  947. package/dist/chunk-NNAJLY6B.js.map +0 -1
  948. package/dist/chunk-OYPKKHXY.js +0 -559
  949. package/dist/chunk-OYPKKHXY.js.map +0 -1
  950. package/dist/chunk-PTOP7OHG.js.map +0 -1
  951. package/dist/chunk-QMY2JKBI.js +0 -246
  952. package/dist/chunk-QMY2JKBI.js.map +0 -1
  953. package/dist/chunk-SN5YV6FF.js +0 -11
  954. package/dist/chunk-SN5YV6FF.js.map +0 -1
  955. package/dist/chunk-SSXFVWCT.js.map +0 -1
  956. package/dist/chunk-T3USOSVN.js.map +0 -1
  957. package/dist/chunk-T4CLW3DN.js +0 -2560
  958. package/dist/chunk-T4CLW3DN.js.map +0 -1
  959. package/dist/chunk-UW2SGTI5.js.map +0 -1
  960. package/dist/chunk-VSCU7K4V.js.map +0 -1
  961. package/dist/chunk-WL2Y2T47.js.map +0 -1
  962. package/dist/chunk-WUTL62MC.js.map +0 -1
  963. package/dist/chunk-XWPLOFDN.js +0 -644
  964. package/dist/chunk-XWPLOFDN.js.map +0 -1
  965. package/dist/chunk-Y3MTRA7D.js +0 -97
  966. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  967. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  968. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  969. package/dist/document-tools/core.d.cts +0 -883
  970. package/dist/document-tools/index.d.cts +0 -90
  971. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  972. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  973. package/dist/index.d.cts +0 -15923
  974. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  975. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  976. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  977. package/dist/shell/index.d.cts +0 -6
  978. package/dist/store.d-GADDvC7w.d.cts +0 -35
  979. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  980. package/dist/ui/index.d.cts +0 -26
  981. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  982. package/dist/viewers/PdfViewer.d.cts +0 -9
  983. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/ConversationList.tsx"],
4
+ "sourcesContent": ["/**\n * The left rail: a scrollable list of conversations (1:1 or group), each showing\n * an avatar, name or title, last-message preview, relative time, and an unread pill.\n */\n\nimport { Check, CheckCheck } from 'lucide-react'\nimport { Badge } from '../ui/badge'\nimport { cn } from '../lib/utils'\nimport type { DmClassNames, DmConversation } from './types'\nimport { formatRelativeTime, userDisplayName, isAgentUser } from './utils'\nimport { DmAvatar } from './DmAvatar'\nimport { AgentBadge } from '../entities/AgentMarkers'\n\nexport interface ConversationListProps {\n conversations: DmConversation[]\n /** The selected row's id (`id ?? peer.external_id`). */\n selectedPeerId: string | null\n /** Receives the row's id (`id ?? peer.external_id`). */\n onSelect: (id: string) => void\n classNames?: Pick<DmClassNames, 'unreadBadge'>\n /** Rendered when there are no conversations. */\n emptyState?: React.ReactNode\n /**\n * Replaces the default \"Conversations / N colleagues\" heading \u2014 e.g. with a\n * call to action. Pass `null` for no heading at all.\n */\n header?: React.ReactNode\n /**\n * Overrides the rail's own sizing. The default is a fixed-width column beside\n * a thread; a consumer showing the list on its own needs it to fill instead,\n * and cannot get there by wrapping (a narrower wrapper clips rather than\n * shrinks).\n */\n className?: string\n}\n\nexport function ConversationList({\n conversations,\n selectedPeerId,\n onSelect,\n classNames,\n emptyState,\n header,\n className,\n}: ConversationListProps) {\n return (\n <aside\n className={cn(\n 'flex min-h-0 flex-col border-b border-border md:w-80 md:shrink-0 md:border-b-0 md:border-r',\n className\n )}\n data-testid=\"arbi-dm-list\"\n >\n {header === undefined ? (\n <div className=\"border-b border-border px-4 py-3\">\n <p className=\"text-sm font-semibold text-foreground\">Conversations</p>\n <p className=\"text-xs text-muted-foreground\">\n {conversations.length} {conversations.length === 1 ? 'colleague' : 'colleagues'}\n </p>\n </div>\n ) : (\n header\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {conversations.length === 0 ? (\n <div className=\"px-4 py-6 text-xs text-muted-foreground\">\n {emptyState ?? 'No conversations yet.'}\n </div>\n ) : (\n <ul className=\"w-full\">\n {conversations.map((c, i) => {\n const { peer, lastMessage, unreadCount } = c\n const rowId = c.id ?? peer.external_id\n // The heading renders once, above the first row of its group.\n const newSection =\n c.sectionLabel && c.sectionLabel !== conversations[i - 1]?.sectionLabel\n const active = rowId === selectedPeerId\n const preview = lastMessage?.body ?? 'No messages yet \u2014 say hello'\n // Unread rows carry weight, which is the signal you catch scanning\n // a list \u2014 the count alone is a detail you have to go looking for.\n const unread = unreadCount > 0\n const body = (\n <>\n {c.leading ?? <DmAvatar user={peer} />}\n <div className=\"min-w-0 flex-1\">\n {/* Count sits with the name; the time sits with the message\n it belongs to. They were the other way round, which put\n \"just now\" beside a name it said nothing about. */}\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn(\n 'truncate text-sm text-foreground',\n unread ? 'font-bold' : 'font-semibold'\n )}\n >\n {c.title ?? userDisplayName(peer)}\n </span>\n {/* An agent is marked by default \u2014 a consumer only\n supplies `badge` to say something else. */}\n {c.badge ?? (isAgentUser(peer) ? <AgentBadge /> : null)}\n </span>\n {c.statusLabel ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 rounded-full px-2 py-0 text-xs font-medium text-muted-foreground\"\n >\n {c.statusLabel}\n </Badge>\n ) : unreadCount > 0 ? (\n // Quiet by default: a filled brand pill with a shadow\n // shouted louder than the message it was counting.\n // Enough to catch the eye scanning the list, no more.\n <Badge\n variant=\"accent\"\n className={cn(\n 'min-w-[1.125rem] justify-center rounded-full px-1 py-0 text-xs font-medium leading-[1.125rem] shadow-none',\n classNames?.unreadBadge\n )}\n >\n {unreadCount}\n </Badge>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-1.5\">\n {/* Your own last message is marked with the same tick the\n bubble carries \u2014 one delivered, two read. It says who\n spoke last AND whether it landed, which a \"You:\" prefix\n cannot, and costs no preview width. */}\n {lastMessage?.isMine ? (\n lastMessage.read ? (\n <CheckCheck\n className=\"size-3.5 shrink-0 text-ai-accent\"\n aria-label=\"Read\"\n />\n ) : (\n <Check\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n aria-label=\"Sent\"\n />\n )\n ) : null}\n <p\n className={cn(\n 'min-w-0 flex-1 truncate text-xs',\n unread ? 'font-medium text-foreground' : 'text-muted-foreground'\n )}\n >\n {c.subtitle ?? preview}\n </p>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {lastMessage ? formatRelativeTime(lastMessage.createdAt) : ''}\n </span>\n </div>\n </div>\n </>\n )\n\n // An invitation that nobody has accepted has no thread to open, so\n // it is listed but not offered as something to click.\n const rowClass = cn(\n // Each row is its own opaque surface. Left transparent it takes\n // the panel's colour, and the chips stop reading as cards at all\n // \u2014 which is the whole point of them.\n 'flex w-full items-start gap-3 border-b border-border/60 bg-card px-4 py-3 text-left transition-colors',\n c.disabled ? 'cursor-default' : active ? 'bg-ai-accent-soft' : 'hover:bg-accent/40'\n )\n\n return (\n <li key={rowId}>\n {newSection && (\n <p\n className=\"bg-muted/40 px-4 py-1.5 text-xs font-medium uppercase tracking-wide text-muted-foreground\"\n data-testid=\"arbi-dm-section\"\n >\n {c.sectionLabel}\n </p>\n )}\n {c.disabled ? (\n <div data-testid={`arbi-dm-conversation-${rowId}`} className={rowClass}>\n {body}\n {c.trailing}\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => onSelect(rowId)}\n data-testid={`arbi-dm-conversation-${rowId}`}\n className={rowClass}\n >\n {body}\n </button>\n )}\n </li>\n )\n })}\n </ul>\n )}\n </div>\n </aside>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ function DateSeparator({ children }) {
3
+ return /* @__PURE__ */ jsx("div", { className: "my-3 flex justify-center", "data-testid": "dm-date-separator", children: /* @__PURE__ */ jsx("span", { className: "rounded-full bg-background/80 px-2 py-0.5 text-xs text-muted-foreground", children }) });
4
+ }
5
+ export {
6
+ DateSeparator
7
+ };
8
+ //# sourceMappingURL=DateSeparator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/DateSeparator.tsx"],
4
+ "sourcesContent": ["/**\n * The day divider between message runs in a thread.\n *\n * The label is supplied by the caller rather than formatted here: the ARBI app\n * has a friendly formatter that already says \"Today\" / \"Yesterday\" in the user's\n * locale, and a second date-formatting opinion in the kit would drift from it.\n */\n\nimport type { ReactNode } from 'react'\n\nexport interface DateSeparatorProps {\n children: ReactNode\n}\n\nexport function DateSeparator({ children }: DateSeparatorProps) {\n return (\n <div className=\"my-3 flex justify-center\" data-testid=\"dm-date-separator\">\n <span className=\"rounded-full bg-background/80 px-2 py-0.5 text-xs text-muted-foreground\">\n {children}\n </span>\n </div>\n )\n}\n"],
5
+ "mappings": "AAiBM;AAHC,SAAS,cAAc,EAAE,SAAS,GAAuB;AAC9D,SACE,oBAAC,SAAI,WAAU,4BAA2B,eAAY,qBACpD,8BAAC,UAAK,WAAU,2EACb,UACH,GACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { UserEntity } from "../entities/UserEntity.js";
3
+ import { getEntityColorStyles } from "../entities/colors.js";
4
+ import { useArbiWsStore } from "../websocket/store.js";
5
+ import { userDisplayName, userInitials, isAgentUser } from "./utils.js";
6
+ function DmAvatar({ user, className, size = "lg" }) {
7
+ const presence = useArbiWsStore((s) => s.presence[user.external_id]);
8
+ const displayStatus = presence === void 0 ? void 0 : presence === "online" ? "connected" : "disconnected";
9
+ return /* @__PURE__ */ jsx(
10
+ UserEntity,
11
+ {
12
+ variant: "icon",
13
+ size,
14
+ className,
15
+ interactive: false,
16
+ showTooltip: false,
17
+ initials: userInitials(user),
18
+ displayName: userDisplayName(user),
19
+ picture: user.picture,
20
+ avatarStyle: getEntityColorStyles(user.external_id),
21
+ isAgent: isAgentUser(user),
22
+ displayStatus
23
+ }
24
+ );
25
+ }
26
+ export {
27
+ DmAvatar
28
+ };
29
+ //# sourceMappingURL=DmAvatar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/directmessages/DmAvatar.tsx"],
4
+ "sourcesContent": ["/**\n * A peer avatar in a DM surface.\n *\n * This used to be its own small avatar that knew nothing about agents or\n * presence, which is why the ARBI app replaced it on every row with a\n * hand-rolled variant of its own. It is now a thin adapter over\n * {@link UserEntity} \u2014 the one presentational person component \u2014 so a DM row, a\n * members table and a document owner all draw a person the same way.\n *\n * The name and props are unchanged: it is exported from the package, and\n * consumers should not have to care that the implementation collapsed.\n */\n\nimport { UserEntity, type PresenceDisplayStatus } from '../entities/UserEntity'\nimport { getEntityColorStyles } from '../entities/colors'\nimport type { EntitySize } from '../entities/EntityPill'\nimport { useArbiWsStore } from '../websocket/store'\nimport type { DmUser } from './types'\nimport { userDisplayName, userInitials, isAgentUser } from './utils'\n\nexport interface DmAvatarProps {\n user: DmUser\n className?: string\n /** Defaults to the 40px row avatar this component has always drawn. */\n size?: EntitySize\n}\n\nexport function DmAvatar({ user, className, size = 'lg' }: DmAvatarProps) {\n // Presence comes from the shared WS store, which stays empty until an app\n // mounts ArbiWebSocketProvider. That is deliberate: with no socket we know\n // nothing about who is online, and `undefined` hides the dot rather than\n // asserting that everyone is offline.\n const presence = useArbiWsStore((s) => s.presence[user.external_id])\n const displayStatus: PresenceDisplayStatus | undefined =\n presence === undefined ? undefined : presence === 'online' ? 'connected' : 'disconnected'\n\n return (\n <UserEntity\n variant=\"icon\"\n size={size}\n className={className}\n interactive={false}\n showTooltip={false}\n initials={userInitials(user)}\n displayName={userDisplayName(user)}\n picture={user.picture}\n // Deterministic tint from the user's id so the fallback is stable + distinct.\n avatarStyle={getEntityColorStyles(user.external_id)}\n isAgent={isAgentUser(user)}\n displayStatus={displayStatus}\n />\n )\n}\n"],
5
+ "mappings": "AAqCI;AAxBJ,SAAS,kBAA8C;AACvD,SAAS,4BAA4B;AAErC,SAAS,sBAAsB;AAE/B,SAAS,iBAAiB,cAAc,mBAAmB;AASpD,SAAS,SAAS,EAAE,MAAM,WAAW,OAAO,KAAK,GAAkB;AAKxE,QAAM,WAAW,eAAe,CAAC,MAAM,EAAE,SAAS,KAAK,WAAW,CAAC;AACnE,QAAM,gBACJ,aAAa,SAAY,SAAY,aAAa,WAAW,cAAc;AAE7E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb,UAAU,aAAa,IAAI;AAAA,MAC3B,aAAa,gBAAgB,IAAI;AAAA,MACjC,SAAS,KAAK;AAAA,MAEd,aAAa,qBAAqB,KAAK,WAAW;AAAA,MAClD,SAAS,YAAY,IAAI;AAAA,MACzB;AAAA;AAAA,EACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -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": "AAoJY,SAuBF,UAlBI,KALF;AAzIZ,SAAS,QAAQ,gBAAgB;AACjC,SAAS,SAAS,WAAW,MAAM,SAAS;AAC5C,SAAS,OAAO,sBAAsB;AACtC,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,UAAU;AA4BZ,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,CAAC,CAAC;AAC7C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAClE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,WAAW,OAA4B,IAAI;AACjD,QAAM,eAAe,OAAyB,IAAI;AAElD,QAAM,WAAW,CAAC,UAAkB;AAClC,QAAI,CAAC,oBAAoB,MAAM,WAAW,EAAG;AAC7C,UAAM,OAAO,CAAC,GAAG,OAAO,GAAG,KAAK;AAChC,QAAI;AACF,YAAM,0BAA0B,IAAI;AACpC,eAAS,IAAI;AACb,qBAAe,IAAI;AAAA,IACrB,SAAS,KAAK;AACZ,qBAAe,eAAe,QAAQ,IAAI,UAAU,2BAA2B;AAAA,IACjF;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,UAAkB;AACpC,aAAS,CAAC,YAAY,QAAQ,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAC3D,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,SAAS,YAAY;AACzB,UAAM,OAAO,MAAM,KAAK;AACxB,QAAK,CAAC,QAAQ,MAAM,WAAW,KAAM,YAAY,KAAM;AACvD,UAAM,UAAU;AAChB,aAAS,EAAE;AACX,aAAS,CAAC,CAAC;AACX,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,OAAO,MAAM,OAAO;AAE1B,eAAS,SAAS,MAAM;AAAA,IAC1B,QAAQ;AAGN,eAAS,IAAI;AACb,eAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,MAAgD;AACjE,QAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,QAAE,eAAe;AACjB,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,MAAiD;AAChE,QAAI,CAAC,iBAAkB;AACvB,UAAM,SAAS,MAAM,KAAK,EAAE,eAAe,SAAS,CAAC,CAAC;AACtD,QAAI,OAAO,WAAW,EAAG;AACzB,MAAE,eAAe;AACjB,aAAS,MAAM;AAAA,EACjB;AAEA,QAAM,WAAW,CAAC,MAAuB,MAAM,KAAK,EAAE,cAAc,SAAS,CAAC,CAAC,EAAE,SAAS,OAAO;AAEjG,QAAM,eAAe,mBACjB;AAAA,IACE,YAAY,CAAC,MAAuB;AAClC,UAAI,CAAC,SAAS,CAAC,KAAK,SAAU;AAC9B,QAAE,eAAe;AACjB,kBAAY,IAAI;AAAA,IAClB;AAAA,IACA,aAAa,CAAC,MAAuB;AACnC,UAAI,EAAE,cAAc,SAAS,EAAE,aAA4B,EAAG;AAC9D,kBAAY,KAAK;AAAA,IACnB;AAAA,IACA,QAAQ,CAAC,MAAuB;AAC9B,kBAAY,KAAK;AACjB,YAAM,UAAU,MAAM,KAAK,EAAE,cAAc,SAAS,CAAC,CAAC;AACtD,UAAI,QAAQ,WAAW,KAAK,SAAU;AACtC,QAAE,eAAe;AACjB,eAAS,OAAO;AAAA,IAClB;AAAA,EACF,IACA,CAAC;AAEL,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MACA,eAAY;AAAA,MACX,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,MAAM,SAAS,KACd,oBAAC,QAAG,WAAU,6BAA4B,cAAW,kBAClD,gBAAM,IAAI,CAAC,GAAG,UACb;AAAA,UAAC;AAAA;AAAA,YAEC,eAAY;AAAA,YACZ,WAAU;AAAA,YAEV;AAAA,kCAAC,aAAU,WAAU,mBAAkB,eAAY,QAAO;AAAA,cAC1D,oBAAC,UAAK,WAAU,YAAY,YAAE,MAAK;AAAA,cACnC,oBAAC,UAAK,WAAU,kCAAkC,yBAAe,EAAE,IAAI,GAAE;AAAA,cACzE;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAU;AAAA,kBACV,cAAY,UAAU,EAAE,IAAI;AAAA,kBAC5B,SAAS,MAAM,WAAW,KAAK;AAAA,kBAC/B,WAAU;AAAA,kBAEV,8BAAC,KAAE,WAAU,UAAS;AAAA;AAAA,cACxB;AAAA;AAAA;AAAA,UAfK,GAAG,EAAE,IAAI,IAAI,KAAK;AAAA,QAgBzB,CACD,GACH;AAAA,QAEF,qBAAC,SAAI,WAAU,wBACZ;AAAA,8BACC,iCACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,UAAU,YAAY;AAAA,gBACtB,SAAS,MAAM,aAAa,SAAS,MAAM;AAAA,gBAC3C,cAAW;AAAA,gBACX,OAAM;AAAA,gBACN,eAAY;AAAA,gBACZ,WAAU;AAAA,gBAEV,8BAAC,aAAU,WAAU,UAAS;AAAA;AAAA,YAChC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,UAAQ;AAAA,gBACR,QAAM;AAAA,gBACN,eAAY;AAAA,gBACZ,UAAU,CAAC,MAAM;AACf,2BAAS,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC,CAAC;AAEzC,oBAAE,OAAO,QAAQ;AAAA,gBACnB;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC;AAAA,cACA;AAAA,cACA;AAAA,cACA,MAAM;AAAA,cACN;AAAA,cACA,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,KAAK,OAAO;AAAA,cAC3B,UAAU,YAAY,QAAS,CAAC,MAAM,KAAK,KAAK,MAAM,WAAW;AAAA,cACjE,WAAW,GAAG,YAAY,UAAU;AAAA,cACpC,eAAY;AAAA,cACZ,cAAW;AAAA,cAEV;AAAA,uBAAO,oBAAC,WAAQ,WAAU,uBAAsB,IAAK,oBAAC,QAAK,WAAU,UAAS;AAAA,gBAAG;AAAA;AAAA;AAAA,UACpF;AAAA,WACF;AAAA,QACC,eACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,eAAY;AAAA,YAEX;AAAA;AAAA,QACH;AAAA,QAED,SACC,oBAAC,OAAE,WAAU,iCAAgC,eAAY,iBACtD,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;",
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": "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",
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