@arbidocs/react 0.5.111 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.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.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.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-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-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
- package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.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 +80 -80
- 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 +80 -80
- 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 +282 -282
- package/dist/index.js +702 -17116
- package/dist/index.js.map +7 -1
- package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
- 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/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
- 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 +154 -154
- package/dist/ui/index.js +290 -10
- 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.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- 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.js +61 -271
- 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 +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- 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-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.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-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.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-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.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-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.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/chunk-ZM6N7YZH.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-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.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 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { offlineMailReads } from "./reads.js";
|
|
2
|
+
import {
|
|
3
|
+
useOfflineMailActive,
|
|
4
|
+
useOfflineMailRuntime
|
|
5
|
+
} from "./runtime.js";
|
|
6
|
+
import {
|
|
7
|
+
useOfflineMailSettings,
|
|
8
|
+
useOfflineMailStatus,
|
|
9
|
+
useOutbox,
|
|
10
|
+
usePendingMailChanges,
|
|
11
|
+
useLocalDrafts,
|
|
12
|
+
useFlushOutbox,
|
|
13
|
+
useSyncOfflineMailbox
|
|
14
|
+
} from "./hooks.js";
|
|
15
|
+
import { OUTBOX_FOLDER } from "./live.js";
|
|
16
|
+
import { enqueueOutbox, deleteOutboxItem, retryOutboxItem } from "./outbox.js";
|
|
17
|
+
import { saveLocalDraft, deleteLocalDraft } from "./drafts.js";
|
|
18
|
+
import {
|
|
19
|
+
hasPendingMailChange,
|
|
20
|
+
queueMailChange
|
|
21
|
+
} from "./changes.js";
|
|
22
|
+
import { loadAttachment } from "./mailbox.js";
|
|
23
|
+
import { wipeOfflineMail } from "./wipe.js";
|
|
24
|
+
import { confirmLosingOfflineMail } from "./confirm-sign-out.js";
|
|
25
|
+
export {
|
|
26
|
+
OUTBOX_FOLDER,
|
|
27
|
+
confirmLosingOfflineMail,
|
|
28
|
+
deleteLocalDraft,
|
|
29
|
+
deleteOutboxItem,
|
|
30
|
+
enqueueOutbox,
|
|
31
|
+
hasPendingMailChange,
|
|
32
|
+
loadAttachment as loadOfflineMailAttachment,
|
|
33
|
+
offlineMailReads,
|
|
34
|
+
queueMailChange,
|
|
35
|
+
retryOutboxItem,
|
|
36
|
+
saveLocalDraft,
|
|
37
|
+
useFlushOutbox,
|
|
38
|
+
useLocalDrafts,
|
|
39
|
+
useOfflineMailActive,
|
|
40
|
+
useOfflineMailRuntime,
|
|
41
|
+
useOfflineMailSettings,
|
|
42
|
+
useOfflineMailStatus,
|
|
43
|
+
useOutbox,
|
|
44
|
+
usePendingMailChanges,
|
|
45
|
+
useSyncOfflineMailbox,
|
|
46
|
+
wipeOfflineMail
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/mail/offline/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Mail kept on this device: reading offline (the last 7 days by default, adjustable per device),\n * the Outbox (sends that wait for a connection and go out exactly once, in order), changes made\n * offline (read, moved, trashed, deleted; applied in order on reconnect), drafts written offline,\n * and the sync that keeps the device copy current. All\n * of it is sealed at rest to the signed-in user's key (`arbi-offline-mail-v1`), bound to that\n * account, and removed on sign-out (`wipeOfflineMail`).\n *\n * A host turns it on with three pieces: `offlineMailReads` as its mail client's reads, the\n * `useOfflineMailRuntime` hook mounted once, and `wipeOfflineMail` on sign-out. The mailbox kit's\n * device storage (`offlineMailSupport` in `@arbidocs/blocks/connect`) is built on the rest.\n */\n\nexport { offlineMailReads, type OfflineMailReadsOptions } from './reads'\nexport {\n useOfflineMailActive,\n useOfflineMailRuntime,\n type OfflineMailRuntimeOptions,\n} from './runtime'\nexport {\n useOfflineMailSettings,\n useOfflineMailStatus,\n useOutbox,\n usePendingMailChanges,\n useLocalDrafts,\n useFlushOutbox,\n useSyncOfflineMailbox,\n} from './hooks'\nexport { OUTBOX_FOLDER } from './live'\nexport { enqueueOutbox, deleteOutboxItem, retryOutboxItem, type OutboxItem } from './outbox'\nexport { saveLocalDraft, deleteLocalDraft, type LocalDraft } from './drafts'\nexport {\n hasPendingMailChange,\n queueMailChange,\n type MailChange,\n type PendingMailChange,\n} from './changes'\nexport { loadAttachment as loadOfflineMailAttachment } from './mailbox'\nexport { type OfflineMailScope, type OfflineMailSettings } from './settings'\nexport { type OfflineMailStatus } from './sync'\nexport { wipeOfflineMail } from './wipe'\nexport { confirmLosingOfflineMail } from './confirm-sign-out'\n"],
|
|
5
|
+
"mappings": "AAaA,SAAS,wBAAsD;AAC/D;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAC9B,SAAS,eAAe,kBAAkB,uBAAwC;AAClF,SAAS,gBAAgB,wBAAyC;AAClE;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAA2B,sBAAiC;AAG5D,SAAS,uBAAuB;AAChC,SAAS,gCAAgC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { sendMailFile } from "../filing.js";
|
|
2
|
+
import { primeOnArbi } from "../../queued-writes.js";
|
|
3
|
+
import { onlineManager } from "@tanstack/react-query";
|
|
4
|
+
import { logger } from "@arbidocs/client";
|
|
5
|
+
import { notify } from "../../notifications/notify-store.js";
|
|
6
|
+
import { accountPath, mailJson } from "../client.js";
|
|
7
|
+
import { mailQueryKeys } from "../hooks.js";
|
|
8
|
+
import { syncLocalDrafts } from "./drafts.js";
|
|
9
|
+
import { applyMailChangesOnce } from "./changes.js";
|
|
10
|
+
import { flushOutboxOnce, listOutbox, purgeSentOutbox } from "./outbox.js";
|
|
11
|
+
import { getOfflineMailSettings, notifyOfflineMailChange } from "./settings.js";
|
|
12
|
+
import { requestPersistentStorage } from "../../documents/offline-documents.js";
|
|
13
|
+
import { syncMailbox } from "./sync.js";
|
|
14
|
+
const OUTBOX_FOLDER = "outbox";
|
|
15
|
+
function sessionUser(arbi) {
|
|
16
|
+
return arbi.session?.getState().user?.external_id ?? null;
|
|
17
|
+
}
|
|
18
|
+
function hasLiveSession(arbi) {
|
|
19
|
+
return !!arbi.session?.getState().serverSessionKey;
|
|
20
|
+
}
|
|
21
|
+
function canReachMail(arbi) {
|
|
22
|
+
return onlineManager.isOnline() && hasLiveSession(arbi);
|
|
23
|
+
}
|
|
24
|
+
const unlocked = { nativeUnlocked: true };
|
|
25
|
+
function mailCall(arbi, path, init = {}) {
|
|
26
|
+
return mailJson((p, i) => arbi.mail.fetch(p, i, unlocked), path, init);
|
|
27
|
+
}
|
|
28
|
+
function liveTransport(arbi) {
|
|
29
|
+
const unlock = async (account) => {
|
|
30
|
+
if (!hasLiveSession(arbi))
|
|
31
|
+
throw Object.assign(new Error("Sign in to unlock your mailbox"), { status: 401 });
|
|
32
|
+
await arbi.mail.unlockAccount(account);
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
policy: () => mailCall(arbi, "/policy"),
|
|
36
|
+
accounts: () => mailCall(arbi, "/accounts"),
|
|
37
|
+
unlock,
|
|
38
|
+
folders: (account) => mailCall(arbi, `${accountPath(account.id)}/folders`),
|
|
39
|
+
messages: (account, folderId, cursor) => mailCall(
|
|
40
|
+
arbi,
|
|
41
|
+
`${accountPath(account.id)}/messages?${new URLSearchParams({
|
|
42
|
+
folder_id: folderId,
|
|
43
|
+
q: "",
|
|
44
|
+
limit: "100",
|
|
45
|
+
...cursor ? { cursor } : {}
|
|
46
|
+
})}`
|
|
47
|
+
),
|
|
48
|
+
message: async (account, messageId) => {
|
|
49
|
+
const path = `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`;
|
|
50
|
+
try {
|
|
51
|
+
return await mailCall(arbi, path);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error.status !== 401 || account.provider !== "native")
|
|
54
|
+
throw error;
|
|
55
|
+
if (hasLiveSession(arbi)) await arbi.mail.unlockNative();
|
|
56
|
+
return mailCall(arbi, path);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
attachment: async (account, messageId, attachmentId) => {
|
|
60
|
+
const response = await arbi.mail.fetch(
|
|
61
|
+
`${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,
|
|
62
|
+
{},
|
|
63
|
+
unlocked
|
|
64
|
+
);
|
|
65
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function liveSender(arbi) {
|
|
70
|
+
const transport = liveTransport(arbi);
|
|
71
|
+
return {
|
|
72
|
+
prepareSecure: async (item) => {
|
|
73
|
+
if (item.account.provider !== "native")
|
|
74
|
+
throw new Error("Choose your native inbox to send securely");
|
|
75
|
+
return arbi.secureMail.prepare(item.compose, item.account, item.requestId);
|
|
76
|
+
},
|
|
77
|
+
unlock: async (account) => {
|
|
78
|
+
if (account.provider !== "native") await transport.unlock(account);
|
|
79
|
+
},
|
|
80
|
+
send: (item) => item.secure ? mailJson((p, i) => arbi.mail.fetch(p, i), "/secure/send", {
|
|
81
|
+
method: "POST",
|
|
82
|
+
body: JSON.stringify(item.securePayload)
|
|
83
|
+
}) : mailJson(
|
|
84
|
+
(p, i) => arbi.mail.fetch(p, i),
|
|
85
|
+
`${accountPath(item.account.id)}/send`,
|
|
86
|
+
{
|
|
87
|
+
method: "POST",
|
|
88
|
+
body: JSON.stringify({ ...item.compose, request_id: item.requestId })
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function liveChangeSender(arbi) {
|
|
94
|
+
return {
|
|
95
|
+
unlock: (account) => liveTransport(arbi).unlock(account),
|
|
96
|
+
apply: async ({ account, messageId, change }) => {
|
|
97
|
+
if (change.kind === "file") {
|
|
98
|
+
const { kind: _, ...request } = change;
|
|
99
|
+
await sendMailFile(
|
|
100
|
+
(p, i) => arbi.mail.fetch(p, i),
|
|
101
|
+
primeOnArbi(arbi),
|
|
102
|
+
account,
|
|
103
|
+
messageId,
|
|
104
|
+
request
|
|
105
|
+
);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
await mailJson(
|
|
109
|
+
(p, i) => arbi.mail.fetch(p, i),
|
|
110
|
+
`${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`,
|
|
111
|
+
change.kind === "delete" ? { method: "DELETE" } : { method: "PATCH", body: JSON.stringify(change.update) }
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const localLocks = /* @__PURE__ */ new Set();
|
|
117
|
+
async function exclusive(name, fn) {
|
|
118
|
+
if (typeof navigator !== "undefined" && navigator.locks?.request) {
|
|
119
|
+
return navigator.locks.request(name, { ifAvailable: true }, async (lock) => {
|
|
120
|
+
if (!lock) return false;
|
|
121
|
+
await fn();
|
|
122
|
+
return true;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (localLocks.has(name)) return false;
|
|
126
|
+
localLocks.add(name);
|
|
127
|
+
try {
|
|
128
|
+
await fn();
|
|
129
|
+
return true;
|
|
130
|
+
} finally {
|
|
131
|
+
localLocks.delete(name);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
let retryTimer = null;
|
|
135
|
+
async function sendOutbox({ arbi, queryClient, openOutbox }) {
|
|
136
|
+
const result = await flushOutboxOnce(liveSender(arbi), () => onlineManager.isOnline());
|
|
137
|
+
if (result.sent > 0) void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() });
|
|
138
|
+
const remaining = (await listOutbox()).filter((i) => i.status !== "sent");
|
|
139
|
+
if (result.failed > 0) {
|
|
140
|
+
notify.error(
|
|
141
|
+
result.failed === 1 ? "A message in your Outbox couldn't be sent" : `${result.failed} messages in your Outbox couldn't be sent`,
|
|
142
|
+
{
|
|
143
|
+
description: "Open the Outbox to see why, then retry, edit or delete it.",
|
|
144
|
+
...openOutbox && { action: { label: "Open Outbox", onClick: openOutbox } }
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
} else if (result.sent > 0 && remaining.length === 0) {
|
|
148
|
+
notify.success(
|
|
149
|
+
result.sent === 1 ? "Your Outbox message was sent" : `${result.sent} Outbox messages sent`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
setTimeout(() => void purgeSentOutbox(3e4), 31e3);
|
|
153
|
+
}
|
|
154
|
+
async function applyChanges({ arbi, queryClient }) {
|
|
155
|
+
const result = await applyMailChangesOnce(liveChangeSender(arbi), () => onlineManager.isOnline());
|
|
156
|
+
if (result.applied + result.gone + result.refused.length > 0)
|
|
157
|
+
void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() });
|
|
158
|
+
if (result.gone > 0)
|
|
159
|
+
notify.info(
|
|
160
|
+
result.gone === 1 ? "A message you changed offline was already gone from the server" : `${result.gone} messages you changed offline were already gone from the server`
|
|
161
|
+
);
|
|
162
|
+
if (result.refused.length > 0)
|
|
163
|
+
notify.error(
|
|
164
|
+
result.refused.length === 1 ? "A change you made offline couldn't be applied" : `${result.refused.length} changes you made offline couldn't be applied`,
|
|
165
|
+
{ description: result.refused[0].error }
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
async function flushOutbox(context) {
|
|
169
|
+
if (!canReachMail(context.arbi)) return;
|
|
170
|
+
const ran = await exclusive("arbi-mail-outbox", async () => {
|
|
171
|
+
await sendOutbox(context);
|
|
172
|
+
await applyChanges(context);
|
|
173
|
+
});
|
|
174
|
+
if (!ran) {
|
|
175
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
176
|
+
retryTimer = setTimeout(() => void flushOutbox(context), 3e3);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function uploadOfflineDrafts({
|
|
180
|
+
arbi,
|
|
181
|
+
queryClient
|
|
182
|
+
}) {
|
|
183
|
+
if (!canReachMail(arbi)) return;
|
|
184
|
+
await exclusive("arbi-mail-drafts", async () => {
|
|
185
|
+
const uploaded = await syncLocalDrafts(
|
|
186
|
+
({ accountId, compose }) => mailJson(
|
|
187
|
+
(p, i) => arbi.mail.fetch(p, i),
|
|
188
|
+
`${accountPath(accountId)}/drafts`,
|
|
189
|
+
{
|
|
190
|
+
method: "POST",
|
|
191
|
+
body: JSON.stringify(compose)
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
);
|
|
195
|
+
if (uploaded > 0) {
|
|
196
|
+
void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allMessages() });
|
|
197
|
+
notify.success(
|
|
198
|
+
uploaded === 1 ? "Your offline draft was saved to Drafts" : `${uploaded} offline drafts were saved to Drafts`
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
let syncing = false;
|
|
204
|
+
function isMailSyncRunning() {
|
|
205
|
+
return syncing;
|
|
206
|
+
}
|
|
207
|
+
async function syncOfflineMailbox({ arbi }, options = {}) {
|
|
208
|
+
const latest = () => getOfflineMailSettings(sessionUser(arbi));
|
|
209
|
+
const settings = latest();
|
|
210
|
+
if (!settings.enabled || !canReachMail(arbi)) return;
|
|
211
|
+
void requestPersistentStorage();
|
|
212
|
+
await exclusive("arbi-mail-sync", async () => {
|
|
213
|
+
syncing = true;
|
|
214
|
+
notifyOfflineMailChange("status");
|
|
215
|
+
try {
|
|
216
|
+
await syncMailbox(liveTransport(arbi), latest(), { ...options, latest });
|
|
217
|
+
} catch (error) {
|
|
218
|
+
logger.error("[offline-mail] sync failed", error);
|
|
219
|
+
} finally {
|
|
220
|
+
syncing = false;
|
|
221
|
+
notifyOfflineMailChange("status");
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
export {
|
|
226
|
+
OUTBOX_FOLDER,
|
|
227
|
+
flushOutbox,
|
|
228
|
+
isMailSyncRunning,
|
|
229
|
+
sessionUser,
|
|
230
|
+
syncOfflineMailbox,
|
|
231
|
+
uploadOfflineDrafts
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=live.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/mail/offline/live.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The offline mailbox's connection to the real API (the session's `arbi.mail`), and the runners\n * that the app-wide runtime (`useOfflineMailRuntime`) and the mailbox call: flush the Outbox, apply\n * the changes made offline, upload offline drafts, sync.\n *\n * Each runner holds a Web Lock, so with several tabs open exactly one does the work at a time (the\n * send endpoints are idempotent anyway; the lock just avoids duplicate traffic).\n */\n\nimport { sendMailFile } from '../filing'\nimport { primeOnArbi } from '../../queued-writes'\nimport { onlineManager, type QueryClient } from '@tanstack/react-query'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { logger } from '@arbidocs/client'\nimport { notify } from '../../notifications/notify-store'\nimport { accountPath, mailJson } from '../client'\nimport { mailQueryKeys } from '../hooks'\nimport type { MailAccount, MailCompose, MailFolder, MailMessage, MailPolicy } from '../types'\nimport { syncLocalDrafts } from './drafts'\nimport { applyMailChangesOnce, type MailChangeSender } from './changes'\nimport { flushOutboxOnce, listOutbox, purgeSentOutbox, type OutboxSender } from './outbox'\nimport { getOfflineMailSettings, notifyOfflineMailChange } from './settings'\nimport { requestPersistentStorage } from '../../documents/offline-documents'\nimport { syncMailbox, type MailTransport } from './sync'\n\n/** What a runner works with: the signed-in session's `Arbi` and the query cache it refreshes. */\nexport interface OfflineMailContext {\n arbi: Arbi\n queryClient: QueryClient\n /** Show the Outbox (\"Open Outbox\" on a notice that a message could not be sent). */\n openOutbox?: () => void\n}\n\n/** The folder role of the device Outbox. */\nexport const OUTBOX_FOLDER = 'outbox'\n\n/**\n * The user the session is signed in as (the offline settings are theirs): the loaded profile's,\n * as `useOfflineMailSettings` reads it. Until it is loaded (a restored tab) there is none, so the\n * defaults apply and nothing is cached yet.\n */\nexport function sessionUser(arbi: Arbi): string | null {\n return arbi.session?.getState().user?.external_id ?? null\n}\n\n/** The session holds a server session key: the keys a background mail request needs. */\nfunction hasLiveSession(arbi: Arbi): boolean {\n return !!arbi.session?.getState().serverSessionKey\n}\n\n/** Whether this tab has what a background mail request needs: a connection and an unlocked session. */\nfunction canReachMail(arbi: Arbi): boolean {\n return onlineManager.isOnline() && hasLiveSession(arbi)\n}\n\nconst unlocked = { nativeUnlocked: true }\n\nfunction mailCall<T>(arbi: Arbi, path: string, init: RequestInit = {}): Promise<T> {\n return mailJson<T>((p, i) => arbi.mail.fetch(p, i, unlocked), path, init)\n}\n\nfunction liveTransport(arbi: Arbi): MailTransport {\n const unlock = async (account: MailAccount) => {\n if (!hasLiveSession(arbi))\n throw Object.assign(new Error('Sign in to unlock your mailbox'), { status: 401 })\n await arbi.mail.unlockAccount(account)\n }\n return {\n policy: () => mailCall<MailPolicy>(arbi, '/policy'),\n accounts: () => mailCall<MailAccount[]>(arbi, '/accounts'),\n unlock,\n folders: (account) => mailCall<MailFolder[]>(arbi, `${accountPath(account.id)}/folders`),\n messages: (account, folderId, cursor) =>\n mailCall(\n arbi,\n `${accountPath(account.id)}/messages?${new URLSearchParams({\n folder_id: folderId,\n q: '',\n limit: '100',\n ...(cursor ? { cursor } : {}),\n })}`\n ),\n message: async (account, messageId) => {\n const path = `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`\n try {\n return await mailCall<MailMessage>(arbi, path)\n } catch (error) {\n // Mail that arrived after this pass unlocked the inbox has a key the session doesn't hold yet.\n if ((error as { status?: number }).status !== 401 || account.provider !== 'native')\n throw error\n if (hasLiveSession(arbi)) await arbi.mail.unlockNative()\n return mailCall<MailMessage>(arbi, path)\n }\n },\n attachment: async (account, messageId, attachmentId) => {\n const response = await arbi.mail.fetch(\n `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n {},\n unlocked\n )\n return new Uint8Array(await response.arrayBuffer())\n },\n }\n}\n\nfunction liveSender(arbi: Arbi): OutboxSender {\n const transport = liveTransport(arbi)\n return {\n prepareSecure: async (item) => {\n if (item.account.provider !== 'native')\n throw new Error('Choose your native inbox to send securely')\n return arbi.secureMail.prepare(item.compose, item.account, item.requestId)\n },\n unlock: async (account) => {\n // The native send path needs no session keys; connected accounts need this session's tokens.\n if (account.provider !== 'native') await transport.unlock(account)\n },\n send: (item) =>\n item.secure\n ? mailJson<{ id?: string }>((p, i) => arbi.mail.fetch(p, i), '/secure/send', {\n method: 'POST',\n body: JSON.stringify(item.securePayload),\n })\n : mailJson<{ id?: string }>(\n (p, i) => arbi.mail.fetch(p, i),\n `${accountPath(item.account.id)}/send`,\n {\n method: 'POST',\n body: JSON.stringify({ ...item.compose, request_id: item.requestId }),\n }\n ),\n }\n}\n\nfunction liveChangeSender(arbi: Arbi): MailChangeSender {\n return {\n unlock: (account) => liveTransport(arbi).unlock(account),\n apply: async ({ account, messageId, change }) => {\n if (change.kind === 'file') {\n const { kind: _, ...request } = change\n await sendMailFile(\n (p, i) => arbi.mail.fetch(p, i),\n primeOnArbi(arbi),\n account,\n messageId,\n request\n )\n return\n }\n await mailJson(\n (p, i) => arbi.mail.fetch(p, i),\n `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`,\n change.kind === 'delete'\n ? { method: 'DELETE' }\n : { method: 'PATCH', body: JSON.stringify(change.update) }\n )\n },\n }\n}\n\nconst localLocks = new Set<string>()\n\n/** Run `fn` unless another tab (or this one) already is; returns whether it ran. */\nasync function exclusive(name: string, fn: () => Promise<void>): Promise<boolean> {\n if (typeof navigator !== 'undefined' && navigator.locks?.request) {\n return navigator.locks.request(name, { ifAvailable: true }, async (lock) => {\n if (!lock) return false\n await fn()\n return true\n })\n }\n if (localLocks.has(name)) return false\n localLocks.add(name)\n try {\n await fn()\n return true\n } finally {\n localLocks.delete(name)\n }\n}\n\nlet retryTimer: ReturnType<typeof setTimeout> | null = null\n\n/** One Outbox pass: send what waits, in order, and tell the user how it went. */\nasync function sendOutbox({ arbi, queryClient, openOutbox }: OfflineMailContext): Promise<void> {\n const result = await flushOutboxOnce(liveSender(arbi), () => onlineManager.isOnline())\n if (result.sent > 0) void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() })\n const remaining = (await listOutbox()).filter((i) => i.status !== 'sent')\n if (result.failed > 0) {\n notify.error(\n result.failed === 1\n ? \"A message in your Outbox couldn't be sent\"\n : `${result.failed} messages in your Outbox couldn't be sent`,\n {\n description: 'Open the Outbox to see why, then retry, edit or delete it.',\n ...(openOutbox && { action: { label: 'Open Outbox', onClick: openOutbox } }),\n }\n )\n } else if (result.sent > 0 && remaining.length === 0) {\n notify.success(\n result.sent === 1 ? 'Your Outbox message was sent' : `${result.sent} Outbox messages sent`\n )\n }\n // Sent rows stay visible briefly as \"Sent\", then leave the Outbox.\n setTimeout(() => void purgeSentOutbox(30_000), 31_000)\n}\n\n/** One pass over the changes made offline: apply them, and say which could not be applied. */\nasync function applyChanges({ arbi, queryClient }: OfflineMailContext): Promise<void> {\n const result = await applyMailChangesOnce(liveChangeSender(arbi), () => onlineManager.isOnline())\n if (result.applied + result.gone + result.refused.length > 0)\n void queryClient.invalidateQueries({ queryKey: mailQueryKeys.all() })\n if (result.gone > 0)\n notify.info(\n result.gone === 1\n ? 'A message you changed offline was already gone from the server'\n : `${result.gone} messages you changed offline were already gone from the server`\n )\n if (result.refused.length > 0)\n notify.error(\n result.refused.length === 1\n ? \"A change you made offline couldn't be applied\"\n : `${result.refused.length} changes you made offline couldn't be applied`,\n { description: result.refused[0].error }\n )\n}\n\n/**\n * Send what waits on this device: the Outbox first, then the changes made offline (read, moved,\n * trashed, deleted), under one lock so neither overtakes the other, and nothing goes out twice\n * from two tabs. When another tab holds the lock, try again shortly: it may have missed something\n * queued here just now.\n */\nexport async function flushOutbox(context: OfflineMailContext): Promise<void> {\n if (!canReachMail(context.arbi)) return\n const ran = await exclusive('arbi-mail-outbox', async () => {\n await sendOutbox(context)\n await applyChanges(context)\n })\n if (!ran) {\n if (retryTimer) clearTimeout(retryTimer)\n retryTimer = setTimeout(() => void flushOutbox(context), 3_000)\n }\n}\n\n/** Upload the drafts written offline to the account's server Drafts. */\nexport async function uploadOfflineDrafts({\n arbi,\n queryClient,\n}: OfflineMailContext): Promise<void> {\n if (!canReachMail(arbi)) return\n await exclusive('arbi-mail-drafts', async () => {\n const uploaded = await syncLocalDrafts(({ accountId, compose }) =>\n mailJson<{ id: string }>(\n (p, i) => arbi.mail.fetch(p, i),\n `${accountPath(accountId)}/drafts`,\n {\n method: 'POST',\n body: JSON.stringify(compose satisfies MailCompose),\n }\n )\n )\n if (uploaded > 0) {\n void queryClient.invalidateQueries({ queryKey: mailQueryKeys.allMessages() })\n notify.success(\n uploaded === 1\n ? 'Your offline draft was saved to Drafts'\n : `${uploaded} offline drafts were saved to Drafts`\n )\n }\n })\n}\n\nlet syncing = false\nexport function isMailSyncRunning(): boolean {\n return syncing\n}\n\n/** One sync pass of the offline mailbox, when the user turned it on for this device. */\nexport async function syncOfflineMailbox(\n { arbi }: Pick<OfflineMailContext, 'arbi'>,\n options: { full?: boolean } = {}\n): Promise<void> {\n const latest = () => getOfflineMailSettings(sessionUser(arbi))\n const settings = latest()\n if (!settings.enabled || !canReachMail(arbi)) return\n // Keeping mail (the default too, not only when it is switched on): ask the browser not to evict it.\n void requestPersistentStorage()\n await exclusive('arbi-mail-sync', async () => {\n syncing = true\n notifyOfflineMailChange('status')\n try {\n await syncMailbox(liveTransport(arbi), latest(), { ...options, latest })\n } catch (error) {\n logger.error('[offline-mail] sync failed', error)\n } finally {\n syncing = false\n notifyOfflineMailChange('status')\n }\n })\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { blind, openBytes, openJson, sealBytes, sealJson } from "./crypto.js";
|
|
2
|
+
import {
|
|
3
|
+
deleteRecords,
|
|
4
|
+
getRecord,
|
|
5
|
+
hasRecord,
|
|
6
|
+
putRecord,
|
|
7
|
+
recordsInBucket,
|
|
8
|
+
touchRecord
|
|
9
|
+
} from "./store.js";
|
|
10
|
+
const keyOf = {
|
|
11
|
+
accounts: () => blind("accounts"),
|
|
12
|
+
policy: () => blind("policy"),
|
|
13
|
+
folders: (accountId) => blind("folders", accountId),
|
|
14
|
+
header: (accountId, folderId, messageId) => blind("header", accountId, folderId, messageId),
|
|
15
|
+
body: (accountId, messageId) => blind("body", accountId, messageId),
|
|
16
|
+
attachment: (accountId, messageId, attachmentId) => blind("attachment", accountId, messageId, attachmentId)
|
|
17
|
+
};
|
|
18
|
+
const bucketOf = {
|
|
19
|
+
global: () => blind("bucket", "global"),
|
|
20
|
+
folder: (accountId, folderId) => blind("bucket", "folder", accountId, folderId),
|
|
21
|
+
account: (accountId) => blind("bucket", "account", accountId)
|
|
22
|
+
};
|
|
23
|
+
async function put(kind, key, bucket, data, sortAt = Date.now()) {
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
await putRecord({ key, kind, bucket, sortAt, size: data.byteLength, lastAccess: now, data });
|
|
26
|
+
}
|
|
27
|
+
async function readJson(record) {
|
|
28
|
+
if (!record) return void 0;
|
|
29
|
+
try {
|
|
30
|
+
return await openJson(record.data);
|
|
31
|
+
} catch {
|
|
32
|
+
return void 0;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const receivedAt = (m) => m.received_at ? Date.parse(m.received_at) || 0 : 0;
|
|
36
|
+
async function saveAccounts(accounts) {
|
|
37
|
+
await put("accounts", await keyOf.accounts(), await bucketOf.global(), await sealJson(accounts));
|
|
38
|
+
}
|
|
39
|
+
async function loadAccounts() {
|
|
40
|
+
return readJson(await getRecord(await keyOf.accounts()));
|
|
41
|
+
}
|
|
42
|
+
async function savePolicy(policy) {
|
|
43
|
+
await put("policy", await keyOf.policy(), await bucketOf.global(), await sealJson(policy));
|
|
44
|
+
}
|
|
45
|
+
async function loadPolicy() {
|
|
46
|
+
return readJson(await getRecord(await keyOf.policy()));
|
|
47
|
+
}
|
|
48
|
+
async function saveFolders(accountId, folders) {
|
|
49
|
+
await put(
|
|
50
|
+
"folders",
|
|
51
|
+
await keyOf.folders(accountId),
|
|
52
|
+
await bucketOf.account(accountId),
|
|
53
|
+
await sealJson(folders)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
async function loadFolders(accountId) {
|
|
57
|
+
return readJson(await getRecord(await keyOf.folders(accountId)));
|
|
58
|
+
}
|
|
59
|
+
function toHeader(message) {
|
|
60
|
+
return {
|
|
61
|
+
...message,
|
|
62
|
+
text: "",
|
|
63
|
+
html: void 0,
|
|
64
|
+
delivery: void 0,
|
|
65
|
+
attachments: message.attachments.map((a) => ({ ...a, content_base64: null }))
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function saveHeader(accountId, folderId, message) {
|
|
69
|
+
await put(
|
|
70
|
+
"header",
|
|
71
|
+
await keyOf.header(accountId, folderId, message.id),
|
|
72
|
+
await bucketOf.folder(accountId, folderId),
|
|
73
|
+
await sealJson(toHeader(message)),
|
|
74
|
+
receivedAt(message)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
async function loadHeaders(accountId, folderId) {
|
|
78
|
+
const records = await recordsInBucket(await bucketOf.folder(accountId, folderId));
|
|
79
|
+
const out = [];
|
|
80
|
+
for (const record of records) {
|
|
81
|
+
if (record.kind !== "header") continue;
|
|
82
|
+
const message = await readJson(record);
|
|
83
|
+
if (message) out.push({ key: record.key, sortAt: record.sortAt, message });
|
|
84
|
+
}
|
|
85
|
+
return out.sort((a, b) => b.sortAt - a.sortAt);
|
|
86
|
+
}
|
|
87
|
+
async function hasFolder(accountId) {
|
|
88
|
+
return hasRecord(await keyOf.folders(accountId));
|
|
89
|
+
}
|
|
90
|
+
async function saveBody(accountId, message) {
|
|
91
|
+
const stripped = {
|
|
92
|
+
...message,
|
|
93
|
+
attachments: message.attachments.map((a) => ({ ...a, content_base64: null }))
|
|
94
|
+
};
|
|
95
|
+
await put(
|
|
96
|
+
"body",
|
|
97
|
+
await keyOf.body(accountId, message.id),
|
|
98
|
+
await bucketOf.account(accountId),
|
|
99
|
+
await sealJson(stripped),
|
|
100
|
+
receivedAt(message)
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
async function hasBody(accountId, messageId) {
|
|
104
|
+
return hasRecord(await keyOf.body(accountId, messageId));
|
|
105
|
+
}
|
|
106
|
+
async function loadBody(accountId, messageId) {
|
|
107
|
+
return readJson(await getRecord(await keyOf.body(accountId, messageId)));
|
|
108
|
+
}
|
|
109
|
+
async function saveAttachment(accountId, messageId, attachmentId, bytes, sortAt) {
|
|
110
|
+
await put(
|
|
111
|
+
"attachment",
|
|
112
|
+
await keyOf.attachment(accountId, messageId, attachmentId),
|
|
113
|
+
await bucketOf.account(accountId),
|
|
114
|
+
await sealBytes(bytes),
|
|
115
|
+
sortAt || void 0
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
async function hasAttachment(accountId, messageId, attachmentId) {
|
|
119
|
+
return hasRecord(await keyOf.attachment(accountId, messageId, attachmentId));
|
|
120
|
+
}
|
|
121
|
+
async function loadAttachment(accountId, messageId, attachmentId) {
|
|
122
|
+
const key = await keyOf.attachment(accountId, messageId, attachmentId);
|
|
123
|
+
const record = await getRecord(key);
|
|
124
|
+
if (!record) return void 0;
|
|
125
|
+
try {
|
|
126
|
+
const bytes = await openBytes(record.data);
|
|
127
|
+
void touchRecord(key);
|
|
128
|
+
return bytes;
|
|
129
|
+
} catch {
|
|
130
|
+
return void 0;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function removeKeys(keys) {
|
|
134
|
+
await deleteRecords(keys);
|
|
135
|
+
}
|
|
136
|
+
function bodyText(body) {
|
|
137
|
+
const html = body.text ? "" : (body.html ?? "").replace(/<[^>]*>/g, " ");
|
|
138
|
+
return `${body.text} ${html} ${body.attachments.map((a) => a.name).join(" ")}`;
|
|
139
|
+
}
|
|
140
|
+
const folded = (value) => value.toLocaleLowerCase().normalize("NFKD");
|
|
141
|
+
async function searchFolder(accountId, folderId, query) {
|
|
142
|
+
const words = folded(query).split(/\s+/).filter(Boolean);
|
|
143
|
+
const headers = await loadHeaders(accountId, folderId);
|
|
144
|
+
if (words.length === 0) return headers.map((h) => h.message);
|
|
145
|
+
const out = [];
|
|
146
|
+
for (const { message } of headers) {
|
|
147
|
+
const people = [...message.sender, ...message.to, ...message.cc].map((p) => `${p.name ?? ""} ${p.email}`).join(" ");
|
|
148
|
+
let haystack = folded(`${message.subject} ${people} ${message.preview}`);
|
|
149
|
+
if (!words.every((w) => haystack.includes(w))) {
|
|
150
|
+
const body = await loadBody(accountId, message.id);
|
|
151
|
+
if (body) haystack += " " + folded(bodyText(body));
|
|
152
|
+
}
|
|
153
|
+
if (words.every((w) => haystack.includes(w))) out.push(message);
|
|
154
|
+
}
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
const isVirtualFolder = (folder) => folder?.role === "flagged";
|
|
158
|
+
async function loadAccountMessages(accountId, include, query = "") {
|
|
159
|
+
const seen = /* @__PURE__ */ new Map();
|
|
160
|
+
for (const folder of await loadFolders(accountId) ?? []) {
|
|
161
|
+
if (isVirtualFolder(folder) || !include(folder)) continue;
|
|
162
|
+
for (const message of await searchFolder(accountId, folder.id, query))
|
|
163
|
+
if (!seen.has(message.id)) seen.set(message.id, message);
|
|
164
|
+
}
|
|
165
|
+
return [...seen.values()].sort((a, b) => receivedAt(b) - receivedAt(a));
|
|
166
|
+
}
|
|
167
|
+
export {
|
|
168
|
+
bucketOf,
|
|
169
|
+
hasAttachment,
|
|
170
|
+
hasBody,
|
|
171
|
+
hasFolder,
|
|
172
|
+
isVirtualFolder,
|
|
173
|
+
keyOf,
|
|
174
|
+
loadAccountMessages,
|
|
175
|
+
loadAccounts,
|
|
176
|
+
loadAttachment,
|
|
177
|
+
loadBody,
|
|
178
|
+
loadFolders,
|
|
179
|
+
loadHeaders,
|
|
180
|
+
loadPolicy,
|
|
181
|
+
removeKeys,
|
|
182
|
+
saveAccounts,
|
|
183
|
+
saveAttachment,
|
|
184
|
+
saveBody,
|
|
185
|
+
saveFolders,
|
|
186
|
+
saveHeader,
|
|
187
|
+
savePolicy,
|
|
188
|
+
searchFolder,
|
|
189
|
+
toHeader
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=mailbox.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/mail/offline/mailbox.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Typed, encrypted reads and writes of mailbox data in the offline store: accounts, folders,\n * message headers (what a folder list shows), bodies (the opened message) and attachment bytes.\n *\n * Headers and bodies are separate records so a folder list decrypts only small headers; bodies are\n * decrypted when a message is opened or searched.\n */\n\nimport type { MailAccount, MailFolder, MailMessage, MailPolicy } from '../types'\nimport { blind, openBytes, openJson, sealBytes, sealJson } from './crypto'\nimport {\n deleteRecords,\n getRecord,\n hasRecord,\n putRecord,\n recordsInBucket,\n touchRecord,\n type RecordKind,\n type StoredRecord,\n} from './store'\n\nexport const keyOf = {\n accounts: () => blind('accounts'),\n policy: () => blind('policy'),\n folders: (accountId: string) => blind('folders', accountId),\n header: (accountId: string, folderId: string, messageId: string) =>\n blind('header', accountId, folderId, messageId),\n body: (accountId: string, messageId: string) => blind('body', accountId, messageId),\n attachment: (accountId: string, messageId: string, attachmentId: string) =>\n blind('attachment', accountId, messageId, attachmentId),\n}\n\nexport const bucketOf = {\n global: () => blind('bucket', 'global'),\n folder: (accountId: string, folderId: string) => blind('bucket', 'folder', accountId, folderId),\n account: (accountId: string) => blind('bucket', 'account', accountId),\n}\n\nasync function put(\n kind: RecordKind,\n key: string,\n bucket: string,\n data: Uint8Array,\n sortAt = Date.now()\n): Promise<void> {\n const now = Date.now()\n await putRecord({ key, kind, bucket, sortAt, size: data.byteLength, lastAccess: now, data })\n}\n\nasync function readJson<T>(record: StoredRecord | undefined): Promise<T | undefined> {\n if (!record) return undefined\n try {\n return await openJson<T>(record.data)\n } catch {\n // Sealed under another identity (a different account wrote it) or damaged: treat as absent.\n return undefined\n }\n}\n\nconst receivedAt = (m: MailMessage) => (m.received_at ? Date.parse(m.received_at) || 0 : 0)\n\nexport async function saveAccounts(accounts: MailAccount[]): Promise<void> {\n await put('accounts', await keyOf.accounts(), await bucketOf.global(), await sealJson(accounts))\n}\n\nexport async function loadAccounts(): Promise<MailAccount[] | undefined> {\n return readJson<MailAccount[]>(await getRecord(await keyOf.accounts()))\n}\n\nexport async function savePolicy(policy: MailPolicy): Promise<void> {\n await put('policy', await keyOf.policy(), await bucketOf.global(), await sealJson(policy))\n}\n\nexport async function loadPolicy(): Promise<MailPolicy | undefined> {\n return readJson<MailPolicy>(await getRecord(await keyOf.policy()))\n}\n\nexport async function saveFolders(accountId: string, folders: MailFolder[]): Promise<void> {\n await put(\n 'folders',\n await keyOf.folders(accountId),\n await bucketOf.account(accountId),\n await sealJson(folders)\n )\n}\n\nexport async function loadFolders(accountId: string): Promise<MailFolder[] | undefined> {\n return readJson<MailFolder[]>(await getRecord(await keyOf.folders(accountId)))\n}\n\n/** A list row: the message without its body text/html or attachment bytes. */\nexport function toHeader(message: MailMessage): MailMessage {\n return {\n ...message,\n text: '',\n html: undefined,\n delivery: undefined,\n attachments: message.attachments.map((a) => ({ ...a, content_base64: null })),\n }\n}\n\nexport interface StoredHeader {\n key: string\n sortAt: number\n message: MailMessage\n}\n\nexport async function saveHeader(\n accountId: string,\n folderId: string,\n message: MailMessage\n): Promise<void> {\n await put(\n 'header',\n await keyOf.header(accountId, folderId, message.id),\n await bucketOf.folder(accountId, folderId),\n await sealJson(toHeader(message)),\n receivedAt(message)\n )\n}\n\n/** A folder's saved headers, newest first. */\nexport async function loadHeaders(accountId: string, folderId: string): Promise<StoredHeader[]> {\n const records = await recordsInBucket(await bucketOf.folder(accountId, folderId))\n const out: StoredHeader[] = []\n for (const record of records) {\n if (record.kind !== 'header') continue\n const message = await readJson<MailMessage>(record)\n if (message) out.push({ key: record.key, sortAt: record.sortAt, message })\n }\n return out.sort((a, b) => b.sortAt - a.sortAt)\n}\n\n/** Whether a folder has ever been saved on this device (so \"empty\" means empty, not \"not saved\"). */\nexport async function hasFolder(accountId: string): Promise<boolean> {\n return hasRecord(await keyOf.folders(accountId))\n}\n\nexport async function saveBody(accountId: string, message: MailMessage): Promise<void> {\n const stripped: MailMessage = {\n ...message,\n attachments: message.attachments.map((a) => ({ ...a, content_base64: null })),\n }\n await put(\n 'body',\n await keyOf.body(accountId, message.id),\n await bucketOf.account(accountId),\n await sealJson(stripped),\n receivedAt(message)\n )\n}\n\nexport async function hasBody(accountId: string, messageId: string): Promise<boolean> {\n return hasRecord(await keyOf.body(accountId, messageId))\n}\n\nexport async function loadBody(\n accountId: string,\n messageId: string\n): Promise<MailMessage | undefined> {\n return readJson<MailMessage>(await getRecord(await keyOf.body(accountId, messageId)))\n}\n\nexport async function saveAttachment(\n accountId: string,\n messageId: string,\n attachmentId: string,\n bytes: Uint8Array,\n /** When its message was received (ms), so it leaves the device with it. */\n sortAt?: number\n): Promise<void> {\n await put(\n 'attachment',\n await keyOf.attachment(accountId, messageId, attachmentId),\n await bucketOf.account(accountId),\n await sealBytes(bytes),\n sortAt || undefined\n )\n}\n\nexport async function hasAttachment(\n accountId: string,\n messageId: string,\n attachmentId: string\n): Promise<boolean> {\n return hasRecord(await keyOf.attachment(accountId, messageId, attachmentId))\n}\n\n/** An attachment's bytes, or undefined when it wasn't saved (too large, or evicted). */\nexport async function loadAttachment(\n accountId: string,\n messageId: string,\n attachmentId: string\n): Promise<Uint8Array | undefined> {\n const key = await keyOf.attachment(accountId, messageId, attachmentId)\n const record = await getRecord(key)\n if (!record) return undefined\n try {\n const bytes = await openBytes(record.data)\n void touchRecord(key)\n return bytes\n } catch {\n return undefined\n }\n}\n\nexport async function removeKeys(keys: string[]): Promise<void> {\n await deleteRecords(keys)\n}\n\n/** Searchable text of an opened message: its text part, else its HTML without tags, and file names. */\nfunction bodyText(body: MailMessage): string {\n const html = body.text ? '' : (body.html ?? '').replace(/<[^>]*>/g, ' ')\n return `${body.text} ${html} ${body.attachments.map((a) => a.name).join(' ')}`\n}\n\nconst folded = (value: string) => value.toLocaleLowerCase().normalize('NFKD')\n\n/**\n * Search a folder on the device: every word must appear in the subject, a participant or the body\n * (the same \"all words\" feel as the server's search).\n */\nexport async function searchFolder(\n accountId: string,\n folderId: string,\n query: string\n): Promise<MailMessage[]> {\n const words = folded(query).split(/\\s+/).filter(Boolean)\n const headers = await loadHeaders(accountId, folderId)\n if (words.length === 0) return headers.map((h) => h.message)\n const out: MailMessage[] = []\n for (const { message } of headers) {\n const people = [...message.sender, ...message.to, ...message.cc]\n .map((p) => `${p.name ?? ''} ${p.email}`)\n .join(' ')\n let haystack = folded(`${message.subject} ${people} ${message.preview}`)\n if (!words.every((w) => haystack.includes(w))) {\n const body = await loadBody(accountId, message.id)\n if (body) haystack += ' ' + folded(bodyText(body))\n }\n if (words.every((w) => haystack.includes(w))) out.push(message)\n }\n return out\n}\n\n/** Whether a folder is a view over the others (Flagged), with no messages of its own to keep. */\nexport const isVirtualFolder = (folder: Pick<MailFolder, 'role'> | undefined) =>\n folder?.role === 'flagged'\n\n/**\n * Messages saved on the device across the account's folders (`include` picks the folders), each\n * once (a Gmail message is listed under every label), newest first.\n */\nexport async function loadAccountMessages(\n accountId: string,\n include: (folder: MailFolder) => boolean,\n query = ''\n): Promise<MailMessage[]> {\n const seen = new Map<string, MailMessage>()\n for (const folder of (await loadFolders(accountId)) ?? []) {\n if (isVirtualFolder(folder) || !include(folder)) continue\n for (const message of await searchFolder(accountId, folder.id, query))\n if (!seen.has(message.id)) seen.set(message.id, message)\n }\n return [...seen.values()].sort((a, b) => receivedAt(b) - receivedAt(a))\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|