@arbidocs/react 0.5.110 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
- package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.cjs +13 -13
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.cjs +48 -48
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
- package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
- package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
- package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
- package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
- package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
- package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
- package/dist/chunk-PWGSIM3F.cjs +291 -0
- package/dist/chunk-PWGSIM3F.cjs.map +1 -0
- package/dist/chunk-QP3WQSAA.cjs +23 -0
- package/dist/chunk-QP3WQSAA.cjs.map +1 -0
- package/dist/chunk-T5FZICXN.cjs +50 -0
- package/dist/chunk-T5FZICXN.cjs.map +1 -0
- package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
- package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
- package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +99 -99
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +101 -101
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +1689 -1619
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +702 -17060
- package/dist/index.js.map +7 -1
- package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
- package/dist/lazy-chunk.js +46 -0
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
- package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +167 -154
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +290 -9
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.cjs +17 -0
- package/dist/viewers/PdfViewer.cjs.map +1 -0
- package/dist/viewers/PdfViewer.d.ts +9 -0
- package/dist/viewers/PdfViewer.js +20 -0
- package/dist/viewers/PdfViewer.js.map +7 -0
- package/dist/viewers/PdfViewerImpl.js +384 -0
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.cjs +79 -653
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +3 -1
- package/dist/viewers/index.js +60 -903
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +12 -4
- package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-6H3O63TQ.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-CPQ3CU4B.js +0 -246
- package/dist/chunk-CPQ3CU4B.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DQALOQPI.js +0 -2766
- package/dist/chunk-DQALOQPI.js.map +0 -1
- package/dist/chunk-FZJMA32S.js +0 -1011
- package/dist/chunk-FZJMA32S.js.map +0 -1
- package/dist/chunk-H5M7FXLB.js +0 -2057
- package/dist/chunk-H5M7FXLB.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-P6WLV5UY.js +0 -644
- package/dist/chunk-P6WLV5UY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-BMhTH98a.d.cts +0 -2035
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15893
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -25
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/index.d.cts +0 -260
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
const DB_VERSION = 1;
|
|
2
|
+
const RECORDS = "records";
|
|
3
|
+
const META = "meta";
|
|
4
|
+
function promisify(request) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
request.onsuccess = () => resolve(request.result);
|
|
7
|
+
request.onerror = () => reject(request.error);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
function createRecordStore(dbName) {
|
|
11
|
+
let dbPromise = null;
|
|
12
|
+
function openDB() {
|
|
13
|
+
if (dbPromise) return dbPromise;
|
|
14
|
+
let request;
|
|
15
|
+
try {
|
|
16
|
+
request = indexedDB.open(dbName, DB_VERSION);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
return Promise.reject(error);
|
|
19
|
+
}
|
|
20
|
+
dbPromise = new Promise((resolve, reject) => {
|
|
21
|
+
request.onerror = () => {
|
|
22
|
+
dbPromise = null;
|
|
23
|
+
reject(request.error);
|
|
24
|
+
};
|
|
25
|
+
request.onsuccess = () => {
|
|
26
|
+
const db = request.result;
|
|
27
|
+
db.onversionchange = () => {
|
|
28
|
+
db.close();
|
|
29
|
+
dbPromise = null;
|
|
30
|
+
};
|
|
31
|
+
resolve(db);
|
|
32
|
+
};
|
|
33
|
+
request.onupgradeneeded = () => {
|
|
34
|
+
const db = request.result;
|
|
35
|
+
if (!db.objectStoreNames.contains(RECORDS)) {
|
|
36
|
+
const records = db.createObjectStore(RECORDS, { keyPath: "key" });
|
|
37
|
+
records.createIndex("bucket", "bucket");
|
|
38
|
+
records.createIndex("kind", "kind");
|
|
39
|
+
}
|
|
40
|
+
if (!db.objectStoreNames.contains(META)) db.createObjectStore(META, { keyPath: "key" });
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
return dbPromise;
|
|
44
|
+
}
|
|
45
|
+
async function run(store, mode, fn) {
|
|
46
|
+
const db = await openDB();
|
|
47
|
+
return promisify(fn(db.transaction(store, mode).objectStore(store)));
|
|
48
|
+
}
|
|
49
|
+
async function scan(pick) {
|
|
50
|
+
const db = await openDB();
|
|
51
|
+
const store = db.transaction(RECORDS, "readonly").objectStore(RECORDS);
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
const out = [];
|
|
54
|
+
const cursor = store.openCursor();
|
|
55
|
+
cursor.onerror = () => reject(cursor.error);
|
|
56
|
+
cursor.onsuccess = () => {
|
|
57
|
+
const c = cursor.result;
|
|
58
|
+
if (!c) return resolve(out);
|
|
59
|
+
out.push(pick(c.value));
|
|
60
|
+
c.continue();
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const self = {
|
|
65
|
+
dbName,
|
|
66
|
+
async putRecord(record) {
|
|
67
|
+
await run(RECORDS, "readwrite", (s) => s.put(record));
|
|
68
|
+
},
|
|
69
|
+
async getRecord(key) {
|
|
70
|
+
return await run(RECORDS, "readonly", (s) => s.get(key));
|
|
71
|
+
},
|
|
72
|
+
async hasRecord(key) {
|
|
73
|
+
return await run(RECORDS, "readonly", (s) => s.count(key)) > 0;
|
|
74
|
+
},
|
|
75
|
+
async deleteRecords(keys) {
|
|
76
|
+
if (keys.length === 0) return;
|
|
77
|
+
const db = await openDB();
|
|
78
|
+
const tx = db.transaction(RECORDS, "readwrite");
|
|
79
|
+
const store = tx.objectStore(RECORDS);
|
|
80
|
+
for (const key of keys) store.delete(key);
|
|
81
|
+
await new Promise((resolve, reject) => {
|
|
82
|
+
tx.oncomplete = () => resolve();
|
|
83
|
+
tx.onerror = () => reject(tx.error);
|
|
84
|
+
tx.onabort = () => reject(tx.error);
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
async recordsInBucket(bucket) {
|
|
88
|
+
return await run(
|
|
89
|
+
RECORDS,
|
|
90
|
+
"readonly",
|
|
91
|
+
(s) => s.index("bucket").getAll(bucket)
|
|
92
|
+
);
|
|
93
|
+
},
|
|
94
|
+
async recordsOfKind(kind) {
|
|
95
|
+
return await run(
|
|
96
|
+
RECORDS,
|
|
97
|
+
"readonly",
|
|
98
|
+
(s) => s.index("kind").getAll(kind)
|
|
99
|
+
);
|
|
100
|
+
},
|
|
101
|
+
allRecordSizes() {
|
|
102
|
+
return scan(({ key, kind, size }) => ({ key, kind, size }));
|
|
103
|
+
},
|
|
104
|
+
allRecordAccess() {
|
|
105
|
+
return scan(({ key, kind, lastAccess }) => ({ key, kind, lastAccess }));
|
|
106
|
+
},
|
|
107
|
+
async touchRecord(key) {
|
|
108
|
+
const record = await self.getRecord(key);
|
|
109
|
+
if (record) await self.putRecord({ ...record, lastAccess: Date.now() });
|
|
110
|
+
},
|
|
111
|
+
async getMeta(key) {
|
|
112
|
+
const row = await run(META, "readonly", (s) => s.get(key));
|
|
113
|
+
return row?.value;
|
|
114
|
+
},
|
|
115
|
+
async setMeta(key, value) {
|
|
116
|
+
await run(META, "readwrite", (s) => s.put({ key, value }));
|
|
117
|
+
},
|
|
118
|
+
async deleteDatabase() {
|
|
119
|
+
const db = await dbPromise?.catch(() => null);
|
|
120
|
+
db?.close();
|
|
121
|
+
dbPromise = null;
|
|
122
|
+
await new Promise((resolve, reject) => {
|
|
123
|
+
const request = indexedDB.deleteDatabase(dbName);
|
|
124
|
+
request.onsuccess = () => resolve();
|
|
125
|
+
request.onerror = () => reject(request.error);
|
|
126
|
+
request.onblocked = () => {
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
return self;
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
createRecordStore
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/offline-store/store.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * A generic encrypted-at-rest IndexedDB store: one object store of sealed records plus a small\n * plaintext `meta` store. A record's plaintext fields are only what IndexedDB needs to find and\n * evict it (a blind key, its kind, a blind bucket, a sort time, its size, last access); the content\n * is in `data`, sealed by the caller (see ./crypto). The store itself is crypto-agnostic.\n *\n * Used by the offline mailbox (`arbi-offline-mail`) and the offline calendar (`arbi-offline-calendar`).\n */\n\nconst DB_VERSION = 1\nconst RECORDS = 'records'\nconst META = 'meta'\n\nexport interface StoredRecord<K extends string = string> {\n /** Blind key (see crypto.blind). */\n key: string\n kind: K\n /** Blind group key. */\n bucket: string\n sortAt: number\n /** Ciphertext bytes, for the storage quota. */\n size: number\n /** Last read (ms), for least-recently-used eviction. */\n lastAccess: number\n /** Sealed contents. */\n data: Uint8Array\n}\n\nexport interface RecordStore<K extends string> {\n readonly dbName: string\n putRecord(record: StoredRecord<K>): Promise<void>\n getRecord(key: string): Promise<StoredRecord<K> | undefined>\n hasRecord(key: string): Promise<boolean>\n deleteRecords(keys: string[]): Promise<void>\n recordsInBucket(bucket: string): Promise<StoredRecord<K>[]>\n recordsOfKind(kind: K): Promise<StoredRecord<K>[]>\n allRecordSizes(): Promise<Array<Pick<StoredRecord<K>, 'key' | 'kind' | 'size'>>>\n /** Keys, kinds and last access (no data), for LRU eviction. */\n allRecordAccess(): Promise<Array<Pick<StoredRecord<K>, 'key' | 'kind' | 'lastAccess'>>>\n touchRecord(key: string): Promise<void>\n getMeta<T>(key: string): Promise<T | undefined>\n setMeta(key: string, value: unknown): Promise<void>\n /** Delete the whole database. */\n deleteDatabase(): Promise<void>\n}\n\nfunction promisify<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n}\n\nexport function createRecordStore<K extends string>(dbName: string): RecordStore<K> {\n let dbPromise: Promise<IDBDatabase> | null = null\n\n function openDB(): Promise<IDBDatabase> {\n if (dbPromise) return dbPromise\n let request: IDBOpenDBRequest\n try {\n request = indexedDB.open(dbName, DB_VERSION)\n } catch (error) {\n // No indexedDB here, or opening it threw (e.g. blocked storage): nothing is kept, so the\n // next call tries again.\n return Promise.reject(error)\n }\n dbPromise = new Promise((resolve, reject) => {\n request.onerror = () => {\n dbPromise = null\n reject(request.error)\n }\n request.onsuccess = () => {\n const db = request.result\n // Another tab deleting the database (sign-out) must not be blocked by this handle.\n db.onversionchange = () => {\n db.close()\n dbPromise = null\n }\n resolve(db)\n }\n request.onupgradeneeded = () => {\n const db = request.result\n if (!db.objectStoreNames.contains(RECORDS)) {\n const records = db.createObjectStore(RECORDS, { keyPath: 'key' })\n records.createIndex('bucket', 'bucket')\n records.createIndex('kind', 'kind')\n }\n if (!db.objectStoreNames.contains(META)) db.createObjectStore(META, { keyPath: 'key' })\n }\n })\n return dbPromise\n }\n\n async function run<T>(\n store: string,\n mode: IDBTransactionMode,\n fn: (s: IDBObjectStore) => IDBRequest<T>\n ): Promise<T> {\n const db = await openDB()\n return promisify(fn(db.transaction(store, mode).objectStore(store)))\n }\n\n async function scan<T>(pick: (r: StoredRecord<K>) => T): Promise<T[]> {\n const db = await openDB()\n const store = db.transaction(RECORDS, 'readonly').objectStore(RECORDS)\n return new Promise((resolve, reject) => {\n const out: T[] = []\n const cursor = store.openCursor()\n cursor.onerror = () => reject(cursor.error)\n cursor.onsuccess = () => {\n const c = cursor.result\n if (!c) return resolve(out)\n out.push(pick(c.value as StoredRecord<K>))\n c.continue()\n }\n })\n }\n\n const self: RecordStore<K> = {\n dbName,\n async putRecord(record) {\n await run(RECORDS, 'readwrite', (s) => s.put(record))\n },\n async getRecord(key) {\n return (await run(RECORDS, 'readonly', (s) => s.get(key))) as StoredRecord<K> | undefined\n },\n async hasRecord(key) {\n return (await run(RECORDS, 'readonly', (s) => s.count(key))) > 0\n },\n async deleteRecords(keys) {\n if (keys.length === 0) return\n const db = await openDB()\n const tx = db.transaction(RECORDS, 'readwrite')\n const store = tx.objectStore(RECORDS)\n for (const key of keys) store.delete(key)\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n tx.onabort = () => reject(tx.error)\n })\n },\n async recordsInBucket(bucket) {\n return (await run(RECORDS, 'readonly', (s) =>\n s.index('bucket').getAll(bucket)\n )) as StoredRecord<K>[]\n },\n async recordsOfKind(kind) {\n return (await run(RECORDS, 'readonly', (s) =>\n s.index('kind').getAll(kind)\n )) as StoredRecord<K>[]\n },\n allRecordSizes() {\n return scan(({ key, kind, size }) => ({ key, kind, size }))\n },\n allRecordAccess() {\n return scan(({ key, kind, lastAccess }) => ({ key, kind, lastAccess }))\n },\n async touchRecord(key) {\n const record = await self.getRecord(key)\n if (record) await self.putRecord({ ...record, lastAccess: Date.now() })\n },\n async getMeta<T>(key: string) {\n const row = (await run(META, 'readonly', (s) => s.get(key))) as { value: T } | undefined\n return row?.value\n },\n async setMeta(key, value) {\n await run(META, 'readwrite', (s) => s.put({ key, value }))\n },\n async deleteDatabase() {\n const db = await dbPromise?.catch(() => null)\n db?.close()\n dbPromise = null\n await new Promise<void>((resolve, reject) => {\n const request = indexedDB.deleteDatabase(dbName)\n request.onsuccess = () => resolve()\n request.onerror = () => reject(request.error)\n // Another tab still holds it open: it closes on versionchange, then this completes.\n request.onblocked = () => {}\n })\n },\n }\n return self\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/offline-store/wipe.ts"],
|
|
4
|
+
"sourcesContent": ["import type { OfflineSealer } from '@arbidocs/client'\nimport type { RecordStore } from './store'\n\n/** Forget a store's keys and delete its database. */\nexport async function wipeStore(sealer: OfflineSealer, store: RecordStore<string>): Promise<void> {\n sealer.forget()\n await store.deleteDatabase()\n}\n"],
|
|
5
|
+
"mappings": "AAIA,eAAsB,UAAU,QAAuB,OAA2C;AAChG,SAAO,OAAO;AACd,QAAM,MAAM,eAAe;AAC7B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/offline.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { partialMatchKey } from "@tanstack/react-query";
|
|
2
|
+
import { replayableTagMutations } from "./tags.js";
|
|
3
|
+
import { replayableDocumentMutations } from "./documents/documents-writes.js";
|
|
4
|
+
import { FINISHED_DOCUMENT_STATUSES } from "./documents/documents-data.js";
|
|
5
|
+
import { QUEUED_WRITE_RETRY } from "./queued-writes.js";
|
|
6
|
+
const REPLAYABLE = [
|
|
7
|
+
...replayableTagMutations,
|
|
8
|
+
...replayableDocumentMutations
|
|
9
|
+
];
|
|
10
|
+
function isReplayableArbiMutation(mutationKey) {
|
|
11
|
+
return !!mutationKey && REPLAYABLE.some((m) => partialMatchKey(mutationKey, m.mutationKey));
|
|
12
|
+
}
|
|
13
|
+
function registerArbiMutationDefaults(queryClient, client) {
|
|
14
|
+
for (const m of REPLAYABLE) {
|
|
15
|
+
queryClient.setMutationDefaults(m.mutationKey, {
|
|
16
|
+
// Each write is sent in the workspace it was made in (kept in its variables), never in the
|
|
17
|
+
// one open when it is replayed; one whose workspace can't be opened is tried again, then
|
|
18
|
+
// kept as not sent.
|
|
19
|
+
mutationFn: (variables) => m.run(client(), variables),
|
|
20
|
+
onSuccess: (data, variables) => m.settle(queryClient, data, variables),
|
|
21
|
+
...QUEUED_WRITE_RETRY
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const DOCUMENT_FAMILIES = [
|
|
26
|
+
"documents",
|
|
27
|
+
"document",
|
|
28
|
+
"documentsById",
|
|
29
|
+
"documentVersions",
|
|
30
|
+
"similarDocuments"
|
|
31
|
+
];
|
|
32
|
+
const OFFLINE_READABLE = [
|
|
33
|
+
...DOCUMENT_FAMILIES,
|
|
34
|
+
"workspaces",
|
|
35
|
+
"userSettings",
|
|
36
|
+
"projects",
|
|
37
|
+
"entitlements"
|
|
38
|
+
];
|
|
39
|
+
function isOfflineReadableArbiQuery(queryKey) {
|
|
40
|
+
return queryKey[0] === "arbi" && OFFLINE_READABLE.includes(queryKey[1]);
|
|
41
|
+
}
|
|
42
|
+
function isRestorableArbiQueryOnline(queryKey, data) {
|
|
43
|
+
if (queryKey[0] !== "arbi") return true;
|
|
44
|
+
if (queryKey[1] === "documents" || queryKey[1] === "entitlements") return false;
|
|
45
|
+
if (!DOCUMENT_FAMILIES.includes(queryKey[1])) return true;
|
|
46
|
+
const docs = Array.isArray(data) ? data : [data];
|
|
47
|
+
return !docs.some((doc) => {
|
|
48
|
+
const status = doc?.status;
|
|
49
|
+
return !!status && !FINISHED_DOCUMENT_STATUSES.has(status);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
isOfflineReadableArbiQuery,
|
|
54
|
+
isReplayableArbiMutation,
|
|
55
|
+
isRestorableArbiQueryOnline,
|
|
56
|
+
registerArbiMutationDefaults
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=offline.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/offline.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Offline writes that survive a reload \u2014 opt in. A mutation made while offline pauses and is sent on\n * reconnect; a host that also persists its query cache (`@tanstack/react-query-persist-client`)\n * keeps the paused write across a reload, but the restored mutation has lost its function. Call\n * {@link registerArbiMutationDefaults} once on the query client, before the persisted cache is\n * restored and `resumePausedMutations()` runs: it gives each replayable package write its request\n * back (on a bare client: the hook's `Arbi` may not exist yet) and what its success does to the\n * cache. {@link isReplayableArbiMutation} says which writes those are, for a host's\n * `shouldDehydrateMutation` and its pending-changes list.\n *\n * Replayable: creating a tag (`useCreateTag`), editing documents' fields (`useUpdateDocuments`),\n * and applying, removing or re-noting a tag on documents (`useAssignDocTags`, `useRemoveDocTags`,\n * `useUpdateDocTag`). Each keeps the workspace it was made in and is replayed there\n * (`queued-writes.ts`), whichever workspace is open after the reload.\n */\n\nimport type { MutationKey, QueryClient, QueryKey } from '@tanstack/react-query'\nimport { partialMatchKey } from '@tanstack/react-query'\nimport type { ArbiClient } from '@arbidocs/client'\nimport { replayableTagMutations } from './tags'\nimport { replayableDocumentMutations } from './documents/documents-writes'\nimport { FINISHED_DOCUMENT_STATUSES } from './documents/documents-data'\nimport { QUEUED_WRITE_RETRY } from './queued-writes'\n\ninterface ReplayableMutation {\n mutationKey: MutationKey\n // Each entry types its own variables and result; the registry only passes them through.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n run: (client: ArbiClient, variables: any) => Promise<unknown>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n settle: (qc: QueryClient, data: any, variables: any) => unknown\n}\n\nconst REPLAYABLE: readonly ReplayableMutation[] = [\n ...replayableTagMutations,\n ...replayableDocumentMutations,\n]\n\n/** Whether a mutation is a package write that can be queued offline and replayed after a reload. */\nexport function isReplayableArbiMutation(mutationKey: MutationKey | undefined): boolean {\n return !!mutationKey && REPLAYABLE.some((m) => partialMatchKey(mutationKey, m.mutationKey))\n}\n\n/**\n * Re-supply the replayable package writes on `queryClient` (see the module comment). `client` is\n * the host's API client, read when a restored write is sent.\n */\nexport function registerArbiMutationDefaults(\n queryClient: QueryClient,\n client: () => ArbiClient\n): void {\n for (const m of REPLAYABLE) {\n queryClient.setMutationDefaults(m.mutationKey, {\n // Each write is sent in the workspace it was made in (kept in its variables), never in the\n // one open when it is replayed; one whose workspace can't be opened is tried again, then\n // kept as not sent.\n mutationFn: (variables: unknown) => m.run(client(), variables),\n onSuccess: (data: unknown, variables: unknown) => m.settle(queryClient, data, variables),\n ...QUEUED_WRITE_RETRY,\n })\n }\n}\n\n/** The package query families holding document metadata (never content). */\nconst DOCUMENT_FAMILIES = [\n 'documents',\n 'document',\n 'documentsById',\n 'documentVersions',\n 'similarDocuments',\n]\n\n/**\n * The package query families a host may persist for an offline start. The entitlements too: the\n * paid pages (Mail, Calendar) open only once they are known, so without them a reopened tab offline\n * showed an empty page instead of the mailbox and Outbox kept on this device.\n */\nconst OFFLINE_READABLE = [\n ...DOCUMENT_FAMILIES,\n 'workspaces',\n 'userSettings',\n 'projects',\n 'entitlements',\n]\n\n/**\n * Whether a package query is worth persisting for an offline start (a host's\n * `shouldDehydrateQuery`): the documents lists, documents, their versions and near-duplicate\n * pairs (metadata, never a document's content), the workspace list (its keys stay wrapped), the\n * user settings, the projects and the entitlements.\n */\nexport function isOfflineReadableArbiQuery(queryKey: QueryKey): boolean {\n return queryKey[0] === 'arbi' && OFFLINE_READABLE.includes(queryKey[1] as string)\n}\n\n/**\n * Whether a persisted package query may be restored when the app starts online. Not a documents\n * list (it is never re-read on its own, so a stale copy would be trusted all session: it loads\n * fresh instead), nor a document saved while still processing (its saved freshness would keep it\n * \"processing\" with no re-read), nor the entitlements (kept for an offline start only: online they\n * are read fresh, so a plan bought since shows at once). The other families (the workspace list,\n * the settings) always. Offline, everything persisted is restored.\n */\nexport function isRestorableArbiQueryOnline(queryKey: QueryKey, data: unknown): boolean {\n if (queryKey[0] !== 'arbi') return true\n if (queryKey[1] === 'documents' || queryKey[1] === 'entitlements') return false\n if (!DOCUMENT_FAMILIES.includes(queryKey[1] as string)) return true\n const docs = Array.isArray(data) ? data : [data]\n return !docs.some((doc) => {\n const status = (doc as { status?: string | null } | null)?.status\n return !!status && !FINISHED_DOCUMENT_STATUSES.has(status)\n })\n}\n"],
|
|
5
|
+
"mappings": "AAiBA,SAAS,uBAAuB;AAEhC,SAAS,8BAA8B;AACvC,SAAS,mCAAmC;AAC5C,SAAS,kCAAkC;AAC3C,SAAS,0BAA0B;AAWnC,MAAM,aAA4C;AAAA,EAChD,GAAG;AAAA,EACH,GAAG;AACL;AAGO,SAAS,yBAAyB,aAA+C;AACtF,SAAO,CAAC,CAAC,eAAe,WAAW,KAAK,CAAC,MAAM,gBAAgB,aAAa,EAAE,WAAW,CAAC;AAC5F;AAMO,SAAS,6BACd,aACA,QACM;AACN,aAAW,KAAK,YAAY;AAC1B,gBAAY,oBAAoB,EAAE,aAAa;AAAA;AAAA;AAAA;AAAA,MAI7C,YAAY,CAAC,cAAuB,EAAE,IAAI,OAAO,GAAG,SAAS;AAAA,MAC7D,WAAW,CAAC,MAAe,cAAuB,EAAE,OAAO,aAAa,MAAM,SAAS;AAAA,MACvF,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;AAGA,MAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOA,MAAM,mBAAmB;AAAA,EACvB,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,SAAS,2BAA2B,UAA6B;AACtE,SAAO,SAAS,CAAC,MAAM,UAAU,iBAAiB,SAAS,SAAS,CAAC,CAAW;AAClF;AAUO,SAAS,4BAA4B,UAAoB,MAAwB;AACtF,MAAI,SAAS,CAAC,MAAM,OAAQ,QAAO;AACnC,MAAI,SAAS,CAAC,MAAM,eAAe,SAAS,CAAC,MAAM,eAAgB,QAAO;AAC1E,MAAI,CAAC,kBAAkB,SAAS,SAAS,CAAC,CAAW,EAAG,QAAO;AAC/D,QAAM,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAC/C,SAAO,CAAC,KAAK,KAAK,CAAC,QAAQ;AACzB,UAAM,SAAU,KAA2C;AAC3D,WAAO,CAAC,CAAC,UAAU,CAAC,2BAA2B,IAAI,MAAM;AAAA,EAC3D,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/people.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useAgents, useWorkspaces } from "./hooks.js";
|
|
3
|
+
import { useContacts, useSearchContacts } from "./contacts.js";
|
|
4
|
+
import { useArbi } from "./useArbi.js";
|
|
5
|
+
import { getUserDisplayName, isAgent } from "./users/user-display.js";
|
|
6
|
+
function peopleDirectory(people, meId) {
|
|
7
|
+
const ids = /* @__PURE__ */ new Map();
|
|
8
|
+
const emails = /* @__PURE__ */ new Map();
|
|
9
|
+
for (const p of people) {
|
|
10
|
+
if (p.user && p.user.external_id !== meId && !ids.has(p.user.external_id))
|
|
11
|
+
ids.set(p.user.external_id, p.user);
|
|
12
|
+
const key = p.email.toLowerCase();
|
|
13
|
+
if (key && !emails.has(key)) emails.set(key, p);
|
|
14
|
+
}
|
|
15
|
+
const users = [...ids.values()].sort(
|
|
16
|
+
(a, b) => getUserDisplayName(a).localeCompare(getUserDisplayName(b))
|
|
17
|
+
);
|
|
18
|
+
return {
|
|
19
|
+
users,
|
|
20
|
+
byId: (id) => id ? ids.get(id) : void 0,
|
|
21
|
+
byEmail: (email) => email ? emails.get(email.toLowerCase()) : void 0
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function personOfUser(user, contactId = null) {
|
|
25
|
+
return {
|
|
26
|
+
email: user.email,
|
|
27
|
+
name: getUserDisplayName(user) || user.email,
|
|
28
|
+
user,
|
|
29
|
+
contactId,
|
|
30
|
+
addressBookId: null
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function cardName(contact) {
|
|
34
|
+
return contact.card?.name?.trim() || [contact.card?.given_name, contact.card?.family_name].filter(Boolean).join(" ");
|
|
35
|
+
}
|
|
36
|
+
function userFromName(externalId, email, name) {
|
|
37
|
+
const [given = "", ...rest] = (name || email).trim().split(/\s+/);
|
|
38
|
+
return { external_id: externalId, email, given_name: given, family_name: rest.join(" ") };
|
|
39
|
+
}
|
|
40
|
+
function usePeople() {
|
|
41
|
+
const arbi = useArbi();
|
|
42
|
+
const meId = arbi.isLoggedIn ? arbi.user.identity()?.externalId : void 0;
|
|
43
|
+
const { data: contacts = [] } = useContacts();
|
|
44
|
+
const { data: workspaces = [] } = useWorkspaces();
|
|
45
|
+
const { data: agents = [] } = useAgents();
|
|
46
|
+
return useMemo(() => {
|
|
47
|
+
const people = [];
|
|
48
|
+
const contactOf = /* @__PURE__ */ new Map();
|
|
49
|
+
for (const c of contacts) {
|
|
50
|
+
if (c.status === "failed" || c.user && isAgent(c.user)) continue;
|
|
51
|
+
if (c.user) contactOf.set(c.user.external_id, c);
|
|
52
|
+
const addresses = [
|
|
53
|
+
c.email ?? c.user?.email,
|
|
54
|
+
...(c.card?.emails ?? []).map((e) => e.email)
|
|
55
|
+
].filter((e) => !!e);
|
|
56
|
+
const user = c.status === "registered" ? c.user ?? null : null;
|
|
57
|
+
for (const email of new Set(addresses))
|
|
58
|
+
people.push({
|
|
59
|
+
email,
|
|
60
|
+
name: cardName(c) || (user ? getUserDisplayName(user) : "") || email,
|
|
61
|
+
user,
|
|
62
|
+
contactId: c.external_id ?? null,
|
|
63
|
+
addressBookId: c.address_book_ext_id ?? null
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const addUser = (user) => {
|
|
67
|
+
const contact = contactOf.get(user.external_id);
|
|
68
|
+
people.push({
|
|
69
|
+
email: user.email,
|
|
70
|
+
name: getUserDisplayName(user) || user.email,
|
|
71
|
+
user,
|
|
72
|
+
contactId: contact?.external_id ?? null,
|
|
73
|
+
addressBookId: contact?.address_book_ext_id ?? null
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
for (const ws of workspaces) for (const wu of ws.users ?? []) addUser(wu.user);
|
|
77
|
+
for (const agent of agents) addUser(agent);
|
|
78
|
+
return peopleDirectory(people, meId);
|
|
79
|
+
}, [contacts, workspaces, agents, meId]);
|
|
80
|
+
}
|
|
81
|
+
function usePeopleSearch(query, { agents = false } = {}) {
|
|
82
|
+
const arbi = useArbi();
|
|
83
|
+
const meId = arbi.isLoggedIn ? arbi.user.identity()?.externalId : void 0;
|
|
84
|
+
const directory = usePeople();
|
|
85
|
+
const search = useSearchContacts(query);
|
|
86
|
+
const term = query.trim().toLowerCase();
|
|
87
|
+
const hits = search.data;
|
|
88
|
+
const people = useMemo(() => {
|
|
89
|
+
if (!term) return [];
|
|
90
|
+
const out = [];
|
|
91
|
+
const seen = /* @__PURE__ */ new Set();
|
|
92
|
+
for (const hit of hits ?? []) {
|
|
93
|
+
if (hit.user_id === meId || seen.has(hit.email.toLowerCase())) continue;
|
|
94
|
+
seen.add(hit.email.toLowerCase());
|
|
95
|
+
const user = hit.user_id ? directory.byId(hit.user_id) ?? userFromName(hit.user_id, hit.email, hit.name) : null;
|
|
96
|
+
if (user && isAgent(user)) continue;
|
|
97
|
+
out.push({
|
|
98
|
+
email: hit.email,
|
|
99
|
+
name: hit.name || (user ? getUserDisplayName(user) : "") || hit.email,
|
|
100
|
+
user,
|
|
101
|
+
contactId: hit.contact_id ?? null,
|
|
102
|
+
addressBookId: hit.address_book_ext_id ?? null
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (agents)
|
|
106
|
+
for (const user of directory.users) {
|
|
107
|
+
if (!isAgent(user) || seen.has(user.email.toLowerCase())) continue;
|
|
108
|
+
const name = getUserDisplayName(user);
|
|
109
|
+
if (!`${name} ${user.email}`.toLowerCase().includes(term)) continue;
|
|
110
|
+
out.push({ email: user.email, name, user, contactId: null, addressBookId: null });
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}, [term, hits, directory, agents, meId]);
|
|
114
|
+
return { people, isFetching: search.isFetching };
|
|
115
|
+
}
|
|
116
|
+
export {
|
|
117
|
+
peopleDirectory,
|
|
118
|
+
personOfUser,
|
|
119
|
+
usePeople,
|
|
120
|
+
usePeopleSearch
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=people.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/people.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * People \u2014 the one place an app learns who someone is.\n *\n * Pickers and autocomplete ask {@link usePeopleSearch}: GET /v1/contacts/search (every address book you can see\n * plus registered people who share a workspace with you, one entry per address), and your own agents where an\n * agent is a valid target. Resolving an id or address seen elsewhere (a DM tab, a tag's creator, a mail\n * recipient) asks {@link usePeople}: the same population, held as a directory \u2014 your contacts, your workspace\n * co-members and your agents. Nothing is learned from notifications.\n */\n\nimport { useMemo } from 'react'\nimport type { components } from '@arbidocs/client'\nimport type { contacts as contactsOps } from '@arbidocs/sdk/browser'\nimport { useAgents, useWorkspaces } from './hooks'\nimport { useContacts, useSearchContacts } from './contacts'\nimport { useArbi } from './useArbi'\nimport { getUserDisplayName, isAgent } from './users/user-display'\n\n/** An ARBI account (or agent) as the API returns it. */\nexport type UserResponse = components['schemas']['UserResponse']\ntype Contact = contactsOps.Contact\n\n// \u2500\u2500 The directory (pure) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface Person {\n email: string\n /** Display name: the card's name, else the account's, else the address. */\n name: string\n /** The ARBI account (or agent), when the person has one. Null: a contact who is not on ARBI. */\n user: UserResponse | null\n /** `cnt-\u2026` when the person is one of the contacts you can see. */\n contactId: string | null\n /** `cal-\u2026` of the address book that contact is in. */\n addressBookId: string | null\n}\n\nexport interface PeopleDirectory {\n /** Registered people and agents, sorted by name (never you). */\n users: UserResponse[]\n byId: (externalId: string | null | undefined) => UserResponse | undefined\n byEmail: (email: string | null | undefined) => Person | undefined\n}\n\n/** Index people by account id and by every address they have. Pure, so tests can build one. */\nexport function peopleDirectory(people: Person[], meId?: string | null): PeopleDirectory {\n const ids = new Map<string, UserResponse>()\n const emails = new Map<string, Person>()\n for (const p of people) {\n if (p.user && p.user.external_id !== meId && !ids.has(p.user.external_id))\n ids.set(p.user.external_id, p.user)\n const key = p.email.toLowerCase()\n if (key && !emails.has(key)) emails.set(key, p)\n }\n const users = [...ids.values()].sort((a, b) =>\n getUserDisplayName(a).localeCompare(getUserDisplayName(b))\n )\n return {\n users,\n byId: (id) => (id ? ids.get(id) : undefined),\n byEmail: (email) => (email ? emails.get(email.toLowerCase()) : undefined),\n }\n}\n\n/** A registered person (or agent) as a {@link Person}. */\nexport function personOfUser(user: UserResponse, contactId: string | null = null): Person {\n return {\n email: user.email,\n name: getUserDisplayName(user) || user.email,\n user,\n contactId,\n addressBookId: null,\n }\n}\n\n// \u2500\u2500 The hooks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction cardName(contact: Contact): string {\n return (\n contact.card?.name?.trim() ||\n [contact.card?.given_name, contact.card?.family_name].filter(Boolean).join(' ')\n )\n}\n\n/** A stand-in account for a search hit whose full record the directory does not hold. */\nfunction userFromName(externalId: string, email: string, name: string | null | undefined) {\n const [given = '', ...rest] = (name || email).trim().split(/\\s+/)\n return { external_id: externalId, email, given_name: given, family_name: rest.join(' ') }\n}\n\n/** Everyone you know, for resolving an id or an address to a person. */\nexport function usePeople(): PeopleDirectory {\n const arbi = useArbi()\n const meId = arbi.isLoggedIn ? arbi.user.identity()?.externalId : undefined\n const { data: contacts = [] } = useContacts()\n const { data: workspaces = [] } = useWorkspaces()\n const { data: agents = [] } = useAgents()\n\n return useMemo(() => {\n const people: Person[] = []\n const contactOf = new Map<string, Contact>()\n for (const c of contacts) {\n if (c.status === 'failed' || (c.user && isAgent(c.user))) continue\n if (c.user) contactOf.set(c.user.external_id, c)\n const addresses = [\n c.email ?? c.user?.email,\n ...(c.card?.emails ?? []).map((e) => e.email),\n ].filter((e): e is string => !!e)\n const user = c.status === 'registered' ? (c.user ?? null) : null\n for (const email of new Set(addresses))\n people.push({\n email,\n name: cardName(c) || (user ? getUserDisplayName(user) : '') || email,\n user,\n contactId: c.external_id ?? null,\n addressBookId: c.address_book_ext_id ?? null,\n })\n }\n const addUser = (user: UserResponse) => {\n const contact = contactOf.get(user.external_id)\n people.push({\n email: user.email,\n name: getUserDisplayName(user) || user.email,\n user,\n contactId: contact?.external_id ?? null,\n addressBookId: contact?.address_book_ext_id ?? null,\n })\n }\n for (const ws of workspaces) for (const wu of ws.users ?? []) addUser(wu.user as UserResponse)\n for (const agent of agents) addUser(agent as UserResponse)\n return peopleDirectory(people, meId)\n }, [contacts, workspaces, agents, meId])\n}\n\n/**\n * People matching `query` (debounced; an empty query matches nobody), for a picker or an autocomplete.\n * `agents`: also your own agents whose name or address matches \u2014 only where an agent is a valid target.\n */\nexport function usePeopleSearch(\n query: string,\n { agents = false }: { agents?: boolean } = {}\n): { people: Person[]; isFetching: boolean } {\n const arbi = useArbi()\n const meId = arbi.isLoggedIn ? arbi.user.identity()?.externalId : undefined\n const directory = usePeople()\n const search = useSearchContacts(query)\n const term = query.trim().toLowerCase()\n const hits = search.data\n\n const people = useMemo(() => {\n if (!term) return []\n const out: Person[] = []\n const seen = new Set<string>()\n for (const hit of hits ?? []) {\n if (hit.user_id === meId || seen.has(hit.email.toLowerCase())) continue\n seen.add(hit.email.toLowerCase())\n const user = hit.user_id\n ? (directory.byId(hit.user_id) ??\n (userFromName(hit.user_id, hit.email, hit.name) as UserResponse))\n : null\n if (user && isAgent(user)) continue\n out.push({\n email: hit.email,\n name: hit.name || (user ? getUserDisplayName(user) : '') || hit.email,\n user,\n contactId: hit.contact_id ?? null,\n addressBookId: hit.address_book_ext_id ?? null,\n })\n }\n if (agents)\n for (const user of directory.users) {\n if (!isAgent(user) || seen.has(user.email.toLowerCase())) continue\n const name = getUserDisplayName(user)\n if (!`${name} ${user.email}`.toLowerCase().includes(term)) continue\n out.push({ email: user.email, name, user, contactId: null, addressBookId: null })\n }\n return out\n }, [term, hits, directory, agents, meId])\n\n return { people, isFetching: search.isFetching }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/projects.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { useArbi } from "./useArbi.js";
|
|
3
|
+
import { arbiQueryKeys } from "./hooks.js";
|
|
4
|
+
function useUpdateProjectFields() {
|
|
5
|
+
const arbi = useArbi();
|
|
6
|
+
const qc = useQueryClient();
|
|
7
|
+
return useMutation({
|
|
8
|
+
mutationFn: ({
|
|
9
|
+
projectExtId,
|
|
10
|
+
patch
|
|
11
|
+
}) => arbi.projects.update(projectExtId, patch),
|
|
12
|
+
onSuccess: () => {
|
|
13
|
+
void qc.invalidateQueries({ queryKey: arbiQueryKeys.projects() });
|
|
14
|
+
void qc.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function useProjectConversationUsage(projectExtId, monthsBack = 0, options) {
|
|
19
|
+
const arbi = useArbi();
|
|
20
|
+
return useQuery({
|
|
21
|
+
queryKey: arbiQueryKeys.projectConversationUsage(projectExtId ?? "", monthsBack),
|
|
22
|
+
queryFn: () => arbi.projects.usageByConversation(projectExtId, monthsBack),
|
|
23
|
+
enabled: (options?.enabled ?? true) && !!projectExtId && arbi.isLoggedIn
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
useProjectConversationUsage,
|
|
28
|
+
useUpdateProjectFields
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/projects.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Project details (budget, client, stage, lead, fields) and spend by conversation.\n *\n * Requires an `ArbiHost` (with an `arbi`) and a React Query client above it.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type {\n ProjectConversationUsageResponse,\n ProjectResponse,\n ProjectUpdateRequest,\n} from '@arbidocs/sdk/browser'\nimport { useArbi } from './useArbi'\nimport { arbiQueryKeys } from './hooks'\n\n/**\n * Patch a project (owner only): name, daily cap, and the details a host sets (`budget` in minor\n * units, `client`, `client_ref`, `stage`, `lead_user`, `fields` merged key by key, `field_schema`).\n * The project list and the workspace list (which carries project names) refresh.\n */\nexport function useUpdateProjectFields() {\n const arbi = useArbi()\n const qc = useQueryClient()\n return useMutation({\n mutationFn: ({\n projectExtId,\n patch,\n }: {\n projectExtId: string\n patch: ProjectUpdateRequest\n }): Promise<ProjectResponse> => arbi.projects.update(projectExtId, patch),\n onSuccess: () => {\n void qc.invalidateQueries({ queryKey: arbiQueryKeys.projects() })\n // Each workspace carries its project's name: a rename shows there at once.\n void qc.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() })\n },\n })\n}\n\n/** A project's spend by conversation (and what no conversation accounts for), in \u00A3. */\nexport function useProjectConversationUsage(\n projectExtId: string | undefined,\n monthsBack: number = 0,\n options?: { enabled?: boolean }\n) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.projectConversationUsage(projectExtId ?? '', monthsBack),\n queryFn: (): Promise<ProjectConversationUsageResponse> =>\n arbi.projects.usageByConversation(projectExtId as string, monthsBack),\n enabled: (options?.enabled ?? true) && !!projectExtId && arbi.isLoggedIn,\n })\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,aAAa,UAAU,sBAAsB;AAMtD,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAOvB,SAAS,yBAAyB;AACvC,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,eAAe;AAC1B,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC;AAAA,MACX;AAAA,MACA;AAAA,IACF,MAGgC,KAAK,SAAS,OAAO,cAAc,KAAK;AAAA,IACxE,WAAW,MAAM;AACf,WAAK,GAAG,kBAAkB,EAAE,UAAU,cAAc,SAAS,EAAE,CAAC;AAEhE,WAAK,GAAG,kBAAkB,EAAE,UAAU,cAAc,WAAW,EAAE,CAAC;AAAA,IACpE;AAAA,EACF,CAAC;AACH;AAGO,SAAS,4BACd,cACA,aAAqB,GACrB,SACA;AACA,QAAM,OAAO,QAAQ;AACrB,SAAO,SAAS;AAAA,IACd,UAAU,cAAc,yBAAyB,gBAAgB,IAAI,UAAU;AAAA,IAC/E,SAAS,MACP,KAAK,SAAS,oBAAoB,cAAwB,UAAU;AAAA,IACtE,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC,gBAAgB,KAAK;AAAA,EAChE,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { MutationCache, QueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { isAbortError, SETTINGS_WRITE_BREAKER_CODE } from "@arbidocs/client";
|
|
3
|
+
import { notify } from "./notifications/notify-store.js";
|
|
4
|
+
import { createArbiQueryPersistOptions } from "./query-persist.js";
|
|
5
|
+
function isClientError(error) {
|
|
6
|
+
if (error && typeof error === "object" && "status" in error) {
|
|
7
|
+
const status = error.status;
|
|
8
|
+
if (typeof status === "number" && status >= 400 && status < 500) {
|
|
9
|
+
if (status === 408 || status === 429) return false;
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function retryDelay(attempt) {
|
|
16
|
+
return Math.min(1e3 * 2 ** attempt, 3e4) + Math.random() * 500;
|
|
17
|
+
}
|
|
18
|
+
function shouldRetryQuery(failureCount, error) {
|
|
19
|
+
return failureCount < 2 && !isClientError(error) && !isAbortError(error);
|
|
20
|
+
}
|
|
21
|
+
const BREAKER_NOTICE_MS = 6e4;
|
|
22
|
+
function createArbiQueryClient({
|
|
23
|
+
persist = false
|
|
24
|
+
} = {}) {
|
|
25
|
+
let breakerNoticeAt = -Infinity;
|
|
26
|
+
const queryClient = new QueryClient({
|
|
27
|
+
mutationCache: new MutationCache({
|
|
28
|
+
onError: (error) => {
|
|
29
|
+
const { detail, code } = error ?? {};
|
|
30
|
+
if (detail === "account_deletion_pending") {
|
|
31
|
+
notify.error("Your account is read-only while deletion is pending.");
|
|
32
|
+
}
|
|
33
|
+
if (code === SETTINGS_WRITE_BREAKER_CODE && Date.now() - breakerNoticeAt > BREAKER_NOTICE_MS) {
|
|
34
|
+
breakerNoticeAt = Date.now();
|
|
35
|
+
notify.warning("Settings are being saved too frequently", {
|
|
36
|
+
description: "Some changes were not saved. Refresh the page if this keeps happening.",
|
|
37
|
+
duration: 1e4
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}),
|
|
42
|
+
defaultOptions: {
|
|
43
|
+
queries: {
|
|
44
|
+
staleTime: 1e3 * 60 * 5,
|
|
45
|
+
refetchOnWindowFocus: false,
|
|
46
|
+
retry: shouldRetryQuery,
|
|
47
|
+
retryDelay,
|
|
48
|
+
gcTime: 1e3 * 60 * 30
|
|
49
|
+
},
|
|
50
|
+
mutations: {
|
|
51
|
+
retry: false
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return { queryClient, persistOptions: persist ? createArbiQueryPersistOptions() : null };
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
createArbiQueryClient,
|
|
59
|
+
isClientError,
|
|
60
|
+
retryDelay,
|
|
61
|
+
shouldRetryQuery
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=query-client.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/query-client.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The React Query client every ARBI host shares: ARBI-frontend's own, and a blocks-only site's\n * through `defaultHost`. Call once per page, at module scope.\n *\n * const { queryClient } = createArbiQueryClient()\n * const { queryClient, persistOptions } = createArbiQueryClient({ persist: true })\n * <PersistQueryClientProvider client={queryClient} persistOptions={persistOptions}>\n *\n * Reads are fresh for 5 minutes and kept 30, are not re-read on window focus, and retry twice\n * with backoff, never on a 4xx (but 408/429) nor on a read a sign-out aborted. Writes never retry.\n * A write refused because the account's deletion is pending, or dropped by the client's settings\n * write breaker, tells the user. With `persist`, the offline slice of the cache is kept on this\n * device (`query-persist.ts`). Sign-out and sign-in clear it with `queryClient.clear()`; the same\n * client stays, so the provider and every hook keep theirs.\n */\n\nimport { MutationCache, QueryClient } from '@tanstack/react-query'\nimport { isAbortError, SETTINGS_WRITE_BREAKER_CODE } from '@arbidocs/client'\nimport { notify } from './notifications/notify-store'\nimport { createArbiQueryPersistOptions, type ArbiQueryPersistOptions } from './query-persist'\n\n/**\n * Returns true for HTTP 4xx errors that should NOT be retried, except for\n * 408 (Request Timeout) and 429 (Too Many Requests) which are transient\n * and worth retrying.\n *\n * Auth errors (401/403) are already handled by the client's re-login, so\n * React Query does not stack additional retries on top of its retry.\n */\nexport function isClientError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status?: number }).status\n if (typeof status === 'number' && status >= 400 && status < 500) {\n // Transient client errors \u2014 allow retry\n if (status === 408 || status === 429) return false\n return true\n }\n }\n return false\n}\n\n/**\n * Exponential backoff with jitter.\n * attempt 0 \u2192 ~1 s, attempt 1 \u2192 ~2 s, capped at 30 s.\n */\nexport function retryDelay(attempt: number): number {\n return Math.min(1000 * 2 ** attempt, 30_000) + Math.random() * 500\n}\n\n/** Whether a failed read is tried again (`failureCount` failures so far). */\nexport function shouldRetryQuery(failureCount: number, error: unknown): boolean {\n return failureCount < 2 && !isClientError(error) && !isAbortError(error)\n}\n\n// A write storm fails hundreds of writes a minute: tell the user once per minute, not per write.\nconst BREAKER_NOTICE_MS = 60_000\n\nexport interface ArbiQueryClientOptions {\n /** Keep the offline slice of the cache on this device, for an offline start. */\n persist?: boolean\n}\n\nexport interface ArbiQueryClient {\n queryClient: QueryClient\n /** For `<PersistQueryClientProvider persistOptions>`; `null` without `persist`. */\n persistOptions: ArbiQueryPersistOptions | null\n}\n\n/** The shared React Query client (see the module comment). */\nexport function createArbiQueryClient(options: {\n persist: true\n}): ArbiQueryClient & { persistOptions: ArbiQueryPersistOptions }\nexport function createArbiQueryClient(options?: ArbiQueryClientOptions): ArbiQueryClient\nexport function createArbiQueryClient({\n persist = false,\n}: ArbiQueryClientOptions = {}): ArbiQueryClient {\n let breakerNoticeAt = -Infinity\n const queryClient = new QueryClient({\n mutationCache: new MutationCache({\n onError: (error: unknown) => {\n const { detail, code } = (error ?? {}) as { detail?: unknown; code?: unknown }\n // The structured 403 of an account whose deletion is pending.\n if (detail === 'account_deletion_pending') {\n notify.error('Your account is read-only while deletion is pending.')\n }\n if (\n code === SETTINGS_WRITE_BREAKER_CODE &&\n Date.now() - breakerNoticeAt > BREAKER_NOTICE_MS\n ) {\n breakerNoticeAt = Date.now()\n notify.warning('Settings are being saved too frequently', {\n description: 'Some changes were not saved. Refresh the page if this keeps happening.',\n duration: 10_000,\n })\n }\n },\n }),\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 5,\n refetchOnWindowFocus: false,\n retry: shouldRetryQuery,\n retryDelay,\n gcTime: 1000 * 60 * 30,\n },\n mutations: {\n retry: false,\n },\n },\n })\n return { queryClient, persistOptions: persist ? createArbiQueryPersistOptions() : null }\n}\n"],
|
|
5
|
+
"mappings": "AAgBA,SAAS,eAAe,mBAAmB;AAC3C,SAAS,cAAc,mCAAmC;AAC1D,SAAS,cAAc;AACvB,SAAS,qCAAmE;AAUrE,SAAS,cAAc,OAAyB;AACrD,MAAI,SAAS,OAAO,UAAU,YAAY,YAAY,OAAO;AAC3D,UAAM,SAAU,MAA8B;AAC9C,QAAI,OAAO,WAAW,YAAY,UAAU,OAAO,SAAS,KAAK;AAE/D,UAAI,WAAW,OAAO,WAAW,IAAK,QAAO;AAC7C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,WAAW,SAAyB;AAClD,SAAO,KAAK,IAAI,MAAO,KAAK,SAAS,GAAM,IAAI,KAAK,OAAO,IAAI;AACjE;AAGO,SAAS,iBAAiB,cAAsB,OAAyB;AAC9E,SAAO,eAAe,KAAK,CAAC,cAAc,KAAK,KAAK,CAAC,aAAa,KAAK;AACzE;AAGA,MAAM,oBAAoB;AAkBnB,SAAS,sBAAsB;AAAA,EACpC,UAAU;AACZ,IAA4B,CAAC,GAAoB;AAC/C,MAAI,kBAAkB;AACtB,QAAM,cAAc,IAAI,YAAY;AAAA,IAClC,eAAe,IAAI,cAAc;AAAA,MAC/B,SAAS,CAAC,UAAmB;AAC3B,cAAM,EAAE,QAAQ,KAAK,IAAK,SAAS,CAAC;AAEpC,YAAI,WAAW,4BAA4B;AACzC,iBAAO,MAAM,sDAAsD;AAAA,QACrE;AACA,YACE,SAAS,+BACT,KAAK,IAAI,IAAI,kBAAkB,mBAC/B;AACA,4BAAkB,KAAK,IAAI;AAC3B,iBAAO,QAAQ,2CAA2C;AAAA,YACxD,aAAa;AAAA,YACb,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,gBAAgB;AAAA,MACd,SAAS;AAAA,QACP,WAAW,MAAO,KAAK;AAAA,QACvB,sBAAsB;AAAA,QACtB,OAAO;AAAA,QACP;AAAA,QACA,QAAQ,MAAO,KAAK;AAAA,MACtB;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO,EAAE,aAAa,gBAAgB,UAAU,8BAA8B,IAAI,KAAK;AACzF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -155,7 +155,7 @@ declare const arbiQueryKeys: {
|
|
|
155
155
|
* `['arbi', 'databases', 'rows', workspaceId, databaseId, params]`.
|
|
156
156
|
*/
|
|
157
157
|
databaseRows: (workspaceId?: string, databaseId?: string, params?: object) => readonly ["arbi", "databases", "rows"] | readonly ["arbi", "databases", "rows", string, string] | readonly ["arbi", "databases", "rows", string, string, object];
|
|
158
|
-
/** The saved dashboards of a store's scope (a workspace). */
|
|
158
|
+
/** The saved dashboards of a store's scope (the user's own, or a workspace's database). */
|
|
159
159
|
dashboards: (scope: string) => readonly ["arbi", "dashboards", string];
|
|
160
160
|
/** A database's rows grouped and measured (a chart); no workspace: every database's. */
|
|
161
161
|
databaseAggregate: (workspaceId?: string, databaseId?: string, request?: object) => readonly ["arbi", "databases", "aggregate"] | readonly ["arbi", "databases", "aggregate", string, string, object];
|