@arbidocs/react 0.5.110 → 0.5.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1011) hide show
  1. package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
  2. package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
  3. package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
  4. package/dist/account/client.js +96 -0
  5. package/dist/account/client.js.map +7 -0
  6. package/dist/account/delete.js +70 -0
  7. package/dist/account/delete.js.map +7 -0
  8. package/dist/account/didit.js +34 -0
  9. package/dist/account/didit.js.map +7 -0
  10. package/dist/account/dismissed-tips.js +33 -0
  11. package/dist/account/dismissed-tips.js.map +7 -0
  12. package/dist/account/email.js +84 -0
  13. package/dist/account/email.js.map +7 -0
  14. package/dist/account/entitlements.js +47 -0
  15. package/dist/account/entitlements.js.map +7 -0
  16. package/dist/account/identity.js +270 -0
  17. package/dist/account/identity.js.map +7 -0
  18. package/dist/account/index.js +93 -0
  19. package/dist/account/index.js.map +7 -0
  20. package/dist/account/notifications.js +59 -0
  21. package/dist/account/notifications.js.map +7 -0
  22. package/dist/account/password.js +103 -0
  23. package/dist/account/password.js.map +7 -0
  24. package/dist/account/profile.js +116 -0
  25. package/dist/account/profile.js.map +7 -0
  26. package/dist/account/recovery.js +13 -0
  27. package/dist/account/recovery.js.map +7 -0
  28. package/dist/account/relevance.js +82 -0
  29. package/dist/account/relevance.js.map +7 -0
  30. package/dist/account/sessions.js +37 -0
  31. package/dist/account/sessions.js.map +7 -0
  32. package/dist/account/settings.js +39 -0
  33. package/dist/account/settings.js.map +7 -0
  34. package/dist/account/table-views.js +16 -0
  35. package/dist/account/table-views.js.map +7 -0
  36. package/dist/ai/AiAnswer.js +83 -0
  37. package/dist/ai/AiAnswer.js.map +7 -0
  38. package/dist/ai/AiMarkdown.js +40 -0
  39. package/dist/ai/AiMarkdown.js.map +7 -0
  40. package/dist/ai/ArtifactCanvas.js +193 -0
  41. package/dist/ai/ArtifactCanvas.js.map +7 -0
  42. package/dist/ai/CitationRenderer.js +413 -0
  43. package/dist/ai/CitationRenderer.js.map +7 -0
  44. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  45. package/dist/ai/MarkdownRenderer.js.map +7 -0
  46. package/dist/ai/MessageArtifactCard.js +75 -0
  47. package/dist/ai/MessageArtifactCard.js.map +7 -0
  48. package/dist/ai/PassageCard.js +79 -0
  49. package/dist/ai/PassageCard.js.map +7 -0
  50. package/dist/ai/engine.js +110 -0
  51. package/dist/ai/engine.js.map +7 -0
  52. package/dist/ai/index.js +63 -0
  53. package/dist/ai/index.js.map +7 -0
  54. package/dist/ai/markdown-base-components.js +37 -0
  55. package/dist/ai/markdown-base-components.js.map +7 -0
  56. package/dist/ai/markdown-streaming-context.js +6 -0
  57. package/dist/ai/markdown-streaming-context.js.map +7 -0
  58. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  59. package/dist/ai/normalize-citations.js.map +7 -0
  60. package/dist/ai/redline.js +41 -0
  61. package/dist/ai/redline.js.map +7 -0
  62. package/dist/ai/split-markdown-blocks.js +40 -0
  63. package/dist/ai/split-markdown-blocks.js.map +7 -0
  64. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  65. package/dist/ai/stored-markdown.js.map +7 -0
  66. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  67. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  68. package/dist/annotations/AnnotationToolbar.js +398 -0
  69. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  70. package/dist/annotations/FreezeDialog.js +170 -0
  71. package/dist/annotations/FreezeDialog.js.map +7 -0
  72. package/dist/annotations/ProductionDialog.js +354 -0
  73. package/dist/annotations/ProductionDialog.js.map +7 -0
  74. package/dist/annotations/controller.js +49 -0
  75. package/dist/annotations/controller.js.map +7 -0
  76. package/dist/annotations/freeze/browser.js +21 -0
  77. package/dist/annotations/freeze/browser.js.map +7 -0
  78. package/dist/annotations/freeze/bundle.js +201 -0
  79. package/dist/annotations/freeze/bundle.js.map +7 -0
  80. package/dist/annotations/freeze/coords.js +37 -0
  81. package/dist/annotations/freeze/coords.js.map +7 -0
  82. package/dist/annotations/freeze/freeze.js +261 -0
  83. package/dist/annotations/freeze/freeze.js.map +7 -0
  84. package/dist/annotations/freeze/hash.js +28 -0
  85. package/dist/annotations/freeze/hash.js.map +7 -0
  86. package/dist/annotations/freeze/index-page.js +78 -0
  87. package/dist/annotations/freeze/index-page.js.map +7 -0
  88. package/dist/annotations/freeze/index.d.ts +1 -1
  89. package/dist/annotations/freeze/index.js +28 -22
  90. package/dist/annotations/freeze/index.js.map +7 -1
  91. package/dist/annotations/freeze/raster.js +208 -0
  92. package/dist/annotations/freeze/raster.js.map +7 -0
  93. package/dist/annotations/freeze/stamp.js +117 -0
  94. package/dist/annotations/freeze/stamp.js.map +7 -0
  95. package/dist/annotations/freeze/types.js +14 -0
  96. package/dist/annotations/freeze/types.js.map +7 -0
  97. package/dist/annotations/freeze/vector.js +283 -0
  98. package/dist/annotations/freeze/vector.js.map +7 -0
  99. package/dist/annotations/geometry.js +81 -0
  100. package/dist/annotations/geometry.js.map +7 -0
  101. package/dist/annotations/index.js +125 -6
  102. package/dist/annotations/index.js.map +7 -1
  103. package/dist/annotations/merge.js +53 -0
  104. package/dist/annotations/merge.js.map +7 -0
  105. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  106. package/dist/annotations/model.js.map +7 -0
  107. package/dist/annotations/overlay-geometry.js +41 -0
  108. package/dist/annotations/overlay-geometry.js.map +7 -0
  109. package/dist/annotations/redaction-log.js +33 -0
  110. package/dist/annotations/redaction-log.js.map +7 -0
  111. package/dist/annotations/selection-marks.js +122 -0
  112. package/dist/annotations/selection-marks.js.map +7 -0
  113. package/dist/annotations/state.js +140 -0
  114. package/dist/annotations/state.js.map +7 -0
  115. package/dist/annotations/store.js +49 -0
  116. package/dist/annotations/store.js.map +7 -0
  117. package/dist/annotations/useAnnotationLayer.js +306 -0
  118. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  119. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  120. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  121. package/dist/annotations/useTextSelectionMarks.js +100 -0
  122. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  123. package/dist/artifacts/artifact-kind.js +19 -0
  124. package/dist/artifacts/artifact-kind.js.map +7 -0
  125. package/dist/artifacts/index.cjs +13 -13
  126. package/dist/artifacts/index.js +89 -571
  127. package/dist/artifacts/index.js.map +7 -1
  128. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  129. package/dist/artifacts/normalize-markdown.js.map +7 -0
  130. package/dist/artifacts/redline-core.js +12 -3
  131. package/dist/artifacts/redline-core.js.map +7 -1
  132. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  133. package/dist/artifacts/redline-diff.js.map +7 -0
  134. package/dist/artifacts/redline-engine.js +14 -0
  135. package/dist/artifacts/redline-engine.js.map +7 -0
  136. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  137. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  138. package/dist/artifacts/useArtifactEditSession.js +183 -0
  139. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  140. package/dist/artifacts/useArtifactSession.js +173 -0
  141. package/dist/artifacts/useArtifactSession.js.map +7 -0
  142. package/dist/artifacts/useArtifactSource.js +16 -0
  143. package/dist/artifacts/useArtifactSource.js.map +7 -0
  144. package/dist/artifacts/useArtifactText.js +78 -0
  145. package/dist/artifacts/useArtifactText.js.map +7 -0
  146. package/dist/artifacts/useRedline.js +65 -0
  147. package/dist/artifacts/useRedline.js.map +7 -0
  148. package/dist/artifacts/useStreamedArtifact.js +74 -0
  149. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  150. package/dist/artifacts/versions.js +68 -0
  151. package/dist/artifacts/versions.js.map +7 -0
  152. package/dist/billing.js +200 -0
  153. package/dist/billing.js.map +7 -0
  154. package/dist/boot-timeout.js +19 -0
  155. package/dist/boot-timeout.js.map +7 -0
  156. package/dist/calendar/accounts.js +213 -0
  157. package/dist/calendar/accounts.js.map +7 -0
  158. package/dist/calendar/hooks.js +409 -0
  159. package/dist/calendar/hooks.js.map +7 -0
  160. package/dist/calendar/index.js +31 -0
  161. package/dist/calendar/index.js.map +7 -0
  162. package/dist/calendar/keys.js +5 -0
  163. package/dist/calendar/keys.js.map +7 -0
  164. package/dist/calendar/offline/outbox.js +231 -0
  165. package/dist/calendar/offline/outbox.js.map +7 -0
  166. package/dist/calendar/offline/runtime.js +109 -0
  167. package/dist/calendar/offline/runtime.js.map +7 -0
  168. package/dist/calendar/offline/support.js +41 -0
  169. package/dist/calendar/offline/support.js.map +7 -0
  170. package/dist/calendar/support.js +34 -0
  171. package/dist/calendar/support.js.map +7 -0
  172. package/dist/calls/actions.js +226 -0
  173. package/dist/calls/actions.js.map +7 -0
  174. package/dist/calls/events.js +138 -0
  175. package/dist/calls/events.js.map +7 -0
  176. package/dist/calls/gate.js +19 -0
  177. package/dist/calls/gate.js.map +7 -0
  178. package/dist/calls/hooks.js +115 -0
  179. package/dist/calls/hooks.js.map +7 -0
  180. package/dist/calls/in-call-chat.js +132 -0
  181. package/dist/calls/in-call-chat.js.map +7 -0
  182. package/dist/calls/index.js +24 -0
  183. package/dist/calls/index.js.map +7 -0
  184. package/dist/calls/keys.js +17 -0
  185. package/dist/calls/keys.js.map +7 -0
  186. package/dist/calls/livekit/index.cjs +48 -48
  187. package/dist/calls/livekit/index.js +6 -958
  188. package/dist/calls/livekit/index.js.map +7 -1
  189. package/dist/calls/livekit/room.js +98 -0
  190. package/dist/calls/livekit/room.js.map +7 -0
  191. package/dist/calls/livekit/useCallRecorder.js +219 -0
  192. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  193. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  194. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  195. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  196. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  197. package/dist/calls/livekit/useInCallChat.js +161 -0
  198. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  199. package/dist/calls/livekit/useWebinar.js +239 -0
  200. package/dist/calls/livekit/useWebinar.js.map +7 -0
  201. package/dist/calls/meeting-chat.js +149 -0
  202. package/dist/calls/meeting-chat.js.map +7 -0
  203. package/dist/calls/moderation.js +50 -0
  204. package/dist/calls/moderation.js.map +7 -0
  205. package/dist/calls/open-meeting-chat.js +29 -0
  206. package/dist/calls/open-meeting-chat.js.map +7 -0
  207. package/dist/calls/read-only.js +24 -0
  208. package/dist/calls/read-only.js.map +7 -0
  209. package/dist/calls/recording-media.js +218 -0
  210. package/dist/calls/recording-media.js.map +7 -0
  211. package/dist/calls/recording-playback.js +260 -0
  212. package/dist/calls/recording-playback.js.map +7 -0
  213. package/dist/calls/recording.js +268 -0
  214. package/dist/calls/recording.js.map +7 -0
  215. package/dist/calls/save-to-thread.js +80 -0
  216. package/dist/calls/save-to-thread.js.map +7 -0
  217. package/dist/calls/session.js +134 -0
  218. package/dist/calls/session.js.map +7 -0
  219. package/dist/calls/transcript-format.js +147 -0
  220. package/dist/calls/transcript-format.js.map +7 -0
  221. package/dist/calls/transcription.js +101 -0
  222. package/dist/calls/transcription.js.map +7 -0
  223. package/dist/calls/webinar.js +71 -0
  224. package/dist/calls/webinar.js.map +7 -0
  225. package/dist/charge-watch.js +71 -0
  226. package/dist/charge-watch.js.map +7 -0
  227. package/dist/chat/ChatBubble.js +146 -0
  228. package/dist/chat/ChatBubble.js.map +7 -0
  229. package/dist/chat/ConversationScope.js +30 -0
  230. package/dist/chat/ConversationScope.js.map +7 -0
  231. package/dist/chat/active-config.js +20 -0
  232. package/dist/chat/active-config.js.map +7 -0
  233. package/dist/chat/agent-chat-owner.js +25 -0
  234. package/dist/chat/agent-chat-owner.js.map +7 -0
  235. package/dist/chat/chat-artifacts.js +64 -0
  236. package/dist/chat/chat-artifacts.js.map +7 -0
  237. package/dist/chat/citations.js +32 -0
  238. package/dist/chat/citations.js.map +7 -0
  239. package/dist/chat/config-model.js +10 -0
  240. package/dist/chat/config-model.js.map +7 -0
  241. package/dist/chat/conversation-cache.js +676 -0
  242. package/dist/chat/conversation-cache.js.map +7 -0
  243. package/dist/chat/conversation-events.js +57 -0
  244. package/dist/chat/conversation-events.js.map +7 -0
  245. package/dist/chat/conversation-mentions.js +58 -0
  246. package/dist/chat/conversation-mentions.js.map +7 -0
  247. package/dist/chat/conversation-workspace.js +58 -0
  248. package/dist/chat/conversation-workspace.js.map +7 -0
  249. package/dist/chat/mentions.js +116 -0
  250. package/dist/chat/mentions.js.map +7 -0
  251. package/dist/chat/open-document.js +106 -0
  252. package/dist/chat/open-document.js.map +7 -0
  253. package/dist/chat/orphaned.js +44 -0
  254. package/dist/chat/orphaned.js.map +7 -0
  255. package/dist/chat/pendingFirstTurn.js +30 -0
  256. package/dist/chat/pendingFirstTurn.js.map +7 -0
  257. package/dist/chat/reply-target.js +12 -0
  258. package/dist/chat/reply-target.js.map +7 -0
  259. package/dist/chat/run-finished.js +28 -0
  260. package/dist/chat/run-finished.js.map +7 -0
  261. package/dist/chat/run-state.js +91 -0
  262. package/dist/chat/run-state.js.map +7 -0
  263. package/dist/chat/stream-handlers.js +419 -0
  264. package/dist/chat/stream-handlers.js.map +7 -0
  265. package/dist/chat/thread-binding.js +76 -0
  266. package/dist/chat/thread-binding.js.map +7 -0
  267. package/dist/chat/thread-document.js +53 -0
  268. package/dist/chat/thread-document.js.map +7 -0
  269. package/dist/chat/turn-control.js +79 -0
  270. package/dist/chat/turn-control.js.map +7 -0
  271. package/dist/chat/useAgentRunControl.js +36 -0
  272. package/dist/chat/useAgentRunControl.js.map +7 -0
  273. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  274. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  275. package/dist/chat/useAskAgain.js +32 -0
  276. package/dist/chat/useAskAgain.js.map +7 -0
  277. package/dist/chat/useAutoSendDraft.js +17 -0
  278. package/dist/chat/useAutoSendDraft.js.map +7 -0
  279. package/dist/chat/useBranchNavigation.js +97 -0
  280. package/dist/chat/useBranchNavigation.js.map +7 -0
  281. package/dist/chat/useConnectRunStream.js +169 -0
  282. package/dist/chat/useConnectRunStream.js.map +7 -0
  283. package/dist/chat/useConversation.js +431 -0
  284. package/dist/chat/useConversation.js.map +7 -0
  285. package/dist/chat/useConversationActions.js +662 -0
  286. package/dist/chat/useConversationActions.js.map +7 -0
  287. package/dist/chat/useConversationData.js +143 -0
  288. package/dist/chat/useConversationData.js.map +7 -0
  289. package/dist/chat/useConversationDocuments.js +41 -0
  290. package/dist/chat/useConversationDocuments.js.map +7 -0
  291. package/dist/chat/useConversationSettings.js +78 -0
  292. package/dist/chat/useConversationSettings.js.map +7 -0
  293. package/dist/chat/useConversationTurn.js +31 -0
  294. package/dist/chat/useConversationTurn.js.map +7 -0
  295. package/dist/chat/useConversationWorkspace.js +12 -0
  296. package/dist/chat/useConversationWorkspace.js.map +7 -0
  297. package/dist/chat/useDeleteMessage.js +15 -0
  298. package/dist/chat/useDeleteMessage.js.map +7 -0
  299. package/dist/chat/useDocumentAutoAdd.js +73 -0
  300. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  301. package/dist/chat/useMessageTimer.js +39 -0
  302. package/dist/chat/useMessageTimer.js.map +7 -0
  303. package/dist/chat/useThinkingContent.js +67 -0
  304. package/dist/chat/useThinkingContent.js.map +7 -0
  305. package/dist/chat/useThreadDocument.js +61 -0
  306. package/dist/chat/useThreadDocument.js.map +7 -0
  307. package/dist/chat/workflow-run-titles.js +50 -0
  308. package/dist/chat/workflow-run-titles.js.map +7 -0
  309. package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
  310. package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
  311. package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
  312. package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
  313. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  314. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  315. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  316. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  317. package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
  318. package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
  319. package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
  320. package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
  321. package/dist/chunk-PWGSIM3F.cjs +291 -0
  322. package/dist/chunk-PWGSIM3F.cjs.map +1 -0
  323. package/dist/chunk-QP3WQSAA.cjs +23 -0
  324. package/dist/chunk-QP3WQSAA.cjs.map +1 -0
  325. package/dist/chunk-T5FZICXN.cjs +50 -0
  326. package/dist/chunk-T5FZICXN.cjs.map +1 -0
  327. package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
  328. package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  329. package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
  330. package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
  331. package/dist/config/config-hooks.js +209 -0
  332. package/dist/config/config-hooks.js.map +7 -0
  333. package/dist/connectivity.js +72 -0
  334. package/dist/connectivity.js.map +7 -0
  335. package/dist/connectors/hooks.js +263 -0
  336. package/dist/connectors/hooks.js.map +7 -0
  337. package/dist/connectors/index.js +28 -0
  338. package/dist/connectors/index.js.map +7 -0
  339. package/dist/contacts.js +100 -0
  340. package/dist/contacts.js.map +7 -0
  341. package/dist/conversation-list.js +65 -0
  342. package/dist/conversation-list.js.map +7 -0
  343. package/dist/databases.js +195 -0
  344. package/dist/databases.js.map +7 -0
  345. package/dist/datasets/aggregate.js +281 -0
  346. package/dist/datasets/aggregate.js.map +7 -0
  347. package/dist/datasets/index.js +122 -0
  348. package/dist/datasets/index.js.map +7 -0
  349. package/dist/datasets/members.js +27 -0
  350. package/dist/datasets/members.js.map +7 -0
  351. package/dist/datasets/panel.js +44 -0
  352. package/dist/datasets/panel.js.map +7 -0
  353. package/dist/datasets/registry.js +47 -0
  354. package/dist/datasets/registry.js.map +7 -0
  355. package/dist/datasets/rows-source.js +44 -0
  356. package/dist/datasets/rows-source.js.map +7 -0
  357. package/dist/datasets/sources/activity.js +83 -0
  358. package/dist/datasets/sources/activity.js.map +7 -0
  359. package/dist/datasets/sources/conversations.js +74 -0
  360. package/dist/datasets/sources/conversations.js.map +7 -0
  361. package/dist/datasets/sources/database.js +209 -0
  362. package/dist/datasets/sources/database.js.map +7 -0
  363. package/dist/datasets/sources/documents.js +93 -0
  364. package/dist/datasets/sources/documents.js.map +7 -0
  365. package/dist/datasets/sources/facts.js +56 -0
  366. package/dist/datasets/sources/facts.js.map +7 -0
  367. package/dist/datasets/sources/projects.js +117 -0
  368. package/dist/datasets/sources/projects.js.map +7 -0
  369. package/dist/datasets/sources/tags.js +67 -0
  370. package/dist/datasets/sources/tags.js.map +7 -0
  371. package/dist/datasets/sources/usage.js +268 -0
  372. package/dist/datasets/sources/usage.js.map +7 -0
  373. package/dist/datasets/sources/workflows.js +91 -0
  374. package/dist/datasets/sources/workflows.js.map +7 -0
  375. package/dist/datasets/sources/workspaces.js +67 -0
  376. package/dist/datasets/sources/workspaces.js.map +7 -0
  377. package/dist/datasets/store.js +194 -0
  378. package/dist/datasets/store.js.map +7 -0
  379. package/dist/datasets/types.js +14 -0
  380. package/dist/datasets/types.js.map +7 -0
  381. package/dist/directmessages/ConversationList.js +148 -0
  382. package/dist/directmessages/ConversationList.js.map +7 -0
  383. package/dist/directmessages/DateSeparator.js +8 -0
  384. package/dist/directmessages/DateSeparator.js.map +7 -0
  385. package/dist/directmessages/DmAvatar.js +29 -0
  386. package/dist/directmessages/DmAvatar.js.map +7 -0
  387. package/dist/directmessages/DmComposer.js +201 -0
  388. package/dist/directmessages/DmComposer.js.map +7 -0
  389. package/dist/directmessages/arrivals.js +29 -0
  390. package/dist/directmessages/arrivals.js.map +7 -0
  391. package/dist/directmessages/chat-cache.js +192 -0
  392. package/dist/directmessages/chat-cache.js.map +7 -0
  393. package/dist/directmessages/grouping.js +26 -0
  394. package/dist/directmessages/grouping.js.map +7 -0
  395. package/dist/directmessages/index.js +81 -0
  396. package/dist/directmessages/index.js.map +7 -0
  397. package/dist/directmessages/useChats.js +266 -0
  398. package/dist/directmessages/useChats.js.map +7 -0
  399. package/dist/directmessages/utils.js +23 -0
  400. package/dist/directmessages/utils.js.map +7 -0
  401. package/dist/document-tools/can-annotate.js +7 -0
  402. package/dist/document-tools/can-annotate.js.map +7 -0
  403. package/dist/document-tools/core.cjs +99 -99
  404. package/dist/document-tools/core.d.ts +2 -2
  405. package/dist/document-tools/core.js +218 -12
  406. package/dist/document-tools/core.js.map +7 -1
  407. package/dist/document-tools/document-pdf.js +76 -0
  408. package/dist/document-tools/document-pdf.js.map +7 -0
  409. package/dist/document-tools/environment.js +136 -0
  410. package/dist/document-tools/environment.js.map +7 -0
  411. package/dist/document-tools/file-shares.js +112 -0
  412. package/dist/document-tools/file-shares.js.map +7 -0
  413. package/dist/document-tools/frozen-copy.js +27 -0
  414. package/dist/document-tools/frozen-copy.js.map +7 -0
  415. package/dist/document-tools/index.cjs +101 -101
  416. package/dist/document-tools/index.d.ts +1 -1
  417. package/dist/document-tools/index.js +26 -148
  418. package/dist/document-tools/index.js.map +7 -1
  419. package/dist/document-tools/markup-download.js +51 -0
  420. package/dist/document-tools/markup-download.js.map +7 -0
  421. package/dist/document-tools/markup-store.js +138 -0
  422. package/dist/document-tools/markup-store.js.map +7 -0
  423. package/dist/document-tools/markup-transfer.js +88 -0
  424. package/dist/document-tools/markup-transfer.js.map +7 -0
  425. package/dist/document-tools/production.js +147 -0
  426. package/dist/document-tools/production.js.map +7 -0
  427. package/dist/document-tools/saved-signature.js +90 -0
  428. package/dist/document-tools/saved-signature.js.map +7 -0
  429. package/dist/document-tools/signature-requests.js +310 -0
  430. package/dist/document-tools/signature-requests.js.map +7 -0
  431. package/dist/document-tools/signing.js +127 -0
  432. package/dist/document-tools/signing.js.map +7 -0
  433. package/dist/document-tools/useDocumentBytes.js +38 -0
  434. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  435. package/dist/document-tools/useDocumentMarkup.js +154 -0
  436. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  437. package/dist/document-tools/useIsOnline.js +13 -0
  438. package/dist/document-tools/useIsOnline.js.map +7 -0
  439. package/dist/document-tools/verification.js +60 -0
  440. package/dist/document-tools/verification.js.map +7 -0
  441. package/dist/documents/DocumentReview.js +220 -0
  442. package/dist/documents/DocumentReview.js.map +7 -0
  443. package/dist/documents/DraftTitleControls.js +41 -0
  444. package/dist/documents/DraftTitleControls.js.map +7 -0
  445. package/dist/documents/InlineMicButton.js +90 -0
  446. package/dist/documents/InlineMicButton.js.map +7 -0
  447. package/dist/documents/MicRecordingOverlay.js +29 -0
  448. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  449. package/dist/documents/MicWaveformIndicator.js +68 -0
  450. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  451. package/dist/documents/PhotoCapture.js +120 -0
  452. package/dist/documents/PhotoCapture.js.map +7 -0
  453. package/dist/documents/VideoCapture.js +129 -0
  454. package/dist/documents/VideoCapture.js.map +7 -0
  455. package/dist/documents/VoiceNoteRecorder.js +166 -0
  456. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  457. package/dist/documents/audio-segmenter.js +63 -0
  458. package/dist/documents/audio-segmenter.js.map +7 -0
  459. package/dist/documents/capture-frame.js +21 -0
  460. package/dist/documents/capture-frame.js.map +7 -0
  461. package/dist/documents/chunked-recorder.js +190 -0
  462. package/dist/documents/chunked-recorder.js.map +7 -0
  463. package/dist/documents/document-download.js +53 -0
  464. package/dist/documents/document-download.js.map +7 -0
  465. package/dist/documents/document-fields.js +109 -0
  466. package/dist/documents/document-fields.js.map +7 -0
  467. package/dist/documents/documents-cache.js +110 -0
  468. package/dist/documents/documents-cache.js.map +7 -0
  469. package/dist/documents/documents-data.js +128 -0
  470. package/dist/documents/documents-data.js.map +7 -0
  471. package/dist/documents/documents-loader.js +113 -0
  472. package/dist/documents/documents-loader.js.map +7 -0
  473. package/dist/documents/documents-writes.js +448 -0
  474. package/dist/documents/documents-writes.js.map +7 -0
  475. package/dist/documents/format-elapsed.js +10 -0
  476. package/dist/documents/format-elapsed.js.map +7 -0
  477. package/dist/documents/has-video-track.js +26 -0
  478. package/dist/documents/has-video-track.js.map +7 -0
  479. package/dist/documents/index.js +266 -0
  480. package/dist/documents/index.js.map +7 -0
  481. package/dist/documents/media-error.js +18 -0
  482. package/dist/documents/media-error.js.map +7 -0
  483. package/dist/documents/offline-documents.js +160 -0
  484. package/dist/documents/offline-documents.js.map +7 -0
  485. package/dist/documents/pending-sync.js +210 -0
  486. package/dist/documents/pending-sync.js.map +7 -0
  487. package/dist/documents/processing-live.js +122 -0
  488. package/dist/documents/processing-live.js.map +7 -0
  489. package/dist/documents/processing-order.js +59 -0
  490. package/dist/documents/processing-order.js.map +7 -0
  491. package/dist/documents/processing-settle.js +21 -0
  492. package/dist/documents/processing-settle.js.map +7 -0
  493. package/dist/documents/related-documents.js +133 -0
  494. package/dist/documents/related-documents.js.map +7 -0
  495. package/dist/documents/support.js +29 -0
  496. package/dist/documents/support.js.map +7 -0
  497. package/dist/documents/upload-files.js +169 -0
  498. package/dist/documents/upload-files.js.map +7 -0
  499. package/dist/documents/useAudioRecorder.js +315 -0
  500. package/dist/documents/useAudioRecorder.js.map +7 -0
  501. package/dist/documents/useCameraStream.js +35 -0
  502. package/dist/documents/useCameraStream.js.map +7 -0
  503. package/dist/documents/useDocumentThumbnails.js +71 -0
  504. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  505. package/dist/documents/useDownloadDocuments.js +90 -0
  506. package/dist/documents/useDownloadDocuments.js.map +7 -0
  507. package/dist/documents/usePassageQuotes.js +37 -0
  508. package/dist/documents/usePassageQuotes.js.map +7 -0
  509. package/dist/documents/useUploadFiles.js +165 -0
  510. package/dist/documents/useUploadFiles.js.map +7 -0
  511. package/dist/documents/useUploadFromUrls.js +63 -0
  512. package/dist/documents/useUploadFromUrls.js.map +7 -0
  513. package/dist/documents/useVideoRecorder.js +62 -0
  514. package/dist/documents/useVideoRecorder.js.map +7 -0
  515. package/dist/entities/AgentMarkers.js +61 -0
  516. package/dist/entities/AgentMarkers.js.map +7 -0
  517. package/dist/entities/DocumentEntity.js +125 -0
  518. package/dist/entities/DocumentEntity.js.map +7 -0
  519. package/dist/entities/EntityPill.js +250 -0
  520. package/dist/entities/EntityPill.js.map +7 -0
  521. package/dist/entities/ProjectEntity.js +61 -0
  522. package/dist/entities/ProjectEntity.js.map +7 -0
  523. package/dist/entities/ShieldIcon.js +49 -0
  524. package/dist/entities/ShieldIcon.js.map +7 -0
  525. package/dist/entities/TagEntity.js +79 -0
  526. package/dist/entities/TagEntity.js.map +7 -0
  527. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  528. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  529. package/dist/entities/UserEntity.js +211 -0
  530. package/dist/entities/UserEntity.js.map +7 -0
  531. package/dist/entities/VerifiedBadge.js +19 -0
  532. package/dist/entities/VerifiedBadge.js.map +7 -0
  533. package/dist/entities/agent-avatar-colors.js +26 -0
  534. package/dist/entities/agent-avatar-colors.js.map +7 -0
  535. package/dist/entities/colors.js +64 -0
  536. package/dist/entities/colors.js.map +7 -0
  537. package/dist/entities/file-type.js +151 -0
  538. package/dist/entities/file-type.js.map +7 -0
  539. package/dist/entities/index.js +100 -0
  540. package/dist/entities/index.js.map +7 -0
  541. package/dist/entities/media-type.js +61 -0
  542. package/dist/entities/media-type.js.map +7 -0
  543. package/dist/entities/registry.js +385 -0
  544. package/dist/entities/registry.js.map +7 -0
  545. package/dist/entities/status.js +43 -0
  546. package/dist/entities/status.js.map +7 -0
  547. package/dist/entities/tag-kinds.js +23 -0
  548. package/dist/entities/tag-kinds.js.map +7 -0
  549. package/dist/entities/tag-types.js +44 -0
  550. package/dist/entities/tag-types.js.map +7 -0
  551. package/dist/entities/vocabulary.js +12 -0
  552. package/dist/entities/vocabulary.js.map +7 -0
  553. package/dist/entity-extraction.js +25 -0
  554. package/dist/entity-extraction.js.map +7 -0
  555. package/dist/facts-search.js +57 -0
  556. package/dist/facts-search.js.map +7 -0
  557. package/dist/facts.js +69 -0
  558. package/dist/facts.js.map +7 -0
  559. package/dist/hooks.js +320 -0
  560. package/dist/hooks.js.map +7 -0
  561. package/dist/host/ArbiHost.js +24 -0
  562. package/dist/host/ArbiHost.js.map +7 -0
  563. package/dist/host/assistant-copy.js +54 -0
  564. package/dist/host/assistant-copy.js.map +7 -0
  565. package/dist/host/config.js +9 -0
  566. package/dist/host/config.js.map +7 -0
  567. package/dist/host/context.js +10 -0
  568. package/dist/host/context.js.map +7 -0
  569. package/dist/host/features.js +144 -0
  570. package/dist/host/features.js.map +7 -0
  571. package/dist/host/index.js +12 -0
  572. package/dist/host/index.js.map +7 -0
  573. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  574. package/dist/host/merge.js.map +7 -0
  575. package/dist/house-template.js +40 -0
  576. package/dist/house-template.js.map +7 -0
  577. package/dist/icons/AppleIcon.js +25 -0
  578. package/dist/icons/AppleIcon.js.map +7 -0
  579. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  580. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  581. package/dist/icons/ArbiIcon.js +24 -0
  582. package/dist/icons/ArbiIcon.js.map +7 -0
  583. package/dist/icons/AudIcon.js +56 -0
  584. package/dist/icons/AudIcon.js.map +7 -0
  585. package/dist/icons/ClaudeIcon.js +28 -0
  586. package/dist/icons/ClaudeIcon.js.map +7 -0
  587. package/dist/icons/DocIcon.js +56 -0
  588. package/dist/icons/DocIcon.js.map +7 -0
  589. package/dist/icons/EmlIcon.js +57 -0
  590. package/dist/icons/EmlIcon.js.map +7 -0
  591. package/dist/icons/FireworksIcon.js +47 -0
  592. package/dist/icons/FireworksIcon.js.map +7 -0
  593. package/dist/icons/GeminiIcon.js +37 -0
  594. package/dist/icons/GeminiIcon.js.map +7 -0
  595. package/dist/icons/GitHubIcon.js +32 -0
  596. package/dist/icons/GitHubIcon.js.map +7 -0
  597. package/dist/icons/GoogleIcon.js +53 -0
  598. package/dist/icons/GoogleIcon.js.map +7 -0
  599. package/dist/icons/HtmlIcon.js +56 -0
  600. package/dist/icons/HtmlIcon.js.map +7 -0
  601. package/dist/icons/ImgIcon.js +56 -0
  602. package/dist/icons/ImgIcon.js.map +7 -0
  603. package/dist/icons/LinkedInIcon.js +25 -0
  604. package/dist/icons/LinkedInIcon.js.map +7 -0
  605. package/dist/icons/OpenAIIcon.js +28 -0
  606. package/dist/icons/OpenAIIcon.js.map +7 -0
  607. package/dist/icons/PdfIcon.js +56 -0
  608. package/dist/icons/PdfIcon.js.map +7 -0
  609. package/dist/icons/ProviderIcon.js +42 -0
  610. package/dist/icons/ProviderIcon.js.map +7 -0
  611. package/dist/icons/TxtIcon.js +56 -0
  612. package/dist/icons/TxtIcon.js.map +7 -0
  613. package/dist/icons/VidIcon.js +56 -0
  614. package/dist/icons/VidIcon.js.map +7 -0
  615. package/dist/icons/XlsIcon.js +56 -0
  616. package/dist/icons/XlsIcon.js.map +7 -0
  617. package/dist/icons/arbi-mark.js +5 -0
  618. package/dist/icons/arbi-mark.js.map +7 -0
  619. package/dist/icons/colors.js +31 -0
  620. package/dist/icons/colors.js.map +7 -0
  621. package/dist/icons/file-type.js +105 -0
  622. package/dist/icons/file-type.js.map +7 -0
  623. package/dist/icons/index.js +55 -0
  624. package/dist/icons/index.js.map +7 -0
  625. package/dist/imagecrop/ImageCropModal.js +56 -0
  626. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  627. package/dist/imagecrop/ImageCropper.js +100 -0
  628. package/dist/imagecrop/ImageCropper.js.map +7 -0
  629. package/dist/imagecrop/cropImage.js +43 -0
  630. package/dist/imagecrop/cropImage.js.map +7 -0
  631. package/dist/imagecrop/index.js +13 -0
  632. package/dist/imagecrop/index.js.map +7 -0
  633. package/dist/index.cjs +1689 -1619
  634. package/dist/index.cjs.map +1 -1
  635. package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
  636. package/dist/index.d.ts +38 -8
  637. package/dist/index.js +702 -17060
  638. package/dist/index.js.map +7 -1
  639. package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
  640. package/dist/lazy-chunk.js +46 -0
  641. package/dist/lazy-chunk.js.map +7 -0
  642. package/dist/lib/collision-padding.js +13 -0
  643. package/dist/lib/collision-padding.js.map +7 -0
  644. package/dist/lib/format-friendly-date.js +55 -0
  645. package/dist/lib/format-friendly-date.js.map +7 -0
  646. package/dist/lib/format-relative-time.js +52 -0
  647. package/dist/lib/format-relative-time.js.map +7 -0
  648. package/dist/lib/markdown-to-text.js +35 -0
  649. package/dist/lib/markdown-to-text.js.map +7 -0
  650. package/dist/lib/toast-interaction.js +9 -0
  651. package/dist/lib/toast-interaction.js.map +7 -0
  652. package/dist/lib/utils.js +9 -0
  653. package/dist/lib/utils.js.map +7 -0
  654. package/dist/mail/client.js +103 -0
  655. package/dist/mail/client.js.map +7 -0
  656. package/dist/mail/document-attachment.js +38 -0
  657. package/dist/mail/document-attachment.js.map +7 -0
  658. package/dist/mail/filing.js +132 -0
  659. package/dist/mail/filing.js.map +7 -0
  660. package/dist/mail/hooks.js +393 -0
  661. package/dist/mail/hooks.js.map +7 -0
  662. package/dist/mail/index.js +120 -0
  663. package/dist/mail/index.js.map +7 -0
  664. package/dist/mail/offline/changes.js +258 -0
  665. package/dist/mail/offline/changes.js.map +7 -0
  666. package/dist/mail/offline/confirm-sign-out.js +37 -0
  667. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  668. package/dist/mail/offline/crypto.js +26 -0
  669. package/dist/mail/offline/crypto.js.map +7 -0
  670. package/dist/mail/offline/drafts.js +69 -0
  671. package/dist/mail/offline/drafts.js.map +7 -0
  672. package/dist/mail/offline/hooks.js +104 -0
  673. package/dist/mail/offline/hooks.js.map +7 -0
  674. package/dist/mail/offline/index.js +48 -0
  675. package/dist/mail/offline/index.js.map +7 -0
  676. package/dist/mail/offline/live.js +233 -0
  677. package/dist/mail/offline/live.js.map +7 -0
  678. package/dist/mail/offline/mailbox.js +191 -0
  679. package/dist/mail/offline/mailbox.js.map +7 -0
  680. package/dist/mail/offline/outbox.js +167 -0
  681. package/dist/mail/offline/outbox.js.map +7 -0
  682. package/dist/mail/offline/reads.js +159 -0
  683. package/dist/mail/offline/reads.js.map +7 -0
  684. package/dist/mail/offline/runtime.js +100 -0
  685. package/dist/mail/offline/runtime.js.map +7 -0
  686. package/dist/mail/offline/settings.js +84 -0
  687. package/dist/mail/offline/settings.js.map +7 -0
  688. package/dist/mail/offline/store.js +29 -0
  689. package/dist/mail/offline/store.js.map +7 -0
  690. package/dist/mail/offline/sync.js +251 -0
  691. package/dist/mail/offline/sync.js.map +7 -0
  692. package/dist/mail/offline/wipe.js +19 -0
  693. package/dist/mail/offline/wipe.js.map +7 -0
  694. package/dist/mail/thread-keys.js +53 -0
  695. package/dist/mail/thread-keys.js.map +7 -0
  696. package/dist/mail/threads.js +71 -0
  697. package/dist/mail/threads.js.map +7 -0
  698. package/dist/mail/useMailClient.js +42 -0
  699. package/dist/mail/useMailClient.js.map +7 -0
  700. package/dist/model-connections.js +58 -0
  701. package/dist/model-connections.js.map +7 -0
  702. package/dist/notifications/ActivityFeed.js +70 -0
  703. package/dist/notifications/ActivityFeed.js.map +7 -0
  704. package/dist/notifications/NotificationBell.js +200 -0
  705. package/dist/notifications/NotificationBell.js.map +7 -0
  706. package/dist/notifications/Toaster.js +24 -0
  707. package/dist/notifications/Toaster.js.map +7 -0
  708. package/dist/notifications/activity-types.js +65 -0
  709. package/dist/notifications/activity-types.js.map +7 -0
  710. package/dist/notifications/bell.js +24 -0
  711. package/dist/notifications/bell.js.map +7 -0
  712. package/dist/notifications/calendar-notifications.js +79 -0
  713. package/dist/notifications/calendar-notifications.js.map +7 -0
  714. package/dist/notifications/index.js +108 -0
  715. package/dist/notifications/index.js.map +7 -0
  716. package/dist/notifications/live.js +28 -0
  717. package/dist/notifications/live.js.map +7 -0
  718. package/dist/notifications/notification-types.js +127 -0
  719. package/dist/notifications/notification-types.js.map +7 -0
  720. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  721. package/dist/notifications/notify-store.js.map +7 -0
  722. package/dist/notifications/server-notifications.js +452 -0
  723. package/dist/notifications/server-notifications.js.map +7 -0
  724. package/dist/notifications/useNotifications.js +34 -0
  725. package/dist/notifications/useNotifications.js.map +7 -0
  726. package/dist/offline-store/network.js +11 -0
  727. package/dist/offline-store/network.js.map +7 -0
  728. package/dist/offline-store/store.js +136 -0
  729. package/dist/offline-store/store.js.map +7 -0
  730. package/dist/offline-store/wipe.js +8 -0
  731. package/dist/offline-store/wipe.js.map +7 -0
  732. package/dist/offline.js +58 -0
  733. package/dist/offline.js.map +7 -0
  734. package/dist/people.js +122 -0
  735. package/dist/people.js.map +7 -0
  736. package/dist/projects.js +30 -0
  737. package/dist/projects.js.map +7 -0
  738. package/dist/query-client.js +63 -0
  739. package/dist/query-client.js.map +7 -0
  740. package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
  741. package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
  742. package/dist/query-keys.js.map +7 -0
  743. package/dist/query-persist.js +66 -0
  744. package/dist/query-persist.js.map +7 -0
  745. package/dist/queued-writes.js +59 -0
  746. package/dist/queued-writes.js.map +7 -0
  747. package/dist/remote-control.js +67 -0
  748. package/dist/remote-control.js.map +7 -0
  749. package/dist/search/index.js +23 -0
  750. package/dist/search/index.js.map +7 -0
  751. package/dist/search/session.js +58 -0
  752. package/dist/search/session.js.map +7 -0
  753. package/dist/search/useSemanticSearch.js +82 -0
  754. package/dist/search/useSemanticSearch.js.map +7 -0
  755. package/dist/session/chat.js +512 -0
  756. package/dist/session/chat.js.map +7 -0
  757. package/dist/session/documents.js +196 -0
  758. package/dist/session/documents.js.map +7 -0
  759. package/dist/session/drafts.js +103 -0
  760. package/dist/session/drafts.js.map +7 -0
  761. package/dist/session/index.js +123 -0
  762. package/dist/session/index.js.map +7 -0
  763. package/dist/session/layout.js +339 -0
  764. package/dist/session/layout.js.map +7 -0
  765. package/dist/session/persist.js +106 -0
  766. package/dist/session/persist.js.map +7 -0
  767. package/dist/session/session-hooks.js +53 -0
  768. package/dist/session/session-hooks.js.map +7 -0
  769. package/dist/session/signed-in.js +36 -0
  770. package/dist/session/signed-in.js.map +7 -0
  771. package/dist/session/store.js +166 -0
  772. package/dist/session/store.js.map +7 -0
  773. package/dist/session/thread-tabs.js +121 -0
  774. package/dist/session/thread-tabs.js.map +7 -0
  775. package/dist/session/ui-state-storage.js +76 -0
  776. package/dist/session/ui-state-storage.js.map +7 -0
  777. package/dist/session/workspace.js +77 -0
  778. package/dist/session/workspace.js.map +7 -0
  779. package/dist/shell/index.cjs +37 -37
  780. package/dist/shell/index.js +43 -10
  781. package/dist/shell/index.js.map +7 -1
  782. package/dist/skill-pack.js +111 -0
  783. package/dist/skill-pack.js.map +7 -0
  784. package/dist/storage.js +186 -0
  785. package/dist/storage.js.map +7 -0
  786. package/dist/support/index.js +35 -0
  787. package/dist/support/index.js.map +7 -0
  788. package/dist/tags.js +204 -0
  789. package/dist/tags.js.map +7 -0
  790. package/dist/ui/DebouncedInput.js +109 -0
  791. package/dist/ui/DebouncedInput.js.map +7 -0
  792. package/dist/ui/DictateContext.js +8 -0
  793. package/dist/ui/DictateContext.js.map +7 -0
  794. package/dist/ui/IconToggle.js +79 -0
  795. package/dist/ui/IconToggle.js.map +7 -0
  796. package/dist/ui/VerifiedToggle.js +38 -0
  797. package/dist/ui/VerifiedToggle.js.map +7 -0
  798. package/dist/ui/VisibilityToggle.js +103 -0
  799. package/dist/ui/VisibilityToggle.js.map +7 -0
  800. package/dist/ui/avatar.js +40 -0
  801. package/dist/ui/avatar.js.map +7 -0
  802. package/dist/ui/badge.js +28 -0
  803. package/dist/ui/badge.js.map +7 -0
  804. package/dist/ui/button.js +48 -0
  805. package/dist/ui/button.js.map +7 -0
  806. package/dist/ui/card.js +90 -0
  807. package/dist/ui/card.js.map +7 -0
  808. package/dist/ui/checkbox.js +22 -0
  809. package/dist/ui/checkbox.js.map +7 -0
  810. package/dist/ui/collapsible.js +10 -0
  811. package/dist/ui/collapsible.js.map +7 -0
  812. package/dist/ui/command.js +103 -0
  813. package/dist/ui/command.js.map +7 -0
  814. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  815. package/dist/ui/dialog.js.map +7 -0
  816. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  817. package/dist/ui/dropdown-menu.js.map +7 -0
  818. package/dist/ui/hover-card.js +36 -0
  819. package/dist/ui/hover-card.js.map +7 -0
  820. package/dist/ui/index.cjs +167 -154
  821. package/dist/ui/index.d.ts +2 -1
  822. package/dist/ui/index.js +290 -9
  823. package/dist/ui/index.js.map +7 -1
  824. package/dist/ui/input.js +65 -0
  825. package/dist/ui/input.js.map +7 -0
  826. package/dist/ui/label.js +16 -0
  827. package/dist/ui/label.js.map +7 -0
  828. package/dist/ui/mark-menu.js +300 -0
  829. package/dist/ui/mark-menu.js.map +7 -0
  830. package/dist/ui/popover.js +40 -0
  831. package/dist/ui/popover.js.map +7 -0
  832. package/dist/ui/portal-container.js +17 -0
  833. package/dist/ui/portal-container.js.map +7 -0
  834. package/dist/ui/progress.js +24 -0
  835. package/dist/ui/progress.js.map +7 -0
  836. package/dist/ui/radio-group.js +29 -0
  837. package/dist/ui/radio-group.js.map +7 -0
  838. package/dist/ui/scroll-area.js +39 -0
  839. package/dist/ui/scroll-area.js.map +7 -0
  840. package/dist/ui/select.js +130 -0
  841. package/dist/ui/select.js.map +7 -0
  842. package/dist/ui/separator.js +23 -0
  843. package/dist/ui/separator.js.map +7 -0
  844. package/dist/ui/slider.js +23 -0
  845. package/dist/ui/slider.js.map +7 -0
  846. package/dist/ui/switch.js +28 -0
  847. package/dist/ui/switch.js.map +7 -0
  848. package/dist/ui/table.js +75 -0
  849. package/dist/ui/table.js.map +7 -0
  850. package/dist/ui/tabs.js +48 -0
  851. package/dist/ui/tabs.js.map +7 -0
  852. package/dist/ui/textarea.js +63 -0
  853. package/dist/ui/textarea.js.map +7 -0
  854. package/dist/ui/toggle-group.js +43 -0
  855. package/dist/ui/toggle-group.js.map +7 -0
  856. package/dist/ui/toggle.js +40 -0
  857. package/dist/ui/toggle.js.map +7 -0
  858. package/dist/ui/tooltip.js +215 -0
  859. package/dist/ui/tooltip.js.map +7 -0
  860. package/dist/usage-metered.js +8 -0
  861. package/dist/usage-metered.js.map +7 -0
  862. package/dist/useArbi.js +16 -0
  863. package/dist/useArbi.js.map +7 -0
  864. package/dist/useInstallSkillPack.js +81 -0
  865. package/dist/useInstallSkillPack.js.map +7 -0
  866. package/dist/usermenu/UserMenu.js +188 -0
  867. package/dist/usermenu/UserMenu.js.map +7 -0
  868. package/dist/usermenu/index.js +5 -0
  869. package/dist/usermenu/index.js.map +7 -0
  870. package/dist/users/index.js +15 -0
  871. package/dist/users/index.js.map +7 -0
  872. package/dist/users/user-display.js +60 -0
  873. package/dist/users/user-display.js.map +7 -0
  874. package/dist/viewers/AudioViewer.js +23 -0
  875. package/dist/viewers/AudioViewer.js.map +7 -0
  876. package/dist/viewers/DocxViewer.js +81 -0
  877. package/dist/viewers/DocxViewer.js.map +7 -0
  878. package/dist/viewers/ImageViewer.js +31 -0
  879. package/dist/viewers/ImageViewer.js.map +7 -0
  880. package/dist/viewers/PdfViewer.cjs +17 -0
  881. package/dist/viewers/PdfViewer.cjs.map +1 -0
  882. package/dist/viewers/PdfViewer.d.ts +9 -0
  883. package/dist/viewers/PdfViewer.js +20 -0
  884. package/dist/viewers/PdfViewer.js.map +7 -0
  885. package/dist/viewers/PdfViewerImpl.js +384 -0
  886. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  887. package/dist/viewers/VideoViewer.js +31 -0
  888. package/dist/viewers/VideoViewer.js.map +7 -0
  889. package/dist/viewers/XlsxViewer.js +102 -0
  890. package/dist/viewers/XlsxViewer.js.map +7 -0
  891. package/dist/viewers/index.cjs +79 -653
  892. package/dist/viewers/index.cjs.map +1 -1
  893. package/dist/viewers/index.d.ts +3 -1
  894. package/dist/viewers/index.js +60 -903
  895. package/dist/viewers/index.js.map +7 -1
  896. package/dist/viewers/page-scroll.js +59 -0
  897. package/dist/viewers/page-scroll.js.map +7 -0
  898. package/dist/viewers/pdf-viewer-constants.js +9 -0
  899. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  900. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  901. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  902. package/dist/viewers/selection-runs.js +38 -0
  903. package/dist/viewers/selection-runs.js.map +7 -0
  904. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  905. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  906. package/dist/viewers/useProcessedChunks.js +58 -0
  907. package/dist/viewers/useProcessedChunks.js.map +7 -0
  908. package/dist/viewers/viewer-zoom.js +163 -0
  909. package/dist/viewers/viewer-zoom.js.map +7 -0
  910. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  911. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  912. package/dist/websocket/context.js +14 -0
  913. package/dist/websocket/context.js.map +7 -0
  914. package/dist/websocket/hooks.js +30 -0
  915. package/dist/websocket/hooks.js.map +7 -0
  916. package/dist/websocket/index.js +22 -0
  917. package/dist/websocket/index.js.map +7 -0
  918. package/dist/websocket/live-updates.js +38 -0
  919. package/dist/websocket/live-updates.js.map +7 -0
  920. package/dist/websocket/reconnect.js +13 -0
  921. package/dist/websocket/reconnect.js.map +7 -0
  922. package/dist/websocket/store.js +58 -0
  923. package/dist/websocket/store.js.map +7 -0
  924. package/dist/workforce.js +607 -0
  925. package/dist/workforce.js.map +7 -0
  926. package/dist/workspaces/access-request.js +35 -0
  927. package/dist/workspaces/access-request.js.map +7 -0
  928. package/dist/workspaces/archive.js +59 -0
  929. package/dist/workspaces/archive.js.map +7 -0
  930. package/dist/workspaces/current.js +20 -0
  931. package/dist/workspaces/current.js.map +7 -0
  932. package/dist/workspaces/delete-workspaces.js +15 -0
  933. package/dist/workspaces/delete-workspaces.js.map +7 -0
  934. package/dist/workspaces/export-archive.js +40 -0
  935. package/dist/workspaces/export-archive.js.map +7 -0
  936. package/dist/workspaces/index.js +99 -0
  937. package/dist/workspaces/index.js.map +7 -0
  938. package/dist/workspaces/settings.js +45 -0
  939. package/dist/workspaces/settings.js.map +7 -0
  940. package/dist/workspaces/shell-workspaces.js +49 -0
  941. package/dist/workspaces/shell-workspaces.js.map +7 -0
  942. package/dist/workspaces/switch.js +234 -0
  943. package/dist/workspaces/switch.js.map +7 -0
  944. package/dist/workspaces/transfer.js +170 -0
  945. package/dist/workspaces/transfer.js.map +7 -0
  946. package/dist/workspaces/useShellWorkspaces.js +86 -0
  947. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  948. package/dist/workspaces/workspace-users.js +65 -0
  949. package/dist/workspaces/workspace-users.js.map +7 -0
  950. package/package.json +12 -4
  951. package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
  952. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  953. package/dist/annotations/freeze/index.d.cts +0 -205
  954. package/dist/annotations/index.d.cts +0 -360
  955. package/dist/artifacts/index.d.cts +0 -476
  956. package/dist/artifacts/redline-core.d.cts +0 -39
  957. package/dist/bundle-YNOX7VIL.js +0 -5
  958. package/dist/bundle-YNOX7VIL.js.map +0 -1
  959. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  960. package/dist/calls/livekit/index.d.cts +0 -280
  961. package/dist/chunk-47CCGUWR.js.map +0 -1
  962. package/dist/chunk-6H3O63TQ.js.map +0 -1
  963. package/dist/chunk-74N436VK.js.map +0 -1
  964. package/dist/chunk-APZZQZ6P.js +0 -147
  965. package/dist/chunk-APZZQZ6P.js.map +0 -1
  966. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  967. package/dist/chunk-CPQ3CU4B.js +0 -246
  968. package/dist/chunk-CPQ3CU4B.js.map +0 -1
  969. package/dist/chunk-DPYBZDJB.js.map +0 -1
  970. package/dist/chunk-DQALOQPI.js +0 -2766
  971. package/dist/chunk-DQALOQPI.js.map +0 -1
  972. package/dist/chunk-FZJMA32S.js +0 -1011
  973. package/dist/chunk-FZJMA32S.js.map +0 -1
  974. package/dist/chunk-H5M7FXLB.js +0 -2057
  975. package/dist/chunk-H5M7FXLB.js.map +0 -1
  976. package/dist/chunk-HDCRPPBW.js +0 -75
  977. package/dist/chunk-HDCRPPBW.js.map +0 -1
  978. package/dist/chunk-NIKPG4PW.js +0 -1128
  979. package/dist/chunk-NIKPG4PW.js.map +0 -1
  980. package/dist/chunk-NNAJLY6B.js +0 -4974
  981. package/dist/chunk-NNAJLY6B.js.map +0 -1
  982. package/dist/chunk-OYPKKHXY.js +0 -559
  983. package/dist/chunk-OYPKKHXY.js.map +0 -1
  984. package/dist/chunk-P6WLV5UY.js +0 -644
  985. package/dist/chunk-P6WLV5UY.js.map +0 -1
  986. package/dist/chunk-PTOP7OHG.js.map +0 -1
  987. package/dist/chunk-SN5YV6FF.js +0 -11
  988. package/dist/chunk-SN5YV6FF.js.map +0 -1
  989. package/dist/chunk-T3USOSVN.js.map +0 -1
  990. package/dist/chunk-T4CLW3DN.js +0 -2560
  991. package/dist/chunk-T4CLW3DN.js.map +0 -1
  992. package/dist/chunk-UW2SGTI5.js.map +0 -1
  993. package/dist/chunk-VSCU7K4V.js.map +0 -1
  994. package/dist/chunk-WL2Y2T47.js.map +0 -1
  995. package/dist/chunk-WUTL62MC.js.map +0 -1
  996. package/dist/chunk-Y3MTRA7D.js +0 -97
  997. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  998. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  999. package/dist/document-tools/core.d.cts +0 -883
  1000. package/dist/document-tools/index.d.cts +0 -90
  1001. package/dist/index.d-BMhTH98a.d.cts +0 -2035
  1002. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  1003. package/dist/index.d.cts +0 -15893
  1004. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  1005. package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
  1006. package/dist/shell/index.d.cts +0 -6
  1007. package/dist/store.d-GADDvC7w.d.cts +0 -35
  1008. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  1009. package/dist/ui/index.d.cts +0 -25
  1010. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  1011. package/dist/viewers/index.d.cts +0 -260
@@ -0,0 +1,104 @@
1
+ import { useCallback, useEffect, useMemo, useState, useSyncExternalStore } from "react";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+ import { logger } from "@arbidocs/client";
4
+ import { useArbi } from "../../useArbi.js";
5
+ import { useArbiSession } from "../../session/signed-in.js";
6
+ import { listLocalDrafts } from "./drafts.js";
7
+ import { flushOutbox, isMailSyncRunning, syncOfflineMailbox } from "./live.js";
8
+ import { listOutbox } from "./outbox.js";
9
+ import { listMailChanges } from "./changes.js";
10
+ import {
11
+ getOfflineMailSettings,
12
+ onOfflineMailChange,
13
+ setOfflineMailSettings
14
+ } from "./settings.js";
15
+ import { getOfflineMailStatus } from "./sync.js";
16
+ function useStoreValue(load, initial, changes) {
17
+ const [value, setValue] = useState(initial);
18
+ const key = changes.join(",");
19
+ useEffect(() => {
20
+ let alive = true;
21
+ const read = () => load().then((next) => alive && setValue(next)).catch((error) => logger.warn("[offline-mail] read failed", error));
22
+ void read();
23
+ const off = onOfflineMailChange((change) => {
24
+ if (change === "wiped") setValue(initial);
25
+ if (change === "wiped" || key.split(",").includes(change)) void read();
26
+ });
27
+ return () => {
28
+ alive = false;
29
+ off();
30
+ };
31
+ }, [key, load, initial]);
32
+ return value;
33
+ }
34
+ function useOfflineMailSettings() {
35
+ const userExtId = useArbiSession().user?.external_id;
36
+ const subscribe = useCallback(
37
+ (onChange) => onOfflineMailChange((change) => {
38
+ if (change === "settings") onChange();
39
+ }),
40
+ []
41
+ );
42
+ const raw = useSyncExternalStore(
43
+ subscribe,
44
+ () => JSON.stringify([userExtId, getOfflineMailSettings(userExtId)])
45
+ );
46
+ const settings = useMemo(() => JSON.parse(raw)[1], [raw]);
47
+ const update = useCallback(
48
+ (patch) => void setOfflineMailSettings(userExtId, patch),
49
+ [userExtId]
50
+ );
51
+ return [settings, update];
52
+ }
53
+ const EMPTY_STATUS = { messages: 0, bytes: 0, skipped: [] };
54
+ function useOfflineMailStatus() {
55
+ const status = useStoreValue(getOfflineMailStatus, EMPTY_STATUS, ["status", "mailbox"]);
56
+ const [syncing, setSyncing] = useState(isMailSyncRunning);
57
+ useEffect(
58
+ () => onOfflineMailChange((change) => {
59
+ if (change === "status") setSyncing(isMailSyncRunning());
60
+ }),
61
+ []
62
+ );
63
+ return { ...status, syncing };
64
+ }
65
+ const NO_ITEMS = [];
66
+ function useOutbox(enabled = true) {
67
+ const load = useCallback(() => enabled ? listOutbox() : Promise.resolve(NO_ITEMS), [enabled]);
68
+ return useStoreValue(load, NO_ITEMS, ["outbox"]);
69
+ }
70
+ const NO_CHANGES = [];
71
+ function usePendingMailChanges(enabled = true) {
72
+ const load = useCallback(
73
+ () => enabled ? listMailChanges() : Promise.resolve(NO_CHANGES),
74
+ [enabled]
75
+ );
76
+ return useStoreValue(load, NO_CHANGES, ["changes"]);
77
+ }
78
+ const NO_DRAFTS = [];
79
+ function useLocalDrafts(accountId) {
80
+ const load = useCallback(
81
+ () => accountId ? listLocalDrafts(accountId) : Promise.resolve(NO_DRAFTS),
82
+ [accountId]
83
+ );
84
+ return useStoreValue(load, NO_DRAFTS, ["drafts"]);
85
+ }
86
+ function useFlushOutbox() {
87
+ const arbi = useArbi();
88
+ const queryClient = useQueryClient();
89
+ return useCallback(() => flushOutbox({ arbi, queryClient }), [arbi, queryClient]);
90
+ }
91
+ function useSyncOfflineMailbox() {
92
+ const arbi = useArbi();
93
+ return useCallback((options) => syncOfflineMailbox({ arbi }, options), [arbi]);
94
+ }
95
+ export {
96
+ useFlushOutbox,
97
+ useLocalDrafts,
98
+ useOfflineMailSettings,
99
+ useOfflineMailStatus,
100
+ useOutbox,
101
+ usePendingMailChanges,
102
+ useSyncOfflineMailbox
103
+ };
104
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mail/offline/hooks.ts"],
4
+ "sourcesContent": ["/**\n * React bindings for the offline mailbox: the per-device settings, sync status, the Outbox, the\n * changes made offline and the drafts kept on this device. Every hook re-reads when the store changes in this tab or another.\n */\n\nimport { useCallback, useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { logger } from '@arbidocs/client'\nimport { useArbi } from '../../useArbi'\nimport { useArbiSession } from '../../session/signed-in'\nimport { listLocalDrafts, type LocalDraft } from './drafts'\nimport { flushOutbox, isMailSyncRunning, syncOfflineMailbox } from './live'\nimport { listOutbox, type OutboxItem } from './outbox'\nimport { listMailChanges, type PendingMailChange } from './changes'\nimport {\n getOfflineMailSettings,\n onOfflineMailChange,\n setOfflineMailSettings,\n type OfflineMailChange,\n type OfflineMailSettings,\n} from './settings'\nimport { getOfflineMailStatus, type OfflineMailStatus } from './sync'\n\n/** Re-run `load` on mount and whenever one of `changes` happens; errors leave the last value. */\nfunction useStoreValue<T>(load: () => Promise<T>, initial: T, changes: OfflineMailChange[]): T {\n const [value, setValue] = useState<T>(initial)\n const key = changes.join(',')\n useEffect(() => {\n let alive = true\n const read = () =>\n load()\n .then((next) => alive && setValue(next))\n .catch((error) => logger.warn('[offline-mail] read failed', error))\n void read()\n const off = onOfflineMailChange((change) => {\n if (change === 'wiped') setValue(initial)\n if (change === 'wiped' || key.split(',').includes(change)) void read()\n })\n return () => {\n alive = false\n off()\n }\n }, [key, load, initial])\n return value\n}\n\nexport function useOfflineMailSettings(): [\n OfflineMailSettings,\n (patch: Partial<OfflineMailSettings>) => void,\n] {\n const userExtId = useArbiSession().user?.external_id\n const subscribe = useCallback(\n (onChange: () => void) =>\n onOfflineMailChange((change) => {\n if (change === 'settings') onChange()\n }),\n []\n )\n // Snapshot as a string so useSyncExternalStore sees a stable value between changes; the user is\n // part of it because the settings are per user.\n const raw = useSyncExternalStore(subscribe, () =>\n JSON.stringify([userExtId, getOfflineMailSettings(userExtId)])\n )\n const settings = useMemo(() => (JSON.parse(raw) as [unknown, OfflineMailSettings])[1], [raw])\n const update = useCallback(\n (patch: Partial<OfflineMailSettings>) => void setOfflineMailSettings(userExtId, patch),\n [userExtId]\n )\n return [settings, update]\n}\n\nconst EMPTY_STATUS: OfflineMailStatus = { messages: 0, bytes: 0, skipped: [] }\n\nexport function useOfflineMailStatus(): OfflineMailStatus & { syncing: boolean } {\n const status = useStoreValue(getOfflineMailStatus, EMPTY_STATUS, ['status', 'mailbox'])\n const [syncing, setSyncing] = useState(isMailSyncRunning)\n useEffect(\n () =>\n onOfflineMailChange((change) => {\n if (change === 'status') setSyncing(isMailSyncRunning())\n }),\n []\n )\n return { ...status, syncing }\n}\n\nconst NO_ITEMS: OutboxItem[] = []\n/** The Outbox, oldest first. `enabled: false` skips reading the store (Mail switched off). */\nexport function useOutbox(enabled = true): OutboxItem[] {\n const load = useCallback(() => (enabled ? listOutbox() : Promise.resolve(NO_ITEMS)), [enabled])\n return useStoreValue(load, NO_ITEMS, ['outbox'])\n}\n\nconst NO_CHANGES: PendingMailChange[] = []\n/**\n * The changes made offline that wait for a connection, oldest first. `enabled: false` skips\n * reading the store (Mail switched off).\n */\nexport function usePendingMailChanges(enabled = true): PendingMailChange[] {\n const load = useCallback(\n () => (enabled ? listMailChanges() : Promise.resolve(NO_CHANGES)),\n [enabled]\n )\n return useStoreValue(load, NO_CHANGES, ['changes'])\n}\n\nconst NO_DRAFTS: LocalDraft[] = []\nexport function useLocalDrafts(accountId: string | undefined): LocalDraft[] {\n const load = useCallback(\n () => (accountId ? listLocalDrafts(accountId) : Promise.resolve(NO_DRAFTS)),\n [accountId]\n )\n return useStoreValue(load, NO_DRAFTS, ['drafts'])\n}\n\n/** Send what waits in the Outbox now (\"Send now\"), on the session in scope. */\nexport function useFlushOutbox(): () => Promise<void> {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n return useCallback(() => flushOutbox({ arbi, queryClient }), [arbi, queryClient])\n}\n\n/** One sync pass of the offline mailbox now (\"Sync now\": `{ full: true }`). */\nexport function useSyncOfflineMailbox(): (options?: { full?: boolean }) => Promise<void> {\n const arbi = useArbi()\n return useCallback((options) => syncOfflineMailbox({ arbi }, options), [arbi])\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,48 @@
1
+ import { offlineMailReads } from "./reads.js";
2
+ import {
3
+ useOfflineMailActive,
4
+ useOfflineMailRuntime
5
+ } from "./runtime.js";
6
+ import {
7
+ useOfflineMailSettings,
8
+ useOfflineMailStatus,
9
+ useOutbox,
10
+ usePendingMailChanges,
11
+ useLocalDrafts,
12
+ useFlushOutbox,
13
+ useSyncOfflineMailbox
14
+ } from "./hooks.js";
15
+ import { OUTBOX_FOLDER } from "./live.js";
16
+ import { enqueueOutbox, deleteOutboxItem, retryOutboxItem } from "./outbox.js";
17
+ import { saveLocalDraft, deleteLocalDraft } from "./drafts.js";
18
+ import {
19
+ hasPendingMailChange,
20
+ queueMailChange
21
+ } from "./changes.js";
22
+ import { loadAttachment } from "./mailbox.js";
23
+ import { wipeOfflineMail } from "./wipe.js";
24
+ import { confirmLosingOfflineMail } from "./confirm-sign-out.js";
25
+ export {
26
+ OUTBOX_FOLDER,
27
+ confirmLosingOfflineMail,
28
+ deleteLocalDraft,
29
+ deleteOutboxItem,
30
+ enqueueOutbox,
31
+ hasPendingMailChange,
32
+ loadAttachment as loadOfflineMailAttachment,
33
+ offlineMailReads,
34
+ queueMailChange,
35
+ retryOutboxItem,
36
+ saveLocalDraft,
37
+ useFlushOutbox,
38
+ useLocalDrafts,
39
+ useOfflineMailActive,
40
+ useOfflineMailRuntime,
41
+ useOfflineMailSettings,
42
+ useOfflineMailStatus,
43
+ useOutbox,
44
+ usePendingMailChanges,
45
+ useSyncOfflineMailbox,
46
+ wipeOfflineMail
47
+ };
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mail/offline/index.ts"],
4
+ "sourcesContent": ["/**\n * Mail kept on this device: reading offline (the last 7 days by default, adjustable per device),\n * the Outbox (sends that wait for a connection and go out exactly once, in order), changes made\n * offline (read, moved, trashed, deleted; applied in order on reconnect), drafts written offline,\n * and the sync that keeps the device copy current. All\n * of it is sealed at rest to the signed-in user's key (`arbi-offline-mail-v1`), bound to that\n * account, and removed on sign-out (`wipeOfflineMail`).\n *\n * A host turns it on with three pieces: `offlineMailReads` as its mail client's reads, the\n * `useOfflineMailRuntime` hook mounted once, and `wipeOfflineMail` on sign-out. The mailbox kit's\n * device storage (`offlineMailSupport` in `@arbidocs/blocks/connect`) is built on the rest.\n */\n\nexport { offlineMailReads, type OfflineMailReadsOptions } from './reads'\nexport {\n useOfflineMailActive,\n useOfflineMailRuntime,\n type OfflineMailRuntimeOptions,\n} from './runtime'\nexport {\n useOfflineMailSettings,\n useOfflineMailStatus,\n useOutbox,\n usePendingMailChanges,\n useLocalDrafts,\n useFlushOutbox,\n useSyncOfflineMailbox,\n} from './hooks'\nexport { OUTBOX_FOLDER } from './live'\nexport { enqueueOutbox, deleteOutboxItem, retryOutboxItem, type OutboxItem } from './outbox'\nexport { saveLocalDraft, deleteLocalDraft, type LocalDraft } from './drafts'\nexport {\n hasPendingMailChange,\n queueMailChange,\n type MailChange,\n type PendingMailChange,\n} from './changes'\nexport { loadAttachment as loadOfflineMailAttachment } from './mailbox'\nexport { type OfflineMailScope, type OfflineMailSettings } from './settings'\nexport { type OfflineMailStatus } from './sync'\nexport { wipeOfflineMail } from './wipe'\nexport { confirmLosingOfflineMail } from './confirm-sign-out'\n"],
5
+ "mappings": "AAaA,SAAS,wBAAsD;AAC/D;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAC9B,SAAS,eAAe,kBAAkB,uBAAwC;AAClF,SAAS,gBAAgB,wBAAyC;AAClE;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAA2B,sBAAiC;AAG5D,SAAS,uBAAuB;AAChC,SAAS,gCAAgC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,233 @@
1
+ import { sendMailFile } from "../filing.js";
2
+ import { primeOnArbi } from "../../queued-writes.js";
3
+ import { onlineManager } from "@tanstack/react-query";
4
+ import { logger } from "@arbidocs/client";
5
+ import { notify } from "../../notifications/notify-store.js";
6
+ import { accountPath, mailJson } from "../client.js";
7
+ import { mailQueryKeys } from "../hooks.js";
8
+ import { syncLocalDrafts } from "./drafts.js";
9
+ import { applyMailChangesOnce } from "./changes.js";
10
+ import { flushOutboxOnce, listOutbox, purgeSentOutbox } from "./outbox.js";
11
+ import { getOfflineMailSettings, notifyOfflineMailChange } from "./settings.js";
12
+ import { requestPersistentStorage } from "../../documents/offline-documents.js";
13
+ import { syncMailbox } from "./sync.js";
14
+ const OUTBOX_FOLDER = "outbox";
15
+ function sessionUser(arbi) {
16
+ return arbi.session?.getState().user?.external_id ?? null;
17
+ }
18
+ function hasLiveSession(arbi) {
19
+ return !!arbi.session?.getState().serverSessionKey;
20
+ }
21
+ function canReachMail(arbi) {
22
+ return onlineManager.isOnline() && hasLiveSession(arbi);
23
+ }
24
+ const unlocked = { nativeUnlocked: true };
25
+ function mailCall(arbi, path, init = {}) {
26
+ return mailJson((p, i) => arbi.mail.fetch(p, i, unlocked), path, init);
27
+ }
28
+ function liveTransport(arbi) {
29
+ const unlock = async (account) => {
30
+ if (!hasLiveSession(arbi))
31
+ throw Object.assign(new Error("Sign in to unlock your mailbox"), { status: 401 });
32
+ await arbi.mail.unlockAccount(account);
33
+ };
34
+ return {
35
+ policy: () => mailCall(arbi, "/policy"),
36
+ accounts: () => mailCall(arbi, "/accounts"),
37
+ unlock,
38
+ folders: (account) => mailCall(arbi, `${accountPath(account.id)}/folders`),
39
+ messages: (account, folderId, cursor) => mailCall(
40
+ arbi,
41
+ `${accountPath(account.id)}/messages?${new URLSearchParams({
42
+ folder_id: folderId,
43
+ q: "",
44
+ limit: "100",
45
+ ...cursor ? { cursor } : {}
46
+ })}`
47
+ ),
48
+ message: async (account, messageId) => {
49
+ const path = `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`;
50
+ try {
51
+ return await mailCall(arbi, path);
52
+ } catch (error) {
53
+ if (error.status !== 401 || account.provider !== "native")
54
+ throw error;
55
+ if (hasLiveSession(arbi)) await arbi.mail.unlockNative();
56
+ return mailCall(arbi, path);
57
+ }
58
+ },
59
+ attachment: async (account, messageId, attachmentId) => {
60
+ const response = await arbi.mail.fetch(
61
+ `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,
62
+ {},
63
+ unlocked
64
+ );
65
+ return new Uint8Array(await response.arrayBuffer());
66
+ }
67
+ };
68
+ }
69
+ function liveSender(arbi) {
70
+ const transport = liveTransport(arbi);
71
+ return {
72
+ prepareSecure: async (item) => {
73
+ if (item.account.provider !== "native")
74
+ throw new Error("Choose your native inbox to send securely");
75
+ return arbi.secureMail.prepare(item.compose, item.account, item.requestId);
76
+ },
77
+ unlock: async (account) => {
78
+ if (account.provider !== "native") await transport.unlock(account);
79
+ },
80
+ send: (item) => item.secure ? mailJson((p, i) => arbi.mail.fetch(p, i), "/secure/send", {
81
+ method: "POST",
82
+ body: JSON.stringify(item.securePayload)
83
+ }) : mailJson(
84
+ (p, i) => arbi.mail.fetch(p, i),
85
+ `${accountPath(item.account.id)}/send`,
86
+ {
87
+ method: "POST",
88
+ body: JSON.stringify({ ...item.compose, request_id: item.requestId })
89
+ }
90
+ )
91
+ };
92
+ }
93
+ function liveChangeSender(arbi) {
94
+ return {
95
+ unlock: (account) => liveTransport(arbi).unlock(account),
96
+ apply: async ({ account, messageId, change }) => {
97
+ if (change.kind === "file") {
98
+ const { kind: _, ...request } = change;
99
+ await sendMailFile(
100
+ (p, i) => arbi.mail.fetch(p, i),
101
+ primeOnArbi(arbi),
102
+ account,
103
+ messageId,
104
+ request
105
+ );
106
+ return;
107
+ }
108
+ await mailJson(
109
+ (p, i) => arbi.mail.fetch(p, i),
110
+ `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`,
111
+ change.kind === "delete" ? { method: "DELETE" } : { method: "PATCH", body: JSON.stringify(change.update) }
112
+ );
113
+ }
114
+ };
115
+ }
116
+ const localLocks = /* @__PURE__ */ new Set();
117
+ async function exclusive(name, fn) {
118
+ if (typeof navigator !== "undefined" && navigator.locks?.request) {
119
+ return navigator.locks.request(name, { ifAvailable: true }, async (lock) => {
120
+ if (!lock) return false;
121
+ await fn();
122
+ return true;
123
+ });
124
+ }
125
+ if (localLocks.has(name)) return false;
126
+ localLocks.add(name);
127
+ try {
128
+ await fn();
129
+ return true;
130
+ } finally {
131
+ localLocks.delete(name);
132
+ }
133
+ }
134
+ let retryTimer = null;
135
+ async function sendOutbox({ arbi, queryClient, openOutbox }) {
136
+ const result = await flushOutboxOnce(liveSender(arbi), () => onlineManager.isOnline());
137
+ if (result.sent > 0) void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() });
138
+ const remaining = (await listOutbox()).filter((i) => i.status !== "sent");
139
+ if (result.failed > 0) {
140
+ notify.error(
141
+ result.failed === 1 ? "A message in your Outbox couldn't be sent" : `${result.failed} messages in your Outbox couldn't be sent`,
142
+ {
143
+ description: "Open the Outbox to see why, then retry, edit or delete it.",
144
+ ...openOutbox && { action: { label: "Open Outbox", onClick: openOutbox } }
145
+ }
146
+ );
147
+ } else if (result.sent > 0 && remaining.length === 0) {
148
+ notify.success(
149
+ result.sent === 1 ? "Your Outbox message was sent" : `${result.sent} Outbox messages sent`
150
+ );
151
+ }
152
+ setTimeout(() => void purgeSentOutbox(3e4), 31e3);
153
+ }
154
+ async function applyChanges({ arbi, queryClient }) {
155
+ const result = await applyMailChangesOnce(liveChangeSender(arbi), () => onlineManager.isOnline());
156
+ if (result.applied + result.gone + result.refused.length > 0)
157
+ void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() });
158
+ if (result.gone > 0)
159
+ notify.info(
160
+ result.gone === 1 ? "A message you changed offline was already gone from the server" : `${result.gone} messages you changed offline were already gone from the server`
161
+ );
162
+ if (result.refused.length > 0)
163
+ notify.error(
164
+ result.refused.length === 1 ? "A change you made offline couldn't be applied" : `${result.refused.length} changes you made offline couldn't be applied`,
165
+ { description: result.refused[0].error }
166
+ );
167
+ }
168
+ async function flushOutbox(context) {
169
+ if (!canReachMail(context.arbi)) return;
170
+ const ran = await exclusive("arbi-mail-outbox", async () => {
171
+ await sendOutbox(context);
172
+ await applyChanges(context);
173
+ });
174
+ if (!ran) {
175
+ if (retryTimer) clearTimeout(retryTimer);
176
+ retryTimer = setTimeout(() => void flushOutbox(context), 3e3);
177
+ }
178
+ }
179
+ async function uploadOfflineDrafts({
180
+ arbi,
181
+ queryClient
182
+ }) {
183
+ if (!canReachMail(arbi)) return;
184
+ await exclusive("arbi-mail-drafts", async () => {
185
+ const uploaded = await syncLocalDrafts(
186
+ ({ accountId, compose }) => mailJson(
187
+ (p, i) => arbi.mail.fetch(p, i),
188
+ `${accountPath(accountId)}/drafts`,
189
+ {
190
+ method: "POST",
191
+ body: JSON.stringify(compose)
192
+ }
193
+ )
194
+ );
195
+ if (uploaded > 0) {
196
+ void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allMessages() });
197
+ notify.success(
198
+ uploaded === 1 ? "Your offline draft was saved to Drafts" : `${uploaded} offline drafts were saved to Drafts`
199
+ );
200
+ }
201
+ });
202
+ }
203
+ let syncing = false;
204
+ function isMailSyncRunning() {
205
+ return syncing;
206
+ }
207
+ async function syncOfflineMailbox({ arbi }, options = {}) {
208
+ const latest = () => getOfflineMailSettings(sessionUser(arbi));
209
+ const settings = latest();
210
+ if (!settings.enabled || !canReachMail(arbi)) return;
211
+ void requestPersistentStorage();
212
+ await exclusive("arbi-mail-sync", async () => {
213
+ syncing = true;
214
+ notifyOfflineMailChange("status");
215
+ try {
216
+ await syncMailbox(liveTransport(arbi), latest(), { ...options, latest });
217
+ } catch (error) {
218
+ logger.error("[offline-mail] sync failed", error);
219
+ } finally {
220
+ syncing = false;
221
+ notifyOfflineMailChange("status");
222
+ }
223
+ });
224
+ }
225
+ export {
226
+ OUTBOX_FOLDER,
227
+ flushOutbox,
228
+ isMailSyncRunning,
229
+ sessionUser,
230
+ syncOfflineMailbox,
231
+ uploadOfflineDrafts
232
+ };
233
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mail/offline/live.ts"],
4
+ "sourcesContent": ["/**\n * The offline mailbox's connection to the real API (the session's `arbi.mail`), and the runners\n * that the app-wide runtime (`useOfflineMailRuntime`) and the mailbox call: flush the Outbox, apply\n * the changes made offline, upload offline drafts, sync.\n *\n * Each runner holds a Web Lock, so with several tabs open exactly one does the work at a time (the\n * send endpoints are idempotent anyway; the lock just avoids duplicate traffic).\n */\n\nimport { sendMailFile } from '../filing'\nimport { primeOnArbi } from '../../queued-writes'\nimport { onlineManager, type QueryClient } from '@tanstack/react-query'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { logger } from '@arbidocs/client'\nimport { notify } from '../../notifications/notify-store'\nimport { accountPath, mailJson } from '../client'\nimport { mailQueryKeys } from '../hooks'\nimport type { MailAccount, MailCompose, MailFolder, MailMessage, MailPolicy } from '../types'\nimport { syncLocalDrafts } from './drafts'\nimport { applyMailChangesOnce, type MailChangeSender } from './changes'\nimport { flushOutboxOnce, listOutbox, purgeSentOutbox, type OutboxSender } from './outbox'\nimport { getOfflineMailSettings, notifyOfflineMailChange } from './settings'\nimport { requestPersistentStorage } from '../../documents/offline-documents'\nimport { syncMailbox, type MailTransport } from './sync'\n\n/** What a runner works with: the signed-in session's `Arbi` and the query cache it refreshes. */\nexport interface OfflineMailContext {\n arbi: Arbi\n queryClient: QueryClient\n /** Show the Outbox (\"Open Outbox\" on a notice that a message could not be sent). */\n openOutbox?: () => void\n}\n\n/** The folder role of the device Outbox. */\nexport const OUTBOX_FOLDER = 'outbox'\n\n/**\n * The user the session is signed in as (the offline settings are theirs): the loaded profile's,\n * as `useOfflineMailSettings` reads it. Until it is loaded (a restored tab) there is none, so the\n * defaults apply and nothing is cached yet.\n */\nexport function sessionUser(arbi: Arbi): string | null {\n return arbi.session?.getState().user?.external_id ?? null\n}\n\n/** The session holds a server session key: the keys a background mail request needs. */\nfunction hasLiveSession(arbi: Arbi): boolean {\n return !!arbi.session?.getState().serverSessionKey\n}\n\n/** Whether this tab has what a background mail request needs: a connection and an unlocked session. */\nfunction canReachMail(arbi: Arbi): boolean {\n return onlineManager.isOnline() && hasLiveSession(arbi)\n}\n\nconst unlocked = { nativeUnlocked: true }\n\nfunction mailCall<T>(arbi: Arbi, path: string, init: RequestInit = {}): Promise<T> {\n return mailJson<T>((p, i) => arbi.mail.fetch(p, i, unlocked), path, init)\n}\n\nfunction liveTransport(arbi: Arbi): MailTransport {\n const unlock = async (account: MailAccount) => {\n if (!hasLiveSession(arbi))\n throw Object.assign(new Error('Sign in to unlock your mailbox'), { status: 401 })\n await arbi.mail.unlockAccount(account)\n }\n return {\n policy: () => mailCall<MailPolicy>(arbi, '/policy'),\n accounts: () => mailCall<MailAccount[]>(arbi, '/accounts'),\n unlock,\n folders: (account) => mailCall<MailFolder[]>(arbi, `${accountPath(account.id)}/folders`),\n messages: (account, folderId, cursor) =>\n mailCall(\n arbi,\n `${accountPath(account.id)}/messages?${new URLSearchParams({\n folder_id: folderId,\n q: '',\n limit: '100',\n ...(cursor ? { cursor } : {}),\n })}`\n ),\n message: async (account, messageId) => {\n const path = `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`\n try {\n return await mailCall<MailMessage>(arbi, path)\n } catch (error) {\n // Mail that arrived after this pass unlocked the inbox has a key the session doesn't hold yet.\n if ((error as { status?: number }).status !== 401 || account.provider !== 'native')\n throw error\n if (hasLiveSession(arbi)) await arbi.mail.unlockNative()\n return mailCall<MailMessage>(arbi, path)\n }\n },\n attachment: async (account, messageId, attachmentId) => {\n const response = await arbi.mail.fetch(\n `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n {},\n unlocked\n )\n return new Uint8Array(await response.arrayBuffer())\n },\n }\n}\n\nfunction liveSender(arbi: Arbi): OutboxSender {\n const transport = liveTransport(arbi)\n return {\n prepareSecure: async (item) => {\n if (item.account.provider !== 'native')\n throw new Error('Choose your native inbox to send securely')\n return arbi.secureMail.prepare(item.compose, item.account, item.requestId)\n },\n unlock: async (account) => {\n // The native send path needs no session keys; connected accounts need this session's tokens.\n if (account.provider !== 'native') await transport.unlock(account)\n },\n send: (item) =>\n item.secure\n ? mailJson<{ id?: string }>((p, i) => arbi.mail.fetch(p, i), '/secure/send', {\n method: 'POST',\n body: JSON.stringify(item.securePayload),\n })\n : mailJson<{ id?: string }>(\n (p, i) => arbi.mail.fetch(p, i),\n `${accountPath(item.account.id)}/send`,\n {\n method: 'POST',\n body: JSON.stringify({ ...item.compose, request_id: item.requestId }),\n }\n ),\n }\n}\n\nfunction liveChangeSender(arbi: Arbi): MailChangeSender {\n return {\n unlock: (account) => liveTransport(arbi).unlock(account),\n apply: async ({ account, messageId, change }) => {\n if (change.kind === 'file') {\n const { kind: _, ...request } = change\n await sendMailFile(\n (p, i) => arbi.mail.fetch(p, i),\n primeOnArbi(arbi),\n account,\n messageId,\n request\n )\n return\n }\n await mailJson(\n (p, i) => arbi.mail.fetch(p, i),\n `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`,\n change.kind === 'delete'\n ? { method: 'DELETE' }\n : { method: 'PATCH', body: JSON.stringify(change.update) }\n )\n },\n }\n}\n\nconst localLocks = new Set<string>()\n\n/** Run `fn` unless another tab (or this one) already is; returns whether it ran. */\nasync function exclusive(name: string, fn: () => Promise<void>): Promise<boolean> {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return navigator.locks.request(name, { ifAvailable: true }, async (lock) => {\n if (!lock) return false\n await fn()\n return true\n })\n }\n if (localLocks.has(name)) return false\n localLocks.add(name)\n try {\n await fn()\n return true\n } finally {\n localLocks.delete(name)\n }\n}\n\nlet retryTimer: ReturnType<typeof setTimeout> | null = null\n\n/** One Outbox pass: send what waits, in order, and tell the user how it went. */\nasync function sendOutbox({ arbi, queryClient, openOutbox }: OfflineMailContext): Promise<void> {\n const result = await flushOutboxOnce(liveSender(arbi), () => onlineManager.isOnline())\n if (result.sent > 0) void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() })\n const remaining = (await listOutbox()).filter((i) => i.status !== 'sent')\n if (result.failed > 0) {\n notify.error(\n result.failed === 1\n ? \"A message in your Outbox couldn't be sent\"\n : `${result.failed} messages in your Outbox couldn't be sent`,\n {\n description: 'Open the Outbox to see why, then retry, edit or delete it.',\n ...(openOutbox && { action: { label: 'Open Outbox', onClick: openOutbox } }),\n }\n )\n } else if (result.sent > 0 && remaining.length === 0) {\n notify.success(\n result.sent === 1 ? 'Your Outbox message was sent' : `${result.sent} Outbox messages sent`\n )\n }\n // Sent rows stay visible briefly as \"Sent\", then leave the Outbox.\n setTimeout(() => void purgeSentOutbox(30_000), 31_000)\n}\n\n/** One pass over the changes made offline: apply them, and say which could not be applied. */\nasync function applyChanges({ arbi, queryClient }: OfflineMailContext): Promise<void> {\n const result = await applyMailChangesOnce(liveChangeSender(arbi), () => onlineManager.isOnline())\n if (result.applied + result.gone + result.refused.length > 0)\n void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() })\n if (result.gone > 0)\n notify.info(\n result.gone === 1\n ? 'A message you changed offline was already gone from the server'\n : `${result.gone} messages you changed offline were already gone from the server`\n )\n if (result.refused.length > 0)\n notify.error(\n result.refused.length === 1\n ? \"A change you made offline couldn't be applied\"\n : `${result.refused.length} changes you made offline couldn't be applied`,\n { description: result.refused[0].error }\n )\n}\n\n/**\n * Send what waits on this device: the Outbox first, then the changes made offline (read, moved,\n * trashed, deleted), under one lock so neither overtakes the other, and nothing goes out twice\n * from two tabs. When another tab holds the lock, try again shortly: it may have missed something\n * queued here just now.\n */\nexport async function flushOutbox(context: OfflineMailContext): Promise<void> {\n if (!canReachMail(context.arbi)) return\n const ran = await exclusive('arbi-mail-outbox', async () => {\n await sendOutbox(context)\n await applyChanges(context)\n })\n if (!ran) {\n if (retryTimer) clearTimeout(retryTimer)\n retryTimer = setTimeout(() => void flushOutbox(context), 3_000)\n }\n}\n\n/** Upload the drafts written offline to the account's server Drafts. */\nexport async function uploadOfflineDrafts({\n arbi,\n queryClient,\n}: OfflineMailContext): Promise<void> {\n if (!canReachMail(arbi)) return\n await exclusive('arbi-mail-drafts', async () => {\n const uploaded = await syncLocalDrafts(({ accountId, compose }) =>\n mailJson<{ id: string }>(\n (p, i) => arbi.mail.fetch(p, i),\n `${accountPath(accountId)}/drafts`,\n {\n method: 'POST',\n body: JSON.stringify(compose satisfies MailCompose),\n }\n )\n )\n if (uploaded > 0) {\n void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allMessages() })\n notify.success(\n uploaded === 1\n ? 'Your offline draft was saved to Drafts'\n : `${uploaded} offline drafts were saved to Drafts`\n )\n }\n })\n}\n\nlet syncing = false\nexport function isMailSyncRunning(): boolean {\n return syncing\n}\n\n/** One sync pass of the offline mailbox, when the user turned it on for this device. */\nexport async function syncOfflineMailbox(\n { arbi }: Pick<OfflineMailContext, 'arbi'>,\n options: { full?: boolean } = {}\n): Promise<void> {\n const latest = () => getOfflineMailSettings(sessionUser(arbi))\n const settings = latest()\n if (!settings.enabled || !canReachMail(arbi)) return\n // Keeping mail (the default too, not only when it is switched on): ask the browser not to evict it.\n void requestPersistentStorage()\n await exclusive('arbi-mail-sync', async () => {\n syncing = true\n notifyOfflineMailChange('status')\n try {\n await syncMailbox(liveTransport(arbi), latest(), { ...options, latest })\n } catch (error) {\n logger.error('[offline-mail] sync failed', error)\n } finally {\n syncing = false\n notifyOfflineMailChange('status')\n }\n })\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,191 @@
1
+ import { blind, openBytes, openJson, sealBytes, sealJson } from "./crypto.js";
2
+ import {
3
+ deleteRecords,
4
+ getRecord,
5
+ hasRecord,
6
+ putRecord,
7
+ recordsInBucket,
8
+ touchRecord
9
+ } from "./store.js";
10
+ const keyOf = {
11
+ accounts: () => blind("accounts"),
12
+ policy: () => blind("policy"),
13
+ folders: (accountId) => blind("folders", accountId),
14
+ header: (accountId, folderId, messageId) => blind("header", accountId, folderId, messageId),
15
+ body: (accountId, messageId) => blind("body", accountId, messageId),
16
+ attachment: (accountId, messageId, attachmentId) => blind("attachment", accountId, messageId, attachmentId)
17
+ };
18
+ const bucketOf = {
19
+ global: () => blind("bucket", "global"),
20
+ folder: (accountId, folderId) => blind("bucket", "folder", accountId, folderId),
21
+ account: (accountId) => blind("bucket", "account", accountId)
22
+ };
23
+ async function put(kind, key, bucket, data, sortAt = Date.now()) {
24
+ const now = Date.now();
25
+ await putRecord({ key, kind, bucket, sortAt, size: data.byteLength, lastAccess: now, data });
26
+ }
27
+ async function readJson(record) {
28
+ if (!record) return void 0;
29
+ try {
30
+ return await openJson(record.data);
31
+ } catch {
32
+ return void 0;
33
+ }
34
+ }
35
+ const receivedAt = (m) => m.received_at ? Date.parse(m.received_at) || 0 : 0;
36
+ async function saveAccounts(accounts) {
37
+ await put("accounts", await keyOf.accounts(), await bucketOf.global(), await sealJson(accounts));
38
+ }
39
+ async function loadAccounts() {
40
+ return readJson(await getRecord(await keyOf.accounts()));
41
+ }
42
+ async function savePolicy(policy) {
43
+ await put("policy", await keyOf.policy(), await bucketOf.global(), await sealJson(policy));
44
+ }
45
+ async function loadPolicy() {
46
+ return readJson(await getRecord(await keyOf.policy()));
47
+ }
48
+ async function saveFolders(accountId, folders) {
49
+ await put(
50
+ "folders",
51
+ await keyOf.folders(accountId),
52
+ await bucketOf.account(accountId),
53
+ await sealJson(folders)
54
+ );
55
+ }
56
+ async function loadFolders(accountId) {
57
+ return readJson(await getRecord(await keyOf.folders(accountId)));
58
+ }
59
+ function toHeader(message) {
60
+ return {
61
+ ...message,
62
+ text: "",
63
+ html: void 0,
64
+ delivery: void 0,
65
+ attachments: message.attachments.map((a) => ({ ...a, content_base64: null }))
66
+ };
67
+ }
68
+ async function saveHeader(accountId, folderId, message) {
69
+ await put(
70
+ "header",
71
+ await keyOf.header(accountId, folderId, message.id),
72
+ await bucketOf.folder(accountId, folderId),
73
+ await sealJson(toHeader(message)),
74
+ receivedAt(message)
75
+ );
76
+ }
77
+ async function loadHeaders(accountId, folderId) {
78
+ const records = await recordsInBucket(await bucketOf.folder(accountId, folderId));
79
+ const out = [];
80
+ for (const record of records) {
81
+ if (record.kind !== "header") continue;
82
+ const message = await readJson(record);
83
+ if (message) out.push({ key: record.key, sortAt: record.sortAt, message });
84
+ }
85
+ return out.sort((a, b) => b.sortAt - a.sortAt);
86
+ }
87
+ async function hasFolder(accountId) {
88
+ return hasRecord(await keyOf.folders(accountId));
89
+ }
90
+ async function saveBody(accountId, message) {
91
+ const stripped = {
92
+ ...message,
93
+ attachments: message.attachments.map((a) => ({ ...a, content_base64: null }))
94
+ };
95
+ await put(
96
+ "body",
97
+ await keyOf.body(accountId, message.id),
98
+ await bucketOf.account(accountId),
99
+ await sealJson(stripped),
100
+ receivedAt(message)
101
+ );
102
+ }
103
+ async function hasBody(accountId, messageId) {
104
+ return hasRecord(await keyOf.body(accountId, messageId));
105
+ }
106
+ async function loadBody(accountId, messageId) {
107
+ return readJson(await getRecord(await keyOf.body(accountId, messageId)));
108
+ }
109
+ async function saveAttachment(accountId, messageId, attachmentId, bytes, sortAt) {
110
+ await put(
111
+ "attachment",
112
+ await keyOf.attachment(accountId, messageId, attachmentId),
113
+ await bucketOf.account(accountId),
114
+ await sealBytes(bytes),
115
+ sortAt || void 0
116
+ );
117
+ }
118
+ async function hasAttachment(accountId, messageId, attachmentId) {
119
+ return hasRecord(await keyOf.attachment(accountId, messageId, attachmentId));
120
+ }
121
+ async function loadAttachment(accountId, messageId, attachmentId) {
122
+ const key = await keyOf.attachment(accountId, messageId, attachmentId);
123
+ const record = await getRecord(key);
124
+ if (!record) return void 0;
125
+ try {
126
+ const bytes = await openBytes(record.data);
127
+ void touchRecord(key);
128
+ return bytes;
129
+ } catch {
130
+ return void 0;
131
+ }
132
+ }
133
+ async function removeKeys(keys) {
134
+ await deleteRecords(keys);
135
+ }
136
+ function bodyText(body) {
137
+ const html = body.text ? "" : (body.html ?? "").replace(/<[^>]*>/g, " ");
138
+ return `${body.text} ${html} ${body.attachments.map((a) => a.name).join(" ")}`;
139
+ }
140
+ const folded = (value) => value.toLocaleLowerCase().normalize("NFKD");
141
+ async function searchFolder(accountId, folderId, query) {
142
+ const words = folded(query).split(/\s+/).filter(Boolean);
143
+ const headers = await loadHeaders(accountId, folderId);
144
+ if (words.length === 0) return headers.map((h) => h.message);
145
+ const out = [];
146
+ for (const { message } of headers) {
147
+ const people = [...message.sender, ...message.to, ...message.cc].map((p) => `${p.name ?? ""} ${p.email}`).join(" ");
148
+ let haystack = folded(`${message.subject} ${people} ${message.preview}`);
149
+ if (!words.every((w) => haystack.includes(w))) {
150
+ const body = await loadBody(accountId, message.id);
151
+ if (body) haystack += " " + folded(bodyText(body));
152
+ }
153
+ if (words.every((w) => haystack.includes(w))) out.push(message);
154
+ }
155
+ return out;
156
+ }
157
+ const isVirtualFolder = (folder) => folder?.role === "flagged";
158
+ async function loadAccountMessages(accountId, include, query = "") {
159
+ const seen = /* @__PURE__ */ new Map();
160
+ for (const folder of await loadFolders(accountId) ?? []) {
161
+ if (isVirtualFolder(folder) || !include(folder)) continue;
162
+ for (const message of await searchFolder(accountId, folder.id, query))
163
+ if (!seen.has(message.id)) seen.set(message.id, message);
164
+ }
165
+ return [...seen.values()].sort((a, b) => receivedAt(b) - receivedAt(a));
166
+ }
167
+ export {
168
+ bucketOf,
169
+ hasAttachment,
170
+ hasBody,
171
+ hasFolder,
172
+ isVirtualFolder,
173
+ keyOf,
174
+ loadAccountMessages,
175
+ loadAccounts,
176
+ loadAttachment,
177
+ loadBody,
178
+ loadFolders,
179
+ loadHeaders,
180
+ loadPolicy,
181
+ removeKeys,
182
+ saveAccounts,
183
+ saveAttachment,
184
+ saveBody,
185
+ saveFolders,
186
+ saveHeader,
187
+ savePolicy,
188
+ searchFolder,
189
+ toHeader
190
+ };
191
+ //# sourceMappingURL=mailbox.js.map