@arbidocs/react 0.5.111 → 0.5.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (972) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/config/config-hooks.js +209 -0
  304. package/dist/config/config-hooks.js.map +7 -0
  305. package/dist/connectivity.js +72 -0
  306. package/dist/connectivity.js.map +7 -0
  307. package/dist/connectors/hooks.js +263 -0
  308. package/dist/connectors/hooks.js.map +7 -0
  309. package/dist/connectors/index.js +28 -0
  310. package/dist/connectors/index.js.map +7 -0
  311. package/dist/contacts.js +100 -0
  312. package/dist/contacts.js.map +7 -0
  313. package/dist/conversation-list.js +65 -0
  314. package/dist/conversation-list.js.map +7 -0
  315. package/dist/databases.js +195 -0
  316. package/dist/databases.js.map +7 -0
  317. package/dist/datasets/aggregate.js +281 -0
  318. package/dist/datasets/aggregate.js.map +7 -0
  319. package/dist/datasets/index.js +122 -0
  320. package/dist/datasets/index.js.map +7 -0
  321. package/dist/datasets/members.js +27 -0
  322. package/dist/datasets/members.js.map +7 -0
  323. package/dist/datasets/panel.js +44 -0
  324. package/dist/datasets/panel.js.map +7 -0
  325. package/dist/datasets/registry.js +47 -0
  326. package/dist/datasets/registry.js.map +7 -0
  327. package/dist/datasets/rows-source.js +44 -0
  328. package/dist/datasets/rows-source.js.map +7 -0
  329. package/dist/datasets/sources/activity.js +83 -0
  330. package/dist/datasets/sources/activity.js.map +7 -0
  331. package/dist/datasets/sources/conversations.js +74 -0
  332. package/dist/datasets/sources/conversations.js.map +7 -0
  333. package/dist/datasets/sources/database.js +209 -0
  334. package/dist/datasets/sources/database.js.map +7 -0
  335. package/dist/datasets/sources/documents.js +93 -0
  336. package/dist/datasets/sources/documents.js.map +7 -0
  337. package/dist/datasets/sources/facts.js +56 -0
  338. package/dist/datasets/sources/facts.js.map +7 -0
  339. package/dist/datasets/sources/projects.js +117 -0
  340. package/dist/datasets/sources/projects.js.map +7 -0
  341. package/dist/datasets/sources/tags.js +67 -0
  342. package/dist/datasets/sources/tags.js.map +7 -0
  343. package/dist/datasets/sources/usage.js +268 -0
  344. package/dist/datasets/sources/usage.js.map +7 -0
  345. package/dist/datasets/sources/workflows.js +91 -0
  346. package/dist/datasets/sources/workflows.js.map +7 -0
  347. package/dist/datasets/sources/workspaces.js +67 -0
  348. package/dist/datasets/sources/workspaces.js.map +7 -0
  349. package/dist/datasets/store.js +194 -0
  350. package/dist/datasets/store.js.map +7 -0
  351. package/dist/datasets/types.js +14 -0
  352. package/dist/datasets/types.js.map +7 -0
  353. package/dist/directmessages/ConversationList.js +148 -0
  354. package/dist/directmessages/ConversationList.js.map +7 -0
  355. package/dist/directmessages/DateSeparator.js +8 -0
  356. package/dist/directmessages/DateSeparator.js.map +7 -0
  357. package/dist/directmessages/DmAvatar.js +29 -0
  358. package/dist/directmessages/DmAvatar.js.map +7 -0
  359. package/dist/directmessages/DmComposer.js +201 -0
  360. package/dist/directmessages/DmComposer.js.map +7 -0
  361. package/dist/directmessages/arrivals.js +29 -0
  362. package/dist/directmessages/arrivals.js.map +7 -0
  363. package/dist/directmessages/chat-cache.js +192 -0
  364. package/dist/directmessages/chat-cache.js.map +7 -0
  365. package/dist/directmessages/grouping.js +26 -0
  366. package/dist/directmessages/grouping.js.map +7 -0
  367. package/dist/directmessages/index.js +81 -0
  368. package/dist/directmessages/index.js.map +7 -0
  369. package/dist/directmessages/useChats.js +266 -0
  370. package/dist/directmessages/useChats.js.map +7 -0
  371. package/dist/directmessages/utils.js +23 -0
  372. package/dist/directmessages/utils.js.map +7 -0
  373. package/dist/document-tools/can-annotate.js +7 -0
  374. package/dist/document-tools/can-annotate.js.map +7 -0
  375. package/dist/document-tools/core.js +218 -12
  376. package/dist/document-tools/core.js.map +7 -1
  377. package/dist/document-tools/document-pdf.js +76 -0
  378. package/dist/document-tools/document-pdf.js.map +7 -0
  379. package/dist/document-tools/environment.js +136 -0
  380. package/dist/document-tools/environment.js.map +7 -0
  381. package/dist/document-tools/file-shares.js +112 -0
  382. package/dist/document-tools/file-shares.js.map +7 -0
  383. package/dist/document-tools/frozen-copy.js +27 -0
  384. package/dist/document-tools/frozen-copy.js.map +7 -0
  385. package/dist/document-tools/index.js +26 -148
  386. package/dist/document-tools/index.js.map +7 -1
  387. package/dist/document-tools/markup-download.js +51 -0
  388. package/dist/document-tools/markup-download.js.map +7 -0
  389. package/dist/document-tools/markup-store.js +138 -0
  390. package/dist/document-tools/markup-store.js.map +7 -0
  391. package/dist/document-tools/markup-transfer.js +88 -0
  392. package/dist/document-tools/markup-transfer.js.map +7 -0
  393. package/dist/document-tools/production.js +147 -0
  394. package/dist/document-tools/production.js.map +7 -0
  395. package/dist/document-tools/saved-signature.js +90 -0
  396. package/dist/document-tools/saved-signature.js.map +7 -0
  397. package/dist/document-tools/signature-requests.js +310 -0
  398. package/dist/document-tools/signature-requests.js.map +7 -0
  399. package/dist/document-tools/signing.js +127 -0
  400. package/dist/document-tools/signing.js.map +7 -0
  401. package/dist/document-tools/useDocumentBytes.js +38 -0
  402. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  403. package/dist/document-tools/useDocumentMarkup.js +154 -0
  404. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  405. package/dist/document-tools/useIsOnline.js +13 -0
  406. package/dist/document-tools/useIsOnline.js.map +7 -0
  407. package/dist/document-tools/verification.js +60 -0
  408. package/dist/document-tools/verification.js.map +7 -0
  409. package/dist/documents/DocumentReview.js +220 -0
  410. package/dist/documents/DocumentReview.js.map +7 -0
  411. package/dist/documents/DraftTitleControls.js +41 -0
  412. package/dist/documents/DraftTitleControls.js.map +7 -0
  413. package/dist/documents/InlineMicButton.js +90 -0
  414. package/dist/documents/InlineMicButton.js.map +7 -0
  415. package/dist/documents/MicRecordingOverlay.js +29 -0
  416. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  417. package/dist/documents/MicWaveformIndicator.js +68 -0
  418. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  419. package/dist/documents/PhotoCapture.js +120 -0
  420. package/dist/documents/PhotoCapture.js.map +7 -0
  421. package/dist/documents/VideoCapture.js +129 -0
  422. package/dist/documents/VideoCapture.js.map +7 -0
  423. package/dist/documents/VoiceNoteRecorder.js +166 -0
  424. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  425. package/dist/documents/audio-segmenter.js +63 -0
  426. package/dist/documents/audio-segmenter.js.map +7 -0
  427. package/dist/documents/capture-frame.js +21 -0
  428. package/dist/documents/capture-frame.js.map +7 -0
  429. package/dist/documents/chunked-recorder.js +190 -0
  430. package/dist/documents/chunked-recorder.js.map +7 -0
  431. package/dist/documents/document-download.js +53 -0
  432. package/dist/documents/document-download.js.map +7 -0
  433. package/dist/documents/document-fields.js +109 -0
  434. package/dist/documents/document-fields.js.map +7 -0
  435. package/dist/documents/documents-cache.js +110 -0
  436. package/dist/documents/documents-cache.js.map +7 -0
  437. package/dist/documents/documents-data.js +128 -0
  438. package/dist/documents/documents-data.js.map +7 -0
  439. package/dist/documents/documents-loader.js +113 -0
  440. package/dist/documents/documents-loader.js.map +7 -0
  441. package/dist/documents/documents-writes.js +448 -0
  442. package/dist/documents/documents-writes.js.map +7 -0
  443. package/dist/documents/format-elapsed.js +10 -0
  444. package/dist/documents/format-elapsed.js.map +7 -0
  445. package/dist/documents/has-video-track.js +26 -0
  446. package/dist/documents/has-video-track.js.map +7 -0
  447. package/dist/documents/index.js +266 -0
  448. package/dist/documents/index.js.map +7 -0
  449. package/dist/documents/media-error.js +18 -0
  450. package/dist/documents/media-error.js.map +7 -0
  451. package/dist/documents/offline-documents.js +160 -0
  452. package/dist/documents/offline-documents.js.map +7 -0
  453. package/dist/documents/pending-sync.js +210 -0
  454. package/dist/documents/pending-sync.js.map +7 -0
  455. package/dist/documents/processing-live.js +122 -0
  456. package/dist/documents/processing-live.js.map +7 -0
  457. package/dist/documents/processing-order.js +59 -0
  458. package/dist/documents/processing-order.js.map +7 -0
  459. package/dist/documents/processing-settle.js +21 -0
  460. package/dist/documents/processing-settle.js.map +7 -0
  461. package/dist/documents/related-documents.js +133 -0
  462. package/dist/documents/related-documents.js.map +7 -0
  463. package/dist/documents/support.js +29 -0
  464. package/dist/documents/support.js.map +7 -0
  465. package/dist/documents/upload-files.js +169 -0
  466. package/dist/documents/upload-files.js.map +7 -0
  467. package/dist/documents/useAudioRecorder.js +315 -0
  468. package/dist/documents/useAudioRecorder.js.map +7 -0
  469. package/dist/documents/useCameraStream.js +35 -0
  470. package/dist/documents/useCameraStream.js.map +7 -0
  471. package/dist/documents/useDocumentThumbnails.js +71 -0
  472. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  473. package/dist/documents/useDownloadDocuments.js +90 -0
  474. package/dist/documents/useDownloadDocuments.js.map +7 -0
  475. package/dist/documents/usePassageQuotes.js +37 -0
  476. package/dist/documents/usePassageQuotes.js.map +7 -0
  477. package/dist/documents/useUploadFiles.js +165 -0
  478. package/dist/documents/useUploadFiles.js.map +7 -0
  479. package/dist/documents/useUploadFromUrls.js +63 -0
  480. package/dist/documents/useUploadFromUrls.js.map +7 -0
  481. package/dist/documents/useVideoRecorder.js +62 -0
  482. package/dist/documents/useVideoRecorder.js.map +7 -0
  483. package/dist/entities/AgentMarkers.js +61 -0
  484. package/dist/entities/AgentMarkers.js.map +7 -0
  485. package/dist/entities/DocumentEntity.js +125 -0
  486. package/dist/entities/DocumentEntity.js.map +7 -0
  487. package/dist/entities/EntityPill.js +250 -0
  488. package/dist/entities/EntityPill.js.map +7 -0
  489. package/dist/entities/ProjectEntity.js +61 -0
  490. package/dist/entities/ProjectEntity.js.map +7 -0
  491. package/dist/entities/ShieldIcon.js +49 -0
  492. package/dist/entities/ShieldIcon.js.map +7 -0
  493. package/dist/entities/TagEntity.js +79 -0
  494. package/dist/entities/TagEntity.js.map +7 -0
  495. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  496. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  497. package/dist/entities/UserEntity.js +211 -0
  498. package/dist/entities/UserEntity.js.map +7 -0
  499. package/dist/entities/VerifiedBadge.js +19 -0
  500. package/dist/entities/VerifiedBadge.js.map +7 -0
  501. package/dist/entities/agent-avatar-colors.js +26 -0
  502. package/dist/entities/agent-avatar-colors.js.map +7 -0
  503. package/dist/entities/colors.js +64 -0
  504. package/dist/entities/colors.js.map +7 -0
  505. package/dist/entities/file-type.js +151 -0
  506. package/dist/entities/file-type.js.map +7 -0
  507. package/dist/entities/index.js +100 -0
  508. package/dist/entities/index.js.map +7 -0
  509. package/dist/entities/media-type.js +61 -0
  510. package/dist/entities/media-type.js.map +7 -0
  511. package/dist/entities/registry.js +385 -0
  512. package/dist/entities/registry.js.map +7 -0
  513. package/dist/entities/status.js +43 -0
  514. package/dist/entities/status.js.map +7 -0
  515. package/dist/entities/tag-kinds.js +23 -0
  516. package/dist/entities/tag-kinds.js.map +7 -0
  517. package/dist/entities/tag-types.js +44 -0
  518. package/dist/entities/tag-types.js.map +7 -0
  519. package/dist/entities/vocabulary.js +12 -0
  520. package/dist/entities/vocabulary.js.map +7 -0
  521. package/dist/entity-extraction.js +25 -0
  522. package/dist/entity-extraction.js.map +7 -0
  523. package/dist/facts-search.js +57 -0
  524. package/dist/facts-search.js.map +7 -0
  525. package/dist/facts.js +69 -0
  526. package/dist/facts.js.map +7 -0
  527. package/dist/hooks.js +320 -0
  528. package/dist/hooks.js.map +7 -0
  529. package/dist/host/ArbiHost.js +24 -0
  530. package/dist/host/ArbiHost.js.map +7 -0
  531. package/dist/host/assistant-copy.js +54 -0
  532. package/dist/host/assistant-copy.js.map +7 -0
  533. package/dist/host/config.js +9 -0
  534. package/dist/host/config.js.map +7 -0
  535. package/dist/host/context.js +10 -0
  536. package/dist/host/context.js.map +7 -0
  537. package/dist/host/features.js +144 -0
  538. package/dist/host/features.js.map +7 -0
  539. package/dist/host/index.js +12 -0
  540. package/dist/host/index.js.map +7 -0
  541. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  542. package/dist/host/merge.js.map +7 -0
  543. package/dist/house-template.js +40 -0
  544. package/dist/house-template.js.map +7 -0
  545. package/dist/icons/AppleIcon.js +25 -0
  546. package/dist/icons/AppleIcon.js.map +7 -0
  547. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  548. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  549. package/dist/icons/ArbiIcon.js +24 -0
  550. package/dist/icons/ArbiIcon.js.map +7 -0
  551. package/dist/icons/AudIcon.js +56 -0
  552. package/dist/icons/AudIcon.js.map +7 -0
  553. package/dist/icons/ClaudeIcon.js +28 -0
  554. package/dist/icons/ClaudeIcon.js.map +7 -0
  555. package/dist/icons/DocIcon.js +56 -0
  556. package/dist/icons/DocIcon.js.map +7 -0
  557. package/dist/icons/EmlIcon.js +57 -0
  558. package/dist/icons/EmlIcon.js.map +7 -0
  559. package/dist/icons/FireworksIcon.js +47 -0
  560. package/dist/icons/FireworksIcon.js.map +7 -0
  561. package/dist/icons/GeminiIcon.js +37 -0
  562. package/dist/icons/GeminiIcon.js.map +7 -0
  563. package/dist/icons/GitHubIcon.js +32 -0
  564. package/dist/icons/GitHubIcon.js.map +7 -0
  565. package/dist/icons/GoogleIcon.js +53 -0
  566. package/dist/icons/GoogleIcon.js.map +7 -0
  567. package/dist/icons/HtmlIcon.js +56 -0
  568. package/dist/icons/HtmlIcon.js.map +7 -0
  569. package/dist/icons/ImgIcon.js +56 -0
  570. package/dist/icons/ImgIcon.js.map +7 -0
  571. package/dist/icons/LinkedInIcon.js +25 -0
  572. package/dist/icons/LinkedInIcon.js.map +7 -0
  573. package/dist/icons/OpenAIIcon.js +28 -0
  574. package/dist/icons/OpenAIIcon.js.map +7 -0
  575. package/dist/icons/PdfIcon.js +56 -0
  576. package/dist/icons/PdfIcon.js.map +7 -0
  577. package/dist/icons/ProviderIcon.js +42 -0
  578. package/dist/icons/ProviderIcon.js.map +7 -0
  579. package/dist/icons/TxtIcon.js +56 -0
  580. package/dist/icons/TxtIcon.js.map +7 -0
  581. package/dist/icons/VidIcon.js +56 -0
  582. package/dist/icons/VidIcon.js.map +7 -0
  583. package/dist/icons/XlsIcon.js +56 -0
  584. package/dist/icons/XlsIcon.js.map +7 -0
  585. package/dist/icons/arbi-mark.js +5 -0
  586. package/dist/icons/arbi-mark.js.map +7 -0
  587. package/dist/icons/colors.js +31 -0
  588. package/dist/icons/colors.js.map +7 -0
  589. package/dist/icons/file-type.js +105 -0
  590. package/dist/icons/file-type.js.map +7 -0
  591. package/dist/icons/index.js +55 -0
  592. package/dist/icons/index.js.map +7 -0
  593. package/dist/imagecrop/ImageCropModal.js +56 -0
  594. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  595. package/dist/imagecrop/ImageCropper.js +100 -0
  596. package/dist/imagecrop/ImageCropper.js.map +7 -0
  597. package/dist/imagecrop/cropImage.js +43 -0
  598. package/dist/imagecrop/cropImage.js.map +7 -0
  599. package/dist/imagecrop/index.js +13 -0
  600. package/dist/imagecrop/index.js.map +7 -0
  601. package/dist/index.js +702 -17116
  602. package/dist/index.js.map +7 -1
  603. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  604. package/dist/lazy-chunk.js.map +7 -0
  605. package/dist/lib/collision-padding.js +13 -0
  606. package/dist/lib/collision-padding.js.map +7 -0
  607. package/dist/lib/format-friendly-date.js +55 -0
  608. package/dist/lib/format-friendly-date.js.map +7 -0
  609. package/dist/lib/format-relative-time.js +52 -0
  610. package/dist/lib/format-relative-time.js.map +7 -0
  611. package/dist/lib/markdown-to-text.js +35 -0
  612. package/dist/lib/markdown-to-text.js.map +7 -0
  613. package/dist/lib/toast-interaction.js +9 -0
  614. package/dist/lib/toast-interaction.js.map +7 -0
  615. package/dist/lib/utils.js +9 -0
  616. package/dist/lib/utils.js.map +7 -0
  617. package/dist/mail/client.js +103 -0
  618. package/dist/mail/client.js.map +7 -0
  619. package/dist/mail/document-attachment.js +38 -0
  620. package/dist/mail/document-attachment.js.map +7 -0
  621. package/dist/mail/filing.js +132 -0
  622. package/dist/mail/filing.js.map +7 -0
  623. package/dist/mail/hooks.js +393 -0
  624. package/dist/mail/hooks.js.map +7 -0
  625. package/dist/mail/index.js +120 -0
  626. package/dist/mail/index.js.map +7 -0
  627. package/dist/mail/offline/changes.js +258 -0
  628. package/dist/mail/offline/changes.js.map +7 -0
  629. package/dist/mail/offline/confirm-sign-out.js +37 -0
  630. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  631. package/dist/mail/offline/crypto.js +26 -0
  632. package/dist/mail/offline/crypto.js.map +7 -0
  633. package/dist/mail/offline/drafts.js +69 -0
  634. package/dist/mail/offline/drafts.js.map +7 -0
  635. package/dist/mail/offline/hooks.js +104 -0
  636. package/dist/mail/offline/hooks.js.map +7 -0
  637. package/dist/mail/offline/index.js +48 -0
  638. package/dist/mail/offline/index.js.map +7 -0
  639. package/dist/mail/offline/live.js +233 -0
  640. package/dist/mail/offline/live.js.map +7 -0
  641. package/dist/mail/offline/mailbox.js +191 -0
  642. package/dist/mail/offline/mailbox.js.map +7 -0
  643. package/dist/mail/offline/outbox.js +167 -0
  644. package/dist/mail/offline/outbox.js.map +7 -0
  645. package/dist/mail/offline/reads.js +159 -0
  646. package/dist/mail/offline/reads.js.map +7 -0
  647. package/dist/mail/offline/runtime.js +100 -0
  648. package/dist/mail/offline/runtime.js.map +7 -0
  649. package/dist/mail/offline/settings.js +84 -0
  650. package/dist/mail/offline/settings.js.map +7 -0
  651. package/dist/mail/offline/store.js +29 -0
  652. package/dist/mail/offline/store.js.map +7 -0
  653. package/dist/mail/offline/sync.js +251 -0
  654. package/dist/mail/offline/sync.js.map +7 -0
  655. package/dist/mail/offline/wipe.js +19 -0
  656. package/dist/mail/offline/wipe.js.map +7 -0
  657. package/dist/mail/thread-keys.js +53 -0
  658. package/dist/mail/thread-keys.js.map +7 -0
  659. package/dist/mail/threads.js +71 -0
  660. package/dist/mail/threads.js.map +7 -0
  661. package/dist/mail/useMailClient.js +42 -0
  662. package/dist/mail/useMailClient.js.map +7 -0
  663. package/dist/model-connections.js +58 -0
  664. package/dist/model-connections.js.map +7 -0
  665. package/dist/notifications/ActivityFeed.js +70 -0
  666. package/dist/notifications/ActivityFeed.js.map +7 -0
  667. package/dist/notifications/NotificationBell.js +200 -0
  668. package/dist/notifications/NotificationBell.js.map +7 -0
  669. package/dist/notifications/Toaster.js +24 -0
  670. package/dist/notifications/Toaster.js.map +7 -0
  671. package/dist/notifications/activity-types.js +65 -0
  672. package/dist/notifications/activity-types.js.map +7 -0
  673. package/dist/notifications/bell.js +24 -0
  674. package/dist/notifications/bell.js.map +7 -0
  675. package/dist/notifications/calendar-notifications.js +79 -0
  676. package/dist/notifications/calendar-notifications.js.map +7 -0
  677. package/dist/notifications/index.js +108 -0
  678. package/dist/notifications/index.js.map +7 -0
  679. package/dist/notifications/live.js +28 -0
  680. package/dist/notifications/live.js.map +7 -0
  681. package/dist/notifications/notification-types.js +127 -0
  682. package/dist/notifications/notification-types.js.map +7 -0
  683. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  684. package/dist/notifications/notify-store.js.map +7 -0
  685. package/dist/notifications/server-notifications.js +452 -0
  686. package/dist/notifications/server-notifications.js.map +7 -0
  687. package/dist/notifications/useNotifications.js +34 -0
  688. package/dist/notifications/useNotifications.js.map +7 -0
  689. package/dist/offline-store/network.js +11 -0
  690. package/dist/offline-store/network.js.map +7 -0
  691. package/dist/offline-store/store.js +136 -0
  692. package/dist/offline-store/store.js.map +7 -0
  693. package/dist/offline-store/wipe.js +8 -0
  694. package/dist/offline-store/wipe.js.map +7 -0
  695. package/dist/offline.js +58 -0
  696. package/dist/offline.js.map +7 -0
  697. package/dist/people.js +122 -0
  698. package/dist/people.js.map +7 -0
  699. package/dist/projects.js +30 -0
  700. package/dist/projects.js.map +7 -0
  701. package/dist/query-client.js +63 -0
  702. package/dist/query-client.js.map +7 -0
  703. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  704. package/dist/query-keys.js.map +7 -0
  705. package/dist/query-persist.js +66 -0
  706. package/dist/query-persist.js.map +7 -0
  707. package/dist/queued-writes.js +59 -0
  708. package/dist/queued-writes.js.map +7 -0
  709. package/dist/remote-control.js +67 -0
  710. package/dist/remote-control.js.map +7 -0
  711. package/dist/search/index.js +23 -0
  712. package/dist/search/index.js.map +7 -0
  713. package/dist/search/session.js +58 -0
  714. package/dist/search/session.js.map +7 -0
  715. package/dist/search/useSemanticSearch.js +82 -0
  716. package/dist/search/useSemanticSearch.js.map +7 -0
  717. package/dist/session/chat.js +512 -0
  718. package/dist/session/chat.js.map +7 -0
  719. package/dist/session/documents.js +196 -0
  720. package/dist/session/documents.js.map +7 -0
  721. package/dist/session/drafts.js +103 -0
  722. package/dist/session/drafts.js.map +7 -0
  723. package/dist/session/index.js +123 -0
  724. package/dist/session/index.js.map +7 -0
  725. package/dist/session/layout.js +339 -0
  726. package/dist/session/layout.js.map +7 -0
  727. package/dist/session/persist.js +106 -0
  728. package/dist/session/persist.js.map +7 -0
  729. package/dist/session/session-hooks.js +53 -0
  730. package/dist/session/session-hooks.js.map +7 -0
  731. package/dist/session/signed-in.js +36 -0
  732. package/dist/session/signed-in.js.map +7 -0
  733. package/dist/session/store.js +166 -0
  734. package/dist/session/store.js.map +7 -0
  735. package/dist/session/thread-tabs.js +121 -0
  736. package/dist/session/thread-tabs.js.map +7 -0
  737. package/dist/session/ui-state-storage.js +76 -0
  738. package/dist/session/ui-state-storage.js.map +7 -0
  739. package/dist/session/workspace.js +77 -0
  740. package/dist/session/workspace.js.map +7 -0
  741. package/dist/shell/index.js +43 -10
  742. package/dist/shell/index.js.map +7 -1
  743. package/dist/skill-pack.js +111 -0
  744. package/dist/skill-pack.js.map +7 -0
  745. package/dist/storage.js +186 -0
  746. package/dist/storage.js.map +7 -0
  747. package/dist/support/index.js +35 -0
  748. package/dist/support/index.js.map +7 -0
  749. package/dist/tags.js +204 -0
  750. package/dist/tags.js.map +7 -0
  751. package/dist/ui/DebouncedInput.js +109 -0
  752. package/dist/ui/DebouncedInput.js.map +7 -0
  753. package/dist/ui/DictateContext.js +8 -0
  754. package/dist/ui/DictateContext.js.map +7 -0
  755. package/dist/ui/IconToggle.js +79 -0
  756. package/dist/ui/IconToggle.js.map +7 -0
  757. package/dist/ui/VerifiedToggle.js +38 -0
  758. package/dist/ui/VerifiedToggle.js.map +7 -0
  759. package/dist/ui/VisibilityToggle.js +103 -0
  760. package/dist/ui/VisibilityToggle.js.map +7 -0
  761. package/dist/ui/avatar.js +40 -0
  762. package/dist/ui/avatar.js.map +7 -0
  763. package/dist/ui/badge.js +28 -0
  764. package/dist/ui/badge.js.map +7 -0
  765. package/dist/ui/button.js +48 -0
  766. package/dist/ui/button.js.map +7 -0
  767. package/dist/ui/card.js +90 -0
  768. package/dist/ui/card.js.map +7 -0
  769. package/dist/ui/checkbox.js +22 -0
  770. package/dist/ui/checkbox.js.map +7 -0
  771. package/dist/ui/collapsible.js +10 -0
  772. package/dist/ui/collapsible.js.map +7 -0
  773. package/dist/ui/command.js +103 -0
  774. package/dist/ui/command.js.map +7 -0
  775. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  776. package/dist/ui/dialog.js.map +7 -0
  777. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  778. package/dist/ui/dropdown-menu.js.map +7 -0
  779. package/dist/ui/hover-card.js +36 -0
  780. package/dist/ui/hover-card.js.map +7 -0
  781. package/dist/ui/index.js +290 -10
  782. package/dist/ui/index.js.map +7 -1
  783. package/dist/ui/input.js +65 -0
  784. package/dist/ui/input.js.map +7 -0
  785. package/dist/ui/label.js +16 -0
  786. package/dist/ui/label.js.map +7 -0
  787. package/dist/ui/mark-menu.js +300 -0
  788. package/dist/ui/mark-menu.js.map +7 -0
  789. package/dist/ui/popover.js +40 -0
  790. package/dist/ui/popover.js.map +7 -0
  791. package/dist/ui/portal-container.js +17 -0
  792. package/dist/ui/portal-container.js.map +7 -0
  793. package/dist/ui/progress.js +24 -0
  794. package/dist/ui/progress.js.map +7 -0
  795. package/dist/ui/radio-group.js +29 -0
  796. package/dist/ui/radio-group.js.map +7 -0
  797. package/dist/ui/scroll-area.js +39 -0
  798. package/dist/ui/scroll-area.js.map +7 -0
  799. package/dist/ui/select.js +130 -0
  800. package/dist/ui/select.js.map +7 -0
  801. package/dist/ui/separator.js +23 -0
  802. package/dist/ui/separator.js.map +7 -0
  803. package/dist/ui/slider.js +23 -0
  804. package/dist/ui/slider.js.map +7 -0
  805. package/dist/ui/switch.js +28 -0
  806. package/dist/ui/switch.js.map +7 -0
  807. package/dist/ui/table.js +75 -0
  808. package/dist/ui/table.js.map +7 -0
  809. package/dist/ui/tabs.js +48 -0
  810. package/dist/ui/tabs.js.map +7 -0
  811. package/dist/ui/textarea.js +63 -0
  812. package/dist/ui/textarea.js.map +7 -0
  813. package/dist/ui/toggle-group.js +43 -0
  814. package/dist/ui/toggle-group.js.map +7 -0
  815. package/dist/ui/toggle.js +40 -0
  816. package/dist/ui/toggle.js.map +7 -0
  817. package/dist/ui/tooltip.js +215 -0
  818. package/dist/ui/tooltip.js.map +7 -0
  819. package/dist/usage-metered.js +8 -0
  820. package/dist/usage-metered.js.map +7 -0
  821. package/dist/useArbi.js +16 -0
  822. package/dist/useArbi.js.map +7 -0
  823. package/dist/useInstallSkillPack.js +81 -0
  824. package/dist/useInstallSkillPack.js.map +7 -0
  825. package/dist/usermenu/UserMenu.js +188 -0
  826. package/dist/usermenu/UserMenu.js.map +7 -0
  827. package/dist/usermenu/index.js +5 -0
  828. package/dist/usermenu/index.js.map +7 -0
  829. package/dist/users/index.js +15 -0
  830. package/dist/users/index.js.map +7 -0
  831. package/dist/users/user-display.js +60 -0
  832. package/dist/users/user-display.js.map +7 -0
  833. package/dist/viewers/AudioViewer.js +23 -0
  834. package/dist/viewers/AudioViewer.js.map +7 -0
  835. package/dist/viewers/DocxViewer.js +81 -0
  836. package/dist/viewers/DocxViewer.js.map +7 -0
  837. package/dist/viewers/ImageViewer.js +31 -0
  838. package/dist/viewers/ImageViewer.js.map +7 -0
  839. package/dist/viewers/PdfViewer.js +19 -3
  840. package/dist/viewers/PdfViewer.js.map +7 -1
  841. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  842. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  843. package/dist/viewers/VideoViewer.js +31 -0
  844. package/dist/viewers/VideoViewer.js.map +7 -0
  845. package/dist/viewers/XlsxViewer.js +102 -0
  846. package/dist/viewers/XlsxViewer.js.map +7 -0
  847. package/dist/viewers/index.js +61 -271
  848. package/dist/viewers/index.js.map +7 -1
  849. package/dist/viewers/page-scroll.js +59 -0
  850. package/dist/viewers/page-scroll.js.map +7 -0
  851. package/dist/viewers/pdf-viewer-constants.js +9 -0
  852. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  853. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  854. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  855. package/dist/viewers/selection-runs.js +38 -0
  856. package/dist/viewers/selection-runs.js.map +7 -0
  857. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  858. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  859. package/dist/viewers/useProcessedChunks.js +58 -0
  860. package/dist/viewers/useProcessedChunks.js.map +7 -0
  861. package/dist/viewers/viewer-zoom.js +163 -0
  862. package/dist/viewers/viewer-zoom.js.map +7 -0
  863. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  864. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  865. package/dist/websocket/context.js +14 -0
  866. package/dist/websocket/context.js.map +7 -0
  867. package/dist/websocket/hooks.js +30 -0
  868. package/dist/websocket/hooks.js.map +7 -0
  869. package/dist/websocket/index.js +22 -0
  870. package/dist/websocket/index.js.map +7 -0
  871. package/dist/websocket/live-updates.js +38 -0
  872. package/dist/websocket/live-updates.js.map +7 -0
  873. package/dist/websocket/reconnect.js +13 -0
  874. package/dist/websocket/reconnect.js.map +7 -0
  875. package/dist/websocket/store.js +58 -0
  876. package/dist/websocket/store.js.map +7 -0
  877. package/dist/workforce.js +607 -0
  878. package/dist/workforce.js.map +7 -0
  879. package/dist/workspaces/access-request.js +35 -0
  880. package/dist/workspaces/access-request.js.map +7 -0
  881. package/dist/workspaces/archive.js +59 -0
  882. package/dist/workspaces/archive.js.map +7 -0
  883. package/dist/workspaces/current.js +20 -0
  884. package/dist/workspaces/current.js.map +7 -0
  885. package/dist/workspaces/delete-workspaces.js +15 -0
  886. package/dist/workspaces/delete-workspaces.js.map +7 -0
  887. package/dist/workspaces/export-archive.js +40 -0
  888. package/dist/workspaces/export-archive.js.map +7 -0
  889. package/dist/workspaces/index.js +99 -0
  890. package/dist/workspaces/index.js.map +7 -0
  891. package/dist/workspaces/settings.js +45 -0
  892. package/dist/workspaces/settings.js.map +7 -0
  893. package/dist/workspaces/shell-workspaces.js +49 -0
  894. package/dist/workspaces/shell-workspaces.js.map +7 -0
  895. package/dist/workspaces/switch.js +234 -0
  896. package/dist/workspaces/switch.js.map +7 -0
  897. package/dist/workspaces/transfer.js +170 -0
  898. package/dist/workspaces/transfer.js.map +7 -0
  899. package/dist/workspaces/useShellWorkspaces.js +86 -0
  900. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  901. package/dist/workspaces/workspace-users.js +65 -0
  902. package/dist/workspaces/workspace-users.js.map +7 -0
  903. package/package.json +4 -4
  904. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  905. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  906. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  907. package/dist/annotations/freeze/index.d.cts +0 -205
  908. package/dist/annotations/index.d.cts +0 -360
  909. package/dist/artifacts/index.d.cts +0 -476
  910. package/dist/artifacts/redline-core.d.cts +0 -39
  911. package/dist/bundle-YNOX7VIL.js +0 -5
  912. package/dist/bundle-YNOX7VIL.js.map +0 -1
  913. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  914. package/dist/calls/livekit/index.d.cts +0 -280
  915. package/dist/chunk-47CCGUWR.js.map +0 -1
  916. package/dist/chunk-4FL3X3LA.js +0 -2057
  917. package/dist/chunk-4FL3X3LA.js.map +0 -1
  918. package/dist/chunk-6QNBSXCE.js +0 -271
  919. package/dist/chunk-6QNBSXCE.js.map +0 -1
  920. package/dist/chunk-74N436VK.js.map +0 -1
  921. package/dist/chunk-APZZQZ6P.js +0 -147
  922. package/dist/chunk-APZZQZ6P.js.map +0 -1
  923. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  924. package/dist/chunk-DPYBZDJB.js.map +0 -1
  925. package/dist/chunk-DZKRL5H3.js +0 -2766
  926. package/dist/chunk-DZKRL5H3.js.map +0 -1
  927. package/dist/chunk-HDCRPPBW.js +0 -75
  928. package/dist/chunk-HDCRPPBW.js.map +0 -1
  929. package/dist/chunk-L2IPPTVC.js +0 -20
  930. package/dist/chunk-L2IPPTVC.js.map +0 -1
  931. package/dist/chunk-LSU4UPS5.js +0 -1011
  932. package/dist/chunk-LSU4UPS5.js.map +0 -1
  933. package/dist/chunk-NIKPG4PW.js +0 -1128
  934. package/dist/chunk-NIKPG4PW.js.map +0 -1
  935. package/dist/chunk-NNAJLY6B.js +0 -4974
  936. package/dist/chunk-NNAJLY6B.js.map +0 -1
  937. package/dist/chunk-OYPKKHXY.js +0 -559
  938. package/dist/chunk-OYPKKHXY.js.map +0 -1
  939. package/dist/chunk-PTOP7OHG.js.map +0 -1
  940. package/dist/chunk-QMY2JKBI.js +0 -246
  941. package/dist/chunk-QMY2JKBI.js.map +0 -1
  942. package/dist/chunk-SN5YV6FF.js +0 -11
  943. package/dist/chunk-SN5YV6FF.js.map +0 -1
  944. package/dist/chunk-SSXFVWCT.js.map +0 -1
  945. package/dist/chunk-T3USOSVN.js.map +0 -1
  946. package/dist/chunk-T4CLW3DN.js +0 -2560
  947. package/dist/chunk-T4CLW3DN.js.map +0 -1
  948. package/dist/chunk-UW2SGTI5.js.map +0 -1
  949. package/dist/chunk-VSCU7K4V.js.map +0 -1
  950. package/dist/chunk-WL2Y2T47.js.map +0 -1
  951. package/dist/chunk-WUTL62MC.js.map +0 -1
  952. package/dist/chunk-XWPLOFDN.js +0 -644
  953. package/dist/chunk-XWPLOFDN.js.map +0 -1
  954. package/dist/chunk-Y3MTRA7D.js +0 -97
  955. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  956. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  957. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  958. package/dist/document-tools/core.d.cts +0 -883
  959. package/dist/document-tools/index.d.cts +0 -90
  960. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  961. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  962. package/dist/index.d.cts +0 -15923
  963. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  964. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  965. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  966. package/dist/shell/index.d.cts +0 -6
  967. package/dist/store.d-GADDvC7w.d.cts +0 -35
  968. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  969. package/dist/ui/index.d.cts +0 -26
  970. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  971. package/dist/viewers/PdfViewer.d.cts +0 -9
  972. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,234 @@
1
+ import { useEffect, useMemo, useRef } from "react";
2
+ import { onlineManager, useQueryClient } from "@tanstack/react-query";
3
+ import {
4
+ ArbiWorkspaceSupersededError
5
+ } from "@arbidocs/sdk/browser";
6
+ import { isAbortError } from "@arbidocs/client";
7
+ import { useArbi } from "../useArbi.js";
8
+ import { arbiQueryKeys, useWorkspaces } from "../hooks.js";
9
+ import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
10
+ import { notify } from "../notifications/notify-store.js";
11
+ import { getEntityLabel } from "../entities/registry.js";
12
+ const WORKSPACE_SCOPED_PACKAGE_KEYS = [
13
+ arbiQueryKeys.allDocuments(),
14
+ arbiQueryKeys.allSimilarDocuments(),
15
+ arbiQueryKeys.allWorkspaceUsers(),
16
+ arbiQueryKeys.documentSignatures(),
17
+ arbiQueryKeys.signatureRequests(),
18
+ arbiQueryKeys.databases()
19
+ ];
20
+ function drainWorkspaceQueries(queryClient) {
21
+ for (const queryKey of WORKSPACE_SCOPED_PACKAGE_KEYS) {
22
+ void queryClient.cancelQueries({ queryKey });
23
+ queryClient.removeQueries({ queryKey });
24
+ }
25
+ }
26
+ function seedOpenedWorkspace(queryClient, workspaceId, opened) {
27
+ if (opened.conversations)
28
+ queryClient.setQueryData(arbiQueryKeys.conversations(workspaceId), opened.conversations);
29
+ if (opened.tags) queryClient.setQueryData(arbiQueryKeys.tags(workspaceId), opened.tags);
30
+ }
31
+ function isWorkspaceArchivedError(error) {
32
+ const body = error?.apiError ?? error;
33
+ const detail = body?.detail;
34
+ return !!detail && typeof detail === "object" && detail.code === "workspace_archived";
35
+ }
36
+ const archivedWorkspaceMessage = (name) => `"${name}" is archived. Its owner can unarchive it from the workspace list.`;
37
+ const listedWorkspace = (queryClient, workspaceId) => queryClient.getQueryData(arbiQueryKeys.workspaces())?.find((w) => w.external_id === workspaceId);
38
+ let switchEpoch = 0;
39
+ const switching = /* @__PURE__ */ new Set();
40
+ const resetSwitchEpochForTests = () => {
41
+ switchEpoch = 0;
42
+ switching.clear();
43
+ };
44
+ const SIGNED_IN_WAIT_MS = 1e4;
45
+ const SIGNED_IN_POLL_MS = 50;
46
+ async function signedIn(arbi, timeoutMs = SIGNED_IN_WAIT_MS) {
47
+ const deadline = Date.now() + timeoutMs;
48
+ while (!arbi().isLoggedIn && arbi().session?.getState().signedIn === true && Date.now() < deadline) {
49
+ await new Promise((resolve) => setTimeout(resolve, SIGNED_IN_POLL_MS));
50
+ }
51
+ }
52
+ async function switchesSettled() {
53
+ while (switching.size > 0) await Promise.allSettled([...switching]);
54
+ }
55
+ function createWorkspaceSwitch({
56
+ arbi,
57
+ session,
58
+ queryClient
59
+ }) {
60
+ const switchWorkspace = (target) => {
61
+ const run = runSwitch(target);
62
+ switching.add(run);
63
+ void run.finally(() => switching.delete(run));
64
+ return run;
65
+ };
66
+ const runSwitch = async (target) => {
67
+ const { workspaceId: previousId, workspaceStatus } = session.getState();
68
+ const isSame = previousId === target.id;
69
+ if (isSame && workspaceStatus === "open") return true;
70
+ const listed = listedWorkspace(queryClient, target.id);
71
+ const name = target.name || listed?.name || "";
72
+ const noun = getEntityLabel("WORKSPACE");
73
+ if (listed?.archive) {
74
+ notify.info(archivedWorkspaceMessage(name));
75
+ return false;
76
+ }
77
+ if (!isSame && !onlineManager.isOnline()) {
78
+ notify.info(
79
+ `You're offline \u2014 you can only use the ${noun} you're already in. Reconnect to switch.`
80
+ );
81
+ return false;
82
+ }
83
+ const epoch = ++switchEpoch;
84
+ notify.info(`Opening "${name}" ${noun}\u2026`, { workspaceId: target.id, duration: 2e3 });
85
+ await signedIn(arbi);
86
+ if (epoch !== switchEpoch) return false;
87
+ if (!isSame) {
88
+ session.leaveWorkspace();
89
+ drainWorkspaceQueries(queryClient);
90
+ session.setWorkspaceId(null);
91
+ }
92
+ session.setWorkspaceStatus("opening");
93
+ performance.mark("arbi:workspace-open:start");
94
+ let opened;
95
+ try {
96
+ opened = await arbi().selectWorkspace(target.id);
97
+ } catch (error) {
98
+ if (isAbortError(error)) return false;
99
+ const superseded = error instanceof ArbiWorkspaceSupersededError;
100
+ if (!superseded) console.error("[switchWorkspace] /open failed:", error);
101
+ if (superseded && epoch === switchEpoch) {
102
+ if (previousId) session.setWorkspaceId(previousId);
103
+ session.setWorkspaceStatus("closed");
104
+ } else if (epoch === switchEpoch) {
105
+ if (previousId) session.setWorkspaceId(previousId);
106
+ session.setWorkspaceStatus("closed");
107
+ if (isWorkspaceArchivedError(error)) {
108
+ notify.info(archivedWorkspaceMessage(name));
109
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() });
110
+ } else {
111
+ notify.error(`Failed to open "${name}" ${noun}`);
112
+ }
113
+ }
114
+ return false;
115
+ }
116
+ if (epoch !== switchEpoch) return false;
117
+ seedOpenedWorkspace(queryClient, target.id, opened);
118
+ performance.mark("arbi:workspace-open:response");
119
+ session.setWorkspaceId(target.id);
120
+ session.setWorkspaceStatus("open");
121
+ return true;
122
+ };
123
+ const clearWorkspace = () => {
124
+ ++switchEpoch;
125
+ session.leaveWorkspace();
126
+ drainWorkspaceQueries(queryClient);
127
+ session.setWorkspaceId(null);
128
+ };
129
+ const openSelectedWorkspace = async () => {
130
+ const workspaceId = session.getState().workspaceId;
131
+ if (!workspaceId) return false;
132
+ const epoch = switchEpoch;
133
+ await signedIn(arbi);
134
+ if (epoch !== switchEpoch || session.getState().workspaceId !== workspaceId) return false;
135
+ performance.mark("arbi:workspace-open:start");
136
+ let opened;
137
+ try {
138
+ opened = await arbi().selectWorkspace(workspaceId);
139
+ } catch (error) {
140
+ if (!(error instanceof ArbiWorkspaceSupersededError) && !isAbortError(error)) {
141
+ console.error("[openSelectedWorkspace] /open failed:", error);
142
+ }
143
+ return false;
144
+ }
145
+ if (epoch !== switchEpoch || session.getState().workspaceId !== workspaceId) return false;
146
+ seedOpenedWorkspace(queryClient, workspaceId, opened);
147
+ performance.mark("arbi:workspace-open:response");
148
+ session.setWorkspaceStatus("open");
149
+ return true;
150
+ };
151
+ return { switchWorkspace, clearWorkspace, openSelectedWorkspace, settled: switchesSettled };
152
+ }
153
+ function useSwitchWorkspace() {
154
+ const arbi = useArbi();
155
+ const arbiRef = useRef(arbi);
156
+ arbiRef.current = arbi;
157
+ const session = useArbiSessionStore();
158
+ const queryClient = useQueryClient();
159
+ useEffect(
160
+ () => arbi.onSigningOut?.(() => {
161
+ ++switchEpoch;
162
+ void queryClient.cancelQueries();
163
+ }),
164
+ [arbi, queryClient]
165
+ );
166
+ return useMemo(
167
+ () => createWorkspaceSwitch({ arbi: () => arbiRef.current, session, queryClient }),
168
+ [session, queryClient]
169
+ );
170
+ }
171
+ function useOpenSelectedWorkspace() {
172
+ const arbi = useArbi();
173
+ const { clearWorkspace, openSelectedWorkspace } = useSwitchWorkspace();
174
+ const workspaceId = useArbiSessionState((s) => s.workspaceId);
175
+ const status = useArbiSessionState((s) => s.workspaceStatus);
176
+ const session = useArbiSessionStore();
177
+ const queryClient = useQueryClient();
178
+ const { data: workspaces, isLoading: listing, isFetching } = useWorkspaces();
179
+ const listed = workspaces;
180
+ const archived = listed?.find((w) => w.external_id === workspaceId && w.archive);
181
+ const reads = queryClient.getQueryState(arbiQueryKeys.workspaces())?.dataUpdateCount ?? 0;
182
+ const opened = useRef({ id: null, reads: 0 });
183
+ const openId = status === "open" ? workspaceId : null;
184
+ if (opened.current.id !== openId) opened.current = { id: openId, reads };
185
+ const gone = !!openId && !!listed && !isFetching && reads > opened.current.reads && !listed.some((w) => w.external_id === openId);
186
+ useEffect(() => {
187
+ if (!archived) return;
188
+ notify.info(archivedWorkspaceMessage(archived.name));
189
+ clearWorkspace();
190
+ }, [archived, clearWorkspace]);
191
+ useEffect(() => {
192
+ if (gone) clearWorkspace();
193
+ }, [gone, clearWorkspace]);
194
+ const opening = useRef(false);
195
+ const signedIn2 = arbi.isLoggedIn;
196
+ useEffect(() => {
197
+ if (!workspaceId || archived || gone || listing || status !== "closed" || !signedIn2 || opening.current)
198
+ return;
199
+ opening.current = true;
200
+ void openSelectedWorkspace().then(async (ok) => {
201
+ if (ok) return;
202
+ const fresh = await queryClient.fetchQuery({
203
+ queryKey: arbiQueryKeys.workspaces(),
204
+ queryFn: () => arbi.workspaces.list(),
205
+ staleTime: 0
206
+ }).catch(() => null);
207
+ if (fresh && session.getState().workspaceId === workspaceId && !fresh.some((w) => w.external_id === workspaceId))
208
+ clearWorkspace();
209
+ }).finally(() => {
210
+ opening.current = false;
211
+ });
212
+ }, [
213
+ arbi,
214
+ session,
215
+ clearWorkspace,
216
+ openSelectedWorkspace,
217
+ queryClient,
218
+ workspaceId,
219
+ archived,
220
+ gone,
221
+ listing,
222
+ status,
223
+ signedIn2
224
+ ]);
225
+ }
226
+ export {
227
+ archivedWorkspaceMessage,
228
+ createWorkspaceSwitch,
229
+ isWorkspaceArchivedError,
230
+ resetSwitchEpochForTests,
231
+ useOpenSelectedWorkspace,
232
+ useSwitchWorkspace
233
+ };
234
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/workspaces/switch.ts"],
4
+ "sourcesContent": ["/**\n * Switching the workspace the app is in: the one coordinator for \"the user is now in workspace X\".\n *\n * The server keeps the active workspace in the session, so every workspace-scoped GET reads the\n * workspace currently open for the session. A naive switch (set the id, `/open` in the background)\n * races every observer that refetches when the id changes: those requests reach a server still in\n * the previous workspace and seed the cache with its data. `switchWorkspace` keeps the order:\n *\n * 1. leave the workspace: its session state (`leaveWorkspace`) and its cached queries go, so\n * nothing shows or refetches the old workspace's data;\n * 2. the selection is cleared, so queries gated on it stop during the round trip;\n * 3. `arbi.selectWorkspace(target)`: the server session is now in the target;\n * 4. the conversations and tags `/open` returned seed their lists, then the selection is\n * committed (`workspaceId`, `workspaceStatus: 'open'`).\n *\n * Concurrent switches (A, then B, then C in quick succession): only the last one commits, and the\n * SDK runs the opens one at a time with the latest request winning, so the server session ends in\n * the last one too. `settled` waits out the switches in flight.\n *\n * A sign-out (`arbi.onSigningOut`, before the server revokes the token) overtakes every switch and\n * open in flight and cancels the queries in flight: the SDK has already stopped new requests and\n * aborts the ones in flight, so none comes back 401 or is reported as a failure.\n */\n\nimport { useEffect, useMemo, useRef } from 'react'\nimport { onlineManager, useQueryClient, type QueryClient } from '@tanstack/react-query'\nimport {\n ArbiWorkspaceSupersededError,\n type Arbi,\n type WorkspaceOpenResponse,\n} from '@arbidocs/sdk/browser'\nimport { isAbortError } from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys, useWorkspaces } from '../hooks'\nimport { useArbiSessionState, useArbiSessionStore, type ArbiSessionStore } from '../session'\nimport { notify } from '../notifications/notify-store'\nimport { getEntityLabel } from '../entities/registry'\n\n/**\n * What depends on the session's open workspace: dropped on a switch, so nothing of the workspace\n * left shows in the next, and a return reads it afresh.\n */\nconst WORKSPACE_SCOPED_PACKAGE_KEYS = [\n arbiQueryKeys.allDocuments(),\n arbiQueryKeys.allSimilarDocuments(),\n arbiQueryKeys.allWorkspaceUsers(),\n arbiQueryKeys.documentSignatures(),\n arbiQueryKeys.signatureRequests(),\n arbiQueryKeys.databases(),\n]\n\n/** Cancel (so nothing in flight lands afterwards) and drop every workspace-scoped query. */\nfunction drainWorkspaceQueries(queryClient: QueryClient): void {\n for (const queryKey of WORKSPACE_SCOPED_PACKAGE_KEYS) {\n void queryClient.cancelQueries({ queryKey })\n queryClient.removeQueries({ queryKey })\n }\n}\n\n/** The conversations and tags `/open` returned seed their lists (patched in place from then on). */\nfunction seedOpenedWorkspace(\n queryClient: QueryClient,\n workspaceId: string,\n opened: WorkspaceOpenResponse\n): void {\n if (opened.conversations)\n queryClient.setQueryData(arbiQueryKeys.conversations(workspaceId), opened.conversations)\n if (opened.tags) queryClient.setQueryData(arbiQueryKeys.tags(workspaceId), opened.tags)\n}\n\n/** The server refused to open an archived workspace (423 `workspace_archived`). */\nexport function isWorkspaceArchivedError(error: unknown): boolean {\n const body = (error as { apiError?: unknown } | null | undefined)?.apiError ?? error\n const detail = (body as { detail?: unknown } | null | undefined)?.detail\n return (\n !!detail &&\n typeof detail === 'object' &&\n (detail as { code?: unknown }).code === 'workspace_archived'\n )\n}\n\n/** What to tell someone who tried to open an archived workspace. */\nexport const archivedWorkspaceMessage = (name: string) =>\n `\"${name}\" is archived. Its owner can unarchive it from the workspace list.`\n\ninterface ListedWorkspace {\n external_id: string\n name: string\n archive?: unknown\n}\n\nconst listedWorkspace = (queryClient: QueryClient, workspaceId: string) =>\n queryClient\n .getQueryData<ListedWorkspace[]>(arbiQueryKeys.workspaces())\n ?.find((w) => w.external_id === workspaceId)\n\n// One sequence for every hook instance, so a newer switch anywhere wins.\nlet switchEpoch = 0\n// The switches not yet settled (opened, refused or overtaken).\nconst switching = new Set<Promise<boolean>>()\n\n/** Exported for tests. */\nexport const resetSwitchEpochForTests = () => {\n switchEpoch = 0\n switching.clear()\n}\n\n/** How long a switch waits for the signed-in session to reach its `Arbi` (see `signedIn`). */\nconst SIGNED_IN_WAIT_MS = 10_000\nconst SIGNED_IN_POLL_MS = 50\n\n/**\n * Wait until the `Arbi` in scope holds the login. Right after a sign-in (or a reload) the session\n * is signed in before the host's `Arbi` has its keys (a host reads them from the device and then\n * renews its `Arbi`): an open asked for in that window would fail with \"Not logged in\". Resolves\n * at once when it holds them, or when the session is not signed in at all (nothing to wait for).\n */\nasync function signedIn(arbi: () => Arbi, timeoutMs = SIGNED_IN_WAIT_MS): Promise<void> {\n const deadline = Date.now() + timeoutMs\n while (\n !arbi().isLoggedIn &&\n arbi().session?.getState().signedIn === true &&\n Date.now() < deadline\n ) {\n await new Promise((resolve) => setTimeout(resolve, SIGNED_IN_POLL_MS))\n }\n}\n\n/** Resolves once no workspace switch is in flight (including any started while waiting). */\nasync function switchesSettled(): Promise<void> {\n while (switching.size > 0) await Promise.allSettled([...switching])\n}\n\nexport interface SwitchWorkspaceTarget {\n id: string\n /** For the notices; default: the name in the workspace list. */\n name?: string\n}\n\nexport interface UseSwitchWorkspaceResult {\n /**\n * Make `target` the workspace the app is in. True once it is open (at once when it already\n * is); false when it could not be (archived, offline, refused: the user was told), or when a\n * newer switch overtook it.\n */\n switchWorkspace: (target: SwitchWorkspaceTarget) => Promise<boolean>\n /** Leave the workspace for none (after deleting or leaving it), with the same clean-up. */\n clearWorkspace: () => void\n /**\n * Open the selected workspace on the server session as it is, without leaving anything or a\n * notice: after a sign-in or a reload (a new server session), or to re-assert it before a write.\n * False when there is none, it could not be opened, or a switch overtook it.\n */\n openSelectedWorkspace: () => Promise<boolean>\n /**\n * Resolves once no switch is in flight: the selection is then committed (or back to where it\n * was), so reading it says which workspace the session is in.\n */\n settled: () => Promise<void>\n}\n\n/** What a workspace switch runs on. */\nexport interface WorkspaceSwitchContext {\n /** The `Arbi` on the signed-in session, as of the switch. */\n arbi: () => Arbi\n session: ArbiSessionStore\n queryClient: QueryClient\n}\n\n/**\n * The workspace switch over a host's session, for code that runs outside `<ArbiHost>` (a host's\n * own environment, built before its host). Inside, use `useSwitchWorkspace`.\n */\nexport function createWorkspaceSwitch({\n arbi,\n session,\n queryClient,\n}: WorkspaceSwitchContext): UseSwitchWorkspaceResult {\n const switchWorkspace = (target: SwitchWorkspaceTarget): Promise<boolean> => {\n const run = runSwitch(target)\n switching.add(run)\n void run.finally(() => switching.delete(run))\n return run\n }\n\n const runSwitch = async (target: SwitchWorkspaceTarget): Promise<boolean> => {\n const { workspaceId: previousId, workspaceStatus } = session.getState()\n const isSame = previousId === target.id\n if (isSame && workspaceStatus === 'open') return true\n\n const listed = listedWorkspace(queryClient, target.id)\n const name = target.name || listed?.name || ''\n const noun = getEntityLabel('WORKSPACE')\n // An archived workspace cannot be opened: say so before leaving the current one.\n if (listed?.archive) {\n notify.info(archivedWorkspaceMessage(name))\n return false\n }\n // Offline, the user stays in the workspace they are in: another one's lists cannot load.\n if (!isSame && !onlineManager.isOnline()) {\n notify.info(\n `You're offline \u2014 you can only use the ${noun} you're already in. Reconnect to switch.`\n )\n return false\n }\n\n const epoch = ++switchEpoch\n notify.info(`Opening \"${name}\" ${noun}\u2026`, { workspaceId: target.id, duration: 2000 })\n // Signed in, but the keys not on this `Arbi` yet: the open waits for them, not fails.\n await signedIn(arbi)\n if (epoch !== switchEpoch) return false\n // Not yet open (a reload): nothing to leave, it only needs `/open`.\n if (!isSame) {\n session.leaveWorkspace()\n drainWorkspaceQueries(queryClient)\n session.setWorkspaceId(null)\n }\n session.setWorkspaceStatus('opening')\n\n performance.mark('arbi:workspace-open:start')\n let opened: WorkspaceOpenResponse\n try {\n opened = await arbi().selectWorkspace(target.id)\n } catch (error) {\n // A sign-out stopped it: the session is going, nothing to restore or report.\n if (isAbortError(error)) return false\n const superseded = error instanceof ArbiWorkspaceSupersededError\n if (!superseded) console.error('[switchWorkspace] /open failed:', error)\n // Overtaken before its turn by a newer switch: that one commits. By an open from elsewhere\n // (no newer switch): back to the previous selection, closed, as for a failure.\n if (superseded && epoch === switchEpoch) {\n if (previousId) session.setWorkspaceId(previousId)\n session.setWorkspaceStatus('closed')\n } else if (epoch === switchEpoch) {\n // Back to the previous selection, closed: `useOpenSelectedWorkspace` opens it again.\n if (previousId) session.setWorkspaceId(previousId)\n session.setWorkspaceStatus('closed')\n if (isWorkspaceArchivedError(error)) {\n // Archived since the list was read: refresh it so it shows as archived.\n notify.info(archivedWorkspaceMessage(name))\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() })\n } else {\n notify.error(`Failed to open \"${name}\" ${noun}`)\n }\n }\n return false\n }\n // A newer switch started meanwhile: it commits, not this one.\n if (epoch !== switchEpoch) return false\n\n seedOpenedWorkspace(queryClient, target.id, opened)\n performance.mark('arbi:workspace-open:response')\n session.setWorkspaceId(target.id)\n session.setWorkspaceStatus('open')\n return true\n }\n\n const clearWorkspace = () => {\n ++switchEpoch\n session.leaveWorkspace()\n drainWorkspaceQueries(queryClient)\n session.setWorkspaceId(null)\n }\n\n const openSelectedWorkspace = async (): Promise<boolean> => {\n const workspaceId = session.getState().workspaceId\n if (!workspaceId) return false\n const epoch = switchEpoch\n await signedIn(arbi)\n if (epoch !== switchEpoch || session.getState().workspaceId !== workspaceId) return false\n performance.mark('arbi:workspace-open:start')\n let opened: WorkspaceOpenResponse\n try {\n opened = await arbi().selectWorkspace(workspaceId)\n } catch (error) {\n // Overtaken by a newer open, or stopped by a sign-out: nothing to report.\n if (!(error instanceof ArbiWorkspaceSupersededError) && !isAbortError(error)) {\n console.error('[openSelectedWorkspace] /open failed:', error)\n }\n return false\n }\n // A switch started meanwhile: it commits its own workspace.\n if (epoch !== switchEpoch || session.getState().workspaceId !== workspaceId) return false\n seedOpenedWorkspace(queryClient, workspaceId, opened)\n performance.mark('arbi:workspace-open:response')\n session.setWorkspaceStatus('open')\n return true\n }\n\n return { switchWorkspace, clearWorkspace, openSelectedWorkspace, settled: switchesSettled }\n}\n\n/** The workspace switch of the `<ArbiHost>` in scope (its `Arbi`, its session state). */\nexport function useSwitchWorkspace(): UseSwitchWorkspaceResult {\n const arbi = useArbi()\n const arbiRef = useRef(arbi)\n arbiRef.current = arbi\n const session = useArbiSessionStore()\n const queryClient = useQueryClient()\n // Signing out: the switches and opens in flight are overtaken, the queries in flight cancelled.\n useEffect(\n () =>\n arbi.onSigningOut?.(() => {\n ++switchEpoch\n void queryClient.cancelQueries()\n }),\n [arbi, queryClient]\n )\n return useMemo(\n () => createWorkspaceSwitch({ arbi: () => arbiRef.current, session, queryClient }),\n [session, queryClient]\n )\n}\n\n/**\n * Keep the selected workspace open on the server session: open it once signed in (after a\n * sign-in or a reload, when the selection was kept but the server session is new), and drop it\n * when the workspace list says it was archived since (by its owner, perhaps on another device),\n * or that it is gone (deleted, or the person left or was removed): the app is then on the\n * workspace list. Mounted once, by the signed-in app.\n */\nexport function useOpenSelectedWorkspace(): void {\n const arbi = useArbi()\n const { clearWorkspace, openSelectedWorkspace } = useSwitchWorkspace()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const status = useArbiSessionState((s) => s.workspaceStatus)\n const session = useArbiSessionStore()\n const queryClient = useQueryClient()\n const { data: workspaces, isLoading: listing, isFetching } = useWorkspaces()\n const listed = workspaces as ListedWorkspace[] | undefined\n const archived = listed?.find((w) => w.external_id === workspaceId && w.archive)\n // The open workspace is gone (deleted, or the person left or was removed) once a list read after\n // it was opened no longer has it: one read before (access granted since) may not have it yet.\n // (Counted, not timed: a read can land in the same millisecond.)\n const reads = queryClient.getQueryState(arbiQueryKeys.workspaces())?.dataUpdateCount ?? 0\n const opened = useRef<{ id: string | null; reads: number }>({ id: null, reads: 0 })\n const openId = status === 'open' ? workspaceId : null\n if (opened.current.id !== openId) opened.current = { id: openId, reads }\n const gone =\n !!openId &&\n !!listed &&\n !isFetching &&\n reads > opened.current.reads &&\n !listed.some((w) => w.external_id === openId)\n\n useEffect(() => {\n if (!archived) return\n notify.info(archivedWorkspaceMessage(archived.name))\n clearWorkspace()\n }, [archived, clearWorkspace])\n\n useEffect(() => {\n if (gone) clearWorkspace()\n }, [gone, clearWorkspace])\n\n // One open at a time; a failed one is tried again when the session or selection changes.\n const opening = useRef(false)\n const signedIn = arbi.isLoggedIn\n useEffect(() => {\n // After the workspace list: it says whether the workspace was archived, and it holds the key\n // the open needs (no list of the open's own).\n if (\n !workspaceId ||\n archived ||\n gone ||\n listing ||\n status !== 'closed' ||\n !signedIn ||\n opening.current\n )\n return\n opening.current = true\n void openSelectedWorkspace()\n .then(async (ok) => {\n if (ok) return\n // Refused: deleted, or left, since (the kept selection of a reload)? The list read now\n // says. (Not the list a reload restores: it may predate a workspace created since.)\n const fresh = await queryClient\n .fetchQuery({\n queryKey: arbiQueryKeys.workspaces(),\n queryFn: () => arbi.workspaces.list(),\n staleTime: 0,\n })\n .catch(() => null)\n if (\n fresh &&\n session.getState().workspaceId === workspaceId &&\n !(fresh as ListedWorkspace[]).some((w) => w.external_id === workspaceId)\n )\n clearWorkspace()\n })\n .finally(() => {\n opening.current = false\n })\n }, [\n arbi,\n session,\n clearWorkspace,\n openSelectedWorkspace,\n queryClient,\n workspaceId,\n archived,\n gone,\n listing,\n status,\n signedIn,\n ])\n}\n"],
5
+ "mappings": "AAwBA,SAAS,WAAW,SAAS,cAAc;AAC3C,SAAS,eAAe,sBAAwC;AAChE;AAAA,EACE;AAAA,OAGK;AACP,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,eAAe,qBAAqB;AAC7C,SAAS,qBAAqB,2BAAkD;AAChF,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAM/B,MAAM,gCAAgC;AAAA,EACpC,cAAc,aAAa;AAAA,EAC3B,cAAc,oBAAoB;AAAA,EAClC,cAAc,kBAAkB;AAAA,EAChC,cAAc,mBAAmB;AAAA,EACjC,cAAc,kBAAkB;AAAA,EAChC,cAAc,UAAU;AAC1B;AAGA,SAAS,sBAAsB,aAAgC;AAC7D,aAAW,YAAY,+BAA+B;AACpD,SAAK,YAAY,cAAc,EAAE,SAAS,CAAC;AAC3C,gBAAY,cAAc,EAAE,SAAS,CAAC;AAAA,EACxC;AACF;AAGA,SAAS,oBACP,aACA,aACA,QACM;AACN,MAAI,OAAO;AACT,gBAAY,aAAa,cAAc,cAAc,WAAW,GAAG,OAAO,aAAa;AACzF,MAAI,OAAO,KAAM,aAAY,aAAa,cAAc,KAAK,WAAW,GAAG,OAAO,IAAI;AACxF;AAGO,SAAS,yBAAyB,OAAyB;AAChE,QAAM,OAAQ,OAAqD,YAAY;AAC/E,QAAM,SAAU,MAAkD;AAClE,SACE,CAAC,CAAC,UACF,OAAO,WAAW,YACjB,OAA8B,SAAS;AAE5C;AAGO,MAAM,2BAA2B,CAAC,SACvC,IAAI,IAAI;AAQV,MAAM,kBAAkB,CAAC,aAA0B,gBACjD,YACG,aAAgC,cAAc,WAAW,CAAC,GACzD,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAG/C,IAAI,cAAc;AAElB,MAAM,YAAY,oBAAI,IAAsB;AAGrC,MAAM,2BAA2B,MAAM;AAC5C,gBAAc;AACd,YAAU,MAAM;AAClB;AAGA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAQ1B,eAAe,SAAS,MAAkB,YAAY,mBAAkC;AACtF,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SACE,CAAC,KAAK,EAAE,cACR,KAAK,EAAE,SAAS,SAAS,EAAE,aAAa,QACxC,KAAK,IAAI,IAAI,UACb;AACA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,iBAAiB,CAAC;AAAA,EACvE;AACF;AAGA,eAAe,kBAAiC;AAC9C,SAAO,UAAU,OAAO,EAAG,OAAM,QAAQ,WAAW,CAAC,GAAG,SAAS,CAAC;AACpE;AA0CO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,QAAM,kBAAkB,CAAC,WAAoD;AAC3E,UAAM,MAAM,UAAU,MAAM;AAC5B,cAAU,IAAI,GAAG;AACjB,SAAK,IAAI,QAAQ,MAAM,UAAU,OAAO,GAAG,CAAC;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,WAAoD;AAC3E,UAAM,EAAE,aAAa,YAAY,gBAAgB,IAAI,QAAQ,SAAS;AACtE,UAAM,SAAS,eAAe,OAAO;AACrC,QAAI,UAAU,oBAAoB,OAAQ,QAAO;AAEjD,UAAM,SAAS,gBAAgB,aAAa,OAAO,EAAE;AACrD,UAAM,OAAO,OAAO,QAAQ,QAAQ,QAAQ;AAC5C,UAAM,OAAO,eAAe,WAAW;AAEvC,QAAI,QAAQ,SAAS;AACnB,aAAO,KAAK,yBAAyB,IAAI,CAAC;AAC1C,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,UAAU,CAAC,cAAc,SAAS,GAAG;AACxC,aAAO;AAAA,QACL,8CAAyC,IAAI;AAAA,MAC/C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,EAAE;AAChB,WAAO,KAAK,YAAY,IAAI,KAAK,IAAI,UAAK,EAAE,aAAa,OAAO,IAAI,UAAU,IAAK,CAAC;AAEpF,UAAM,SAAS,IAAI;AACnB,QAAI,UAAU,YAAa,QAAO;AAElC,QAAI,CAAC,QAAQ;AACX,cAAQ,eAAe;AACvB,4BAAsB,WAAW;AACjC,cAAQ,eAAe,IAAI;AAAA,IAC7B;AACA,YAAQ,mBAAmB,SAAS;AAEpC,gBAAY,KAAK,2BAA2B;AAC5C,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,KAAK,EAAE,gBAAgB,OAAO,EAAE;AAAA,IACjD,SAAS,OAAO;AAEd,UAAI,aAAa,KAAK,EAAG,QAAO;AAChC,YAAM,aAAa,iBAAiB;AACpC,UAAI,CAAC,WAAY,SAAQ,MAAM,mCAAmC,KAAK;AAGvE,UAAI,cAAc,UAAU,aAAa;AACvC,YAAI,WAAY,SAAQ,eAAe,UAAU;AACjD,gBAAQ,mBAAmB,QAAQ;AAAA,MACrC,WAAW,UAAU,aAAa;AAEhC,YAAI,WAAY,SAAQ,eAAe,UAAU;AACjD,gBAAQ,mBAAmB,QAAQ;AACnC,YAAI,yBAAyB,KAAK,GAAG;AAEnC,iBAAO,KAAK,yBAAyB,IAAI,CAAC;AAC1C,eAAK,YAAY,kBAAkB,EAAE,UAAU,cAAc,WAAW,EAAE,CAAC;AAAA,QAC7E,OAAO;AACL,iBAAO,MAAM,mBAAmB,IAAI,KAAK,IAAI,EAAE;AAAA,QACjD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,YAAa,QAAO;AAElC,wBAAoB,aAAa,OAAO,IAAI,MAAM;AAClD,gBAAY,KAAK,8BAA8B;AAC/C,YAAQ,eAAe,OAAO,EAAE;AAChC,YAAQ,mBAAmB,MAAM;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,MAAM;AAC3B,MAAE;AACF,YAAQ,eAAe;AACvB,0BAAsB,WAAW;AACjC,YAAQ,eAAe,IAAI;AAAA,EAC7B;AAEA,QAAM,wBAAwB,YAA8B;AAC1D,UAAM,cAAc,QAAQ,SAAS,EAAE;AACvC,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,QAAQ;AACd,UAAM,SAAS,IAAI;AACnB,QAAI,UAAU,eAAe,QAAQ,SAAS,EAAE,gBAAgB,YAAa,QAAO;AACpF,gBAAY,KAAK,2BAA2B;AAC5C,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,KAAK,EAAE,gBAAgB,WAAW;AAAA,IACnD,SAAS,OAAO;AAEd,UAAI,EAAE,iBAAiB,iCAAiC,CAAC,aAAa,KAAK,GAAG;AAC5E,gBAAQ,MAAM,yCAAyC,KAAK;AAAA,MAC9D;AACA,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,eAAe,QAAQ,SAAS,EAAE,gBAAgB,YAAa,QAAO;AACpF,wBAAoB,aAAa,aAAa,MAAM;AACpD,gBAAY,KAAK,8BAA8B;AAC/C,YAAQ,mBAAmB,MAAM;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,iBAAiB,gBAAgB,uBAAuB,SAAS,gBAAgB;AAC5F;AAGO,SAAS,qBAA+C;AAC7D,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,UAAU,oBAAoB;AACpC,QAAM,cAAc,eAAe;AAEnC;AAAA,IACE,MACE,KAAK,eAAe,MAAM;AACxB,QAAE;AACF,WAAK,YAAY,cAAc;AAAA,IACjC,CAAC;AAAA,IACH,CAAC,MAAM,WAAW;AAAA,EACpB;AACA,SAAO;AAAA,IACL,MAAM,sBAAsB,EAAE,MAAM,MAAM,QAAQ,SAAS,SAAS,YAAY,CAAC;AAAA,IACjF,CAAC,SAAS,WAAW;AAAA,EACvB;AACF;AASO,SAAS,2BAAiC;AAC/C,QAAM,OAAO,QAAQ;AACrB,QAAM,EAAE,gBAAgB,sBAAsB,IAAI,mBAAmB;AACrE,QAAM,cAAc,oBAAoB,CAAC,MAAM,EAAE,WAAW;AAC5D,QAAM,SAAS,oBAAoB,CAAC,MAAM,EAAE,eAAe;AAC3D,QAAM,UAAU,oBAAoB;AACpC,QAAM,cAAc,eAAe;AACnC,QAAM,EAAE,MAAM,YAAY,WAAW,SAAS,WAAW,IAAI,cAAc;AAC3E,QAAM,SAAS;AACf,QAAM,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,eAAe,EAAE,OAAO;AAI/E,QAAM,QAAQ,YAAY,cAAc,cAAc,WAAW,CAAC,GAAG,mBAAmB;AACxF,QAAM,SAAS,OAA6C,EAAE,IAAI,MAAM,OAAO,EAAE,CAAC;AAClF,QAAM,SAAS,WAAW,SAAS,cAAc;AACjD,MAAI,OAAO,QAAQ,OAAO,OAAQ,QAAO,UAAU,EAAE,IAAI,QAAQ,MAAM;AACvE,QAAM,OACJ,CAAC,CAAC,UACF,CAAC,CAAC,UACF,CAAC,cACD,QAAQ,OAAO,QAAQ,SACvB,CAAC,OAAO,KAAK,CAAC,MAAM,EAAE,gBAAgB,MAAM;AAE9C,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,WAAO,KAAK,yBAAyB,SAAS,IAAI,CAAC;AACnD,mBAAe;AAAA,EACjB,GAAG,CAAC,UAAU,cAAc,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,KAAM,gBAAe;AAAA,EAC3B,GAAG,CAAC,MAAM,cAAc,CAAC;AAGzB,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAMA,YAAW,KAAK;AACtB,YAAU,MAAM;AAGd,QACE,CAAC,eACD,YACA,QACA,WACA,WAAW,YACX,CAACA,aACD,QAAQ;AAER;AACF,YAAQ,UAAU;AAClB,SAAK,sBAAsB,EACxB,KAAK,OAAO,OAAO;AAClB,UAAI,GAAI;AAGR,YAAM,QAAQ,MAAM,YACjB,WAAW;AAAA,QACV,UAAU,cAAc,WAAW;AAAA,QACnC,SAAS,MAAM,KAAK,WAAW,KAAK;AAAA,QACpC,WAAW;AAAA,MACb,CAAC,EACA,MAAM,MAAM,IAAI;AACnB,UACE,SACA,QAAQ,SAAS,EAAE,gBAAgB,eACnC,CAAE,MAA4B,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAEvE,uBAAe;AAAA,IACnB,CAAC,EACA,QAAQ,MAAM;AACb,cAAQ,UAAU;AAAA,IACpB,CAAC;AAAA,EACL,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAA;AAAA,EACF,CAAC;AACH;",
6
+ "names": ["signedIn"]
7
+ }
@@ -0,0 +1,170 @@
1
+ import { useCallback, useState } from "react";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { useArbi } from "../useArbi.js";
4
+ import { arbiQueryKeys } from "../hooks.js";
5
+ import { notify } from "../notifications/notify-store.js";
6
+ import { downloadBlob } from "../document-tools/environment.js";
7
+ import { fetchDocumentFile } from "../document-tools/document-pdf.js";
8
+ import { fetchMarkupPdf } from "../document-tools/markup-download.js";
9
+ import { archiveName, buildDocumentMetadataRows } from "../documents/document-download.js";
10
+ import { buildWorkspaceArchive } from "./export-archive.js";
11
+ const TRANSFER_POLL_MS = 1500;
12
+ function isTransferResumable(status) {
13
+ if (status.status === "interrupted" || status.status === "cancelled" || status.status === "failed")
14
+ return true;
15
+ return status.status === "completed" && Number(status.counts?.failed ?? 0) > 0;
16
+ }
17
+ function isTransferFinished(status) {
18
+ return !!status && status.status !== "running" && status.status !== "queued";
19
+ }
20
+ function openWorkspaceId(arbi) {
21
+ return arbi.hasWorkspace ? arbi.getWorkspaceId() : "";
22
+ }
23
+ function usePlanWorkspaceTransfer(scope, mode, options = {}) {
24
+ const arbi = useArbi();
25
+ const workspaceId = openWorkspaceId(arbi);
26
+ return useQuery({
27
+ queryKey: arbiQueryKeys.workspaceTransferPlan(workspaceId, JSON.stringify(scope), mode),
28
+ // The plan is of the workspace open on the server: kept only if it stayed `workspaceId`.
29
+ queryFn: () => arbi.readInWorkspace(
30
+ workspaceId,
31
+ () => arbi.workspaces.transfer.plan(scope, mode)
32
+ ),
33
+ enabled: !!workspaceId && (options.enabled ?? true),
34
+ staleTime: 1e4,
35
+ // The previous plan stays while the next loads, never another workspace's.
36
+ // ['arbi', 'workspaceTransfers', 'plan', workspaceId, scope, mode]
37
+ placeholderData: (previous, previousQuery) => previousQuery?.queryKey[3] === workspaceId ? previous : void 0
38
+ });
39
+ }
40
+ function useStartWorkspaceTransfer() {
41
+ const arbi = useArbi();
42
+ return useMutation({
43
+ mutationFn: (params) => arbi.workspaces.transfer.start(params)
44
+ });
45
+ }
46
+ function useResumeWorkspaceTransfer() {
47
+ const arbi = useArbi();
48
+ return useMutation({
49
+ mutationFn: ({
50
+ transferId,
51
+ targetWorkspaceId
52
+ }) => arbi.workspaces.transfer.resume(transferId, targetWorkspaceId)
53
+ });
54
+ }
55
+ function useCancelWorkspaceTransfer() {
56
+ const arbi = useArbi();
57
+ return useMutation({
58
+ mutationFn: (transferId) => arbi.workspaces.transfer.cancel(transferId)
59
+ });
60
+ }
61
+ function useWorkspaceTransfer(transferId) {
62
+ const arbi = useArbi();
63
+ return useQuery({
64
+ queryKey: arbiQueryKeys.workspaceTransfer(transferId ?? ""),
65
+ queryFn: () => arbi.workspaces.transfer.get(transferId ?? ""),
66
+ enabled: !!transferId && arbi.isLoggedIn,
67
+ staleTime: 0,
68
+ refetchInterval: (query) => isTransferFinished(query.state.data) ? false : TRANSFER_POLL_MS
69
+ });
70
+ }
71
+ function useWorkspaceTransfers(options = {}) {
72
+ const arbi = useArbi();
73
+ const workspaceId = openWorkspaceId(arbi);
74
+ return useQuery({
75
+ queryKey: arbiQueryKeys.workspaceTransfers(workspaceId),
76
+ queryFn: () => arbi.readInWorkspace(
77
+ workspaceId,
78
+ () => arbi.workspaces.transfer.list()
79
+ ),
80
+ enabled: !!workspaceId && (options.enabled ?? true)
81
+ });
82
+ }
83
+ function useInvalidateAfterTransfer() {
84
+ const queryClient = useQueryClient();
85
+ return useCallback(
86
+ (mode) => {
87
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() });
88
+ void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allWorkspaceTransfers() });
89
+ if (mode !== "move") return;
90
+ for (const queryKey of [
91
+ arbiQueryKeys.workflows(),
92
+ arbiQueryKeys.allFacts(),
93
+ arbiQueryKeys.allTags(),
94
+ arbiQueryKeys.allDocuments(),
95
+ arbiQueryKeys.allConversations()
96
+ ])
97
+ void queryClient.invalidateQueries({ queryKey });
98
+ },
99
+ [queryClient]
100
+ );
101
+ }
102
+ function useWorkspaceExportDownload({
103
+ workspaceName,
104
+ workspaceId
105
+ } = {}) {
106
+ const arbi = useArbi();
107
+ const [progress, setProgress] = useState(null);
108
+ const download = useCallback(
109
+ async ({ scope, documents = [], csvColumns }) => {
110
+ setProgress({ done: 0, total: 0 });
111
+ try {
112
+ const data = await arbi.workspaces.transfer.exportData(
113
+ scope,
114
+ workspaceId ? { workspaceId } : void 0
115
+ );
116
+ let metadataCsv = null;
117
+ if (csvColumns === void 0 || csvColumns.length > 0) {
118
+ const exported = new Set(
119
+ (data.files ?? []).filter((f) => !f.markup).map((f) => f.doc_ext_id)
120
+ );
121
+ const rows = documents.filter((d) => exported.has(d.external_id));
122
+ if (rows.length > 0) {
123
+ const Papa = (await import("papaparse")).default;
124
+ metadataCsv = Papa.unparse(buildDocumentMetadataRows(rows, csvColumns));
125
+ }
126
+ }
127
+ const client = arbi.getClient().fetch;
128
+ const archive = await buildWorkspaceArchive({
129
+ exportData: data,
130
+ fetchFile: async (docExtId, version, kind) => kind === "markup" ? (await fetchMarkupPdf(client, docExtId, version, workspaceId)).blob : fetchDocumentFile(client, docExtId, { version, workspaceExtId: workspaceId }),
131
+ metadataCsv,
132
+ onProgress: (done, total) => setProgress({ done, total })
133
+ });
134
+ const fileName = archiveName(workspaceName, "export");
135
+ downloadBlob(archive.blob, fileName);
136
+ const files = `${archive.fileCount} file${archive.fileCount !== 1 ? "s" : ""}`;
137
+ if (archive.failed.length === 0) {
138
+ notify.success(`Successfully downloaded ${files} and data in ${fileName}`);
139
+ } else {
140
+ notify.warning(
141
+ `Downloaded ${files} in ${fileName}; ${archive.failed.length} could not be fetched (listed in manifest.json)`
142
+ );
143
+ }
144
+ return true;
145
+ } catch (error) {
146
+ console.error("Workspace export failed:", error);
147
+ notify.error("Failed to download. Please try again.");
148
+ return false;
149
+ } finally {
150
+ setProgress(null);
151
+ }
152
+ },
153
+ [arbi, workspaceName, workspaceId]
154
+ );
155
+ return { download, isDownloading: progress !== null, progress };
156
+ }
157
+ export {
158
+ TRANSFER_POLL_MS,
159
+ isTransferFinished,
160
+ isTransferResumable,
161
+ useCancelWorkspaceTransfer,
162
+ useInvalidateAfterTransfer,
163
+ usePlanWorkspaceTransfer,
164
+ useResumeWorkspaceTransfer,
165
+ useStartWorkspaceTransfer,
166
+ useWorkspaceExportDownload,
167
+ useWorkspaceTransfer,
168
+ useWorkspaceTransfers
169
+ };
170
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/workspaces/transfer.ts"],
4
+ "sourcesContent": ["/**\n * Download, copy or move a scope of the open workspace (`/v1/workspace/transfer*`,\n * `/v1/workspace/export`). One scope shape (`TransferScope`) feeds them all: the preview\n * (`usePlanWorkspaceTransfer`), the background copy or move (`useStartWorkspaceTransfer`, followed\n * with `useWorkspaceTransfer`) and the download (`useWorkspaceExportDownload`). The target\n * workspace's key is sealed by the SDK (`arbi.workspaces.transfer`).\n */\n\nimport { useCallback, useState } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { components } from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../hooks'\nimport { notify } from '../notifications/notify-store'\nimport { downloadBlob } from '../document-tools/environment'\nimport { fetchDocumentFile } from '../document-tools/document-pdf'\nimport { fetchMarkupPdf } from '../document-tools/markup-download'\nimport { archiveName, buildDocumentMetadataRows } from '../documents/document-download'\nimport type { WorkspaceDocument } from '../documents/documents-cache'\nimport { buildWorkspaceArchive } from './export-archive'\n\nexport type TransferScope = components['schemas']['TransferScope']\nexport type TransferKind = components['schemas']['TransferKind']\nexport type TransferMode = components['schemas']['TransferMode']\nexport type TransferPlan = components['schemas']['TransferPlanResponse']\nexport type TransferStatus = components['schemas']['TransferStatusResponse']\nexport type TransferConflictPolicy = components['schemas']['ConflictPolicy']\nexport type WorkspaceExport = components['schemas']['WorkspaceExportResponse']\n\n/** Polling cadence while a job runs; it goes idle once the job has finished. */\nexport const TRANSFER_POLL_MS = 1500\n\n/** A job no worker runs any more (interrupted, cancelled, failed, or done with failures). */\nexport function isTransferResumable(status: TransferStatus): boolean {\n if (\n status.status === 'interrupted' ||\n status.status === 'cancelled' ||\n status.status === 'failed'\n )\n return true\n return status.status === 'completed' && Number(status.counts?.failed ?? 0) > 0\n}\n\n/** The job has stopped (it is neither queued nor running). */\nexport function isTransferFinished(status: TransferStatus | null | undefined): boolean {\n return !!status && status.status !== 'running' && status.status !== 'queued'\n}\n\nfunction openWorkspaceId(arbi: ReturnType<typeof useArbi>): string {\n return arbi.hasWorkspace ? arbi.getWorkspaceId() : ''\n}\n\n/** What a scope would take in the open workspace; re-read when the scope or the mode changes. */\nexport function usePlanWorkspaceTransfer(\n scope: TransferScope,\n mode: TransferMode,\n options: { enabled?: boolean } = {}\n) {\n const arbi = useArbi()\n const workspaceId = openWorkspaceId(arbi)\n return useQuery({\n queryKey: arbiQueryKeys.workspaceTransferPlan(workspaceId, JSON.stringify(scope), mode),\n // The plan is of the workspace open on the server: kept only if it stayed `workspaceId`.\n queryFn: () =>\n arbi.readInWorkspace(\n workspaceId,\n () => arbi.workspaces.transfer.plan(scope, mode) as Promise<TransferPlan>\n ),\n enabled: !!workspaceId && (options.enabled ?? true),\n staleTime: 10_000,\n // The previous plan stays while the next loads, never another workspace's.\n // ['arbi', 'workspaceTransfers', 'plan', workspaceId, scope, mode]\n placeholderData: (previous, previousQuery) =>\n previousQuery?.queryKey[3] === workspaceId ? previous : undefined,\n })\n}\n\n/** Start copying or moving into another workspace (a background job). */\nexport function useStartWorkspaceTransfer() {\n const arbi = useArbi()\n return useMutation({\n mutationFn: (params: {\n scope: TransferScope\n mode: TransferMode\n targetWorkspaceId: string\n onConflict?: TransferConflictPolicy\n }) => arbi.workspaces.transfer.start(params) as Promise<TransferStatus>,\n })\n}\n\n/** Resume a stopped job (nothing is copied twice). */\nexport function useResumeWorkspaceTransfer() {\n const arbi = useArbi()\n return useMutation({\n mutationFn: ({\n transferId,\n targetWorkspaceId,\n }: {\n transferId: string\n targetWorkspaceId: string\n }) => arbi.workspaces.transfer.resume(transferId, targetWorkspaceId) as Promise<TransferStatus>,\n })\n}\n\nexport function useCancelWorkspaceTransfer() {\n const arbi = useArbi()\n return useMutation({\n mutationFn: (transferId: string) => arbi.workspaces.transfer.cancel(transferId),\n })\n}\n\n/** One job's progress, polled while it runs. */\nexport function useWorkspaceTransfer(transferId: string | null) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.workspaceTransfer(transferId ?? ''),\n queryFn: () => arbi.workspaces.transfer.get(transferId ?? '') as Promise<TransferStatus>,\n enabled: !!transferId && arbi.isLoggedIn,\n staleTime: 0,\n refetchInterval: (query) =>\n isTransferFinished(query.state.data as TransferStatus | undefined) ? false : TRANSFER_POLL_MS,\n })\n}\n\n/** The caller's recent jobs out of the open workspace (to offer a resume). */\nexport function useWorkspaceTransfers(options: { enabled?: boolean } = {}) {\n const arbi = useArbi()\n const workspaceId = openWorkspaceId(arbi)\n return useQuery({\n queryKey: arbiQueryKeys.workspaceTransfers(workspaceId),\n queryFn: () =>\n arbi.readInWorkspace(\n workspaceId,\n () => arbi.workspaces.transfer.list() as Promise<TransferStatus[]>\n ),\n enabled: !!workspaceId && (options.enabled ?? true),\n })\n}\n\n/** What to refresh once a job has finished: the workspaces' counts always, this one's lists after a move. */\nexport function useInvalidateAfterTransfer() {\n const queryClient = useQueryClient()\n return useCallback(\n (mode: TransferMode) => {\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() })\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allWorkspaceTransfers() })\n if (mode !== 'move') return\n for (const queryKey of [\n arbiQueryKeys.workflows(),\n arbiQueryKeys.allFacts(),\n arbiQueryKeys.allTags(),\n arbiQueryKeys.allDocuments(),\n arbiQueryKeys.allConversations(),\n ])\n void queryClient.invalidateQueries({ queryKey })\n },\n [queryClient]\n )\n}\n\nexport interface ExportDownloadRequest {\n scope: TransferScope\n /** Documents known to the page, for `index.csv` (only those in the export are listed). */\n documents?: WorkspaceDocument[]\n /** CSV columns: undefined = all standard columns, [] = no index.csv. */\n csvColumns?: string[]\n}\n\n/**\n * Download a scope of the open workspace as files: its documents (every version, and each\n * version's markup PDF), one JSON file per entity type and a manifest (`buildWorkspaceArchive`).\n */\nexport function useWorkspaceExportDownload({\n workspaceName,\n workspaceId,\n}: { workspaceName?: string; workspaceId?: string } = {}) {\n const arbi = useArbi()\n const [progress, setProgress] = useState<{ done: number; total: number } | null>(null)\n\n const download = useCallback(\n async ({ scope, documents = [], csvColumns }: ExportDownloadRequest) => {\n setProgress({ done: 0, total: 0 })\n try {\n const data = (await arbi.workspaces.transfer.exportData(\n scope,\n workspaceId ? { workspaceId } : undefined\n )) as WorkspaceExport\n let metadataCsv: string | null = null\n if (csvColumns === undefined || csvColumns.length > 0) {\n const exported = new Set(\n (data.files ?? []).filter((f) => !f.markup).map((f) => f.doc_ext_id)\n )\n const rows = documents.filter((d) => exported.has(d.external_id))\n if (rows.length > 0) {\n const Papa = (await import('papaparse')).default\n metadataCsv = Papa.unparse(buildDocumentMetadataRows(rows, csvColumns))\n }\n }\n const client = arbi.getClient().fetch\n const archive = await buildWorkspaceArchive({\n exportData: data,\n fetchFile: async (docExtId, version, kind) =>\n kind === 'markup'\n ? (await fetchMarkupPdf(client, docExtId, version, workspaceId)).blob\n : fetchDocumentFile(client, docExtId, { version, workspaceExtId: workspaceId }),\n metadataCsv,\n onProgress: (done, total) => setProgress({ done, total }),\n })\n const fileName = archiveName(workspaceName, 'export')\n downloadBlob(archive.blob, fileName)\n const files = `${archive.fileCount} file${archive.fileCount !== 1 ? 's' : ''}`\n if (archive.failed.length === 0) {\n notify.success(`Successfully downloaded ${files} and data in ${fileName}`)\n } else {\n notify.warning(\n `Downloaded ${files} in ${fileName}; ${archive.failed.length} could not be fetched (listed in manifest.json)`\n )\n }\n return true\n } catch (error) {\n console.error('Workspace export failed:', error)\n notify.error('Failed to download. Please try again.')\n return false\n } finally {\n setProgress(null)\n }\n },\n [arbi, workspaceName, workspaceId]\n )\n\n return { download, isDownloading: progress !== null, progress }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,86 @@
1
+ import { useCallback, useMemo, useRef, useState } from "react";
2
+ import {
3
+ pickRecentWorkspaces,
4
+ resolveActiveWorkspace,
5
+ toShellWorkspace
6
+ } from "./shell-workspaces.js";
7
+ function useShellWorkspaces(options) {
8
+ const {
9
+ workspaces,
10
+ isLoading = false,
11
+ loadError,
12
+ selectedId,
13
+ seed,
14
+ decorate,
15
+ recentLimit,
16
+ lastOpened,
17
+ formatLastSeen
18
+ } = options;
19
+ const live = useMemo(
20
+ () => (workspaces ?? []).map((source) => {
21
+ const item = toShellWorkspace(source);
22
+ return decorate ? { ...item, ...decorate(item, source) } : item;
23
+ }),
24
+ [workspaces, decorate]
25
+ );
26
+ const isLive = live.length > 0;
27
+ const isSeed = !isLive && !isLoading && !!seed;
28
+ const items = useMemo(
29
+ () => isLive ? live : isSeed ? [...seed.workspaces] : [],
30
+ [isLive, live, isSeed, seed]
31
+ );
32
+ const active = useMemo(
33
+ () => resolveActiveWorkspace(items, selectedId, { isSeed, seedActiveId: seed?.activeId }),
34
+ [items, selectedId, isSeed, seed?.activeId]
35
+ );
36
+ const recent = useMemo(
37
+ () => pickRecentWorkspaces(items, active?.id, { limit: recentLimit, lastOpened, formatLastSeen }),
38
+ [items, active?.id, recentLimit, lastOpened, formatLastSeen]
39
+ );
40
+ const [openingId, setOpeningId] = useState(null);
41
+ const [openError, setOpenError] = useState(void 0);
42
+ const callbacks = useRef({
43
+ select: options.select,
44
+ onOpened: options.onOpened,
45
+ onOpenError: options.onOpenError
46
+ });
47
+ callbacks.current = {
48
+ select: options.select,
49
+ onOpened: options.onOpened,
50
+ onOpenError: options.onOpenError
51
+ };
52
+ const itemsRef = useRef(items);
53
+ itemsRef.current = items;
54
+ const open = useCallback(async (target) => {
55
+ const id = typeof target === "string" ? target : target.id;
56
+ const workspace = itemsRef.current.find((w) => w.id === id);
57
+ if (!workspace) return false;
58
+ setOpenError(void 0);
59
+ setOpeningId(id);
60
+ try {
61
+ await callbacks.current.select(workspace);
62
+ } catch (err) {
63
+ setOpenError(err);
64
+ setOpeningId(null);
65
+ callbacks.current.onOpenError?.(err, workspace);
66
+ return false;
67
+ }
68
+ setOpeningId(null);
69
+ callbacks.current.onOpened?.(workspace);
70
+ return true;
71
+ }, []);
72
+ return {
73
+ items,
74
+ active,
75
+ recent,
76
+ isLive,
77
+ isLoading,
78
+ error: openError ?? loadError ?? null,
79
+ openingId,
80
+ open
81
+ };
82
+ }
83
+ export {
84
+ useShellWorkspaces
85
+ };
86
+ //# sourceMappingURL=useShellWorkspaces.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/workspaces/useShellWorkspaces.ts"],
4
+ "sourcesContent": ["/**\n * `useShellWorkspaces`: the user's workspaces as the shell's switcher and the workspaces gallery\n * show them, the one the app is in, and `open(workspace)`.\n *\n * Source-agnostic on purpose: the host hands in the list and the selection mechanism it already\n * has (ARBI-frontend its React Query hook and workspace store, a connected app `useWorkspaces`\n * plus the connection's `setWorkspace`).\n */\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport {\n pickRecentWorkspaces,\n resolveActiveWorkspace,\n toShellWorkspace,\n type ShellRecentWorkspaceItem,\n type ShellWorkspaceItem,\n type ShellWorkspaceSource,\n} from './shell-workspaces'\n\n/** Workspaces to show while the account has none (a demo); the host owns the data. */\nexport interface ShellWorkspaceSeed {\n workspaces: readonly ShellWorkspaceItem[]\n /** The seed workspace that counts as the current one when nothing is selected. */\n activeId?: string\n}\n\nexport interface UseShellWorkspacesOptions<S extends ShellWorkspaceSource = ShellWorkspaceSource> {\n /** The account's workspaces (SDK shape). `undefined` while loading. */\n workspaces: readonly S[] | undefined\n isLoading?: boolean\n /** The list query's error, passed through as `error`. */\n loadError?: unknown\n /** The workspace the host says the app is in (the connection's selection). */\n selectedId?: string | null\n /**\n * Make the workspace the app's current one: open it on the server and record the selection.\n * Throw (reject) to report failure. Called for EVERY open, including the current workspace, so\n * a click on the current card still re-opens it and then navigates.\n */\n select: (workspace: ShellWorkspaceItem) => Promise<unknown> | unknown\n /** After a successful select: navigate, toast, close a menu. The \"switch, then navigate\" hook. */\n onOpened?: (workspace: ShellWorkspaceItem) => void\n /** When select rejects. The active workspace is unchanged. Without it the error is in `error`. */\n onOpenError?: (error: unknown, workspace: ShellWorkspaceItem) => void\n /** Demo list for an account that has no workspaces (never while loading). */\n seed?: ShellWorkspaceSeed\n /** Host decoration per workspace, e.g. a rendered project pill. Merged over the adapter. */\n decorate?: (item: ShellWorkspaceItem, source: S) => Partial<ShellWorkspaceItem>\n /** How many recent workspaces the switcher offers. Default 4. */\n recentLimit?: number\n /** `workspace id -> epoch ms` last opened here; orders `recent`, falling back to `updatedAt`. */\n lastOpened?: Readonly<Record<string, number>>\n /** Format a recency timestamp into `recent[].lastSeen`. */\n formatLastSeen?: (timestamp: number) => string\n}\n\nexport interface UseShellWorkspacesResult {\n /** All workspaces: the account's, or the seed when it has none. */\n items: ShellWorkspaceItem[]\n /** The single current workspace; undefined only when there are no workspaces at all. */\n active: ShellWorkspaceItem | undefined\n /** The other workspaces, most recently opened first, for the quick-switch menu. */\n recent: ShellRecentWorkspaceItem[]\n /** The account's own workspaces: false while `items` is the seed. */\n isLive: boolean\n isLoading: boolean\n /** The list query's error or the last failed open; cleared by the next open. */\n error: unknown\n /** Id of the workspace being opened, else null (for a spinner on its card). */\n openingId: string | null\n /** Select the workspace (always, even the current one), then `onOpened`. False if select threw. */\n open: (workspace: Pick<ShellWorkspaceItem, 'id'> | string) => Promise<boolean>\n}\n\nexport function useShellWorkspaces<S extends ShellWorkspaceSource = ShellWorkspaceSource>(\n options: UseShellWorkspacesOptions<S>\n): UseShellWorkspacesResult {\n const {\n workspaces,\n isLoading = false,\n loadError,\n selectedId,\n seed,\n decorate,\n recentLimit,\n lastOpened,\n formatLastSeen,\n } = options\n\n const live = useMemo(\n () =>\n (workspaces ?? []).map((source) => {\n const item = toShellWorkspace(source)\n return decorate ? { ...item, ...decorate(item, source) } : item\n }),\n [workspaces, decorate]\n )\n const isLive = live.length > 0\n const isSeed = !isLive && !isLoading && !!seed\n const items = useMemo(\n () => (isLive ? live : isSeed ? [...seed.workspaces] : []),\n [isLive, live, isSeed, seed]\n )\n const active = useMemo(\n () => resolveActiveWorkspace(items, selectedId, { isSeed, seedActiveId: seed?.activeId }),\n [items, selectedId, isSeed, seed?.activeId]\n )\n const recent = useMemo(\n () =>\n pickRecentWorkspaces(items, active?.id, { limit: recentLimit, lastOpened, formatLastSeen }),\n [items, active?.id, recentLimit, lastOpened, formatLastSeen]\n )\n\n const [openingId, setOpeningId] = useState<string | null>(null)\n const [openError, setOpenError] = useState<unknown>(undefined)\n // Latest callbacks without re-creating `open` on every render.\n const callbacks = useRef({\n select: options.select,\n onOpened: options.onOpened,\n onOpenError: options.onOpenError,\n })\n callbacks.current = {\n select: options.select,\n onOpened: options.onOpened,\n onOpenError: options.onOpenError,\n }\n const itemsRef = useRef(items)\n itemsRef.current = items\n\n const open = useCallback(async (target: Pick<ShellWorkspaceItem, 'id'> | string) => {\n const id = typeof target === 'string' ? target : target.id\n const workspace = itemsRef.current.find((w) => w.id === id)\n if (!workspace) return false\n setOpenError(undefined)\n setOpeningId(id)\n try {\n await callbacks.current.select(workspace)\n } catch (err) {\n setOpenError(err)\n setOpeningId(null)\n callbacks.current.onOpenError?.(err, workspace)\n return false\n }\n setOpeningId(null)\n callbacks.current.onOpened?.(workspace)\n return true\n }, [])\n\n return {\n items,\n active,\n recent,\n isLive,\n isLoading,\n error: openError ?? loadError ?? null,\n openingId,\n open,\n }\n}\n"],
5
+ "mappings": "AASA,SAAS,aAAa,SAAS,QAAQ,gBAAgB;AACvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAyDA,SAAS,mBACd,SAC0B;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,OAAO;AAAA,IACX,OACG,cAAc,CAAC,GAAG,IAAI,CAAC,WAAW;AACjC,YAAM,OAAO,iBAAiB,MAAM;AACpC,aAAO,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,MAAM,MAAM,EAAE,IAAI;AAAA,IAC7D,CAAC;AAAA,IACH,CAAC,YAAY,QAAQ;AAAA,EACvB;AACA,QAAM,SAAS,KAAK,SAAS;AAC7B,QAAM,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC1C,QAAM,QAAQ;AAAA,IACZ,MAAO,SAAS,OAAO,SAAS,CAAC,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,IACxD,CAAC,QAAQ,MAAM,QAAQ,IAAI;AAAA,EAC7B;AACA,QAAM,SAAS;AAAA,IACb,MAAM,uBAAuB,OAAO,YAAY,EAAE,QAAQ,cAAc,MAAM,SAAS,CAAC;AAAA,IACxF,CAAC,OAAO,YAAY,QAAQ,MAAM,QAAQ;AAAA,EAC5C;AACA,QAAM,SAAS;AAAA,IACb,MACE,qBAAqB,OAAO,QAAQ,IAAI,EAAE,OAAO,aAAa,YAAY,eAAe,CAAC;AAAA,IAC5F,CAAC,OAAO,QAAQ,IAAI,aAAa,YAAY,cAAc;AAAA,EAC7D;AAEA,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,MAAS;AAE7D,QAAM,YAAY,OAAO;AAAA,IACvB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,EACvB,CAAC;AACD,YAAU,UAAU;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,EACvB;AACA,QAAM,WAAW,OAAO,KAAK;AAC7B,WAAS,UAAU;AAEnB,QAAM,OAAO,YAAY,OAAO,WAAoD;AAClF,UAAM,KAAK,OAAO,WAAW,WAAW,SAAS,OAAO;AACxD,UAAM,YAAY,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1D,QAAI,CAAC,UAAW,QAAO;AACvB,iBAAa,MAAS;AACtB,iBAAa,EAAE;AACf,QAAI;AACF,YAAM,UAAU,QAAQ,OAAO,SAAS;AAAA,IAC1C,SAAS,KAAK;AACZ,mBAAa,GAAG;AAChB,mBAAa,IAAI;AACjB,gBAAU,QAAQ,cAAc,KAAK,SAAS;AAC9C,aAAO;AAAA,IACT;AACA,iBAAa,IAAI;AACjB,cAAU,QAAQ,WAAW,SAAS;AACtC,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,aAAa,aAAa;AAAA,IACjC;AAAA,IACA;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }