@arbidocs/react 0.5.111 → 0.5.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (983) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  304. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  305. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  306. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  307. package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
  308. package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  309. package/dist/config/config-hooks.js +209 -0
  310. package/dist/config/config-hooks.js.map +7 -0
  311. package/dist/connectivity.js +72 -0
  312. package/dist/connectivity.js.map +7 -0
  313. package/dist/connectors/hooks.js +263 -0
  314. package/dist/connectors/hooks.js.map +7 -0
  315. package/dist/connectors/index.js +28 -0
  316. package/dist/connectors/index.js.map +7 -0
  317. package/dist/contacts.js +100 -0
  318. package/dist/contacts.js.map +7 -0
  319. package/dist/conversation-list.js +65 -0
  320. package/dist/conversation-list.js.map +7 -0
  321. package/dist/databases.js +195 -0
  322. package/dist/databases.js.map +7 -0
  323. package/dist/datasets/aggregate.js +281 -0
  324. package/dist/datasets/aggregate.js.map +7 -0
  325. package/dist/datasets/index.js +122 -0
  326. package/dist/datasets/index.js.map +7 -0
  327. package/dist/datasets/members.js +27 -0
  328. package/dist/datasets/members.js.map +7 -0
  329. package/dist/datasets/panel.js +44 -0
  330. package/dist/datasets/panel.js.map +7 -0
  331. package/dist/datasets/registry.js +47 -0
  332. package/dist/datasets/registry.js.map +7 -0
  333. package/dist/datasets/rows-source.js +44 -0
  334. package/dist/datasets/rows-source.js.map +7 -0
  335. package/dist/datasets/sources/activity.js +83 -0
  336. package/dist/datasets/sources/activity.js.map +7 -0
  337. package/dist/datasets/sources/conversations.js +74 -0
  338. package/dist/datasets/sources/conversations.js.map +7 -0
  339. package/dist/datasets/sources/database.js +209 -0
  340. package/dist/datasets/sources/database.js.map +7 -0
  341. package/dist/datasets/sources/documents.js +93 -0
  342. package/dist/datasets/sources/documents.js.map +7 -0
  343. package/dist/datasets/sources/facts.js +56 -0
  344. package/dist/datasets/sources/facts.js.map +7 -0
  345. package/dist/datasets/sources/projects.js +117 -0
  346. package/dist/datasets/sources/projects.js.map +7 -0
  347. package/dist/datasets/sources/tags.js +67 -0
  348. package/dist/datasets/sources/tags.js.map +7 -0
  349. package/dist/datasets/sources/usage.js +268 -0
  350. package/dist/datasets/sources/usage.js.map +7 -0
  351. package/dist/datasets/sources/workflows.js +91 -0
  352. package/dist/datasets/sources/workflows.js.map +7 -0
  353. package/dist/datasets/sources/workspaces.js +67 -0
  354. package/dist/datasets/sources/workspaces.js.map +7 -0
  355. package/dist/datasets/store.js +194 -0
  356. package/dist/datasets/store.js.map +7 -0
  357. package/dist/datasets/types.js +14 -0
  358. package/dist/datasets/types.js.map +7 -0
  359. package/dist/directmessages/ConversationList.js +148 -0
  360. package/dist/directmessages/ConversationList.js.map +7 -0
  361. package/dist/directmessages/DateSeparator.js +8 -0
  362. package/dist/directmessages/DateSeparator.js.map +7 -0
  363. package/dist/directmessages/DmAvatar.js +29 -0
  364. package/dist/directmessages/DmAvatar.js.map +7 -0
  365. package/dist/directmessages/DmComposer.js +201 -0
  366. package/dist/directmessages/DmComposer.js.map +7 -0
  367. package/dist/directmessages/arrivals.js +29 -0
  368. package/dist/directmessages/arrivals.js.map +7 -0
  369. package/dist/directmessages/chat-cache.js +192 -0
  370. package/dist/directmessages/chat-cache.js.map +7 -0
  371. package/dist/directmessages/grouping.js +26 -0
  372. package/dist/directmessages/grouping.js.map +7 -0
  373. package/dist/directmessages/index.js +81 -0
  374. package/dist/directmessages/index.js.map +7 -0
  375. package/dist/directmessages/useChats.js +266 -0
  376. package/dist/directmessages/useChats.js.map +7 -0
  377. package/dist/directmessages/utils.js +23 -0
  378. package/dist/directmessages/utils.js.map +7 -0
  379. package/dist/document-tools/can-annotate.js +7 -0
  380. package/dist/document-tools/can-annotate.js.map +7 -0
  381. package/dist/document-tools/core.cjs +80 -80
  382. package/dist/document-tools/core.js +218 -12
  383. package/dist/document-tools/core.js.map +7 -1
  384. package/dist/document-tools/document-pdf.js +76 -0
  385. package/dist/document-tools/document-pdf.js.map +7 -0
  386. package/dist/document-tools/environment.js +136 -0
  387. package/dist/document-tools/environment.js.map +7 -0
  388. package/dist/document-tools/file-shares.js +112 -0
  389. package/dist/document-tools/file-shares.js.map +7 -0
  390. package/dist/document-tools/frozen-copy.js +27 -0
  391. package/dist/document-tools/frozen-copy.js.map +7 -0
  392. package/dist/document-tools/index.cjs +80 -80
  393. package/dist/document-tools/index.js +26 -148
  394. package/dist/document-tools/index.js.map +7 -1
  395. package/dist/document-tools/markup-download.js +51 -0
  396. package/dist/document-tools/markup-download.js.map +7 -0
  397. package/dist/document-tools/markup-store.js +138 -0
  398. package/dist/document-tools/markup-store.js.map +7 -0
  399. package/dist/document-tools/markup-transfer.js +88 -0
  400. package/dist/document-tools/markup-transfer.js.map +7 -0
  401. package/dist/document-tools/production.js +147 -0
  402. package/dist/document-tools/production.js.map +7 -0
  403. package/dist/document-tools/saved-signature.js +90 -0
  404. package/dist/document-tools/saved-signature.js.map +7 -0
  405. package/dist/document-tools/signature-requests.js +310 -0
  406. package/dist/document-tools/signature-requests.js.map +7 -0
  407. package/dist/document-tools/signing.js +127 -0
  408. package/dist/document-tools/signing.js.map +7 -0
  409. package/dist/document-tools/useDocumentBytes.js +38 -0
  410. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  411. package/dist/document-tools/useDocumentMarkup.js +154 -0
  412. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  413. package/dist/document-tools/useIsOnline.js +13 -0
  414. package/dist/document-tools/useIsOnline.js.map +7 -0
  415. package/dist/document-tools/verification.js +60 -0
  416. package/dist/document-tools/verification.js.map +7 -0
  417. package/dist/documents/DocumentReview.js +220 -0
  418. package/dist/documents/DocumentReview.js.map +7 -0
  419. package/dist/documents/DraftTitleControls.js +41 -0
  420. package/dist/documents/DraftTitleControls.js.map +7 -0
  421. package/dist/documents/InlineMicButton.js +90 -0
  422. package/dist/documents/InlineMicButton.js.map +7 -0
  423. package/dist/documents/MicRecordingOverlay.js +29 -0
  424. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  425. package/dist/documents/MicWaveformIndicator.js +68 -0
  426. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  427. package/dist/documents/PhotoCapture.js +120 -0
  428. package/dist/documents/PhotoCapture.js.map +7 -0
  429. package/dist/documents/VideoCapture.js +129 -0
  430. package/dist/documents/VideoCapture.js.map +7 -0
  431. package/dist/documents/VoiceNoteRecorder.js +166 -0
  432. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  433. package/dist/documents/audio-segmenter.js +63 -0
  434. package/dist/documents/audio-segmenter.js.map +7 -0
  435. package/dist/documents/capture-frame.js +21 -0
  436. package/dist/documents/capture-frame.js.map +7 -0
  437. package/dist/documents/chunked-recorder.js +190 -0
  438. package/dist/documents/chunked-recorder.js.map +7 -0
  439. package/dist/documents/document-download.js +53 -0
  440. package/dist/documents/document-download.js.map +7 -0
  441. package/dist/documents/document-fields.js +109 -0
  442. package/dist/documents/document-fields.js.map +7 -0
  443. package/dist/documents/documents-cache.js +110 -0
  444. package/dist/documents/documents-cache.js.map +7 -0
  445. package/dist/documents/documents-data.js +128 -0
  446. package/dist/documents/documents-data.js.map +7 -0
  447. package/dist/documents/documents-loader.js +113 -0
  448. package/dist/documents/documents-loader.js.map +7 -0
  449. package/dist/documents/documents-writes.js +448 -0
  450. package/dist/documents/documents-writes.js.map +7 -0
  451. package/dist/documents/format-elapsed.js +10 -0
  452. package/dist/documents/format-elapsed.js.map +7 -0
  453. package/dist/documents/has-video-track.js +26 -0
  454. package/dist/documents/has-video-track.js.map +7 -0
  455. package/dist/documents/index.js +266 -0
  456. package/dist/documents/index.js.map +7 -0
  457. package/dist/documents/media-error.js +18 -0
  458. package/dist/documents/media-error.js.map +7 -0
  459. package/dist/documents/offline-documents.js +160 -0
  460. package/dist/documents/offline-documents.js.map +7 -0
  461. package/dist/documents/pending-sync.js +210 -0
  462. package/dist/documents/pending-sync.js.map +7 -0
  463. package/dist/documents/processing-live.js +122 -0
  464. package/dist/documents/processing-live.js.map +7 -0
  465. package/dist/documents/processing-order.js +59 -0
  466. package/dist/documents/processing-order.js.map +7 -0
  467. package/dist/documents/processing-settle.js +21 -0
  468. package/dist/documents/processing-settle.js.map +7 -0
  469. package/dist/documents/related-documents.js +133 -0
  470. package/dist/documents/related-documents.js.map +7 -0
  471. package/dist/documents/support.js +29 -0
  472. package/dist/documents/support.js.map +7 -0
  473. package/dist/documents/upload-files.js +169 -0
  474. package/dist/documents/upload-files.js.map +7 -0
  475. package/dist/documents/useAudioRecorder.js +315 -0
  476. package/dist/documents/useAudioRecorder.js.map +7 -0
  477. package/dist/documents/useCameraStream.js +35 -0
  478. package/dist/documents/useCameraStream.js.map +7 -0
  479. package/dist/documents/useDocumentThumbnails.js +71 -0
  480. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  481. package/dist/documents/useDownloadDocuments.js +90 -0
  482. package/dist/documents/useDownloadDocuments.js.map +7 -0
  483. package/dist/documents/usePassageQuotes.js +37 -0
  484. package/dist/documents/usePassageQuotes.js.map +7 -0
  485. package/dist/documents/useUploadFiles.js +165 -0
  486. package/dist/documents/useUploadFiles.js.map +7 -0
  487. package/dist/documents/useUploadFromUrls.js +63 -0
  488. package/dist/documents/useUploadFromUrls.js.map +7 -0
  489. package/dist/documents/useVideoRecorder.js +62 -0
  490. package/dist/documents/useVideoRecorder.js.map +7 -0
  491. package/dist/entities/AgentMarkers.js +61 -0
  492. package/dist/entities/AgentMarkers.js.map +7 -0
  493. package/dist/entities/DocumentEntity.js +125 -0
  494. package/dist/entities/DocumentEntity.js.map +7 -0
  495. package/dist/entities/EntityPill.js +250 -0
  496. package/dist/entities/EntityPill.js.map +7 -0
  497. package/dist/entities/ProjectEntity.js +61 -0
  498. package/dist/entities/ProjectEntity.js.map +7 -0
  499. package/dist/entities/ShieldIcon.js +49 -0
  500. package/dist/entities/ShieldIcon.js.map +7 -0
  501. package/dist/entities/TagEntity.js +79 -0
  502. package/dist/entities/TagEntity.js.map +7 -0
  503. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  504. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  505. package/dist/entities/UserEntity.js +211 -0
  506. package/dist/entities/UserEntity.js.map +7 -0
  507. package/dist/entities/VerifiedBadge.js +19 -0
  508. package/dist/entities/VerifiedBadge.js.map +7 -0
  509. package/dist/entities/agent-avatar-colors.js +26 -0
  510. package/dist/entities/agent-avatar-colors.js.map +7 -0
  511. package/dist/entities/colors.js +64 -0
  512. package/dist/entities/colors.js.map +7 -0
  513. package/dist/entities/file-type.js +151 -0
  514. package/dist/entities/file-type.js.map +7 -0
  515. package/dist/entities/index.js +100 -0
  516. package/dist/entities/index.js.map +7 -0
  517. package/dist/entities/media-type.js +61 -0
  518. package/dist/entities/media-type.js.map +7 -0
  519. package/dist/entities/registry.js +385 -0
  520. package/dist/entities/registry.js.map +7 -0
  521. package/dist/entities/status.js +43 -0
  522. package/dist/entities/status.js.map +7 -0
  523. package/dist/entities/tag-kinds.js +23 -0
  524. package/dist/entities/tag-kinds.js.map +7 -0
  525. package/dist/entities/tag-types.js +44 -0
  526. package/dist/entities/tag-types.js.map +7 -0
  527. package/dist/entities/vocabulary.js +12 -0
  528. package/dist/entities/vocabulary.js.map +7 -0
  529. package/dist/entity-extraction.js +25 -0
  530. package/dist/entity-extraction.js.map +7 -0
  531. package/dist/facts-search.js +57 -0
  532. package/dist/facts-search.js.map +7 -0
  533. package/dist/facts.js +69 -0
  534. package/dist/facts.js.map +7 -0
  535. package/dist/hooks.js +320 -0
  536. package/dist/hooks.js.map +7 -0
  537. package/dist/host/ArbiHost.js +24 -0
  538. package/dist/host/ArbiHost.js.map +7 -0
  539. package/dist/host/assistant-copy.js +54 -0
  540. package/dist/host/assistant-copy.js.map +7 -0
  541. package/dist/host/config.js +9 -0
  542. package/dist/host/config.js.map +7 -0
  543. package/dist/host/context.js +10 -0
  544. package/dist/host/context.js.map +7 -0
  545. package/dist/host/features.js +144 -0
  546. package/dist/host/features.js.map +7 -0
  547. package/dist/host/index.js +12 -0
  548. package/dist/host/index.js.map +7 -0
  549. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  550. package/dist/host/merge.js.map +7 -0
  551. package/dist/house-template.js +40 -0
  552. package/dist/house-template.js.map +7 -0
  553. package/dist/icons/AppleIcon.js +25 -0
  554. package/dist/icons/AppleIcon.js.map +7 -0
  555. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  556. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  557. package/dist/icons/ArbiIcon.js +24 -0
  558. package/dist/icons/ArbiIcon.js.map +7 -0
  559. package/dist/icons/AudIcon.js +56 -0
  560. package/dist/icons/AudIcon.js.map +7 -0
  561. package/dist/icons/ClaudeIcon.js +28 -0
  562. package/dist/icons/ClaudeIcon.js.map +7 -0
  563. package/dist/icons/DocIcon.js +56 -0
  564. package/dist/icons/DocIcon.js.map +7 -0
  565. package/dist/icons/EmlIcon.js +57 -0
  566. package/dist/icons/EmlIcon.js.map +7 -0
  567. package/dist/icons/FireworksIcon.js +47 -0
  568. package/dist/icons/FireworksIcon.js.map +7 -0
  569. package/dist/icons/GeminiIcon.js +37 -0
  570. package/dist/icons/GeminiIcon.js.map +7 -0
  571. package/dist/icons/GitHubIcon.js +32 -0
  572. package/dist/icons/GitHubIcon.js.map +7 -0
  573. package/dist/icons/GoogleIcon.js +53 -0
  574. package/dist/icons/GoogleIcon.js.map +7 -0
  575. package/dist/icons/HtmlIcon.js +56 -0
  576. package/dist/icons/HtmlIcon.js.map +7 -0
  577. package/dist/icons/ImgIcon.js +56 -0
  578. package/dist/icons/ImgIcon.js.map +7 -0
  579. package/dist/icons/LinkedInIcon.js +25 -0
  580. package/dist/icons/LinkedInIcon.js.map +7 -0
  581. package/dist/icons/OpenAIIcon.js +28 -0
  582. package/dist/icons/OpenAIIcon.js.map +7 -0
  583. package/dist/icons/PdfIcon.js +56 -0
  584. package/dist/icons/PdfIcon.js.map +7 -0
  585. package/dist/icons/ProviderIcon.js +42 -0
  586. package/dist/icons/ProviderIcon.js.map +7 -0
  587. package/dist/icons/TxtIcon.js +56 -0
  588. package/dist/icons/TxtIcon.js.map +7 -0
  589. package/dist/icons/VidIcon.js +56 -0
  590. package/dist/icons/VidIcon.js.map +7 -0
  591. package/dist/icons/XlsIcon.js +56 -0
  592. package/dist/icons/XlsIcon.js.map +7 -0
  593. package/dist/icons/arbi-mark.js +5 -0
  594. package/dist/icons/arbi-mark.js.map +7 -0
  595. package/dist/icons/colors.js +31 -0
  596. package/dist/icons/colors.js.map +7 -0
  597. package/dist/icons/file-type.js +105 -0
  598. package/dist/icons/file-type.js.map +7 -0
  599. package/dist/icons/index.js +55 -0
  600. package/dist/icons/index.js.map +7 -0
  601. package/dist/imagecrop/ImageCropModal.js +56 -0
  602. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  603. package/dist/imagecrop/ImageCropper.js +100 -0
  604. package/dist/imagecrop/ImageCropper.js.map +7 -0
  605. package/dist/imagecrop/cropImage.js +43 -0
  606. package/dist/imagecrop/cropImage.js.map +7 -0
  607. package/dist/imagecrop/index.js +13 -0
  608. package/dist/imagecrop/index.js.map +7 -0
  609. package/dist/index.cjs +282 -282
  610. package/dist/index.js +702 -17116
  611. package/dist/index.js.map +7 -1
  612. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  613. package/dist/lazy-chunk.js.map +7 -0
  614. package/dist/lib/collision-padding.js +13 -0
  615. package/dist/lib/collision-padding.js.map +7 -0
  616. package/dist/lib/format-friendly-date.js +55 -0
  617. package/dist/lib/format-friendly-date.js.map +7 -0
  618. package/dist/lib/format-relative-time.js +52 -0
  619. package/dist/lib/format-relative-time.js.map +7 -0
  620. package/dist/lib/markdown-to-text.js +35 -0
  621. package/dist/lib/markdown-to-text.js.map +7 -0
  622. package/dist/lib/toast-interaction.js +9 -0
  623. package/dist/lib/toast-interaction.js.map +7 -0
  624. package/dist/lib/utils.js +9 -0
  625. package/dist/lib/utils.js.map +7 -0
  626. package/dist/mail/client.js +103 -0
  627. package/dist/mail/client.js.map +7 -0
  628. package/dist/mail/document-attachment.js +38 -0
  629. package/dist/mail/document-attachment.js.map +7 -0
  630. package/dist/mail/filing.js +132 -0
  631. package/dist/mail/filing.js.map +7 -0
  632. package/dist/mail/hooks.js +393 -0
  633. package/dist/mail/hooks.js.map +7 -0
  634. package/dist/mail/index.js +120 -0
  635. package/dist/mail/index.js.map +7 -0
  636. package/dist/mail/offline/changes.js +258 -0
  637. package/dist/mail/offline/changes.js.map +7 -0
  638. package/dist/mail/offline/confirm-sign-out.js +37 -0
  639. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  640. package/dist/mail/offline/crypto.js +26 -0
  641. package/dist/mail/offline/crypto.js.map +7 -0
  642. package/dist/mail/offline/drafts.js +69 -0
  643. package/dist/mail/offline/drafts.js.map +7 -0
  644. package/dist/mail/offline/hooks.js +104 -0
  645. package/dist/mail/offline/hooks.js.map +7 -0
  646. package/dist/mail/offline/index.js +48 -0
  647. package/dist/mail/offline/index.js.map +7 -0
  648. package/dist/mail/offline/live.js +233 -0
  649. package/dist/mail/offline/live.js.map +7 -0
  650. package/dist/mail/offline/mailbox.js +191 -0
  651. package/dist/mail/offline/mailbox.js.map +7 -0
  652. package/dist/mail/offline/outbox.js +167 -0
  653. package/dist/mail/offline/outbox.js.map +7 -0
  654. package/dist/mail/offline/reads.js +159 -0
  655. package/dist/mail/offline/reads.js.map +7 -0
  656. package/dist/mail/offline/runtime.js +100 -0
  657. package/dist/mail/offline/runtime.js.map +7 -0
  658. package/dist/mail/offline/settings.js +84 -0
  659. package/dist/mail/offline/settings.js.map +7 -0
  660. package/dist/mail/offline/store.js +29 -0
  661. package/dist/mail/offline/store.js.map +7 -0
  662. package/dist/mail/offline/sync.js +251 -0
  663. package/dist/mail/offline/sync.js.map +7 -0
  664. package/dist/mail/offline/wipe.js +19 -0
  665. package/dist/mail/offline/wipe.js.map +7 -0
  666. package/dist/mail/thread-keys.js +53 -0
  667. package/dist/mail/thread-keys.js.map +7 -0
  668. package/dist/mail/threads.js +71 -0
  669. package/dist/mail/threads.js.map +7 -0
  670. package/dist/mail/useMailClient.js +42 -0
  671. package/dist/mail/useMailClient.js.map +7 -0
  672. package/dist/model-connections.js +58 -0
  673. package/dist/model-connections.js.map +7 -0
  674. package/dist/notifications/ActivityFeed.js +70 -0
  675. package/dist/notifications/ActivityFeed.js.map +7 -0
  676. package/dist/notifications/NotificationBell.js +200 -0
  677. package/dist/notifications/NotificationBell.js.map +7 -0
  678. package/dist/notifications/Toaster.js +24 -0
  679. package/dist/notifications/Toaster.js.map +7 -0
  680. package/dist/notifications/activity-types.js +65 -0
  681. package/dist/notifications/activity-types.js.map +7 -0
  682. package/dist/notifications/bell.js +24 -0
  683. package/dist/notifications/bell.js.map +7 -0
  684. package/dist/notifications/calendar-notifications.js +79 -0
  685. package/dist/notifications/calendar-notifications.js.map +7 -0
  686. package/dist/notifications/index.js +108 -0
  687. package/dist/notifications/index.js.map +7 -0
  688. package/dist/notifications/live.js +28 -0
  689. package/dist/notifications/live.js.map +7 -0
  690. package/dist/notifications/notification-types.js +127 -0
  691. package/dist/notifications/notification-types.js.map +7 -0
  692. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  693. package/dist/notifications/notify-store.js.map +7 -0
  694. package/dist/notifications/server-notifications.js +452 -0
  695. package/dist/notifications/server-notifications.js.map +7 -0
  696. package/dist/notifications/useNotifications.js +34 -0
  697. package/dist/notifications/useNotifications.js.map +7 -0
  698. package/dist/offline-store/network.js +11 -0
  699. package/dist/offline-store/network.js.map +7 -0
  700. package/dist/offline-store/store.js +136 -0
  701. package/dist/offline-store/store.js.map +7 -0
  702. package/dist/offline-store/wipe.js +8 -0
  703. package/dist/offline-store/wipe.js.map +7 -0
  704. package/dist/offline.js +58 -0
  705. package/dist/offline.js.map +7 -0
  706. package/dist/people.js +122 -0
  707. package/dist/people.js.map +7 -0
  708. package/dist/projects.js +30 -0
  709. package/dist/projects.js.map +7 -0
  710. package/dist/query-client.js +63 -0
  711. package/dist/query-client.js.map +7 -0
  712. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  713. package/dist/query-keys.js.map +7 -0
  714. package/dist/query-persist.js +66 -0
  715. package/dist/query-persist.js.map +7 -0
  716. package/dist/queued-writes.js +59 -0
  717. package/dist/queued-writes.js.map +7 -0
  718. package/dist/remote-control.js +67 -0
  719. package/dist/remote-control.js.map +7 -0
  720. package/dist/search/index.js +23 -0
  721. package/dist/search/index.js.map +7 -0
  722. package/dist/search/session.js +58 -0
  723. package/dist/search/session.js.map +7 -0
  724. package/dist/search/useSemanticSearch.js +82 -0
  725. package/dist/search/useSemanticSearch.js.map +7 -0
  726. package/dist/session/chat.js +512 -0
  727. package/dist/session/chat.js.map +7 -0
  728. package/dist/session/documents.js +196 -0
  729. package/dist/session/documents.js.map +7 -0
  730. package/dist/session/drafts.js +103 -0
  731. package/dist/session/drafts.js.map +7 -0
  732. package/dist/session/index.js +123 -0
  733. package/dist/session/index.js.map +7 -0
  734. package/dist/session/layout.js +339 -0
  735. package/dist/session/layout.js.map +7 -0
  736. package/dist/session/persist.js +106 -0
  737. package/dist/session/persist.js.map +7 -0
  738. package/dist/session/session-hooks.js +53 -0
  739. package/dist/session/session-hooks.js.map +7 -0
  740. package/dist/session/signed-in.js +36 -0
  741. package/dist/session/signed-in.js.map +7 -0
  742. package/dist/session/store.js +166 -0
  743. package/dist/session/store.js.map +7 -0
  744. package/dist/session/thread-tabs.js +121 -0
  745. package/dist/session/thread-tabs.js.map +7 -0
  746. package/dist/session/ui-state-storage.js +76 -0
  747. package/dist/session/ui-state-storage.js.map +7 -0
  748. package/dist/session/workspace.js +77 -0
  749. package/dist/session/workspace.js.map +7 -0
  750. package/dist/shell/index.cjs +37 -37
  751. package/dist/shell/index.js +43 -10
  752. package/dist/shell/index.js.map +7 -1
  753. package/dist/skill-pack.js +111 -0
  754. package/dist/skill-pack.js.map +7 -0
  755. package/dist/storage.js +186 -0
  756. package/dist/storage.js.map +7 -0
  757. package/dist/support/index.js +35 -0
  758. package/dist/support/index.js.map +7 -0
  759. package/dist/tags.js +204 -0
  760. package/dist/tags.js.map +7 -0
  761. package/dist/ui/DebouncedInput.js +109 -0
  762. package/dist/ui/DebouncedInput.js.map +7 -0
  763. package/dist/ui/DictateContext.js +8 -0
  764. package/dist/ui/DictateContext.js.map +7 -0
  765. package/dist/ui/IconToggle.js +79 -0
  766. package/dist/ui/IconToggle.js.map +7 -0
  767. package/dist/ui/VerifiedToggle.js +38 -0
  768. package/dist/ui/VerifiedToggle.js.map +7 -0
  769. package/dist/ui/VisibilityToggle.js +103 -0
  770. package/dist/ui/VisibilityToggle.js.map +7 -0
  771. package/dist/ui/avatar.js +40 -0
  772. package/dist/ui/avatar.js.map +7 -0
  773. package/dist/ui/badge.js +28 -0
  774. package/dist/ui/badge.js.map +7 -0
  775. package/dist/ui/button.js +48 -0
  776. package/dist/ui/button.js.map +7 -0
  777. package/dist/ui/card.js +90 -0
  778. package/dist/ui/card.js.map +7 -0
  779. package/dist/ui/checkbox.js +22 -0
  780. package/dist/ui/checkbox.js.map +7 -0
  781. package/dist/ui/collapsible.js +10 -0
  782. package/dist/ui/collapsible.js.map +7 -0
  783. package/dist/ui/command.js +103 -0
  784. package/dist/ui/command.js.map +7 -0
  785. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  786. package/dist/ui/dialog.js.map +7 -0
  787. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  788. package/dist/ui/dropdown-menu.js.map +7 -0
  789. package/dist/ui/hover-card.js +36 -0
  790. package/dist/ui/hover-card.js.map +7 -0
  791. package/dist/ui/index.cjs +154 -154
  792. package/dist/ui/index.js +290 -10
  793. package/dist/ui/index.js.map +7 -1
  794. package/dist/ui/input.js +65 -0
  795. package/dist/ui/input.js.map +7 -0
  796. package/dist/ui/label.js +16 -0
  797. package/dist/ui/label.js.map +7 -0
  798. package/dist/ui/mark-menu.js +300 -0
  799. package/dist/ui/mark-menu.js.map +7 -0
  800. package/dist/ui/popover.js +40 -0
  801. package/dist/ui/popover.js.map +7 -0
  802. package/dist/ui/portal-container.js +17 -0
  803. package/dist/ui/portal-container.js.map +7 -0
  804. package/dist/ui/progress.js +24 -0
  805. package/dist/ui/progress.js.map +7 -0
  806. package/dist/ui/radio-group.js +29 -0
  807. package/dist/ui/radio-group.js.map +7 -0
  808. package/dist/ui/scroll-area.js +39 -0
  809. package/dist/ui/scroll-area.js.map +7 -0
  810. package/dist/ui/select.js +130 -0
  811. package/dist/ui/select.js.map +7 -0
  812. package/dist/ui/separator.js +23 -0
  813. package/dist/ui/separator.js.map +7 -0
  814. package/dist/ui/slider.js +23 -0
  815. package/dist/ui/slider.js.map +7 -0
  816. package/dist/ui/switch.js +28 -0
  817. package/dist/ui/switch.js.map +7 -0
  818. package/dist/ui/table.js +75 -0
  819. package/dist/ui/table.js.map +7 -0
  820. package/dist/ui/tabs.js +48 -0
  821. package/dist/ui/tabs.js.map +7 -0
  822. package/dist/ui/textarea.js +63 -0
  823. package/dist/ui/textarea.js.map +7 -0
  824. package/dist/ui/toggle-group.js +43 -0
  825. package/dist/ui/toggle-group.js.map +7 -0
  826. package/dist/ui/toggle.js +40 -0
  827. package/dist/ui/toggle.js.map +7 -0
  828. package/dist/ui/tooltip.js +215 -0
  829. package/dist/ui/tooltip.js.map +7 -0
  830. package/dist/usage-metered.js +8 -0
  831. package/dist/usage-metered.js.map +7 -0
  832. package/dist/useArbi.js +16 -0
  833. package/dist/useArbi.js.map +7 -0
  834. package/dist/useInstallSkillPack.js +81 -0
  835. package/dist/useInstallSkillPack.js.map +7 -0
  836. package/dist/usermenu/UserMenu.js +188 -0
  837. package/dist/usermenu/UserMenu.js.map +7 -0
  838. package/dist/usermenu/index.js +5 -0
  839. package/dist/usermenu/index.js.map +7 -0
  840. package/dist/users/index.js +15 -0
  841. package/dist/users/index.js.map +7 -0
  842. package/dist/users/user-display.js +60 -0
  843. package/dist/users/user-display.js.map +7 -0
  844. package/dist/viewers/AudioViewer.js +23 -0
  845. package/dist/viewers/AudioViewer.js.map +7 -0
  846. package/dist/viewers/DocxViewer.js +81 -0
  847. package/dist/viewers/DocxViewer.js.map +7 -0
  848. package/dist/viewers/ImageViewer.js +31 -0
  849. package/dist/viewers/ImageViewer.js.map +7 -0
  850. package/dist/viewers/PdfViewer.js +19 -3
  851. package/dist/viewers/PdfViewer.js.map +7 -1
  852. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  853. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  854. package/dist/viewers/VideoViewer.js +31 -0
  855. package/dist/viewers/VideoViewer.js.map +7 -0
  856. package/dist/viewers/XlsxViewer.js +102 -0
  857. package/dist/viewers/XlsxViewer.js.map +7 -0
  858. package/dist/viewers/index.js +61 -271
  859. package/dist/viewers/index.js.map +7 -1
  860. package/dist/viewers/page-scroll.js +59 -0
  861. package/dist/viewers/page-scroll.js.map +7 -0
  862. package/dist/viewers/pdf-viewer-constants.js +9 -0
  863. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  864. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  865. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  866. package/dist/viewers/selection-runs.js +38 -0
  867. package/dist/viewers/selection-runs.js.map +7 -0
  868. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  869. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  870. package/dist/viewers/useProcessedChunks.js +58 -0
  871. package/dist/viewers/useProcessedChunks.js.map +7 -0
  872. package/dist/viewers/viewer-zoom.js +163 -0
  873. package/dist/viewers/viewer-zoom.js.map +7 -0
  874. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  875. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  876. package/dist/websocket/context.js +14 -0
  877. package/dist/websocket/context.js.map +7 -0
  878. package/dist/websocket/hooks.js +30 -0
  879. package/dist/websocket/hooks.js.map +7 -0
  880. package/dist/websocket/index.js +22 -0
  881. package/dist/websocket/index.js.map +7 -0
  882. package/dist/websocket/live-updates.js +38 -0
  883. package/dist/websocket/live-updates.js.map +7 -0
  884. package/dist/websocket/reconnect.js +13 -0
  885. package/dist/websocket/reconnect.js.map +7 -0
  886. package/dist/websocket/store.js +58 -0
  887. package/dist/websocket/store.js.map +7 -0
  888. package/dist/workforce.js +607 -0
  889. package/dist/workforce.js.map +7 -0
  890. package/dist/workspaces/access-request.js +35 -0
  891. package/dist/workspaces/access-request.js.map +7 -0
  892. package/dist/workspaces/archive.js +59 -0
  893. package/dist/workspaces/archive.js.map +7 -0
  894. package/dist/workspaces/current.js +20 -0
  895. package/dist/workspaces/current.js.map +7 -0
  896. package/dist/workspaces/delete-workspaces.js +15 -0
  897. package/dist/workspaces/delete-workspaces.js.map +7 -0
  898. package/dist/workspaces/export-archive.js +40 -0
  899. package/dist/workspaces/export-archive.js.map +7 -0
  900. package/dist/workspaces/index.js +99 -0
  901. package/dist/workspaces/index.js.map +7 -0
  902. package/dist/workspaces/settings.js +45 -0
  903. package/dist/workspaces/settings.js.map +7 -0
  904. package/dist/workspaces/shell-workspaces.js +49 -0
  905. package/dist/workspaces/shell-workspaces.js.map +7 -0
  906. package/dist/workspaces/switch.js +234 -0
  907. package/dist/workspaces/switch.js.map +7 -0
  908. package/dist/workspaces/transfer.js +170 -0
  909. package/dist/workspaces/transfer.js.map +7 -0
  910. package/dist/workspaces/useShellWorkspaces.js +86 -0
  911. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  912. package/dist/workspaces/workspace-users.js +65 -0
  913. package/dist/workspaces/workspace-users.js.map +7 -0
  914. package/package.json +4 -4
  915. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  916. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  917. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  918. package/dist/annotations/freeze/index.d.cts +0 -205
  919. package/dist/annotations/index.d.cts +0 -360
  920. package/dist/artifacts/index.d.cts +0 -476
  921. package/dist/artifacts/redline-core.d.cts +0 -39
  922. package/dist/bundle-YNOX7VIL.js +0 -5
  923. package/dist/bundle-YNOX7VIL.js.map +0 -1
  924. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  925. package/dist/calls/livekit/index.d.cts +0 -280
  926. package/dist/chunk-47CCGUWR.js.map +0 -1
  927. package/dist/chunk-4FL3X3LA.js +0 -2057
  928. package/dist/chunk-4FL3X3LA.js.map +0 -1
  929. package/dist/chunk-6QNBSXCE.js +0 -271
  930. package/dist/chunk-6QNBSXCE.js.map +0 -1
  931. package/dist/chunk-74N436VK.js.map +0 -1
  932. package/dist/chunk-APZZQZ6P.js +0 -147
  933. package/dist/chunk-APZZQZ6P.js.map +0 -1
  934. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  935. package/dist/chunk-DPYBZDJB.js.map +0 -1
  936. package/dist/chunk-DZKRL5H3.js +0 -2766
  937. package/dist/chunk-DZKRL5H3.js.map +0 -1
  938. package/dist/chunk-HDCRPPBW.js +0 -75
  939. package/dist/chunk-HDCRPPBW.js.map +0 -1
  940. package/dist/chunk-L2IPPTVC.js +0 -20
  941. package/dist/chunk-L2IPPTVC.js.map +0 -1
  942. package/dist/chunk-LSU4UPS5.js +0 -1011
  943. package/dist/chunk-LSU4UPS5.js.map +0 -1
  944. package/dist/chunk-NIKPG4PW.js +0 -1128
  945. package/dist/chunk-NIKPG4PW.js.map +0 -1
  946. package/dist/chunk-NNAJLY6B.js +0 -4974
  947. package/dist/chunk-NNAJLY6B.js.map +0 -1
  948. package/dist/chunk-OYPKKHXY.js +0 -559
  949. package/dist/chunk-OYPKKHXY.js.map +0 -1
  950. package/dist/chunk-PTOP7OHG.js.map +0 -1
  951. package/dist/chunk-QMY2JKBI.js +0 -246
  952. package/dist/chunk-QMY2JKBI.js.map +0 -1
  953. package/dist/chunk-SN5YV6FF.js +0 -11
  954. package/dist/chunk-SN5YV6FF.js.map +0 -1
  955. package/dist/chunk-SSXFVWCT.js.map +0 -1
  956. package/dist/chunk-T3USOSVN.js.map +0 -1
  957. package/dist/chunk-T4CLW3DN.js +0 -2560
  958. package/dist/chunk-T4CLW3DN.js.map +0 -1
  959. package/dist/chunk-UW2SGTI5.js.map +0 -1
  960. package/dist/chunk-VSCU7K4V.js.map +0 -1
  961. package/dist/chunk-WL2Y2T47.js.map +0 -1
  962. package/dist/chunk-WUTL62MC.js.map +0 -1
  963. package/dist/chunk-XWPLOFDN.js +0 -644
  964. package/dist/chunk-XWPLOFDN.js.map +0 -1
  965. package/dist/chunk-Y3MTRA7D.js +0 -97
  966. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  967. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  968. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  969. package/dist/document-tools/core.d.cts +0 -883
  970. package/dist/document-tools/index.d.cts +0 -90
  971. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  972. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  973. package/dist/index.d.cts +0 -15923
  974. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  975. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  976. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  977. package/dist/shell/index.d.cts +0 -6
  978. package/dist/store.d-GADDvC7w.d.cts +0 -35
  979. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  980. package/dist/ui/index.d.cts +0 -26
  981. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  982. package/dist/viewers/PdfViewer.d.cts +0 -9
  983. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,231 @@
1
+ import { createOfflineSealer } from "@arbidocs/client";
2
+ import { createRecordStore } from "../../offline-store/store.js";
3
+ import { isBrowserOffline, isNetworkFailure } from "../../offline-store/network.js";
4
+ import { wipeStore } from "../../offline-store/wipe.js";
5
+ const OFFLINE_CALENDAR_DB = "arbi-offline-calendar";
6
+ const CACHE_LIMIT = 200;
7
+ class OfflineCalendarLockedError extends Error {
8
+ constructor() {
9
+ super("Sign in to open the calendar saved on this device");
10
+ this.name = "OfflineCalendarLockedError";
11
+ }
12
+ }
13
+ const store = createRecordStore(OFFLINE_CALENDAR_DB);
14
+ const sealer = createOfflineSealer("arbi-offline-calendar-v1", {
15
+ locked: () => new OfflineCalendarLockedError()
16
+ });
17
+ function isCalendarOffline() {
18
+ return isBrowserOffline();
19
+ }
20
+ function isCalendarNetworkError(error) {
21
+ if (isNetworkFailure(error)) return true;
22
+ const status = error?.status;
23
+ return typeof status !== "number" && isBrowserOffline();
24
+ }
25
+ const cacheBucket = () => sealer.blind("bucket", "cache");
26
+ const cacheKey = (key) => sealer.blind("cache", key);
27
+ async function writeCalendarCache(key, data) {
28
+ const sealed = await sealer.sealJson({ key, data });
29
+ const now = Date.now();
30
+ await store.putRecord({
31
+ key: await cacheKey(key),
32
+ kind: "cache",
33
+ bucket: await cacheBucket(),
34
+ sortAt: now,
35
+ size: sealed.length,
36
+ lastAccess: now,
37
+ data: sealed
38
+ });
39
+ await evictCache();
40
+ }
41
+ async function readCalendarCache(key) {
42
+ try {
43
+ const blindKey = await cacheKey(key);
44
+ const record = await store.getRecord(blindKey);
45
+ if (!record) return null;
46
+ const opened = await sealer.openJson(record.data);
47
+ if (opened.key !== key) return null;
48
+ await store.putRecord({ ...record, lastAccess: Date.now() });
49
+ return opened.data;
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+ async function evictCache() {
55
+ const rows = (await store.allRecordAccess()).filter((r) => r.kind === "cache");
56
+ if (rows.length <= CACHE_LIMIT) return;
57
+ rows.sort((a, b) => a.lastAccess - b.lastAccess);
58
+ await store.deleteRecords(rows.slice(0, rows.length - CACHE_LIMIT).map((r) => r.key));
59
+ }
60
+ const outboxBucket = () => sealer.blind("bucket", "outbox");
61
+ const outboxKey = (requestId) => sealer.blind("outbox", requestId);
62
+ let seqCounter = 0;
63
+ async function writeItem(item) {
64
+ const sealed = await sealer.sealJson(item);
65
+ await store.putRecord({
66
+ key: await outboxKey(item.requestId),
67
+ kind: "outbox",
68
+ bucket: await outboxBucket(),
69
+ sortAt: item.seq,
70
+ size: sealed.length,
71
+ lastAccess: Date.now(),
72
+ data: sealed
73
+ });
74
+ }
75
+ async function readItems() {
76
+ const records = await store.recordsInBucket(await outboxBucket());
77
+ const items = [];
78
+ for (const record of records) {
79
+ try {
80
+ items.push(await sealer.openJson(record.data));
81
+ } catch {
82
+ }
83
+ }
84
+ return items.sort((a, b) => a.seq - b.seq);
85
+ }
86
+ function newRequestId() {
87
+ return typeof crypto !== "undefined" && "randomUUID" in crypto ? crypto.randomUUID() : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
88
+ }
89
+ async function enqueueCalendarWrite(op) {
90
+ const now = Date.now();
91
+ seqCounter = Math.max(seqCounter + 1, now * 1e3);
92
+ const item = {
93
+ requestId: newRequestId(),
94
+ op,
95
+ state: "queued",
96
+ attempts: 0,
97
+ createdAt: now,
98
+ seq: seqCounter
99
+ };
100
+ await writeItem(item);
101
+ notify("enqueued");
102
+ return { requestId: item.requestId };
103
+ }
104
+ async function listCalendarOutbox() {
105
+ try {
106
+ return (await readItems()).map(({ requestId, op, state, inDoubt, error }) => ({
107
+ requestId,
108
+ op,
109
+ state,
110
+ inDoubt,
111
+ error
112
+ }));
113
+ } catch {
114
+ return [];
115
+ }
116
+ }
117
+ function classify(error) {
118
+ if (isCalendarNetworkError(error)) return "offline";
119
+ const status = error?.status;
120
+ if (typeof status === "number" && status >= 500) return "retry";
121
+ return "failed";
122
+ }
123
+ function run(exec, item) {
124
+ const op = item.op;
125
+ switch (op.kind) {
126
+ case "create":
127
+ return exec.create(op.body, item.requestId);
128
+ case "update":
129
+ return exec.update(op.target, op.body, item.requestId);
130
+ case "delete":
131
+ return exec.delete(op.target, item.requestId);
132
+ case "respond":
133
+ return exec.respond(op.params, item.requestId);
134
+ }
135
+ }
136
+ let replaying = null;
137
+ function replayCalendarOutbox(exec) {
138
+ if (replaying) return replaying;
139
+ const locks = typeof navigator !== "undefined" ? navigator.locks : void 0;
140
+ const run2 = locks?.request ? locks.request(
141
+ "arbi-calendar-outbox-replay",
142
+ () => replayOnce(exec)
143
+ ) : replayOnce(exec);
144
+ const current = run2.finally(() => {
145
+ replaying = null;
146
+ });
147
+ replaying = current;
148
+ return current;
149
+ }
150
+ async function replayOnce(exec) {
151
+ const result = { sent: 0, failed: 0, inDoubt: 0 };
152
+ for (const queued of await readItems()) {
153
+ if (queued.state !== "queued" && queued.state !== "sending") continue;
154
+ if (isCalendarOffline()) break;
155
+ let item = {
156
+ ...queued,
157
+ inDoubt: queued.inDoubt || queued.state === "sending"
158
+ };
159
+ if (item.op.kind === "create" && item.inDoubt && exec.findCreated) {
160
+ let found = false;
161
+ try {
162
+ found = await exec.findCreated(item.requestId, item.op.body);
163
+ } catch (error) {
164
+ if (classify(error) === "offline") break;
165
+ }
166
+ if (found) {
167
+ await store.deleteRecords([await outboxKey(item.requestId)]);
168
+ result.sent++;
169
+ continue;
170
+ }
171
+ }
172
+ item = { ...item, state: "sending", attempts: item.attempts + 1 };
173
+ await writeItem(item);
174
+ let outcome;
175
+ let message;
176
+ try {
177
+ await run(exec, item);
178
+ outcome = "sent";
179
+ } catch (error) {
180
+ outcome = classify(error);
181
+ message = error instanceof Error ? error.message : "The change could not be saved";
182
+ }
183
+ if (outcome === "sent") {
184
+ await store.deleteRecords([await outboxKey(item.requestId)]);
185
+ result.sent++;
186
+ continue;
187
+ }
188
+ if (outcome === "failed") {
189
+ await writeItem({ ...item, state: "failed", error: message });
190
+ result.failed++;
191
+ continue;
192
+ }
193
+ const inDoubt = item.inDoubt || item.op.kind === "create";
194
+ await writeItem({ ...item, state: "queued", inDoubt, error: message });
195
+ if (inDoubt) result.inDoubt++;
196
+ if (outcome === "offline") break;
197
+ }
198
+ notify();
199
+ return result;
200
+ }
201
+ const listeners = /* @__PURE__ */ new Set();
202
+ function notify(change = "changed") {
203
+ for (const l of listeners) l(change);
204
+ }
205
+ function onCalendarOutboxChange(listener) {
206
+ listeners.add(listener);
207
+ return () => listeners.delete(listener);
208
+ }
209
+ async function wipeCalendarOffline() {
210
+ await wipeStore(sealer, store);
211
+ notify();
212
+ }
213
+ async function claimCalendarOffline(userExtId) {
214
+ const owner = await store.getMeta("owner");
215
+ if (owner && owner !== userExtId) await wipeCalendarOffline();
216
+ await store.setMeta("owner", userExtId);
217
+ }
218
+ export {
219
+ OFFLINE_CALENDAR_DB,
220
+ claimCalendarOffline,
221
+ enqueueCalendarWrite,
222
+ isCalendarNetworkError,
223
+ isCalendarOffline,
224
+ listCalendarOutbox,
225
+ onCalendarOutboxChange,
226
+ readCalendarCache,
227
+ replayCalendarOutbox,
228
+ wipeCalendarOffline,
229
+ writeCalendarCache
230
+ };
231
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/calendar/offline/outbox.ts"],
4
+ "sourcesContent": ["/**\n * The offline calendar: an encrypted IndexedDB cache of fetched calendar data (event windows,\n * calendars, settings) and an exactly-once Outbox of writes made while offline.\n *\n * Storage is the generic encrypted record store (`../../offline-store`) under its own database\n * (`arbi-offline-calendar`) and key namespace (`arbi-offline-calendar-v1`), keyed by the user's\n * identity like the offline mailbox: nothing readable is written to disk, and another account's\n * records are unreadable (and ignored).\n *\n * Outbox semantics (the calendar API has no request-id dedupe):\n * - every write keeps the `requestId` it was given when queued, for its whole life;\n * - replay is in order and stops at the first network failure (order is kept);\n * - a refusal (4xx) is final: \"failed\", never retried automatically;\n * - a network failure or 5xx keeps the write queued. For a create that may already have reached the\n * server it is marked `inDoubt`; before re-sending an in-doubt create the executor's\n * `findCreated` is asked whether the server already has it, and if so it is marked sent instead\n * of being created twice. Updates, deletes and responses set absolute state, so a retry is safe;\n * - a write left \"sending\" (tab closed mid-request) is treated as in doubt.\n * - sent writes leave the Outbox.\n */\n\nimport { createOfflineSealer } from '@arbidocs/client'\nimport type { ScopedTarget } from '@arbidocs/sdk/browser'\nimport { createRecordStore } from '../../offline-store/store'\nimport { isBrowserOffline, isNetworkFailure } from '../../offline-store/network'\nimport { wipeStore } from '../../offline-store/wipe'\nimport type { CalendarPendingWrite, CalendarWriteOp } from '../support'\n\nexport const OFFLINE_CALENDAR_DB = 'arbi-offline-calendar'\nconst CACHE_LIMIT = 200\n\nclass OfflineCalendarLockedError extends Error {\n constructor() {\n super('Sign in to open the calendar saved on this device')\n this.name = 'OfflineCalendarLockedError'\n }\n}\n\ntype Kind = 'cache' | 'outbox'\nconst store = createRecordStore<Kind>(OFFLINE_CALENDAR_DB)\nconst sealer = createOfflineSealer('arbi-offline-calendar-v1', {\n locked: () => new OfflineCalendarLockedError(),\n})\n\n// \u2500\u2500 network \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 function isCalendarOffline(): boolean {\n return isBrowserOffline()\n}\n\n/** The request never got an HTTP answer (offline, host unreachable). */\nexport function isCalendarNetworkError(error: unknown): boolean {\n if (isNetworkFailure(error)) return true\n const status = (error as { status?: unknown } | null)?.status\n return typeof status !== 'number' && isBrowserOffline()\n}\n\n// \u2500\u2500 cache \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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\nconst cacheBucket = () => sealer.blind('bucket', 'cache')\nconst cacheKey = (key: string) => sealer.blind('cache', key)\n\nexport async function writeCalendarCache(key: string, data: unknown): Promise<void> {\n const sealed = await sealer.sealJson({ key, data })\n const now = Date.now()\n await store.putRecord({\n key: await cacheKey(key),\n kind: 'cache',\n bucket: await cacheBucket(),\n sortAt: now,\n size: sealed.length,\n lastAccess: now,\n data: sealed,\n })\n await evictCache()\n}\n\nexport async function readCalendarCache<T>(key: string): Promise<T | null> {\n try {\n const blindKey = await cacheKey(key)\n const record = await store.getRecord(blindKey)\n if (!record) return null\n const opened = await sealer.openJson<{ key: string; data: T }>(record.data)\n if (opened.key !== key) return null\n await store.putRecord({ ...record, lastAccess: Date.now() })\n return opened.data\n } catch {\n // Locked, another account's record, or tampered: treat as not cached.\n return null\n }\n}\n\nasync function evictCache(): Promise<void> {\n const rows = (await store.allRecordAccess()).filter((r) => r.kind === 'cache')\n if (rows.length <= CACHE_LIMIT) return\n rows.sort((a, b) => a.lastAccess - b.lastAccess)\n await store.deleteRecords(rows.slice(0, rows.length - CACHE_LIMIT).map((r) => r.key))\n}\n\n// \u2500\u2500 outbox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 type CalendarOutboxOp = CalendarWriteOp\n\ntype CalendarOutboxState = 'queued' | 'sending' | 'sent' | 'failed'\n\ninterface CalendarOutboxItem {\n requestId: string\n op: CalendarOutboxOp\n state: CalendarOutboxState\n inDoubt?: boolean\n error?: string\n attempts: number\n createdAt: number\n seq: number\n}\n\ntype Op<K extends CalendarOutboxOp['kind']> = Extract<CalendarOutboxOp, { kind: K }>\n\nexport interface CalendarOutboxExecutor {\n create(body: Op<'create'>['body'], requestId: string): Promise<unknown>\n update(target: ScopedTarget, body: Op<'update'>['body'], requestId: string): Promise<unknown>\n delete(target: Op<'delete'>['target'], requestId: string): Promise<unknown>\n respond(params: Op<'respond'>['params'], requestId: string): Promise<unknown>\n /** Whether an in-doubt create already reached the server (no server-side dedupe). */\n findCreated?(requestId: string, body: Op<'create'>['body']): Promise<boolean>\n}\n\nconst outboxBucket = () => sealer.blind('bucket', 'outbox')\nconst outboxKey = (requestId: string) => sealer.blind('outbox', requestId)\nlet seqCounter = 0\n\nasync function writeItem(item: CalendarOutboxItem): Promise<void> {\n const sealed = await sealer.sealJson(item)\n await store.putRecord({\n key: await outboxKey(item.requestId),\n kind: 'outbox',\n bucket: await outboxBucket(),\n sortAt: item.seq,\n size: sealed.length,\n lastAccess: Date.now(),\n data: sealed,\n })\n}\n\nasync function readItems(): Promise<CalendarOutboxItem[]> {\n const records = await store.recordsInBucket(await outboxBucket())\n const items: CalendarOutboxItem[] = []\n for (const record of records) {\n try {\n items.push(await sealer.openJson<CalendarOutboxItem>(record.data))\n } catch {\n // Sealed under a different identity: not this user's; ignore.\n }\n }\n return items.sort((a, b) => a.seq - b.seq)\n}\n\nfunction newRequestId(): string {\n return typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`\n}\n\nexport async function enqueueCalendarWrite(op: CalendarOutboxOp): Promise<{ requestId: string }> {\n const now = Date.now()\n // Monotonic even when two writes are queued in the same millisecond.\n seqCounter = Math.max(seqCounter + 1, now * 1000)\n const item: CalendarOutboxItem = {\n requestId: newRequestId(),\n op,\n state: 'queued',\n attempts: 0,\n createdAt: now,\n seq: seqCounter,\n }\n await writeItem(item)\n notify('enqueued')\n return { requestId: item.requestId }\n}\n\nexport async function listCalendarOutbox(): Promise<CalendarPendingWrite[]> {\n try {\n return (await readItems()).map(({ requestId, op, state, inDoubt, error }) => ({\n requestId,\n op,\n state,\n inDoubt,\n error,\n }))\n } catch {\n return []\n }\n}\n\ntype Outcome = 'sent' | 'offline' | 'retry' | 'failed'\n\nfunction classify(error: unknown): Outcome {\n if (isCalendarNetworkError(error)) return 'offline'\n const status = (error as { status?: number } | null)?.status\n if (typeof status === 'number' && status >= 500) return 'retry'\n return 'failed'\n}\n\nfunction run(exec: CalendarOutboxExecutor, item: CalendarOutboxItem): Promise<unknown> {\n const op = item.op\n switch (op.kind) {\n case 'create':\n return exec.create(op.body, item.requestId)\n case 'update':\n return exec.update(op.target, op.body, item.requestId)\n case 'delete':\n return exec.delete(op.target, item.requestId)\n case 'respond':\n return exec.respond(op.params, item.requestId)\n }\n}\n\nlet replaying: Promise<{ sent: number; failed: number; inDoubt: number }> | null = null\n\n/**\n * Send queued writes in order. Concurrent calls in a tab share one run, and tabs take turns through a Web\n * Lock: two tabs replaying at once would both send the same queued create (exactly-once across tabs).\n */\nexport function replayCalendarOutbox(\n exec: CalendarOutboxExecutor\n): Promise<{ sent: number; failed: number; inDoubt: number }> {\n if (replaying) return replaying\n type Result = { sent: number; failed: number; inDoubt: number }\n const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined\n const run: Promise<Result> = locks?.request\n ? (locks.request('arbi-calendar-outbox-replay', () =>\n replayOnce(exec)\n ) as unknown as Promise<Result>)\n : replayOnce(exec)\n const current = run.finally(() => {\n replaying = null\n })\n replaying = current\n return current\n}\n\nasync function replayOnce(\n exec: CalendarOutboxExecutor\n): Promise<{ sent: number; failed: number; inDoubt: number }> {\n const result = { sent: 0, failed: 0, inDoubt: 0 }\n for (const queued of await readItems()) {\n if (queued.state !== 'queued' && queued.state !== 'sending') continue\n if (isCalendarOffline()) break\n // Left \"sending\" by a closed tab: the request may have reached the server.\n let item: CalendarOutboxItem = {\n ...queued,\n inDoubt: queued.inDoubt || queued.state === 'sending',\n }\n if (item.op.kind === 'create' && item.inDoubt && exec.findCreated) {\n let found = false\n try {\n found = await exec.findCreated(item.requestId, item.op.body)\n } catch (error) {\n if (classify(error) === 'offline') break\n }\n if (found) {\n await store.deleteRecords([await outboxKey(item.requestId)])\n result.sent++\n continue\n }\n }\n item = { ...item, state: 'sending', attempts: item.attempts + 1 }\n await writeItem(item)\n let outcome: Outcome\n let message: string | undefined\n try {\n await run(exec, item)\n outcome = 'sent'\n } catch (error) {\n outcome = classify(error)\n message = error instanceof Error ? error.message : 'The change could not be saved'\n }\n if (outcome === 'sent') {\n await store.deleteRecords([await outboxKey(item.requestId)])\n result.sent++\n continue\n }\n if (outcome === 'failed') {\n await writeItem({ ...item, state: 'failed', error: message })\n result.failed++\n continue\n }\n // Network or server error: keep it queued. A create may have been made: in doubt.\n const inDoubt = item.inDoubt || item.op.kind === 'create'\n await writeItem({ ...item, state: 'queued', inDoubt, error: message })\n if (inDoubt) result.inDoubt++\n if (outcome === 'offline') break\n }\n notify()\n return result\n}\n\n// \u2500\u2500 change notifications + wipe \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 type CalendarOutboxChange = 'enqueued' | 'changed'\nconst listeners = new Set<(change: CalendarOutboxChange) => void>()\nfunction notify(change: CalendarOutboxChange = 'changed') {\n for (const l of listeners) l(change)\n}\n/** Subscribe to Outbox changes ('enqueued': a new write was queued); returns the unsubscribe. */\nexport function onCalendarOutboxChange(\n listener: (change: CalendarOutboxChange) => void\n): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\nexport async function wipeCalendarOffline(): Promise<void> {\n await wipeStore(sealer, store)\n notify()\n}\n\n/**\n * Bind the offline calendar to the account signing in: a store another account wrote on this\n * device is removed (sealed to their key it is unreadable anyway, but its cache and queued writes\n * must not take space or linger).\n */\nexport async function claimCalendarOffline(userExtId: string): Promise<void> {\n const owner = await store.getMeta<string>('owner')\n if (owner && owner !== userExtId) await wipeCalendarOffline()\n await store.setMeta('owner', userExtId)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["run"]
7
+ }
@@ -0,0 +1,109 @@
1
+ import { useEffect } from "react";
2
+ import { onlineManager, useQueryClient } from "@tanstack/react-query";
3
+ import { logger } from "@arbidocs/client";
4
+ import { notify } from "../../notifications/notify-store.js";
5
+ import { useArbi } from "../../useArbi.js";
6
+ import { useArbiSession } from "../../session/signed-in.js";
7
+ import { calendarQueryKeys } from "../keys.js";
8
+ import {
9
+ claimCalendarOffline,
10
+ onCalendarOutboxChange,
11
+ replayCalendarOutbox
12
+ } from "./outbox.js";
13
+ const day = (date, offset) => {
14
+ const t = /* @__PURE__ */ new Date(`${date}T00:00:00Z`);
15
+ t.setUTCDate(t.getUTCDate() + offset);
16
+ return t.toISOString();
17
+ };
18
+ const calendarOutboxExecutor = (arbi) => ({
19
+ create: (body) => arbi.calendar.createEvent(body),
20
+ update: (target, body) => arbi.calendar.updateEvent(target, body),
21
+ delete: (target) => arbi.calendar.deleteEvent(target),
22
+ respond: (params) => arbi.calendar.respond(params),
23
+ /** No server dedupe: an in-doubt create counts as made if an event with its title and start exists. */
24
+ async findCreated(_requestId, body) {
25
+ const { title, start } = body;
26
+ const date = (start?.date_time ?? start?.date ?? "").slice(0, 10);
27
+ if (!title || !/^\d{4}-\d{2}-\d{2}$/.test(date)) return false;
28
+ const events = await arbi.calendar.listEvents({
29
+ start: day(date, -1),
30
+ end: day(date, 2)
31
+ });
32
+ return events.some(
33
+ (e) => e.title === title && (start?.date_time ? (e.start.date_time ?? "").slice(0, 16) === start.date_time.slice(0, 16) : e.start.date === start?.date)
34
+ );
35
+ }
36
+ });
37
+ const SYNC_CHANNEL = "arbi-calendar-outbox";
38
+ function refreshCalendarQueries(queryClient) {
39
+ void queryClient.invalidateQueries({ queryKey: calendarQueryKeys.all() });
40
+ }
41
+ async function replay(arbi, queryClient) {
42
+ const result = await replayCalendarOutbox(calendarOutboxExecutor(arbi));
43
+ if (result.sent || result.failed) {
44
+ refreshCalendarQueries(queryClient);
45
+ try {
46
+ const channel = new BroadcastChannel(SYNC_CHANNEL);
47
+ channel.postMessage("synced");
48
+ channel.close();
49
+ } catch {
50
+ }
51
+ }
52
+ if (result.failed)
53
+ notify.error(
54
+ result.failed === 1 ? "A calendar change made offline could not be saved" : `${result.failed} calendar changes made offline could not be saved`
55
+ );
56
+ }
57
+ function useCalendarOfflineRuntime() {
58
+ const { status, serverSessionKey, user } = useArbiSession();
59
+ const userExtId = user?.external_id;
60
+ const authenticated = status === "signed-in";
61
+ const hasSession = !!serverSessionKey;
62
+ const arbi = useArbi();
63
+ const ready = authenticated && hasSession && arbi.isLoggedIn;
64
+ const queryClient = useQueryClient();
65
+ useEffect(() => {
66
+ if (!authenticated || !userExtId) return;
67
+ claimCalendarOffline(userExtId).catch(
68
+ (error) => logger.warn("[offline-calendar] could not bind the store", error)
69
+ );
70
+ }, [authenticated, userExtId]);
71
+ useEffect(() => {
72
+ if (!ready) return;
73
+ const run = () => {
74
+ if (!onlineManager.isOnline()) return;
75
+ replay(arbi, queryClient).catch(
76
+ (error) => logger.warn("[offline-calendar] replay failed", error)
77
+ );
78
+ };
79
+ run();
80
+ let wasOnline = onlineManager.isOnline();
81
+ const offOnline = onlineManager.subscribe((online) => {
82
+ if (online && !wasOnline) run();
83
+ wasOnline = online;
84
+ });
85
+ let queued = null;
86
+ const offOutbox = onCalendarOutboxChange((change) => {
87
+ if (change !== "enqueued") return;
88
+ if (queued) clearTimeout(queued);
89
+ queued = setTimeout(run, 2e3);
90
+ });
91
+ let channel = null;
92
+ try {
93
+ channel = new BroadcastChannel(SYNC_CHANNEL);
94
+ channel.onmessage = () => refreshCalendarQueries(queryClient);
95
+ } catch {
96
+ channel = null;
97
+ }
98
+ return () => {
99
+ channel?.close();
100
+ offOnline();
101
+ offOutbox();
102
+ if (queued) clearTimeout(queued);
103
+ };
104
+ }, [ready, arbi, queryClient]);
105
+ }
106
+ export {
107
+ useCalendarOfflineRuntime
108
+ };
109
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/calendar/offline/runtime.ts"],
4
+ "sourcesContent": ["/**\n * useCalendarOfflineRuntime \u2014 mounted once by the host for a signed-in user. On reconnect (and at start,\n * when online with a live session) it replays the calendar Outbox (writes made offline) in order,\n * then refreshes the calendar queries.\n */\n\nimport { useEffect } from 'react'\nimport { onlineManager, useQueryClient, type QueryClient } from '@tanstack/react-query'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { logger } from '@arbidocs/client'\nimport { notify } from '../../notifications/notify-store'\nimport { useArbi } from '../../useArbi'\nimport { useArbiSession } from '../../session/signed-in'\nimport { calendarQueryKeys } from '../keys'\nimport {\n claimCalendarOffline,\n onCalendarOutboxChange,\n replayCalendarOutbox,\n type CalendarOutboxExecutor,\n} from './outbox'\n\nconst day = (date: string, offset: number) => {\n const t = new Date(`${date}T00:00:00Z`)\n t.setUTCDate(t.getUTCDate() + offset)\n return t.toISOString()\n}\n\n/** Sends the queued writes on a signed-in session. */\nconst calendarOutboxExecutor = (arbi: Arbi): CalendarOutboxExecutor => ({\n create: (body) => arbi.calendar.createEvent(body),\n update: (target, body) => arbi.calendar.updateEvent(target, body),\n delete: (target) => arbi.calendar.deleteEvent(target),\n respond: (params) => arbi.calendar.respond(params),\n /** No server dedupe: an in-doubt create counts as made if an event with its title and start exists. */\n async findCreated(_requestId, body) {\n const { title, start } = body\n const date = (start?.date_time ?? start?.date ?? '').slice(0, 10)\n if (!title || !/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) return false\n const events = await arbi.calendar.listEvents({\n start: day(date, -1),\n end: day(date, 2),\n })\n return events.some(\n (e) =>\n e.title === title &&\n (start?.date_time\n ? (e.start.date_time ?? '').slice(0, 16) === start.date_time.slice(0, 16)\n : e.start.date === start?.date)\n )\n },\n})\n\n/** Tabs take turns replaying (Web Lock); the one that sent tells the others to refresh. */\nconst SYNC_CHANNEL = 'arbi-calendar-outbox'\n\nfunction refreshCalendarQueries(queryClient: QueryClient) {\n // The outbox list is under the calendar keys too.\n void queryClient.invalidateQueries({ queryKey: calendarQueryKeys.all() })\n}\n\nasync function replay(arbi: Arbi, queryClient: QueryClient): Promise<void> {\n const result = await replayCalendarOutbox(calendarOutboxExecutor(arbi))\n if (result.sent || result.failed) {\n refreshCalendarQueries(queryClient)\n try {\n const channel = new BroadcastChannel(SYNC_CHANNEL)\n channel.postMessage('synced')\n channel.close()\n } catch {\n /* no BroadcastChannel: other tabs refresh on their next fetch */\n }\n }\n if (result.failed)\n notify.error(\n result.failed === 1\n ? 'A calendar change made offline could not be saved'\n : `${result.failed} calendar changes made offline could not be saved`\n )\n}\n\nexport function useCalendarOfflineRuntime(): void {\n const { status, serverSessionKey, user } = useArbiSession()\n const userExtId = user?.external_id\n const authenticated = status === 'signed-in'\n const hasSession = !!serverSessionKey\n // The writes go out on the shared session's `Arbi`, once it holds the login.\n const arbi = useArbi()\n const ready = authenticated && hasSession && arbi.isLoggedIn\n const queryClient = useQueryClient()\n\n useEffect(() => {\n if (!authenticated || !userExtId) return\n claimCalendarOffline(userExtId).catch((error) =>\n logger.warn('[offline-calendar] could not bind the store', error)\n )\n }, [authenticated, userExtId])\n\n useEffect(() => {\n if (!ready) return\n const run = () => {\n if (!onlineManager.isOnline()) return\n replay(arbi, queryClient).catch((error) =>\n logger.warn('[offline-calendar] replay failed', error)\n )\n }\n run()\n let wasOnline = onlineManager.isOnline()\n const offOnline = onlineManager.subscribe((online) => {\n if (online && !wasOnline) run()\n wasOnline = online\n })\n // A write queued while online (e.g. the request failed mid-flight) goes out on the next change.\n let queued: ReturnType<typeof setTimeout> | null = null\n const offOutbox = onCalendarOutboxChange((change) => {\n if (change !== 'enqueued') return\n if (queued) clearTimeout(queued)\n queued = setTimeout(run, 2_000)\n })\n let channel: BroadcastChannel | null = null\n try {\n channel = new BroadcastChannel(SYNC_CHANNEL)\n channel.onmessage = () => refreshCalendarQueries(queryClient)\n } catch {\n channel = null\n }\n return () => {\n channel?.close()\n offOnline()\n offOutbox()\n if (queued) clearTimeout(queued)\n }\n }, [ready, arbi, queryClient])\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ import { ArbiApiError } from "@arbidocs/sdk/browser";
2
+ import {
3
+ enqueueCalendarWrite,
4
+ isCalendarNetworkError,
5
+ isCalendarOffline,
6
+ listCalendarOutbox,
7
+ onCalendarOutboxChange,
8
+ readCalendarCache,
9
+ writeCalendarCache
10
+ } from "./outbox.js";
11
+ const calendarOfflineSupport = {
12
+ async read(key, fetch) {
13
+ const cacheKey = JSON.stringify(key);
14
+ if (!isCalendarOffline()) {
15
+ try {
16
+ const data = await fetch();
17
+ void writeCalendarCache(cacheKey, data).catch(() => {
18
+ });
19
+ return data;
20
+ } catch (err) {
21
+ if (!isCalendarNetworkError(err)) throw err;
22
+ }
23
+ }
24
+ const cached = await readCalendarCache(cacheKey).catch(
25
+ () => null
26
+ );
27
+ if (cached != null) return cached;
28
+ throw new ArbiApiError("You are offline and this view is not saved on this device");
29
+ },
30
+ async write(op, send) {
31
+ if (!isCalendarOffline()) return send();
32
+ const { requestId } = await enqueueCalendarWrite(op);
33
+ return { queued: true, requestId };
34
+ },
35
+ pending: listCalendarOutbox,
36
+ subscribe: (listener) => onCalendarOutboxChange(() => listener())
37
+ };
38
+ export {
39
+ calendarOfflineSupport
40
+ };
41
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/calendar/offline/support.ts"],
4
+ "sourcesContent": ["/**\n * The calendar kept on this device, as the calendar hooks take it (the host's\n * `calendar.offline`): reads are remembered (encrypted) and answered from that copy when the\n * network is down; event writes made offline go to the outbox, which `useCalendarOfflineRuntime`\n * replays once back online.\n */\nimport { ArbiApiError } from '@arbidocs/sdk/browser'\nimport type { CalendarOfflineSupport } from '../support'\nimport {\n enqueueCalendarWrite,\n isCalendarNetworkError,\n isCalendarOffline,\n listCalendarOutbox,\n onCalendarOutboxChange,\n readCalendarCache,\n writeCalendarCache,\n} from './outbox'\n\nexport const calendarOfflineSupport: CalendarOfflineSupport = {\n async read(key, fetch) {\n const cacheKey = JSON.stringify(key)\n if (!isCalendarOffline()) {\n try {\n const data = await fetch()\n void writeCalendarCache(cacheKey, data).catch(() => {})\n return data\n } catch (err) {\n if (!isCalendarNetworkError(err)) throw err\n }\n }\n const cached = await readCalendarCache<Awaited<ReturnType<typeof fetch>>>(cacheKey).catch(\n () => null\n )\n if (cached != null) return cached\n throw new ArbiApiError('You are offline and this view is not saved on this device')\n },\n async write(op, send) {\n if (!isCalendarOffline()) return send()\n const { requestId } = await enqueueCalendarWrite(op)\n return { queued: true, requestId }\n },\n pending: listCalendarOutbox,\n subscribe: (listener) => onCalendarOutboxChange(() => listener()),\n}\n"],
5
+ "mappings": "AAMA,SAAS,oBAAoB;AAE7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,yBAAiD;AAAA,EAC5D,MAAM,KAAK,KAAK,OAAO;AACrB,UAAM,WAAW,KAAK,UAAU,GAAG;AACnC,QAAI,CAAC,kBAAkB,GAAG;AACxB,UAAI;AACF,cAAM,OAAO,MAAM,MAAM;AACzB,aAAK,mBAAmB,UAAU,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACtD,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,YAAI,CAAC,uBAAuB,GAAG,EAAG,OAAM;AAAA,MAC1C;AAAA,IACF;AACA,UAAM,SAAS,MAAM,kBAAqD,QAAQ,EAAE;AAAA,MAClF,MAAM;AAAA,IACR;AACA,QAAI,UAAU,KAAM,QAAO;AAC3B,UAAM,IAAI,aAAa,2DAA2D;AAAA,EACpF;AAAA,EACA,MAAM,MAAM,IAAI,MAAM;AACpB,QAAI,CAAC,kBAAkB,EAAG,QAAO,KAAK;AACtC,UAAM,EAAE,UAAU,IAAI,MAAM,qBAAqB,EAAE;AACnD,WAAO,EAAE,QAAQ,MAAM,UAAU;AAAA,EACnC;AAAA,EACA,SAAS;AAAA,EACT,WAAW,CAAC,aAAa,uBAAuB,MAAM,SAAS,CAAC;AAClE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,34 @@
1
+ import { useMemo } from "react";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+ import { useArbi } from "../useArbi.js";
4
+ import { useArbiHost } from "../host/config.js";
5
+ import { connectorQueryKeys } from "../connectors/hooks.js";
6
+ function isQueuedCalendarWrite(value) {
7
+ return !!value && typeof value === "object" && value.queued === true;
8
+ }
9
+ const NO_SUPPORT = {};
10
+ function useCalendarSupport() {
11
+ const support = useArbiHost().calendar ?? NO_SUPPORT;
12
+ const arbi = useArbi();
13
+ const qc = useQueryClient();
14
+ return useMemo(
15
+ () => ({
16
+ ...support,
17
+ connectors: support.connectors ?? {
18
+ authorize: (vendor, returnPath) => arbi.connectors.authorize(vendor, returnPath),
19
+ bridge: (vendor) => arbi.connectors.bridgeTokens({ vendor }),
20
+ connectedVendors: async () => (await qc.fetchQuery({
21
+ queryKey: connectorQueryKeys.mine(),
22
+ queryFn: () => arbi.connectors.mine(),
23
+ staleTime: 3e4
24
+ })).map((c) => c.vendor_key)
25
+ }
26
+ }),
27
+ [support, arbi, qc]
28
+ );
29
+ }
30
+ export {
31
+ isQueuedCalendarWrite,
32
+ useCalendarSupport
33
+ };
34
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/calendar/support.tsx"],
4
+ "sourcesContent": ["/**\n * What a host adds to the calendar hooks (the host configuration's `calendar`), all optional:\n * keeping the calendar on this device (offline reads and a write outbox), and where the OAuth of a\n * Google or Microsoft account comes back to. Without it the hooks read and write online only.\n * Accounts connect through the user's connectors (`arbi.connectors`) unless the host supplies its\n * own.\n */\n\nimport { useMemo } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useArbi } from '../useArbi'\nimport { useArbiHost } from '../host/config'\nimport { connectorQueryKeys } from '../connectors/hooks'\nimport type {\n EventCreateBody,\n EventPatchBody,\n RespondParams,\n ScopedTarget,\n} from '@arbidocs/sdk/browser'\n\n/** A write the outbox can hold while offline. */\nexport type CalendarWriteOp =\n | { kind: 'create'; body: EventCreateBody }\n | { kind: 'update'; target: ScopedTarget; body: EventPatchBody }\n | { kind: 'delete'; target: ScopedTarget & { notify?: boolean } }\n | { kind: 'respond'; params: RespondParams }\n\n/** A write made offline: queued on this device and sent exactly once when back online. */\nexport interface QueuedCalendarWrite {\n queued: true\n requestId: string\n}\n\nexport function isQueuedCalendarWrite(value: unknown): value is QueuedCalendarWrite {\n return !!value && typeof value === 'object' && (value as QueuedCalendarWrite).queued === true\n}\n\n/** A write waiting in the outbox (a queued create is drawn on the grid as pending). */\nexport interface CalendarPendingWrite {\n requestId: string\n op: CalendarWriteOp\n state: string\n inDoubt?: boolean\n error?: string\n}\n\nexport interface CalendarOfflineSupport {\n /**\n * Run a read online and keep the result on this device; when the network is down, answer from\n * that copy. `key` identifies the read (its query key).\n */\n read<T>(key: readonly unknown[], fetch: () => Promise<T>): Promise<T>\n /** Send a write, or, offline, queue it and answer {@link QueuedCalendarWrite}. */\n write<T>(op: CalendarWriteOp, send: () => Promise<T>): Promise<T | QueuedCalendarWrite>\n /** The writes waiting in the outbox. */\n pending(): Promise<CalendarPendingWrite[]>\n /** Be told when the outbox changes. Returns the unsubscribe. */\n subscribe(listener: () => void): () => void\n}\n\nexport interface CalendarConnectorSupport {\n /** The URL that starts a connector's OAuth consent and comes back to `returnPath`. */\n authorize(vendor: string, returnPath: string): Promise<string>\n /** Hand this server session the connector's sealed grant (the server answered 401 without it). */\n bridge(vendor: string): Promise<void>\n /** The vendor keys of the user's connected connectors. */\n connectedVendors(): Promise<string[]>\n}\n\nexport interface CalendarSupport {\n offline?: CalendarOfflineSupport\n connectors?: CalendarConnectorSupport\n /** Where the OAuth consent returns to (default: the current page). */\n oauthReturnPath?: string\n}\n\nconst NO_SUPPORT: CalendarSupport = {}\n\nexport function useCalendarSupport(): CalendarSupport {\n const support = useArbiHost().calendar ?? NO_SUPPORT\n const arbi = useArbi()\n const qc = useQueryClient()\n return useMemo<CalendarSupport>(\n () => ({\n ...support,\n connectors: support.connectors ?? {\n authorize: (vendor, returnPath) => arbi.connectors.authorize(vendor, returnPath),\n bridge: (vendor) => arbi.connectors.bridgeTokens({ vendor }),\n connectedVendors: async () =>\n (\n await qc.fetchQuery({\n queryKey: connectorQueryKeys.mine(),\n queryFn: () => arbi.connectors.mine(),\n staleTime: 30_000,\n })\n ).map((c) => c.vendor_key),\n },\n }),\n [support, arbi, qc]\n )\n}\n"],
5
+ "mappings": "AAQA,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,0BAA0B;AAqB5B,SAAS,sBAAsB,OAA8C;AAClF,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAa,MAA8B,WAAW;AAC3F;AAyCA,MAAM,aAA8B,CAAC;AAE9B,SAAS,qBAAsC;AACpD,QAAM,UAAU,YAAY,EAAE,YAAY;AAC1C,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,eAAe;AAC1B,SAAO;AAAA,IACL,OAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY,QAAQ,cAAc;AAAA,QAChC,WAAW,CAAC,QAAQ,eAAe,KAAK,WAAW,UAAU,QAAQ,UAAU;AAAA,QAC/E,QAAQ,CAAC,WAAW,KAAK,WAAW,aAAa,EAAE,OAAO,CAAC;AAAA,QAC3D,kBAAkB,aAEd,MAAM,GAAG,WAAW;AAAA,UAClB,UAAU,mBAAmB,KAAK;AAAA,UAClC,SAAS,MAAM,KAAK,WAAW,KAAK;AAAA,UACpC,WAAW;AAAA,QACb,CAAC,GACD,IAAI,CAAC,MAAM,EAAE,UAAU;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,SAAS,MAAM,EAAE;AAAA,EACpB;AACF;",
6
+ "names": []
7
+ }