@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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/account/identity.ts"],
4
+ "sourcesContent": ["/**\n * Identity verification: the optional, paid ID check behind the verified tick (Pro plans only).\n *\n * Two layers, like `profile.ts`. `useIdentityVerificationFlow` owns the dialog's state and takes\n * the backend calls as functions, so an app with its own API layer (ARBI-frontend) binds the same\n * `IdentityVerificationCard` / `IdentityVerificationDialog` blocks without a provider.\n * `useIdentityVerification` binds it to the SDK (`arbi.identity`).\n *\n * Steps: pay the one-time fee (charged to the user's Pro project card) \u2192 verify inside Didit's\n * embedded frame \u2192 result (verified, declined, in review, or the name on the document differs from\n * the account name, offered as the new name). No webhooks: completing Didit's flow calls `refresh`.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { identityErrorCode } from '@arbidocs/sdk/browser'\nimport { useAccountClient } from './client'\nimport { arbiQueryKeys } from '../hooks'\nimport { mountDiditVerification } from './didit'\nimport type {\n IdentityBusy,\n IdentityProblem,\n IdentityPurchase,\n IdentityStatus,\n IdentityStep,\n IdentityVerificationFlow,\n} from './identity-types'\n\nexport type {\n IdentityBusy,\n IdentityProblem,\n IdentityPurchase,\n IdentityState,\n IdentityStatus,\n IdentityStep,\n IdentityVerificationFlow,\n} from './identity-types'\n\n/** The backend calls of the flow, as functions (see the module comment). */\nexport interface IdentityVerificationApi {\n status: () => Promise<IdentityStatus>\n purchase: () => Promise<IdentityPurchase>\n /** The Didit session URL. */\n startSession: () => Promise<string>\n refresh: () => Promise<IdentityStatus>\n acceptName: () => Promise<IdentityStatus>\n remove: () => Promise<IdentityStatus>\n}\n\nexport interface UseIdentityVerificationFlowOptions {\n /** Load the status (default true; e.g. false while signed out). */\n enabled?: boolean\n /** The tick changed (granted, renamed away, removed): update the host's copy of the user. */\n onVerifiedChange?: (verified: boolean) => void\n /** The account name became the name on the document. */\n onNameAccepted?: (name: { givenName: string; familyName: string | null }) => void\n /** The host's price format (e.g. its billing helpers); default `formatIdentityPrice`. */\n formatPrice?: (status: IdentityStatus) => string\n}\n\nfunction problemOf(error: unknown, fallback: string): IdentityProblem {\n const code = identityErrorCode(error) ?? (error as { code?: unknown } | null)?.code\n const message = error instanceof Error && error.message ? error.message : fallback\n return { code: typeof code === 'string' ? code : undefined, message }\n}\n\n/** Which step the dialog opens on for a status. */\nexport function identityStepFor(status: IdentityStatus | undefined): IdentityStep {\n if (!status) return 'pay'\n if (['name_mismatch', 'in_review', 'verified'].includes(status.state)) return 'result'\n if (status.state === 'declined') return status.attempts_left > 0 ? 'result' : 'pay'\n if (status.state === 'in_progress' || status.attempts_left > 0) return 'verify'\n return 'pay'\n}\n\n/** \"\u00A35.00 incl. VAT\": the fee is quoted including UK VAT. */\nexport function formatIdentityPrice(status: IdentityStatus): string {\n let amount: string\n try {\n amount = new Intl.NumberFormat('en-GB', {\n style: 'currency',\n currency: status.currency,\n }).format(status.price_pence / 100)\n } catch {\n amount = `${(status.price_pence / 100).toFixed(2)} ${status.currency}`\n }\n return `${amount} incl. VAT`\n}\n\n/** The identity verification dialog's state, bound to the backend calls in `api`. */\nexport function useIdentityVerificationFlow(\n api: IdentityVerificationApi,\n {\n enabled = true,\n onVerifiedChange,\n onNameAccepted,\n formatPrice = formatIdentityPrice,\n }: UseIdentityVerificationFlowOptions = {}\n): IdentityVerificationFlow {\n const qc = useQueryClient()\n const apiRef = useRef(api)\n apiRef.current = api\n const query = useQuery({\n queryKey: arbiQueryKeys.identity(),\n queryFn: () => apiRef.current.status(),\n enabled,\n staleTime: 60_000,\n })\n const status = query.data\n\n const [isOpen, setIsOpen] = useState(false)\n const [step, setStep] = useState<IdentityStep>('pay')\n const [busy, setBusy] = useState<IdentityBusy>(null)\n const [problem, setProblem] = useState<IdentityProblem | null>(null)\n const [paymentUrl, setPaymentUrl] = useState<string | null>(null)\n const [sessionUrl, setSessionUrl] = useState<string | null>(null)\n const [container, setContainer] = useState<HTMLElement | null>(null)\n const [embedFailed, setEmbedFailed] = useState(false)\n const verifyContainerId = `didit-${useId().replace(/[^a-zA-Z0-9_-]/g, '')}`\n\n const lastVerified = useRef<boolean | undefined>(undefined)\n const apply = useCallback(\n (next: IdentityStatus) => {\n qc.setQueryData(arbiQueryKeys.identity(), next)\n if (lastVerified.current !== undefined && lastVerified.current !== next.verified) {\n onVerifiedChange?.(next.verified)\n }\n lastVerified.current = next.verified\n return next\n },\n [qc, onVerifiedChange]\n )\n useEffect(() => {\n if (status && lastVerified.current === undefined) lastVerified.current = status.verified\n }, [status])\n\n const run = useCallback(\n async <T>(kind: Exclude<IdentityBusy, null>, fallback: string, fn: () => Promise<T>) => {\n setBusy(kind)\n setProblem(null)\n try {\n return await fn()\n } catch (e) {\n setProblem(problemOf(e, fallback))\n return undefined\n } finally {\n setBusy(null)\n }\n },\n []\n )\n\n const isOpenRef = useRef(false)\n const closeRef = useRef<() => void>(() => {})\n const startVerifyRef = useRef<() => Promise<void>>(async () => {})\n\n const refresh = useCallback(async () => {\n const next = await run('refresh', 'Could not read the verification result', () =>\n apiRef.current.refresh()\n )\n if (!next) return\n apply(next)\n if (next.state === 'in_progress') return\n setSessionUrl(null)\n const nextStep = next.state === 'declined' ? 'result' : identityStepFor(next)\n // An abandoned or expired session (state none, attempts left): open a fresh one.\n if (nextStep === 'verify' && isOpenRef.current) void startVerifyRef.current()\n else setStep(nextStep)\n }, [run, apply])\n\n // A check left open (closed tab, reload, manual review): ask for its result once on load.\n const refreshedOnLoad = useRef(false)\n useEffect(() => {\n if (refreshedOnLoad.current || !status) return\n refreshedOnLoad.current = true\n if (status.state === 'in_progress' || status.state === 'in_review') void refresh()\n }, [status, refresh])\n\n const startVerify = useCallback(async () => {\n setStep('verify')\n setEmbedFailed(false)\n const url = await run('start', 'Could not start identity verification', () =>\n apiRef.current.startSession()\n )\n if (url) {\n setSessionUrl(url)\n return\n }\n // Still unpaid (a 3-D Secure payment not confirmed yet): back to the payment step.\n setStep('pay')\n }, [run])\n startVerifyRef.current = startVerify\n\n // Mount Didit once the session is open and its host element is on screen.\n useEffect(() => {\n if (!isOpen || step !== 'verify' || !sessionUrl || !container || embedFailed) return\n let teardown: (() => void) | undefined\n let cancelled = false\n mountDiditVerification({\n url: sessionUrl,\n containerId: container.id,\n onResult: (result) => {\n if (result.type === 'failed' && result.error?.type === 'cameraAccessDenied') {\n setEmbedFailed(true)\n return\n }\n if (result.type === 'cancelled') {\n closeRef.current()\n return\n }\n void refresh()\n },\n })\n .then((stop) => {\n if (cancelled) stop()\n else teardown = stop\n })\n .catch(() => setEmbedFailed(true))\n return () => {\n cancelled = true\n teardown?.()\n }\n }, [isOpen, step, sessionUrl, container, embedFailed, refresh])\n\n // Verifying in another tab: look for the result when the user comes back.\n const [waitingInTab, setWaitingInTab] = useState(false)\n useEffect(() => {\n if (!waitingInTab || typeof window === 'undefined') return\n const onFocus = () => void refresh()\n window.addEventListener('focus', onFocus)\n return () => window.removeEventListener('focus', onFocus)\n }, [waitingInTab, refresh])\n\n const open = useCallback(() => {\n isOpenRef.current = true\n setProblem(null)\n setPaymentUrl(status?.pending_payment_url ?? null)\n const first = identityStepFor(status)\n setStep(first)\n setIsOpen(true)\n if (first === 'verify') void startVerify()\n }, [status, startVerify])\n\n const close = useCallback(() => {\n isOpenRef.current = false\n setIsOpen(false)\n setSessionUrl(null)\n setWaitingInTab(false)\n setEmbedFailed(false)\n setProblem(null)\n }, [])\n closeRef.current = close\n\n const pay = useCallback(async () => {\n const result = await run('pay', 'Payment could not be completed', () =>\n apiRef.current.purchase()\n )\n if (!result) return\n if (result.status === 'requires_action') {\n setPaymentUrl(result.payment_url ?? null)\n return\n }\n setPaymentUrl(null)\n void query.refetch()\n void startVerify()\n }, [run, query, startVerify])\n\n const acceptName = useCallback(async () => {\n const offered = status\n const next = await run('accept', 'Could not change your name', () =>\n apiRef.current.acceptName()\n )\n if (!next) return\n apply(next)\n if (offered?.document_given_name) {\n onNameAccepted?.({\n givenName: offered.document_given_name,\n familyName: offered.document_family_name ?? null,\n })\n }\n }, [run, apply, status, onNameAccepted])\n\n const remove = useCallback(async () => {\n const next = await run('remove', 'Could not remove the verification', () =>\n apiRef.current.remove()\n )\n if (next) apply(next)\n }, [run, apply])\n\n const price = useMemo(() => (status ? formatPrice(status) : null), [status, formatPrice])\n\n return {\n status,\n isLoading: query.isLoading,\n price,\n isOpen,\n open,\n close,\n step,\n busy,\n problem,\n paymentUrl,\n pay: () => void pay(),\n recheckPayment: () => void startVerify(),\n verifyContainerId,\n verifyContainerRef: setContainer,\n embedFailed,\n openInNewTab: () => {\n if (!sessionUrl || typeof window === 'undefined') return\n window.open(sessionUrl, '_blank', 'noopener')\n setWaitingInTab(true)\n },\n checkResult: () => void refresh(),\n retry: () => void startVerify(),\n acceptName: () => void acceptName(),\n keepName: close,\n remove: () => void remove(),\n }\n}\n\n// \u2500\u2500 Bound \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * The identity verification flow over the account client in scope; the profile query follows the\n * tick and name.\n */\nexport function useIdentityVerification(\n options: Omit<UseIdentityVerificationFlowOptions, 'enabled'> = {}\n): IdentityVerificationFlow {\n const { client, enabled } = useAccountClient()\n const qc = useQueryClient()\n const { onVerifiedChange, onNameAccepted, formatPrice } = options\n return useIdentityVerificationFlow(client.identity, {\n enabled,\n formatPrice,\n onVerifiedChange: (verified) => {\n void qc.invalidateQueries({ queryKey: arbiQueryKeys.profile() })\n onVerifiedChange?.(verified)\n },\n onNameAccepted: (name) => {\n void qc.invalidateQueries({ queryKey: arbiQueryKeys.profile() })\n void qc.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() })\n onNameAccepted?.(name)\n },\n })\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,93 @@
1
+ import {
2
+ useProfile,
3
+ useUpdateProfile,
4
+ toProfileView,
5
+ useNameEditor,
6
+ useAvatarCrop,
7
+ MAX_AVATAR_FILE_BYTES
8
+ } from "./profile.js";
9
+ import {
10
+ useRequestEmailChange,
11
+ useConfirmEmailChange,
12
+ useEmailChange
13
+ } from "./email.js";
14
+ import {
15
+ usePasswordChange,
16
+ usePasswordChangeForm,
17
+ DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES
18
+ } from "./password.js";
19
+ import { useUserSettings, useUpdateUserSettings } from "./settings.js";
20
+ import { useDismissedTips } from "./dismissed-tips.js";
21
+ import {
22
+ useNotificationPreferences,
23
+ toNotificationPreferences
24
+ } from "./notifications.js";
25
+ import {
26
+ useWorkspaceNotificationLevel,
27
+ useFollowThread
28
+ } from "./relevance.js";
29
+ import { useSessions, useTerminateSession, useSignOut, useCurrentSessionId } from "./sessions.js";
30
+ import {
31
+ arbiAccountClient,
32
+ useAccountClient
33
+ } from "./client.js";
34
+ import {
35
+ useDeleteAccount,
36
+ useDeleteAccountFlow,
37
+ parseDeleteAccountBlockers
38
+ } from "./delete.js";
39
+ import {
40
+ useIdentityVerification,
41
+ useIdentityVerificationFlow,
42
+ identityStepFor,
43
+ formatIdentityPrice
44
+ } from "./identity.js";
45
+ import { mountDiditVerification } from "./didit.js";
46
+ import { downloadRecoveryFile } from "./recovery.js";
47
+ import {
48
+ useEntitlements,
49
+ useInvalidateEntitlements,
50
+ useIsEntitled,
51
+ entitlementRefusal
52
+ } from "./entitlements.js";
53
+ export {
54
+ DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES,
55
+ MAX_AVATAR_FILE_BYTES,
56
+ arbiAccountClient,
57
+ downloadRecoveryFile,
58
+ entitlementRefusal,
59
+ formatIdentityPrice,
60
+ identityStepFor,
61
+ mountDiditVerification,
62
+ parseDeleteAccountBlockers,
63
+ toNotificationPreferences,
64
+ toProfileView,
65
+ useAccountClient,
66
+ useAvatarCrop,
67
+ useConfirmEmailChange,
68
+ useCurrentSessionId,
69
+ useDeleteAccount,
70
+ useDeleteAccountFlow,
71
+ useDismissedTips,
72
+ useEmailChange,
73
+ useEntitlements,
74
+ useFollowThread,
75
+ useIdentityVerification,
76
+ useIdentityVerificationFlow,
77
+ useInvalidateEntitlements,
78
+ useIsEntitled,
79
+ useNameEditor,
80
+ useNotificationPreferences,
81
+ usePasswordChange,
82
+ usePasswordChangeForm,
83
+ useProfile,
84
+ useRequestEmailChange,
85
+ useSessions,
86
+ useSignOut,
87
+ useTerminateSession,
88
+ useUpdateProfile,
89
+ useUpdateUserSettings,
90
+ useUserSettings,
91
+ useWorkspaceNotificationLevel
92
+ };
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/account/index.ts"],
4
+ "sourcesContent": ["export {\n useProfile,\n useUpdateProfile,\n toProfileView,\n useNameEditor,\n useAvatarCrop,\n MAX_AVATAR_FILE_BYTES,\n type ProfileView,\n type UpdateProfileVars,\n type UseNameEditorOptions,\n type NameEditor,\n type UseAvatarCropOptions,\n type AvatarCrop,\n type AvatarFileProblem,\n} from './profile'\nexport {\n useRequestEmailChange,\n useConfirmEmailChange,\n useEmailChange,\n type UseEmailChangeOptions,\n type EmailChange,\n} from './email'\nexport {\n usePasswordChange,\n usePasswordChangeForm,\n DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES,\n type PasswordChangeVars,\n type PasswordChangeFormMessages,\n type UsePasswordChangeFormOptions,\n type PasswordChangeForm,\n} from './password'\nexport { useUserSettings, useUpdateUserSettings, type UserSettingsPatch } from './settings'\nexport { useDismissedTips } from './dismissed-tips'\nexport {\n useNotificationPreferences,\n toNotificationPreferences,\n type EmailPreferences,\n type NotificationPreferencesModel,\n} from './notifications'\nexport {\n useWorkspaceNotificationLevel,\n useFollowThread,\n type WorkspaceNotificationLevel,\n type RelevancePatch,\n type FollowSaveCallbacks,\n} from './relevance'\nexport { useSessions, useTerminateSession, useSignOut, useCurrentSessionId } from './sessions'\nexport {\n arbiAccountClient,\n useAccountClient,\n type AccountClient,\n type AccountClientContextValue,\n type AccountSession,\n type AccountSignOutOptions,\n} from './client'\nexport {\n useDeleteAccount,\n useDeleteAccountFlow,\n parseDeleteAccountBlockers,\n type DeleteAccountBlocker,\n type UseDeleteAccountFlowOptions,\n type DeleteAccountFlow,\n} from './delete'\nexport {\n useIdentityVerification,\n useIdentityVerificationFlow,\n identityStepFor,\n formatIdentityPrice,\n type IdentityVerificationApi,\n type IdentityVerificationFlow,\n type UseIdentityVerificationFlowOptions,\n type IdentityStep,\n type IdentityBusy,\n type IdentityProblem,\n type IdentityStatus,\n type IdentityState,\n type IdentityPurchase,\n} from './identity'\nexport { mountDiditVerification, type MountDiditOptions } from './didit'\nexport { downloadRecoveryFile } from './recovery'\nexport {\n useEntitlements,\n useInvalidateEntitlements,\n useIsEntitled,\n entitlementRefusal,\n type FeatureEntitlements,\n type EntitledFeature,\n type FeatureRefusal,\n} from './entitlements'\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAQK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP,SAAS,iBAAiB,6BAAqD;AAC/E,SAAS,wBAAwB;AACjC;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP,SAAS,aAAa,qBAAqB,YAAY,2BAA2B;AAClF;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAUK;AACP,SAAS,8BAAsD;AAC/D,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,59 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { useArbi } from "../useArbi.js";
4
+ import { arbiQueryKeys } from "../hooks.js";
5
+ import { useUserSettings } from "./settings.js";
6
+ function toNotificationPreferences(stored, keys) {
7
+ const checked = Object.fromEntries(keys.map((key) => [key, stored?.[key] ?? true]));
8
+ return {
9
+ masterChecked: keys.some((key) => checked[key]),
10
+ checked,
11
+ masterPatch: (value) => Object.fromEntries(keys.map((key) => [key, value])),
12
+ categoryPatch: (key, value) => ({ [key]: value })
13
+ };
14
+ }
15
+ function useNotificationPreferences(keys, options) {
16
+ const arbi = useArbi();
17
+ const qc = useQueryClient();
18
+ const settings = useUserSettings(options);
19
+ const stored = settings.data?.email_notifications;
20
+ const save = useMutation({
21
+ mutationFn: (patch) => arbi.settings.update({ email_notifications: patch }),
22
+ onMutate: async (patch) => {
23
+ await qc.cancelQueries({ queryKey: arbiQueryKeys.userSettings() });
24
+ const previous = qc.getQueryData(arbiQueryKeys.userSettings());
25
+ qc.setQueryData(
26
+ arbiQueryKeys.userSettings(),
27
+ (old) => old ? { ...old, email_notifications: { ...old.email_notifications, ...patch } } : old
28
+ );
29
+ return { previous };
30
+ },
31
+ onError: (_err, _patch, context) => {
32
+ qc.setQueryData(arbiQueryKeys.userSettings(), context?.previous);
33
+ },
34
+ onSettled: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() })
35
+ });
36
+ const model = useMemo(() => toNotificationPreferences(stored, keys), [stored, keys]);
37
+ const setAll = useCallback(
38
+ (value) => save.mutate(model.masterPatch(value)),
39
+ [save, model]
40
+ );
41
+ const setCategory = useCallback(
42
+ (key, value) => save.mutate(model.categoryPatch(key, value)),
43
+ [save, model]
44
+ );
45
+ return {
46
+ ...model,
47
+ isLoading: settings.isLoading,
48
+ isSaving: save.isPending,
49
+ /** The master switch handler: every category on or off. */
50
+ setAll,
51
+ /** One category's handler. */
52
+ setCategory
53
+ };
54
+ }
55
+ export {
56
+ toNotificationPreferences,
57
+ useNotificationPreferences
58
+ };
59
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/account/notifications.ts"],
4
+ "sourcesContent": ["/**\n * Notification preferences: which email categories the user wants (the `email_notifications`\n * record of the user settings). All default on. The master switch on `NotificationCategoryList`\n * is \"on while at least one category is on\" and writes every category at once.\n */\n\nimport { useCallback, useMemo } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../hooks'\nimport { useUserSettings } from './settings'\n\n/** Category key to on/off, e.g. `{ messages: true, product_updates: false }`. */\nexport type EmailPreferences = Record<string, boolean>\n\n// \u2500\u2500 Pure core \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface NotificationPreferencesModel {\n /** Master switch: on while at least one category is on. */\n masterChecked: boolean\n /** Each category's state (`true` when the record says nothing: the default). */\n checked: Record<string, boolean>\n /** The PATCH body for the master switch: every category set to `value`. */\n masterPatch: (value: boolean) => EmailPreferences\n /** The PATCH body for one category. */\n categoryPatch: (key: string, value: boolean) => EmailPreferences\n}\n\n/** Derive the switch states from the stored record and the list of category keys. */\nexport function toNotificationPreferences(\n stored: EmailPreferences | null | undefined,\n keys: readonly string[]\n): NotificationPreferencesModel {\n const checked = Object.fromEntries(keys.map((key) => [key, stored?.[key] ?? true]))\n return {\n masterChecked: keys.some((key) => checked[key]),\n checked,\n masterPatch: (value) => Object.fromEntries(keys.map((key) => [key, value])),\n categoryPatch: (key, value) => ({ [key]: value }),\n }\n}\n\n// \u2500\u2500 SDK-bound hooks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * The email notification preferences and the save. `save` writes the given keys (a patch,\n * merged by the server) and updates the cached settings straight away, so the switches do not\n * wait for the round trip; a failed write rolls back.\n */\nexport function useNotificationPreferences(\n keys: readonly string[],\n options?: { enabled?: boolean }\n) {\n const arbi = useArbi()\n const qc = useQueryClient()\n const settings = useUserSettings(options)\n const stored = settings.data?.email_notifications as EmailPreferences | undefined\n\n const save = useMutation({\n mutationFn: (patch: EmailPreferences) =>\n arbi.settings.update({ email_notifications: patch } as never),\n onMutate: async (patch) => {\n await qc.cancelQueries({ queryKey: arbiQueryKeys.userSettings() })\n const previous = qc.getQueryData(arbiQueryKeys.userSettings())\n qc.setQueryData(arbiQueryKeys.userSettings(), (old: typeof settings.data) =>\n old ? { ...old, email_notifications: { ...old.email_notifications, ...patch } } : old\n )\n return { previous }\n },\n onError: (_err, _patch, context) => {\n qc.setQueryData(arbiQueryKeys.userSettings(), context?.previous)\n },\n onSettled: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() }),\n })\n\n const model = useMemo(() => toNotificationPreferences(stored, keys), [stored, keys])\n const setAll = useCallback(\n (value: boolean) => save.mutate(model.masterPatch(value)),\n [save, model]\n )\n const setCategory = useCallback(\n (key: string, value: boolean) => save.mutate(model.categoryPatch(key, value)),\n [save, model]\n )\n\n return {\n ...model,\n isLoading: settings.isLoading,\n isSaving: save.isPending,\n /** The master switch handler: every category on or off. */\n setAll,\n /** One category's handler. */\n setCategory,\n }\n}\n"],
5
+ "mappings": "AAMA,SAAS,aAAa,eAAe;AACrC,SAAS,aAAa,sBAAsB;AAC5C,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAmBzB,SAAS,0BACd,QACA,MAC8B;AAC9B,QAAM,UAAU,OAAO,YAAY,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,GAAG,KAAK,IAAI,CAAC,CAAC;AAClF,SAAO;AAAA,IACL,eAAe,KAAK,KAAK,CAAC,QAAQ,QAAQ,GAAG,CAAC;AAAA,IAC9C;AAAA,IACA,aAAa,CAAC,UAAU,OAAO,YAAY,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC;AAAA,IAC1E,eAAe,CAAC,KAAK,WAAW,EAAE,CAAC,GAAG,GAAG,MAAM;AAAA,EACjD;AACF;AASO,SAAS,2BACd,MACA,SACA;AACA,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,eAAe;AAC1B,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,SAAS,SAAS,MAAM;AAE9B,QAAM,OAAO,YAAY;AAAA,IACvB,YAAY,CAAC,UACX,KAAK,SAAS,OAAO,EAAE,qBAAqB,MAAM,CAAU;AAAA,IAC9D,UAAU,OAAO,UAAU;AACzB,YAAM,GAAG,cAAc,EAAE,UAAU,cAAc,aAAa,EAAE,CAAC;AACjE,YAAM,WAAW,GAAG,aAAa,cAAc,aAAa,CAAC;AAC7D,SAAG;AAAA,QAAa,cAAc,aAAa;AAAA,QAAG,CAAC,QAC7C,MAAM,EAAE,GAAG,KAAK,qBAAqB,EAAE,GAAG,IAAI,qBAAqB,GAAG,MAAM,EAAE,IAAI;AAAA,MACpF;AACA,aAAO,EAAE,SAAS;AAAA,IACpB;AAAA,IACA,SAAS,CAAC,MAAM,QAAQ,YAAY;AAClC,SAAG,aAAa,cAAc,aAAa,GAAG,SAAS,QAAQ;AAAA,IACjE;AAAA,IACA,WAAW,MAAM,GAAG,kBAAkB,EAAE,UAAU,cAAc,aAAa,EAAE,CAAC;AAAA,EAClF,CAAC;AAED,QAAM,QAAQ,QAAQ,MAAM,0BAA0B,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC;AACnF,QAAM,SAAS;AAAA,IACb,CAAC,UAAmB,KAAK,OAAO,MAAM,YAAY,KAAK,CAAC;AAAA,IACxD,CAAC,MAAM,KAAK;AAAA,EACd;AACA,QAAM,cAAc;AAAA,IAClB,CAAC,KAAa,UAAmB,KAAK,OAAO,MAAM,cAAc,KAAK,KAAK,CAAC;AAAA,IAC5E,CAAC,MAAM,KAAK;AAAA,EACd;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,SAAS;AAAA,IACpB,UAAU,KAAK;AAAA;AAAA,IAEf;AAAA;AAAA,IAEA;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,103 @@
1
+ import { useCallback, useMemo, useState } from "react";
2
+ import { useMutation } from "@tanstack/react-query";
3
+ import { passwordChangeErrorMessage } from "@arbidocs/client";
4
+ import { useAccountClient } from "./client.js";
5
+ function usePasswordChange() {
6
+ const { client } = useAccountClient();
7
+ return useMutation({
8
+ mutationFn: (vars) => client.changePassword(vars)
9
+ });
10
+ }
11
+ const DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES = {
12
+ required: "All fields are required",
13
+ mismatch: "New passwords do not match",
14
+ sameAsCurrent: "New password must be different from current password",
15
+ wrongCurrent: "Current password is incorrect.",
16
+ wrongRecoveryKey: "Recovery key did not match this account. Try a different recovery file."
17
+ };
18
+ function usePasswordChangeForm({
19
+ recoveryMode = false,
20
+ getUnmetRequirement,
21
+ submit,
22
+ onClose,
23
+ onRecoveryComplete,
24
+ messages
25
+ }) {
26
+ const m = useMemo(() => ({ ...DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES, ...messages }), [messages]);
27
+ const [currentPassword, setCurrentPassword] = useState("");
28
+ const [newPassword, setNewPassword] = useState("");
29
+ const [confirmPassword, setConfirmPassword] = useState("");
30
+ const [error, setError] = useState(null);
31
+ const [isProcessing, setIsProcessing] = useState(false);
32
+ const [isChanged, setIsChanged] = useState(false);
33
+ const clear = useCallback(() => {
34
+ setCurrentPassword("");
35
+ setNewPassword("");
36
+ setConfirmPassword("");
37
+ }, []);
38
+ const isSubmitDisabled = isProcessing || !recoveryMode && !currentPassword || !newPassword || !confirmPassword || getUnmetRequirement(newPassword) !== null || newPassword !== confirmPassword;
39
+ const onSubmit = useCallback(() => {
40
+ setError(null);
41
+ if (!recoveryMode && !currentPassword || !newPassword || !confirmPassword) {
42
+ return setError(m.required);
43
+ }
44
+ if (newPassword !== confirmPassword) return setError(m.mismatch);
45
+ const unmet = getUnmetRequirement(newPassword);
46
+ if (unmet !== null) return setError(unmet);
47
+ if (!recoveryMode && currentPassword === newPassword) return setError(m.sameAsCurrent);
48
+ setIsProcessing(true);
49
+ void submit({ newPassword, currentPassword: recoveryMode ? void 0 : currentPassword }).then(() => {
50
+ clear();
51
+ if (recoveryMode) {
52
+ onClose();
53
+ onRecoveryComplete?.();
54
+ } else {
55
+ setIsChanged(true);
56
+ }
57
+ }).catch((e) => {
58
+ const message = passwordChangeErrorMessage(e);
59
+ const wrongCurrent = /invalid signature|current password|401/i.test(message);
60
+ setError(wrongCurrent ? recoveryMode ? m.wrongRecoveryKey : m.wrongCurrent : message);
61
+ }).finally(() => setIsProcessing(false));
62
+ }, [
63
+ recoveryMode,
64
+ currentPassword,
65
+ newPassword,
66
+ confirmPassword,
67
+ getUnmetRequirement,
68
+ submit,
69
+ clear,
70
+ onClose,
71
+ onRecoveryComplete,
72
+ m
73
+ ]);
74
+ return {
75
+ currentPassword,
76
+ onCurrentPasswordChange: setCurrentPassword,
77
+ newPassword,
78
+ onNewPasswordChange: setNewPassword,
79
+ confirmPassword,
80
+ onConfirmPasswordChange: setConfirmPassword,
81
+ error,
82
+ isProcessing,
83
+ isSubmitDisabled,
84
+ onSubmit,
85
+ isChanged,
86
+ onCancel: () => {
87
+ clear();
88
+ setError(null);
89
+ setIsChanged(false);
90
+ onClose();
91
+ },
92
+ onDone: () => {
93
+ setIsChanged(false);
94
+ onClose();
95
+ }
96
+ };
97
+ }
98
+ export {
99
+ DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES,
100
+ usePasswordChange,
101
+ usePasswordChangeForm
102
+ };
103
+ //# sourceMappingURL=password.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/account/password.ts"],
4
+ "sourcesContent": ["/**\n * Password change: a new master password for the same account identity.\n *\n * The password only wraps the identity keypair, so a change is one request that re-encrypts nothing\n * and leaves the recovery key as it was (see `Arbi.account.changePassword`). `usePasswordChange` is\n * the SDK-bound mutation. `usePasswordChangeForm` is the controller behind `PasswordChangeDialog`:\n * fields, validation, error wording and the success state. It takes the submit as a function, so an\n * app without an `arbi` in its host binds the same dialog.\n */\n\nimport { useCallback, useMemo, useState } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { passwordChangeErrorMessage } from '@arbidocs/client'\nimport { useAccountClient } from './client'\n\n// \u2500\u2500 SDK-bound hook \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface PasswordChangeVars {\n newPassword: string\n /** Omit in recovery mode (after signing in with a recovery key). */\n currentPassword?: string\n}\n\n/** Change (or, in recovery mode, set) the master password through the account client in scope. */\nexport function usePasswordChange() {\n const { client } = useAccountClient()\n return useMutation({\n mutationFn: (vars: PasswordChangeVars): Promise<void> => client.changePassword(vars),\n })\n}\n\n// \u2500\u2500 Controller (no SDK) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface PasswordChangeFormMessages {\n required: string\n mismatch: string\n sameAsCurrent: string\n wrongCurrent: string\n wrongRecoveryKey: string\n}\n\nexport const DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES: PasswordChangeFormMessages = {\n required: 'All fields are required',\n mismatch: 'New passwords do not match',\n sameAsCurrent: 'New password must be different from current password',\n wrongCurrent: 'Current password is incorrect.',\n wrongRecoveryKey: 'Recovery key did not match this account. Try a different recovery file.',\n}\n\nexport interface UsePasswordChangeFormOptions {\n /** After recovery with a key: no current password is asked for. */\n recoveryMode?: boolean\n /** The host's password policy: the first unmet requirement, or `null` when the password is fine. */\n getUnmetRequirement: (password: string) => string | null\n /** Do the change. */\n submit: (vars: PasswordChangeVars) => Promise<void>\n /** The dialog should close (cancel, or done). */\n onClose: () => void\n /** Recovery finished: continue into the app. Recovery closes itself, with no success screen. */\n onRecoveryComplete?: () => void\n messages?: Partial<PasswordChangeFormMessages>\n}\n\nexport interface PasswordChangeForm {\n currentPassword: string\n onCurrentPasswordChange: (value: string) => void\n newPassword: string\n onNewPasswordChange: (value: string) => void\n confirmPassword: string\n onConfirmPasswordChange: (value: string) => void\n error: string | null\n isProcessing: boolean\n isSubmitDisabled: boolean\n onSubmit: () => void\n /** The change went through (normal mode): the dialog shows its success state. */\n isChanged: boolean\n /** Cancel and clear the form. */\n onCancel: () => void\n /** Leave the success screen. */\n onDone: () => void\n}\n\n/** The state machine of `PasswordChangeDialog`; spread it into the dialog's props. */\nexport function usePasswordChangeForm({\n recoveryMode = false,\n getUnmetRequirement,\n submit,\n onClose,\n onRecoveryComplete,\n messages,\n}: UsePasswordChangeFormOptions): PasswordChangeForm {\n const m = useMemo(() => ({ ...DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES, ...messages }), [messages])\n const [currentPassword, setCurrentPassword] = useState('')\n const [newPassword, setNewPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [isProcessing, setIsProcessing] = useState(false)\n const [isChanged, setIsChanged] = useState(false)\n\n const clear = useCallback(() => {\n setCurrentPassword('')\n setNewPassword('')\n setConfirmPassword('')\n }, [])\n\n const isSubmitDisabled =\n isProcessing ||\n (!recoveryMode && !currentPassword) ||\n !newPassword ||\n !confirmPassword ||\n getUnmetRequirement(newPassword) !== null ||\n newPassword !== confirmPassword\n\n const onSubmit = useCallback(() => {\n setError(null)\n if ((!recoveryMode && !currentPassword) || !newPassword || !confirmPassword) {\n return setError(m.required)\n }\n if (newPassword !== confirmPassword) return setError(m.mismatch)\n const unmet = getUnmetRequirement(newPassword)\n if (unmet !== null) return setError(unmet)\n if (!recoveryMode && currentPassword === newPassword) return setError(m.sameAsCurrent)\n\n setIsProcessing(true)\n void submit({ newPassword, currentPassword: recoveryMode ? undefined : currentPassword })\n .then(() => {\n clear()\n if (recoveryMode) {\n onClose()\n onRecoveryComplete?.()\n } else {\n setIsChanged(true)\n }\n })\n .catch((e: unknown) => {\n const message = passwordChangeErrorMessage(e)\n const wrongCurrent = /invalid signature|current password|401/i.test(message)\n setError(wrongCurrent ? (recoveryMode ? m.wrongRecoveryKey : m.wrongCurrent) : message)\n })\n .finally(() => setIsProcessing(false))\n }, [\n recoveryMode,\n currentPassword,\n newPassword,\n confirmPassword,\n getUnmetRequirement,\n submit,\n clear,\n onClose,\n onRecoveryComplete,\n m,\n ])\n\n return {\n currentPassword,\n onCurrentPasswordChange: setCurrentPassword,\n newPassword,\n onNewPasswordChange: setNewPassword,\n confirmPassword,\n onConfirmPasswordChange: setConfirmPassword,\n error,\n isProcessing,\n isSubmitDisabled,\n onSubmit,\n isChanged,\n onCancel: () => {\n clear()\n setError(null)\n setIsChanged(false)\n onClose()\n },\n onDone: () => {\n setIsChanged(false)\n onClose()\n },\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,116 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { arbiQueryKeys } from "../hooks.js";
4
+ import { useAccountClient } from "./client.js";
5
+ function toProfileView(profile) {
6
+ return {
7
+ ...profile,
8
+ fullName: [profile.givenName, profile.familyName].map((part) => part?.trim()).filter(Boolean).join(" ")
9
+ };
10
+ }
11
+ function useProfile(options) {
12
+ const { client, enabled } = useAccountClient();
13
+ const qc = useQueryClient();
14
+ useEffect(
15
+ () => client.onProfileChange(() => qc.setQueryData(arbiQueryKeys.profile(), client.profile())),
16
+ [client, qc]
17
+ );
18
+ return useQuery({
19
+ queryKey: arbiQueryKeys.profile(),
20
+ queryFn: () => client.profile(),
21
+ enabled: (options?.enabled ?? true) && enabled,
22
+ staleTime: Infinity
23
+ });
24
+ }
25
+ function useUpdateProfile() {
26
+ const { client } = useAccountClient();
27
+ const qc = useQueryClient();
28
+ return useMutation({
29
+ mutationFn: async (vars) => {
30
+ await client.updateProfile(vars);
31
+ return client.profile();
32
+ },
33
+ onSuccess: (profile) => {
34
+ qc.setQueryData(arbiQueryKeys.profile(), profile);
35
+ void qc.invalidateQueries({ queryKey: arbiQueryKeys.identity() });
36
+ return qc.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() });
37
+ }
38
+ });
39
+ }
40
+ function useNameEditor({ givenName, familyName, save }) {
41
+ const [isEditing, setIsEditing] = useState(false);
42
+ const [given, setGiven] = useState("");
43
+ const [family, setFamily] = useState("");
44
+ const [isSaving, setIsSaving] = useState(false);
45
+ const [error, setError] = useState(null);
46
+ const onStartEdit = useCallback(() => {
47
+ setGiven(givenName ?? "");
48
+ setFamily(familyName ?? "");
49
+ setError(null);
50
+ setIsEditing(true);
51
+ }, [givenName, familyName]);
52
+ const onSave = useCallback(() => {
53
+ const trimmedGiven = given.trim();
54
+ if (!trimmedGiven) return;
55
+ setIsSaving(true);
56
+ setError(null);
57
+ void Promise.resolve().then(() => save({ givenName: trimmedGiven, familyName: family.trim() })).then(() => setIsEditing(false)).catch((e) => setError(e)).finally(() => setIsSaving(false));
58
+ }, [given, family, save]);
59
+ return {
60
+ isEditing,
61
+ givenName: given,
62
+ familyName: family,
63
+ onGivenNameChange: setGiven,
64
+ onFamilyNameChange: setFamily,
65
+ onStartEdit,
66
+ onSave,
67
+ onCancel: () => setIsEditing(false),
68
+ isSaving,
69
+ error
70
+ };
71
+ }
72
+ const MAX_AVATAR_FILE_BYTES = 5 * 1024 * 1024;
73
+ function useAvatarCrop({
74
+ upload,
75
+ onProblem,
76
+ maxBytes = MAX_AVATAR_FILE_BYTES
77
+ }) {
78
+ const [pendingImage, setPendingImage] = useState(null);
79
+ const [isUploading, setIsUploading] = useState(false);
80
+ const onFileChosen = useCallback(
81
+ (file) => {
82
+ if (!file.type.startsWith("image/")) return onProblem?.("not-image");
83
+ if (file.size > maxBytes) return onProblem?.("too-large");
84
+ const reader = new FileReader();
85
+ reader.onload = () => setPendingImage(reader.result);
86
+ reader.onerror = () => onProblem?.("unreadable");
87
+ reader.readAsDataURL(file);
88
+ },
89
+ [maxBytes, onProblem]
90
+ );
91
+ const onCropComplete = useCallback(
92
+ (result) => {
93
+ setPendingImage(null);
94
+ setIsUploading(true);
95
+ void Promise.resolve().then(() => upload(result.dataUrl)).catch(() => {
96
+ }).finally(() => setIsUploading(false));
97
+ },
98
+ [upload]
99
+ );
100
+ return {
101
+ onFileChosen,
102
+ pendingImage,
103
+ onCropComplete,
104
+ onCropCancel: () => setPendingImage(null),
105
+ isUploading
106
+ };
107
+ }
108
+ export {
109
+ MAX_AVATAR_FILE_BYTES,
110
+ toProfileView,
111
+ useAvatarCrop,
112
+ useNameEditor,
113
+ useProfile,
114
+ useUpdateProfile
115
+ };
116
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/account/profile.ts"],
4
+ "sourcesContent": ["/**\n * Profile: the signed-in user's name and picture.\n *\n * Two layers, like the rest of the package. The bound hooks (`useProfile`, `useUpdateProfile`) go\n * through the account client in scope (`useAccountClient`: the host configuration's `account`, else\n * one on its `arbi`). The controllers (`useNameEditor`, `useAvatarCrop`) own only the form\n * state and take the save as a function, so an app that has its own API layer (ARBI-frontend)\n * binds the same `ProfileCard` / `AvatarPicker` parts without a provider.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { LoginProfile } from '@arbidocs/sdk/browser'\nimport { arbiQueryKeys } from '../hooks'\nimport { useAccountClient } from './client'\n\n// \u2500\u2500 View model \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ProfileView {\n givenName: string\n familyName: string | null\n picture: string | null\n email: string\n /** The sign-in provider manages the email (it cannot be changed here). */\n isSso: boolean\n /** Verified tick: passed an ID check under this name, not expired. */\n isIdentityVerified?: boolean\n /** Given and family name joined; empty while the profile has no name. */\n fullName: string\n}\n\n/** The profile as the UI reads it. `fullName` is the profile name, never the email. */\nexport function toProfileView(profile: LoginProfile): ProfileView {\n return {\n ...profile,\n fullName: [profile.givenName, profile.familyName]\n .map((part) => part?.trim())\n .filter(Boolean)\n .join(' '),\n }\n}\n\n// \u2500\u2500 SDK-bound hooks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** The signed-in user's profile; `null` when the session has none (restored without a login). */\nexport function useProfile(options?: { enabled?: boolean }) {\n const { client, enabled } = useAccountClient()\n const qc = useQueryClient()\n // The profile changes outside these hooks too (another tab, an ID check, a re-login).\n useEffect(\n () => client.onProfileChange(() => qc.setQueryData(arbiQueryKeys.profile(), client.profile())),\n [client, qc]\n )\n return useQuery({\n queryKey: arbiQueryKeys.profile(),\n queryFn: (): ProfileView | null => client.profile(),\n enabled: (options?.enabled ?? true) && enabled,\n staleTime: Infinity,\n })\n}\n\nexport interface UpdateProfileVars {\n givenName?: string\n /** `''` clears it. */\n familyName?: string\n /** A data URL or URL; `''` clears it (the backend caps it at 100 KB). */\n picture?: string\n}\n\n/**\n * Save the name and/or picture (PATCH /v1/user/profile). The profile query is updated in place and\n * the workspace list (member rows carry the name) is refreshed, so every surface follows.\n */\nexport function useUpdateProfile() {\n const { client } = useAccountClient()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: async (vars: UpdateProfileVars) => {\n await client.updateProfile(vars)\n return client.profile()\n },\n onSuccess: (profile) => {\n qc.setQueryData(arbiQueryKeys.profile(), profile)\n // A rename can drop (or restore) the verified tick.\n void qc.invalidateQueries({ queryKey: arbiQueryKeys.identity() })\n return qc.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() })\n },\n })\n}\n\n// \u2500\u2500 Controllers (no SDK) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface UseNameEditorOptions {\n givenName: string | null | undefined\n familyName: string | null | undefined\n /** Persist the new name. Reject to keep the editor open (see `error`). */\n save: (name: { givenName: string; familyName: string }) => Promise<unknown> | unknown\n}\n\nexport interface NameEditor {\n isEditing: boolean\n givenName: string\n familyName: string\n onGivenNameChange: (value: string) => void\n onFamilyNameChange: (value: string) => void\n onStartEdit: () => void\n onSave: () => void\n onCancel: () => void\n isSaving: boolean\n /** The last failed save. */\n error: unknown\n}\n\n/**\n * State of the inline name editor of `ProfileCard`: start edit (seeded from the current name),\n * save (trimmed; a blank given name is not saved), cancel. Spread it into `ProfileCard`'s `name`\n * with `display`.\n */\nexport function useNameEditor({ givenName, familyName, save }: UseNameEditorOptions): NameEditor {\n const [isEditing, setIsEditing] = useState(false)\n const [given, setGiven] = useState('')\n const [family, setFamily] = useState('')\n const [isSaving, setIsSaving] = useState(false)\n const [error, setError] = useState<unknown>(null)\n\n const onStartEdit = useCallback(() => {\n setGiven(givenName ?? '')\n setFamily(familyName ?? '')\n setError(null)\n setIsEditing(true)\n }, [givenName, familyName])\n\n const onSave = useCallback(() => {\n const trimmedGiven = given.trim()\n if (!trimmedGiven) return\n setIsSaving(true)\n setError(null)\n void Promise.resolve()\n .then(() => save({ givenName: trimmedGiven, familyName: family.trim() }))\n .then(() => setIsEditing(false))\n .catch((e: unknown) => setError(e))\n .finally(() => setIsSaving(false))\n }, [given, family, save])\n\n return {\n isEditing,\n givenName: given,\n familyName: family,\n onGivenNameChange: setGiven,\n onFamilyNameChange: setFamily,\n onStartEdit,\n onSave,\n onCancel: () => setIsEditing(false),\n isSaving,\n error,\n }\n}\n\n/** Largest picture file accepted before cropping. */\nexport const MAX_AVATAR_FILE_BYTES = 5 * 1024 * 1024\n\nexport type AvatarFileProblem = 'not-image' | 'too-large' | 'unreadable'\n\nexport interface UseAvatarCropOptions {\n /** Persist the cropped picture (a data URL). */\n upload: (dataUrl: string) => Promise<unknown> | unknown\n /** Report a rejected file or a failed read; default is silent (the picker just does not open). */\n onProblem?: (problem: AvatarFileProblem) => void\n maxBytes?: number\n}\n\nexport interface AvatarCrop {\n /** Pass to `AvatarPicker.onFileChosen`. */\n onFileChosen: (file: File) => void\n /** The chosen image awaiting a crop (a data URL), else `null`. */\n pendingImage: string | null\n /** Pass to the crop dialog's `onComplete`. */\n onCropComplete: (result: { dataUrl: string }) => void\n onCropCancel: () => void\n isUploading: boolean\n}\n\n/**\n * The choose, validate, crop, upload sequence behind `AvatarPicker`: the picker hands over a file,\n * this checks it (image, size) and reads it for the crop dialog, then uploads the cropped data URL.\n */\nexport function useAvatarCrop({\n upload,\n onProblem,\n maxBytes = MAX_AVATAR_FILE_BYTES,\n}: UseAvatarCropOptions): AvatarCrop {\n const [pendingImage, setPendingImage] = useState<string | null>(null)\n const [isUploading, setIsUploading] = useState(false)\n\n const onFileChosen = useCallback(\n (file: File) => {\n if (!file.type.startsWith('image/')) return onProblem?.('not-image')\n if (file.size > maxBytes) return onProblem?.('too-large')\n const reader = new FileReader()\n reader.onload = () => setPendingImage(reader.result as string)\n reader.onerror = () => onProblem?.('unreadable')\n reader.readAsDataURL(file)\n },\n [maxBytes, onProblem]\n )\n\n const onCropComplete = useCallback(\n (result: { dataUrl: string }) => {\n setPendingImage(null)\n setIsUploading(true)\n void Promise.resolve()\n .then(() => upload(result.dataUrl))\n .catch(() => {\n // The host's `upload` reports its own failure; the picker just stops spinning.\n })\n .finally(() => setIsUploading(false))\n },\n [upload]\n )\n\n return {\n onFileChosen,\n pendingImage,\n onCropComplete,\n onCropCancel: () => setPendingImage(null),\n isUploading,\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ import { createRecoveryFile } from "@arbidocs/client";
2
+ import { downloadBlob } from "../document-tools/environment.js";
3
+ async function downloadRecoveryFile(params) {
4
+ const file = await createRecoveryFile({
5
+ ...params,
6
+ origin: params.origin ?? window.location.origin
7
+ });
8
+ downloadBlob(new Blob([file.html], { type: "text/html" }), file.filename);
9
+ }
10
+ export {
11
+ downloadRecoveryFile
12
+ };
13
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/account/recovery.ts"],
4
+ "sourcesContent": ["/**\n * Saving the account's recovery key in the browser: the recovery file (`createRecoveryFile` of\n * `@arbidocs/client`, a one-link HTML page) downloaded for the current origin.\n */\n\nimport { createRecoveryFile, type RecoveryKeyParams } from '@arbidocs/client'\nimport { downloadBlob } from '../document-tools/environment'\n\n/** Download the recovery file. `origin` defaults to the page's own; `auth0Sub` SSO-wraps the key. */\nexport async function downloadRecoveryFile(\n params: Omit<RecoveryKeyParams, 'origin'> & { origin?: string }\n): Promise<void> {\n const file = await createRecoveryFile({\n ...params,\n origin: params.origin ?? window.location.origin,\n })\n downloadBlob(new Blob([file.html], { type: 'text/html' }), file.filename)\n}\n"],
5
+ "mappings": "AAKA,SAAS,0BAAkD;AAC3D,SAAS,oBAAoB;AAG7B,eAAsB,qBACpB,QACe;AACf,QAAM,OAAO,MAAM,mBAAmB;AAAA,IACpC,GAAG;AAAA,IACH,QAAQ,OAAO,UAAU,OAAO,SAAS;AAAA,EAC3C,CAAC;AACD,eAAa,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,MAAM,YAAY,CAAC,GAAG,KAAK,QAAQ;AAC1E;",
6
+ "names": []
7
+ }
@@ -0,0 +1,82 @@
1
+ import { useCallback } from "react";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { settings as settingsOps } from "@arbidocs/sdk/browser";
4
+ import { useArbi } from "../useArbi.js";
5
+ import { arbiQueryKeys } from "../hooks.js";
6
+ import { useUserSettings } from "./settings.js";
7
+ function useRelevanceSave() {
8
+ const arbi = useArbi();
9
+ const qc = useQueryClient();
10
+ return useMutation({
11
+ mutationFn: (patch) => arbi.settings.update(patch),
12
+ onMutate: async (patch) => {
13
+ await qc.cancelQueries({ queryKey: arbiQueryKeys.userSettings() });
14
+ const previous = qc.getQueryData(arbiQueryKeys.userSettings());
15
+ qc.setQueryData(
16
+ arbiQueryKeys.userSettings(),
17
+ (old) => old ? { ...old, ...patch } : old
18
+ );
19
+ return { previous };
20
+ },
21
+ onError: (_err, _patch, context) => {
22
+ qc.setQueryData(arbiQueryKeys.userSettings(), context?.previous);
23
+ },
24
+ onSettled: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() })
25
+ });
26
+ }
27
+ function useWorkspaceNotificationLevel(workspaceId, options) {
28
+ const qc = useQueryClient();
29
+ const settings = useUserSettings(options);
30
+ const save = useRelevanceSave();
31
+ const level = workspaceId ? settingsOps.workspaceNotificationLevel(settings.data, workspaceId) : "default";
32
+ const setLevel = useCallback(
33
+ (next) => {
34
+ if (!workspaceId) return;
35
+ const current = qc.getQueryData(arbiQueryKeys.userSettings()) ?? settings.data;
36
+ save.mutate(settingsOps.workspaceLevelPatch(current, workspaceId, next));
37
+ },
38
+ [qc, save, settings.data, workspaceId]
39
+ );
40
+ return {
41
+ level,
42
+ setLevel,
43
+ isLoading: settings.isLoading,
44
+ isSaving: save.isPending,
45
+ error: save.error
46
+ };
47
+ }
48
+ function useFollowThread(conversationId, options) {
49
+ const qc = useQueryClient();
50
+ const settings = useUserSettings(options);
51
+ const save = useRelevanceSave();
52
+ const following = !!conversationId && !!settings.data?.followed_threads?.includes(conversationId);
53
+ const setFollowing = useCallback(
54
+ (on, callbacks) => {
55
+ if (!conversationId) return;
56
+ const current = qc.getQueryData(arbiQueryKeys.userSettings()) ?? settings.data;
57
+ save.mutate(
58
+ {
59
+ followed_threads: settingsOps.withMembership(
60
+ current?.followed_threads,
61
+ conversationId,
62
+ on
63
+ )
64
+ },
65
+ callbacks
66
+ );
67
+ },
68
+ [qc, save, settings.data, conversationId]
69
+ );
70
+ return {
71
+ following,
72
+ setFollowing,
73
+ isLoading: settings.isLoading,
74
+ isSaving: save.isPending,
75
+ error: save.error
76
+ };
77
+ }
78
+ export {
79
+ useFollowThread,
80
+ useWorkspaceNotificationLevel
81
+ };
82
+ //# sourceMappingURL=relevance.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/account/relevance.ts"],
4
+ "sourcesContent": ["/**\n * Follow and mute: the relevance lists of the user settings. A workspace member is pushed only what\n * concerns them (a mention, an assignment, a reply in a thread they take part in). Following a\n * workspace or a thread opts in to everything from it; muting a workspace silences it, mentions\n * included. Everything else is in the workspace's activity feed.\n *\n * The server takes each list whole: a save sends the full new list, worked out from the cached\n * settings, and updates the cache straight away; a failed write rolls back.\n */\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { settings as settingsOps } from '@arbidocs/sdk/browser'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../hooks'\nimport { useUserSettings } from './settings'\n\n/** `default` (what names or involves you), `following` (everything) or `muted` (nothing). */\nexport type WorkspaceNotificationLevel = settingsOps.WorkspaceNotificationLevel\n\n/** The lists a follow or mute write may send. */\nexport interface RelevancePatch {\n muted_workspaces?: string[]\n followed_workspaces?: string[]\n followed_threads?: string[]\n}\n\ntype Settings = NonNullable<ReturnType<typeof useUserSettings>['data']>\n\n/** A write of some of the lists, applied to the cached settings at once. */\nfunction useRelevanceSave() {\n const arbi = useArbi()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: (patch: RelevancePatch) => arbi.settings.update(patch),\n onMutate: async (patch) => {\n await qc.cancelQueries({ queryKey: arbiQueryKeys.userSettings() })\n const previous = qc.getQueryData<Settings>(arbiQueryKeys.userSettings())\n qc.setQueryData<Settings>(arbiQueryKeys.userSettings(), (old) =>\n old ? { ...old, ...patch } : old\n )\n return { previous }\n },\n onError: (_err, _patch, context) => {\n qc.setQueryData(arbiQueryKeys.userSettings(), context?.previous)\n },\n onSettled: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() }),\n })\n}\n\n/**\n * How much of a workspace reaches the user: `default`, `following` (everything) or `muted`\n * (nothing). `setLevel` moves the workspace between the two lists in one write.\n */\nexport function useWorkspaceNotificationLevel(\n workspaceId: string | null | undefined,\n options?: { enabled?: boolean }\n) {\n const qc = useQueryClient()\n const settings = useUserSettings(options)\n const save = useRelevanceSave()\n const level = workspaceId\n ? settingsOps.workspaceNotificationLevel(settings.data, workspaceId)\n : 'default'\n const setLevel = useCallback(\n (next: WorkspaceNotificationLevel) => {\n if (!workspaceId) return\n const current = qc.getQueryData<Settings>(arbiQueryKeys.userSettings()) ?? settings.data\n save.mutate(settingsOps.workspaceLevelPatch(current, workspaceId, next))\n },\n [qc, save, settings.data, workspaceId]\n )\n return {\n level,\n setLevel,\n isLoading: settings.isLoading,\n isSaving: save.isPending,\n error: save.error,\n }\n}\n\n/** What the host does once a follow switch is saved or refused (e.g. a toast: nothing else shows). */\nexport interface FollowSaveCallbacks {\n onSuccess?: () => void\n onError?: (error: Error) => void\n}\n\n/** Whether the user follows a thread (pushed everything in it), and the switch. */\nexport function useFollowThread(\n conversationId: string | null | undefined,\n options?: { enabled?: boolean }\n) {\n const qc = useQueryClient()\n const settings = useUserSettings(options)\n const save = useRelevanceSave()\n const following = !!conversationId && !!settings.data?.followed_threads?.includes(conversationId)\n const setFollowing = useCallback(\n (on: boolean, callbacks?: FollowSaveCallbacks) => {\n if (!conversationId) return\n const current = qc.getQueryData<Settings>(arbiQueryKeys.userSettings()) ?? settings.data\n save.mutate(\n {\n followed_threads: settingsOps.withMembership(\n current?.followed_threads,\n conversationId,\n on\n ),\n },\n callbacks\n )\n },\n [qc, save, settings.data, conversationId]\n )\n return {\n following,\n setFollowing,\n isLoading: settings.isLoading,\n isSaving: save.isPending,\n error: save.error,\n }\n}\n"],
5
+ "mappings": "AAUA,SAAS,mBAAmB;AAC5B,SAAS,aAAa,sBAAsB;AAC5C,SAAS,YAAY,mBAAmB;AACxC,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAehC,SAAS,mBAAmB;AAC1B,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,eAAe;AAC1B,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,UAA0B,KAAK,SAAS,OAAO,KAAK;AAAA,IACjE,UAAU,OAAO,UAAU;AACzB,YAAM,GAAG,cAAc,EAAE,UAAU,cAAc,aAAa,EAAE,CAAC;AACjE,YAAM,WAAW,GAAG,aAAuB,cAAc,aAAa,CAAC;AACvE,SAAG;AAAA,QAAuB,cAAc,aAAa;AAAA,QAAG,CAAC,QACvD,MAAM,EAAE,GAAG,KAAK,GAAG,MAAM,IAAI;AAAA,MAC/B;AACA,aAAO,EAAE,SAAS;AAAA,IACpB;AAAA,IACA,SAAS,CAAC,MAAM,QAAQ,YAAY;AAClC,SAAG,aAAa,cAAc,aAAa,GAAG,SAAS,QAAQ;AAAA,IACjE;AAAA,IACA,WAAW,MAAM,GAAG,kBAAkB,EAAE,UAAU,cAAc,aAAa,EAAE,CAAC;AAAA,EAClF,CAAC;AACH;AAMO,SAAS,8BACd,aACA,SACA;AACA,QAAM,KAAK,eAAe;AAC1B,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,OAAO,iBAAiB;AAC9B,QAAM,QAAQ,cACV,YAAY,2BAA2B,SAAS,MAAM,WAAW,IACjE;AACJ,QAAM,WAAW;AAAA,IACf,CAAC,SAAqC;AACpC,UAAI,CAAC,YAAa;AAClB,YAAM,UAAU,GAAG,aAAuB,cAAc,aAAa,CAAC,KAAK,SAAS;AACpF,WAAK,OAAO,YAAY,oBAAoB,SAAS,aAAa,IAAI,CAAC;AAAA,IACzE;AAAA,IACA,CAAC,IAAI,MAAM,SAAS,MAAM,WAAW;AAAA,EACvC;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,SAAS;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,EACd;AACF;AASO,SAAS,gBACd,gBACA,SACA;AACA,QAAM,KAAK,eAAe;AAC1B,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,OAAO,iBAAiB;AAC9B,QAAM,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,SAAS,MAAM,kBAAkB,SAAS,cAAc;AAChG,QAAM,eAAe;AAAA,IACnB,CAAC,IAAa,cAAoC;AAChD,UAAI,CAAC,eAAgB;AACrB,YAAM,UAAU,GAAG,aAAuB,cAAc,aAAa,CAAC,KAAK,SAAS;AACpF,WAAK;AAAA,QACH;AAAA,UACE,kBAAkB,YAAY;AAAA,YAC5B,SAAS;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,IAAI,MAAM,SAAS,MAAM,cAAc;AAAA,EAC1C;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,SAAS;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,EACd;AACF;",
6
+ "names": []
7
+ }