@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
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
// src/lazy-chunk.tsx
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { lazy, Suspense } from "react";
|
|
5
3
|
function lazyChunk(load) {
|
|
6
4
|
let module;
|
|
7
5
|
let pending;
|
|
@@ -40,7 +38,9 @@ function lazyComponent(c, pick, fallback = () => null) {
|
|
|
40
38
|
}
|
|
41
39
|
return LazyComponent;
|
|
42
40
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
export {
|
|
42
|
+
lazyChunk,
|
|
43
|
+
lazyComponent,
|
|
44
|
+
preloadChunks
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=lazy-chunk.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lazy-chunk.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Heavy components (the PDF engine, the Word editor, the data grid) live in their own chunk, loaded\n * the first time one renders, so a page that never shows one (a sign-in page) never downloads it.\n *\n * `lazyChunk(load)` names a lazily loaded module; `lazyComponent(chunk, pick, fallback)` renders a\n * component from it with the same props, showing `fallback` until the chunk is in. A chunk loaded\n * beforehand (`preloadChunks`, as test setups do) renders at once, without suspending.\n */\nimport { lazy, Suspense, type ComponentType, type ReactNode } from 'react'\n\nexport interface LazyChunk<M> {\n /** Load the module (once); resolves with it. */\n load: () => Promise<M>\n /** The module, once loaded. */\n loaded: () => M | undefined\n}\n\nexport function lazyChunk<M>(load: () => Promise<M>): LazyChunk<M> {\n let module: M | undefined\n let pending: Promise<M> | undefined\n return {\n load: () =>\n (pending ??= load().then(\n (m) => (module = m),\n (error: unknown) => {\n // A failed download (offline, a stale deploy) is not cached: a later `load()` retries.\n pending = undefined\n throw error\n }\n )),\n loaded: () => module,\n }\n}\n\n/** Load every chunk now (test setups, or warming up after sign-in). */\nexport function preloadChunks(chunks: readonly LazyChunk<unknown>[]): Promise<unknown[]> {\n return Promise.all(chunks.map((c) => c.load()))\n}\n\n/**\n * A component rendered from `c` once it has loaded, with `fallback` (given the props) meanwhile.\n * Generic components keep their type: `lazyComponent(...) as typeof Impl`.\n *\n * A failed download (offline, a stale deploy) throws to the nearest error boundary; its retry\n * renders again and loads again, with no page reload: `React.lazy` keeps a failure for good, so a\n * failed one is replaced.\n */\nexport function lazyComponent<M, P extends object>(\n c: LazyChunk<M>,\n pick: (module: M) => ComponentType<P>,\n fallback: (props: P) => ReactNode = () => null\n): ComponentType<P> {\n const make = () =>\n lazy(() => {\n const m = c.loaded()\n // Already loaded: a thenable that resolves synchronously, so React renders without suspending.\n if (m)\n return {\n then: (resolve: (v: { default: ComponentType<P> }) => void) =>\n resolve({ default: pick(m) }),\n } as never\n return c.load().then(\n (loaded) => ({ default: pick(loaded) }),\n (error: unknown) => {\n Lazy = make()\n throw error\n }\n )\n })\n let Lazy = make()\n function LazyComponent(props: P) {\n return (\n <Suspense fallback={fallback(props)}>\n <Lazy {...props} />\n </Suspense>\n )\n }\n return LazyComponent\n}\n"],
|
|
5
|
+
"mappings": "AAyEQ;AAjER,SAAS,MAAM,gBAAoD;AAS5D,SAAS,UAAa,MAAsC;AACjE,MAAI;AACJ,MAAI;AACJ,SAAO;AAAA,IACL,MAAM,MACH,YAAY,KAAK,EAAE;AAAA,MAClB,CAAC,MAAO,SAAS;AAAA,MACjB,CAAC,UAAmB;AAElB,kBAAU;AACV,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACF,QAAQ,MAAM;AAAA,EAChB;AACF;AAGO,SAAS,cAAc,QAA2D;AACvF,SAAO,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAChD;AAUO,SAAS,cACd,GACA,MACA,WAAoC,MAAM,MACxB;AAClB,QAAM,OAAO,MACX,KAAK,MAAM;AACT,UAAM,IAAI,EAAE,OAAO;AAEnB,QAAI;AACF,aAAO;AAAA,QACL,MAAM,CAAC,YACL,QAAQ,EAAE,SAAS,KAAK,CAAC,EAAE,CAAC;AAAA,MAChC;AACF,WAAO,EAAE,KAAK,EAAE;AAAA,MACd,CAAC,YAAY,EAAE,SAAS,KAAK,MAAM,EAAE;AAAA,MACrC,CAAC,UAAmB;AAClB,eAAO,KAAK;AACZ,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AACH,MAAI,OAAO,KAAK;AAChB,WAAS,cAAc,OAAU;AAC/B,WACE,oBAAC,YAAS,UAAU,SAAS,KAAK,GAChC,8BAAC,QAAM,GAAG,OAAO,GACnB;AAAA,EAEJ;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function getCollisionPadding() {
|
|
2
|
+
const base = 8;
|
|
3
|
+
if (typeof window === "undefined") return { top: base, right: base, bottom: base, left: base };
|
|
4
|
+
const hidden = Math.max(
|
|
5
|
+
0,
|
|
6
|
+
(document.documentElement?.clientHeight ?? window.innerHeight) - window.innerHeight
|
|
7
|
+
);
|
|
8
|
+
return { top: base, right: base, bottom: base + hidden, left: base };
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
getCollisionPadding
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=collision-padding.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/collision-padding.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Collision padding for Radix poppers (menus, popovers, selects, hover cards).\n *\n * 8px on every side, plus, at the bottom, the amount by which the layout viewport is taller than\n * the visible one. Mobile Safari (and its landscape emulation) reports a layout viewport that is\n * larger than `innerHeight` while the toolbars are showing, so Radix would otherwise place a menu\n * under the bottom bar.\n */\nexport function getCollisionPadding(): {\n top: number\n right: number\n bottom: number\n left: number\n} {\n const base = 8\n if (typeof window === 'undefined') return { top: base, right: base, bottom: base, left: base }\n const hidden = Math.max(\n 0,\n (document.documentElement?.clientHeight ?? window.innerHeight) - window.innerHeight\n )\n return { top: base, right: base, bottom: base + hidden, left: base }\n}\n"],
|
|
5
|
+
"mappings": "AAQO,SAAS,sBAKd;AACA,QAAM,OAAO;AACb,MAAI,OAAO,WAAW,YAAa,QAAO,EAAE,KAAK,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,KAAK;AAC7F,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,KACC,SAAS,iBAAiB,gBAAgB,OAAO,eAAe,OAAO;AAAA,EAC1E;AACA,SAAO,EAAE,KAAK,MAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ,MAAM,KAAK;AACrE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
function formatFriendlyDate(dateString, includeTime = true) {
|
|
2
|
+
if (!dateString) return "";
|
|
3
|
+
try {
|
|
4
|
+
if (dateString.includes("Today") || dateString.includes("Yesterday") || /\w+ \d+, \d+:\d+:\d+/.test(dateString)) {
|
|
5
|
+
return dateString;
|
|
6
|
+
}
|
|
7
|
+
if (/^\d{1,2}:\d{2}(:\d{2})?$/.test(dateString)) {
|
|
8
|
+
return dateString;
|
|
9
|
+
}
|
|
10
|
+
const date = new Date(dateString);
|
|
11
|
+
if (isNaN(date.getTime())) return dateString;
|
|
12
|
+
const timeOptions = { hour: "2-digit", minute: "2-digit" };
|
|
13
|
+
const timeString = date.toLocaleTimeString([], timeOptions);
|
|
14
|
+
const now = /* @__PURE__ */ new Date();
|
|
15
|
+
const today = now.toDateString();
|
|
16
|
+
const yesterday = new Date(now);
|
|
17
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
18
|
+
if (date.toDateString() === today) {
|
|
19
|
+
return includeTime ? `Today, ${timeString}` : "today";
|
|
20
|
+
} else if (date.toDateString() === yesterday.toDateString()) {
|
|
21
|
+
return includeTime ? `Yesterday, ${timeString}` : "yesterday";
|
|
22
|
+
} else {
|
|
23
|
+
const dateOptions = {
|
|
24
|
+
month: "short",
|
|
25
|
+
day: "numeric"
|
|
26
|
+
};
|
|
27
|
+
if (date.getFullYear() !== now.getFullYear()) {
|
|
28
|
+
dateOptions.year = "numeric";
|
|
29
|
+
}
|
|
30
|
+
const formattedDate = date.toLocaleDateString([], dateOptions);
|
|
31
|
+
return includeTime ? `${formattedDate}, ${timeString}` : formattedDate;
|
|
32
|
+
}
|
|
33
|
+
} catch {
|
|
34
|
+
return dateString;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function formatCompactLastSeen(timestamp, options = {}) {
|
|
38
|
+
const date = new Date(timestamp);
|
|
39
|
+
if (isNaN(date.getTime())) return "";
|
|
40
|
+
const now = options.now ?? /* @__PURE__ */ new Date();
|
|
41
|
+
const yesterday = new Date(now);
|
|
42
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
43
|
+
if (date.toDateString() === now.toDateString()) {
|
|
44
|
+
return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
45
|
+
}
|
|
46
|
+
if (date.toDateString() === yesterday.toDateString()) return "Yesterday";
|
|
47
|
+
const dateOptions = { month: "short", day: "numeric" };
|
|
48
|
+
if (date.getFullYear() !== now.getFullYear()) dateOptions.year = "numeric";
|
|
49
|
+
return date.toLocaleDateString([], dateOptions);
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
formatCompactLastSeen,
|
|
53
|
+
formatFriendlyDate
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=format-friendly-date.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/format-friendly-date.ts"],
|
|
4
|
+
"sourcesContent": ["/** A timestamp as people read it: \"Today, 14:05\", \"Yesterday\", \"Aug 18\" (with the year once it is not this one). */\n\n/**\n * Format a date string for friendly display with Today/Yesterday context\n */\nexport function formatFriendlyDate(dateString: string, includeTime: boolean = true): string {\n if (!dateString) return ''\n\n try {\n // If we already have a properly formatted timestamp (with \"Today\", etc.), just return it\n if (\n dateString.includes('Today') ||\n dateString.includes('Yesterday') ||\n /\\w+ \\d+, \\d+:\\d+:\\d+/.test(dateString)\n ) {\n return dateString\n }\n\n // For HH:MM or HH:MM:SS format strings, just return them as is - no formatting\n if (/^\\d{1,2}:\\d{2}(:\\d{2})?$/.test(dateString)) {\n return dateString\n }\n\n // Server sends ISO-8601 timestamps with Z suffix (e.g., '2023-04-30T15:30:45Z')\n // indicating they are in UTC time, which browser handles correctly\n // The Z suffix tells browsers to interpret the time as UTC and convert to local time\n const date = new Date(dateString)\n\n if (isNaN(date.getTime())) return dateString // Fallback if not valid date\n\n // Format the time part (no seconds)\n const timeOptions: Intl.DateTimeFormatOptions = { hour: '2-digit', minute: '2-digit' }\n const timeString = date.toLocaleTimeString([], timeOptions)\n\n // Get 'today' and 'yesterday' in the local timezone\n const now = new Date()\n const today = now.toDateString()\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n\n // Compare date parts to categorize the timestamp\n if (date.toDateString() === today) {\n return includeTime ? `Today, ${timeString}` : 'today'\n } else if (date.toDateString() === yesterday.toDateString()) {\n return includeTime ? `Yesterday, ${timeString}` : 'yesterday'\n } else {\n // Format the date for older dates\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric',\n }\n\n // Add year if it's not the current year\n if (date.getFullYear() !== now.getFullYear()) {\n dateOptions.year = 'numeric'\n }\n\n const formattedDate = date.toLocaleDateString([], dateOptions)\n return includeTime ? `${formattedDate}, ${timeString}` : formattedDate\n }\n } catch {\n return dateString\n }\n}\n\n/**\n * Ultra-compact \"last seen\" stamp, for tight rows (the workspace switcher's recent list): the bare\n * time for today (\"11:27\"), \"Yesterday\", then a short date (\"Aug 18\", with the year once it is not\n * this one). Empty for an invalid timestamp.\n */\nexport function formatCompactLastSeen(\n timestamp: number | string | Date,\n options: { now?: Date } = {}\n): string {\n const date = new Date(timestamp)\n if (isNaN(date.getTime())) return ''\n\n const now = options.now ?? new Date()\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n\n if (date.toDateString() === now.toDateString()) {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n }\n if (date.toDateString() === yesterday.toDateString()) return 'Yesterday'\n const dateOptions: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric' }\n if (date.getFullYear() !== now.getFullYear()) dateOptions.year = 'numeric'\n return date.toLocaleDateString([], dateOptions)\n}\n"],
|
|
5
|
+
"mappings": "AAKO,SAAS,mBAAmB,YAAoB,cAAuB,MAAc;AAC1F,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI;AAEF,QACE,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,WAAW,KAC/B,uBAAuB,KAAK,UAAU,GACtC;AACA,aAAO;AAAA,IACT;AAGA,QAAI,2BAA2B,KAAK,UAAU,GAAG;AAC/C,aAAO;AAAA,IACT;AAKA,UAAM,OAAO,IAAI,KAAK,UAAU;AAEhC,QAAI,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAGlC,UAAM,cAA0C,EAAE,MAAM,WAAW,QAAQ,UAAU;AACrF,UAAM,aAAa,KAAK,mBAAmB,CAAC,GAAG,WAAW;AAG1D,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,QAAQ,IAAI,aAAa;AAC/B,UAAM,YAAY,IAAI,KAAK,GAAG;AAC9B,cAAU,QAAQ,UAAU,QAAQ,IAAI,CAAC;AAGzC,QAAI,KAAK,aAAa,MAAM,OAAO;AACjC,aAAO,cAAc,UAAU,UAAU,KAAK;AAAA,IAChD,WAAW,KAAK,aAAa,MAAM,UAAU,aAAa,GAAG;AAC3D,aAAO,cAAc,cAAc,UAAU,KAAK;AAAA,IACpD,OAAO;AAEL,YAAM,cAA0C;AAAA,QAC9C,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAGA,UAAI,KAAK,YAAY,MAAM,IAAI,YAAY,GAAG;AAC5C,oBAAY,OAAO;AAAA,MACrB;AAEA,YAAM,gBAAgB,KAAK,mBAAmB,CAAC,GAAG,WAAW;AAC7D,aAAO,cAAc,GAAG,aAAa,KAAK,UAAU,KAAK;AAAA,IAC3D;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,sBACd,WACA,UAA0B,CAAC,GACnB;AACR,QAAM,OAAO,IAAI,KAAK,SAAS;AAC/B,MAAI,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAElC,QAAM,MAAM,QAAQ,OAAO,oBAAI,KAAK;AACpC,QAAM,YAAY,IAAI,KAAK,GAAG;AAC9B,YAAU,QAAQ,UAAU,QAAQ,IAAI,CAAC;AAEzC,MAAI,KAAK,aAAa,MAAM,IAAI,aAAa,GAAG;AAC9C,WAAO,KAAK,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC;AAAA,EAC3E;AACA,MAAI,KAAK,aAAa,MAAM,UAAU,aAAa,EAAG,QAAO;AAC7D,QAAM,cAA0C,EAAE,OAAO,SAAS,KAAK,UAAU;AACjF,MAAI,KAAK,YAAY,MAAM,IAAI,YAAY,EAAG,aAAY,OAAO;AACjE,SAAO,KAAK,mBAAmB,CAAC,GAAG,WAAW;AAChD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const FORMATTERS = /* @__PURE__ */ new Map();
|
|
2
|
+
const DIVISIONS = [
|
|
3
|
+
{ amount: 60, unit: "seconds" },
|
|
4
|
+
{ amount: 60, unit: "minutes" },
|
|
5
|
+
{ amount: 24, unit: "hours" },
|
|
6
|
+
{ amount: 7, unit: "days" },
|
|
7
|
+
{ amount: 4.34524, unit: "weeks" },
|
|
8
|
+
{ amount: 12, unit: "months" },
|
|
9
|
+
{ amount: Number.POSITIVE_INFINITY, unit: "years" }
|
|
10
|
+
];
|
|
11
|
+
function formatter(style) {
|
|
12
|
+
let f = FORMATTERS.get(style);
|
|
13
|
+
if (!f) {
|
|
14
|
+
f = new Intl.RelativeTimeFormat(void 0, { numeric: "auto", style });
|
|
15
|
+
FORMATTERS.set(style, f);
|
|
16
|
+
}
|
|
17
|
+
return f;
|
|
18
|
+
}
|
|
19
|
+
const COMPACT_UNITS = [
|
|
20
|
+
[86400, "d"],
|
|
21
|
+
[3600, "h"],
|
|
22
|
+
[60, "m"]
|
|
23
|
+
];
|
|
24
|
+
function compact(seconds) {
|
|
25
|
+
const abs = Math.abs(seconds);
|
|
26
|
+
if (abs < 60) return "just now";
|
|
27
|
+
for (const [size, suffix] of COMPACT_UNITS) {
|
|
28
|
+
if (abs >= size) {
|
|
29
|
+
const value = `${Math.round(abs / size)}${suffix}`;
|
|
30
|
+
return seconds < 0 ? `${value} ago` : `in ${value}`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return "just now";
|
|
34
|
+
}
|
|
35
|
+
function formatRelativeTime(iso, options = {}) {
|
|
36
|
+
const then = Date.parse(iso);
|
|
37
|
+
if (Number.isNaN(then)) return "";
|
|
38
|
+
let duration = (then - (options.now ?? Date.now())) / 1e3;
|
|
39
|
+
if (options.style === "compact") return compact(duration);
|
|
40
|
+
if (Math.abs(duration) < 45) return "just now";
|
|
41
|
+
for (const division of DIVISIONS) {
|
|
42
|
+
if (Math.abs(duration) < division.amount) {
|
|
43
|
+
return formatter(options.style ?? "long").format(Math.round(duration), division.unit);
|
|
44
|
+
}
|
|
45
|
+
duration /= division.amount;
|
|
46
|
+
}
|
|
47
|
+
return "";
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
formatRelativeTime
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=format-relative-time.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/format-relative-time.ts"],
|
|
4
|
+
"sourcesContent": ["/** The one relative-time formatter: the notification bell, the DM kit, thread lists, webinar\n * panels, workspace cards, connector syncs and studio widgets all use it (no type imports, so the\n * SDK-free `/shell` and `/ui` entries can use it). */\n\nconst FORMATTERS = new Map<Intl.RelativeTimeFormatStyle, Intl.RelativeTimeFormat>()\nconst DIVISIONS: Array<{ amount: number; unit: Intl.RelativeTimeFormatUnit }> = [\n { amount: 60, unit: 'seconds' },\n { amount: 60, unit: 'minutes' },\n { amount: 24, unit: 'hours' },\n { amount: 7, unit: 'days' },\n { amount: 4.34524, unit: 'weeks' },\n { amount: 12, unit: 'months' },\n { amount: Number.POSITIVE_INFINITY, unit: 'years' },\n]\n\nfunction formatter(style: Intl.RelativeTimeFormatStyle): Intl.RelativeTimeFormat {\n let f = FORMATTERS.get(style)\n if (!f) {\n f = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto', style })\n FORMATTERS.set(style, f)\n }\n return f\n}\n\nexport interface FormatRelativeTimeOptions {\n /** The reference instant in epoch milliseconds (default: now). */\n now?: number\n /** `long` (default): \"2 hours ago\"; `short`: \"2 hr. ago\", for tight rows; `compact`: \"2h ago\",\n * for status lines and dense widgets. */\n style?: Intl.RelativeTimeFormatStyle | 'compact'\n}\n\nconst COMPACT_UNITS: Array<[seconds: number, suffix: string]> = [\n [86_400, 'd'],\n [3_600, 'h'],\n [60, 'm'],\n]\n\n/** \"5m ago\", \"3h ago\", \"2d ago\", \"in 4h\"; \"just now\" under a minute. */\nfunction compact(seconds: number): string {\n const abs = Math.abs(seconds)\n if (abs < 60) return 'just now'\n for (const [size, suffix] of COMPACT_UNITS) {\n if (abs >= size) {\n const value = `${Math.round(abs / size)}${suffix}`\n return seconds < 0 ? `${value} ago` : `in ${value}`\n }\n }\n return 'just now'\n}\n\n/** Relative time of an ISO timestamp, past or future: \"2 hours ago\", \"in 3 days\", \"just now\".\n * Empty for an unparseable timestamp. */\nexport function formatRelativeTime(iso: string, options: FormatRelativeTimeOptions = {}): string {\n const then = Date.parse(iso)\n if (Number.isNaN(then)) return ''\n let duration = (then - (options.now ?? Date.now())) / 1000\n if (options.style === 'compact') return compact(duration)\n if (Math.abs(duration) < 45) return 'just now'\n for (const division of DIVISIONS) {\n if (Math.abs(duration) < division.amount) {\n return formatter(options.style ?? 'long').format(Math.round(duration), division.unit)\n }\n duration /= division.amount\n }\n return ''\n}\n"],
|
|
5
|
+
"mappings": "AAIA,MAAM,aAAa,oBAAI,IAA2D;AAClF,MAAM,YAA0E;AAAA,EAC9E,EAAE,QAAQ,IAAI,MAAM,UAAU;AAAA,EAC9B,EAAE,QAAQ,IAAI,MAAM,UAAU;AAAA,EAC9B,EAAE,QAAQ,IAAI,MAAM,QAAQ;AAAA,EAC5B,EAAE,QAAQ,GAAG,MAAM,OAAO;AAAA,EAC1B,EAAE,QAAQ,SAAS,MAAM,QAAQ;AAAA,EACjC,EAAE,QAAQ,IAAI,MAAM,SAAS;AAAA,EAC7B,EAAE,QAAQ,OAAO,mBAAmB,MAAM,QAAQ;AACpD;AAEA,SAAS,UAAU,OAA8D;AAC/E,MAAI,IAAI,WAAW,IAAI,KAAK;AAC5B,MAAI,CAAC,GAAG;AACN,QAAI,IAAI,KAAK,mBAAmB,QAAW,EAAE,SAAS,QAAQ,MAAM,CAAC;AACrE,eAAW,IAAI,OAAO,CAAC;AAAA,EACzB;AACA,SAAO;AACT;AAUA,MAAM,gBAA0D;AAAA,EAC9D,CAAC,OAAQ,GAAG;AAAA,EACZ,CAAC,MAAO,GAAG;AAAA,EACX,CAAC,IAAI,GAAG;AACV;AAGA,SAAS,QAAQ,SAAyB;AACxC,QAAM,MAAM,KAAK,IAAI,OAAO;AAC5B,MAAI,MAAM,GAAI,QAAO;AACrB,aAAW,CAAC,MAAM,MAAM,KAAK,eAAe;AAC1C,QAAI,OAAO,MAAM;AACf,YAAM,QAAQ,GAAG,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,MAAM;AAChD,aAAO,UAAU,IAAI,GAAG,KAAK,SAAS,MAAM,KAAK;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAIO,SAAS,mBAAmB,KAAa,UAAqC,CAAC,GAAW;AAC/F,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,MAAI,YAAY,QAAQ,QAAQ,OAAO,KAAK,IAAI,MAAM;AACtD,MAAI,QAAQ,UAAU,UAAW,QAAO,QAAQ,QAAQ;AACxD,MAAI,KAAK,IAAI,QAAQ,IAAI,GAAI,QAAO;AACpC,aAAW,YAAY,WAAW;AAChC,QAAI,KAAK,IAAI,QAAQ,IAAI,SAAS,QAAQ;AACxC,aAAO,UAAU,QAAQ,SAAS,MAAM,EAAE,OAAO,KAAK,MAAM,QAAQ,GAAG,SAAS,IAAI;AAAA,IACtF;AACA,gBAAY,SAAS;AAAA,EACvB;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function markdownToPlainText(input) {
|
|
2
|
+
if (!input) return "";
|
|
3
|
+
return input.replace(/```[^\n]*\n?/g, "").replace(/!\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/\[([^\]]+)\]\([^)]*\)/g, "$1").replace(/^[ \t]*#{1,6}[ \t]+/gm, "").replace(/^[ \t]*>[ \t]?/gm, "").replace(/^[ \t]*([-*+]|\d+[.)])[ \t]+/gm, "").replace(/(\*\*|__)(.*?)\1/g, "$2").replace(/(\*|_)(.*?)\1/g, "$2").replace(/`([^`]*)`/g, "$1").replace(/\s+/g, " ").trim();
|
|
4
|
+
}
|
|
5
|
+
const TABLE_DELIMITER_ROW = /^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?\s*$/;
|
|
6
|
+
function splitTableRow(line) {
|
|
7
|
+
return line.trim().replace(/^\|/, "").replace(/(?<!\\)\|$/, "").split(/(?<!\\)\|/).map((cell) => cell.trim().replace(/\\\|/g, "|"));
|
|
8
|
+
}
|
|
9
|
+
function flattenMarkdownTables(input) {
|
|
10
|
+
const lines = input.split("\n");
|
|
11
|
+
const out = [];
|
|
12
|
+
for (let i = 0; i < lines.length; i++) {
|
|
13
|
+
const isTableStart = lines[i].includes("|") && i + 1 < lines.length && lines[i + 1].includes("|") && TABLE_DELIMITER_ROW.test(lines[i + 1]);
|
|
14
|
+
if (!isTableStart) {
|
|
15
|
+
out.push(lines[i]);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
out.push(splitTableRow(lines[i]).join(" "));
|
|
19
|
+
i += 1;
|
|
20
|
+
while (i + 1 < lines.length && lines[i + 1].includes("|") && lines[i + 1].trim()) {
|
|
21
|
+
i += 1;
|
|
22
|
+
out.push(splitTableRow(lines[i]).join(" "));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return out.join("\n");
|
|
26
|
+
}
|
|
27
|
+
function markdownToPlainTextBlocks(input) {
|
|
28
|
+
if (!input) return "";
|
|
29
|
+
return flattenMarkdownTables(input).replace(/^[ \t]*([-*_])([ \t]*\1){2,}[ \t]*$/gm, "").replace(/```[^\n]*\n?/g, "").replace(/!\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, "$1 ($2)").replace(/^[ \t]*#{1,6}[ \t]+/gm, "").replace(/^[ \t]*>[ \t]?/gm, "").replace(/(\*\*|__)(?=\S)(.+?)(?<=\S)\1/g, "$2").replace(/\*(?=\S)(.+?)(?<=\S)\*/g, "$1").replace(/(^|[^\w])_(?=\S)(.+?)(?<=\S)_(?!\w)/g, "$1$2").replace(/`([^`]*)`/g, "$1").replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
markdownToPlainText,
|
|
33
|
+
markdownToPlainTextBlocks
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=markdown-to-text.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/markdown-to-text.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * markdownToPlainText\n *\n * Cheap, dependency-free markdown \u2192 plain-text flattener for dense UI surfaces\n * (e.g. a single AG Grid cell) where we want a readable one-paragraph preview,\n * NOT rendered markdown. It strips the common markers our AI summaries emit\n * (bullets, headings, emphasis, inline code, links, blockquotes) and collapses\n * whitespace to a single line.\n *\n * Deliberately regex-based and O(n): it is safe to call per visible grid cell\n * (a valueFormatter) without the cost of a real markdown parser/renderer, so it\n * has no per-row-count impact on large tables. For full rich rendering use the\n * document viewer / review form, which render one document at a time.\n */\nexport function markdownToPlainText(input: string | null | undefined): string {\n if (!input) return ''\n return (\n input\n // Fenced code fences ``` \u2192 drop the fence lines, keep inner text\n .replace(/```[^\\n]*\\n?/g, '')\n // Images  \u2192 alt\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // Links [text](url) \u2192 text\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1')\n // Leading block markers at the start of a line: headings, blockquotes,\n // list bullets (-, *, +) and ordered list numbers.\n .replace(/^[ \\t]*#{1,6}[ \\t]+/gm, '')\n .replace(/^[ \\t]*>[ \\t]?/gm, '')\n .replace(/^[ \\t]*([-*+]|\\d+[.)])[ \\t]+/gm, '')\n // Emphasis / bold markers **x** __x__ *x* _x_ \u2192 x\n .replace(/(\\*\\*|__)(.*?)\\1/g, '$2')\n .replace(/(\\*|_)(.*?)\\1/g, '$2')\n // Inline code `x` \u2192 x\n .replace(/`([^`]*)`/g, '$1')\n // Collapse all whitespace (incl. newlines) to single spaces\n .replace(/\\s+/g, ' ')\n .trim()\n )\n}\n\n// A GFM delimiter row such as |---|:---:| (it must contain a pipe, so a lone --- is a rule)\nconst TABLE_DELIMITER_ROW = /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?\\s*$/\n\n/**\n * Split one pipe-table row into its cells. Escaped \\| stays a literal pipe.\n */\nfunction splitTableRow(line: string): string[] {\n return line\n .trim()\n .replace(/^\\|/, '')\n .replace(/(?<!\\\\)\\|$/, '')\n .split(/(?<!\\\\)\\|/)\n .map((cell) => cell.trim().replace(/\\\\\\|/g, '|'))\n}\n\n/**\n * Replace each GFM pipe table with one tab-separated line per row. Tabs paste into a\n * spreadsheet as columns and read as aligned text elsewhere, where the pipes and the\n * dashed separator row would not.\n */\nfunction flattenMarkdownTables(input: string): string {\n const lines = input.split('\\n')\n const out: string[] = []\n for (let i = 0; i < lines.length; i++) {\n const isTableStart =\n lines[i].includes('|') &&\n i + 1 < lines.length &&\n lines[i + 1].includes('|') &&\n TABLE_DELIMITER_ROW.test(lines[i + 1])\n if (!isTableStart) {\n out.push(lines[i])\n continue\n }\n out.push(splitTableRow(lines[i]).join('\\t'))\n i += 1 // skip the delimiter row\n while (i + 1 < lines.length && lines[i + 1].includes('|') && lines[i + 1].trim()) {\n i += 1\n out.push(splitTableRow(lines[i]).join('\\t'))\n }\n }\n return out.join('\\n')\n}\n\n/**\n * Line-preserving variant of markdownToPlainText for copying an answer as plain\n * text. Removes the same markup but keeps paragraph breaks and list lines, so a\n * pasted answer keeps its shape. Tables become tab-separated rows and horizontal\n * rules are dropped. List numbers and bullets stay because they are visible\n * content. Link URLs are kept in parentheses so nothing is lost.\n */\nexport function markdownToPlainTextBlocks(input: string | null | undefined): string {\n if (!input) return ''\n return (\n flattenMarkdownTables(input)\n .replace(/^[ \\t]*([-*_])([ \\t]*\\1){2,}[ \\t]*$/gm, '')\n .replace(/```[^\\n]*\\n?/g, '')\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g, '$1 ($2)')\n .replace(/^[ \\t]*#{1,6}[ \\t]+/gm, '')\n .replace(/^[ \\t]*>[ \\t]?/gm, '')\n // Emphasis only when the markers hug non-space text, so \"* bullet\" and\n // snake_case identifiers are left alone\n .replace(/(\\*\\*|__)(?=\\S)(.+?)(?<=\\S)\\1/g, '$2')\n .replace(/\\*(?=\\S)(.+?)(?<=\\S)\\*/g, '$1')\n .replace(/(^|[^\\w])_(?=\\S)(.+?)(?<=\\S)_(?!\\w)/g, '$1$2')\n .replace(/`([^`]*)`/g, '$1')\n .replace(/[ \\t]+\\n/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n )\n}\n"],
|
|
5
|
+
"mappings": "AAcO,SAAS,oBAAoB,OAA0C;AAC5E,MAAI,CAAC,MAAO,QAAO;AACnB,SACE,MAEG,QAAQ,iBAAiB,EAAE,EAE3B,QAAQ,2BAA2B,IAAI,EAEvC,QAAQ,0BAA0B,IAAI,EAGtC,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,kCAAkC,EAAE,EAE5C,QAAQ,qBAAqB,IAAI,EACjC,QAAQ,kBAAkB,IAAI,EAE9B,QAAQ,cAAc,IAAI,EAE1B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAEZ;AAGA,MAAM,sBAAsB;AAK5B,SAAS,cAAc,MAAwB;AAC7C,SAAO,KACJ,KAAK,EACL,QAAQ,OAAO,EAAE,EACjB,QAAQ,cAAc,EAAE,EACxB,MAAM,WAAW,EACjB,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,QAAQ,SAAS,GAAG,CAAC;AACpD;AAOA,SAAS,sBAAsB,OAAuB;AACpD,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,eACJ,MAAM,CAAC,EAAE,SAAS,GAAG,KACrB,IAAI,IAAI,MAAM,UACd,MAAM,IAAI,CAAC,EAAE,SAAS,GAAG,KACzB,oBAAoB,KAAK,MAAM,IAAI,CAAC,CAAC;AACvC,QAAI,CAAC,cAAc;AACjB,UAAI,KAAK,MAAM,CAAC,CAAC;AACjB;AAAA,IACF;AACA,QAAI,KAAK,cAAc,MAAM,CAAC,CAAC,EAAE,KAAK,GAAI,CAAC;AAC3C,SAAK;AACL,WAAO,IAAI,IAAI,MAAM,UAAU,MAAM,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG;AAChF,WAAK;AACL,UAAI,KAAK,cAAc,MAAM,CAAC,CAAC,EAAE,KAAK,GAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,IAAI,KAAK,IAAI;AACtB;AASO,SAAS,0BAA0B,OAA0C;AAClF,MAAI,CAAC,MAAO,QAAO;AACnB,SACE,sBAAsB,KAAK,EACxB,QAAQ,yCAAyC,EAAE,EACnD,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,2BAA2B,IAAI,EACvC,QAAQ,8BAA8B,SAAS,EAC/C,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,oBAAoB,EAAE,EAG9B,QAAQ,kCAAkC,IAAI,EAC9C,QAAQ,2BAA2B,IAAI,EACvC,QAAQ,wCAAwC,MAAM,EACtD,QAAQ,cAAc,IAAI,EAC1B,QAAQ,aAAa,IAAI,EACzB,QAAQ,WAAW,MAAM,EACzB,KAAK;AAEZ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
function isToastInteraction(event) {
|
|
2
|
+
const original = event.detail?.originalEvent;
|
|
3
|
+
const target = original?.target ?? event.target;
|
|
4
|
+
return target instanceof Element && target.closest("[data-sonner-toaster]") !== null;
|
|
5
|
+
}
|
|
6
|
+
export {
|
|
7
|
+
isToastInteraction
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=toast-interaction.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/toast-interaction.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * True when an interaction landed on a sonner toast. The toaster renders in its own\n * portal, outside every dialog, so Radix counts a click (or the focus move from\n * clicking a toast's close button) as an \"outside\" interaction and dismisses the open\n * dialog \u2014 e.g. clicking the \"Welcome\" toast closed the create-workspace dialog\n * underneath it.\n */\nexport function isToastInteraction(event: Event): boolean {\n const original = (event as CustomEvent<{ originalEvent?: Event }>).detail?.originalEvent\n const target = original?.target ?? event.target\n return target instanceof Element && target.closest('[data-sonner-toaster]') !== null\n}\n"],
|
|
5
|
+
"mappings": "AAOO,SAAS,mBAAmB,OAAuB;AACxD,QAAM,WAAY,MAAiD,QAAQ;AAC3E,QAAM,SAAS,UAAU,UAAU,MAAM;AACzC,SAAO,kBAAkB,WAAW,OAAO,QAAQ,uBAAuB,MAAM;AAClF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/lib/utils.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Core utility: `cn()` \u2014 merge class names with Tailwind-aware conflict\n * resolution (clsx + tailwind-merge). Copied faithfully from the ARBI app so the\n * promoted \"lego\" components style identically in a consumer app.\n */\n\nimport { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
class MailOfflineUnavailableError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "MailOfflineUnavailableError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
function accountPath(id) {
|
|
8
|
+
return `/accounts/${encodeURIComponent(id)}`;
|
|
9
|
+
}
|
|
10
|
+
function conversationsPath(accountId, folderId, query, cursor) {
|
|
11
|
+
const params = new URLSearchParams({
|
|
12
|
+
folder_id: folderId,
|
|
13
|
+
q: query,
|
|
14
|
+
...cursor ? { cursor } : {}
|
|
15
|
+
});
|
|
16
|
+
return `${accountPath(accountId)}/conversations?${params}`;
|
|
17
|
+
}
|
|
18
|
+
function threadPath(accountId, threadId, folderId) {
|
|
19
|
+
return `${accountPath(accountId)}/thread?${new URLSearchParams({ thread_id: threadId, folder_id: folderId })}`;
|
|
20
|
+
}
|
|
21
|
+
async function mailJson(fetch, path, init) {
|
|
22
|
+
const response = await fetch(path, init);
|
|
23
|
+
return response.status === 204 ? void 0 : response.json();
|
|
24
|
+
}
|
|
25
|
+
function createMailClient(fetch, overrides = {}) {
|
|
26
|
+
return {
|
|
27
|
+
fetch,
|
|
28
|
+
getPolicy: () => mailJson(fetch, "/policy"),
|
|
29
|
+
listAccounts: () => mailJson(fetch, "/accounts"),
|
|
30
|
+
listFolders: (account) => mailJson(fetch, `${accountPath(account.id)}/folders`),
|
|
31
|
+
listMessages: (account, folderId, query, cursor) => mailJson(
|
|
32
|
+
fetch,
|
|
33
|
+
`${accountPath(account.id)}/messages?${new URLSearchParams({ folder_id: folderId, q: query, ...cursor ? { cursor } : {} })}`
|
|
34
|
+
),
|
|
35
|
+
listConversations: (account, folderId, query, cursor) => mailJson(fetch, conversationsPath(account.id, folderId, query, cursor)),
|
|
36
|
+
getThread: (account, threadId, folderId) => mailJson(fetch, threadPath(account.id, threadId, folderId)),
|
|
37
|
+
getMessage: (account, messageId) => mailJson(fetch, `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`),
|
|
38
|
+
unlock: async () => {
|
|
39
|
+
},
|
|
40
|
+
...overrides
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function arbiMailClient(arbi, overrides = {}) {
|
|
44
|
+
return createMailClient((path, init) => arbi.mail.fetch(path, init), {
|
|
45
|
+
unlock: (account) => arbi.mail.unlockAccount(account),
|
|
46
|
+
...overrides
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function fileAttachment(file) {
|
|
50
|
+
const data = await new Promise((resolve, reject) => {
|
|
51
|
+
const reader = new FileReader();
|
|
52
|
+
reader.onload = () => resolve(String(reader.result).split(",")[1]);
|
|
53
|
+
reader.onerror = () => reject(new Error(`Could not read ${file.name}`));
|
|
54
|
+
reader.readAsDataURL(file);
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
id: "",
|
|
58
|
+
name: file.name,
|
|
59
|
+
content_type: file.type || "application/octet-stream",
|
|
60
|
+
size: file.size,
|
|
61
|
+
content_base64: data
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function defaultMailAlias(user) {
|
|
65
|
+
return [user?.given_name, user?.family_name].filter(Boolean).map(
|
|
66
|
+
(name) => name.normalize("NFKD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/[^a-z0-9]/g, "")
|
|
67
|
+
).filter(Boolean).join(".").slice(0, 63);
|
|
68
|
+
}
|
|
69
|
+
function nextAliasSuggestion(alias) {
|
|
70
|
+
const number = /(\d+)$/.exec(alias);
|
|
71
|
+
if (!number) return `${alias}2`;
|
|
72
|
+
return `${alias.slice(0, -number[1].length)}${Number(number[1]) + 1}`;
|
|
73
|
+
}
|
|
74
|
+
function isAliasTakenError(err) {
|
|
75
|
+
return "status" in err && err.status === 409;
|
|
76
|
+
}
|
|
77
|
+
function aliasTakenMessage(alias, suggestion, domain) {
|
|
78
|
+
return `${alias}@${domain} is already taken. Try ${suggestion}@${domain}: we check it when you confirm.`;
|
|
79
|
+
}
|
|
80
|
+
function mailDraftIdFromContent(content) {
|
|
81
|
+
try {
|
|
82
|
+
const meta = JSON.parse(content || "{}");
|
|
83
|
+
return typeof meta.mail_id === "string" && meta.mail_id ? meta.mail_id : void 0;
|
|
84
|
+
} catch {
|
|
85
|
+
return void 0;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
MailOfflineUnavailableError,
|
|
90
|
+
accountPath,
|
|
91
|
+
aliasTakenMessage,
|
|
92
|
+
arbiMailClient,
|
|
93
|
+
conversationsPath,
|
|
94
|
+
createMailClient,
|
|
95
|
+
defaultMailAlias,
|
|
96
|
+
fileAttachment,
|
|
97
|
+
isAliasTakenError,
|
|
98
|
+
mailDraftIdFromContent,
|
|
99
|
+
mailJson,
|
|
100
|
+
nextAliasSuggestion,
|
|
101
|
+
threadPath
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/mail/client.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The mail client the hooks and the mail blocks talk to.\n *\n * A {@link MailClient} is a transport (`fetch` under `/v1/mail`) plus the reads the screens make.\n * {@link createMailClient} builds one from any transport; {@link arbiMailClient} builds the default\n * one from an `Arbi` (used when the host configuration has no `mail`). A host that keeps mail offline,\n * bridges connector tokens or sends secure mail passes its own reads and extras as overrides.\n */\n\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport type {\n MailAccount,\n MailAttachment,\n MailCompose,\n MailConversationPage,\n MailFolder,\n MailMessage,\n MailPage,\n MailPolicy,\n MailThread,\n} from './types'\n\n/** Fetch a path under `/v1/mail` with authentication; rejects a non-2xx response (`status` set). */\nexport type MailFetch = (path: string, init?: RequestInit) => Promise<Response>\n\n/** Which draft body to open in the Word editor (`POST /drafts/editor`). */\nexport interface MailDraftEditorRequest {\n /** A saved draft (its room, or a new one seeded from it). */\n draftId?: string\n /** A room this person already has open: a reconnect, or a new message not saved yet. */\n roomId?: string\n /** What a new message's room starts from (a reply's quote). */\n text?: string\n html?: string | null\n /** The workspace open in the app: a new draft bills its project when the person may. */\n workspaceExtId?: string | null\n}\n\n/** A project an email's AI work is billed to: the person's own, or a matter they own or collaborate in. */\nexport interface MailProject {\n external_id: string\n name: string\n personal: boolean\n}\n\n/** A collaboration session on a draft's body: a document session's fields plus the draft. */\nexport interface MailDraftEditorSession {\n room_id: string\n token: string\n expires_in: number\n websocket_path: string\n can_edit: boolean\n identity: { actorId: string; name: string; role: 'human' | 'agent' }\n filename: string\n draft_id?: string | null\n /** The project ARBI's work on this email is billed to. */\n project?: MailProject | null\n}\n\nexport interface MailClient {\n fetch: MailFetch\n getPolicy(): Promise<MailPolicy>\n listAccounts(): Promise<MailAccount[]>\n listFolders(account: MailAccount): Promise<MailFolder[]>\n listMessages(\n account: MailAccount,\n folderId: string,\n query: string,\n cursor: string | null\n ): Promise<MailPage>\n /** One page of a folder's conversations, newest first (`null` cursor: the first page). */\n listConversations(\n account: MailAccount,\n folderId: string,\n query: string,\n cursor: string | null\n ): Promise<MailConversationPage>\n /** One conversation's messages, oldest first; `folderId`: the folder it was opened from. */\n getThread(account: MailAccount, threadId: string, folderId: string): Promise<MailThread>\n getMessage(account: MailAccount, messageId: string): Promise<MailMessage>\n /** Hand this session what the server needs to read the account (keys, credentials). */\n unlock(account: MailAccount): Promise<void>\n /**\n * The encrypted payload for `/secure/send` (native mail only). Absent: secure delivery is not\n * offered.\n */\n prepareSecureMail?(\n compose: MailCompose,\n account: MailAccount,\n requestId: string\n ): Promise<unknown>\n /** The URL that connects an OAuth mail provider, returning to `returnPath`. Absent: not offered. */\n authorizeOAuth?(vendor: string, returnPath: string): Promise<string>\n /**\n * Open a native draft's body in the Word editor, unlocking its room for this session with the\n * person's key when the server asks (423). Absent: the composer keeps its plain rich-text body.\n */\n openDraftEditor?(request: MailDraftEditorRequest): Promise<MailDraftEditorSession>\n}\n\n/** A read that needs the network and has no copy on this device (shown as a notice, not an error). */\nexport class MailOfflineUnavailableError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MailOfflineUnavailableError'\n }\n}\n\nexport function accountPath(id: string): string {\n return `/accounts/${encodeURIComponent(id)}`\n}\n\n/** A folder's conversations (`GET \u2026/conversations`). */\nexport function conversationsPath(\n accountId: string,\n folderId: string,\n query: string,\n cursor: string | null\n): string {\n const params = new URLSearchParams({\n folder_id: folderId,\n q: query,\n ...(cursor ? { cursor } : {}),\n })\n return `${accountPath(accountId)}/conversations?${params}`\n}\n\n/** One conversation (`GET \u2026/thread`): its id goes in the query, as it can be a Message-ID. */\nexport function threadPath(accountId: string, threadId: string, folderId: string): string {\n return `${accountPath(accountId)}/thread?${new URLSearchParams({ thread_id: threadId, folder_id: folderId })}`\n}\n\n/** A JSON mail call: the parsed body, or `undefined` for 204. */\nexport async function mailJson<T>(fetch: MailFetch, path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(path, init)\n return response.status === 204 ? (undefined as T) : (response.json() as Promise<T>)\n}\n\n/** A client over `fetch`; `overrides` replace any of its reads or add the optional extras. */\nexport function createMailClient(\n fetch: MailFetch,\n overrides: Partial<MailClient> = {}\n): MailClient {\n return {\n fetch,\n getPolicy: () => mailJson(fetch, '/policy'),\n listAccounts: () => mailJson(fetch, '/accounts'),\n listFolders: (account) => mailJson(fetch, `${accountPath(account.id)}/folders`),\n listMessages: (account, folderId, query, cursor) =>\n mailJson(\n fetch,\n `${accountPath(account.id)}/messages?${new URLSearchParams({ folder_id: folderId, q: query, ...(cursor ? { cursor } : {}) })}`\n ),\n listConversations: (account, folderId, query, cursor) =>\n mailJson(fetch, conversationsPath(account.id, folderId, query, cursor)),\n getThread: (account, threadId, folderId) =>\n mailJson(fetch, threadPath(account.id, threadId, folderId)),\n getMessage: (account, messageId) =>\n mailJson(fetch, `${accountPath(account.id)}/messages/${encodeURIComponent(messageId)}`),\n unlock: async () => {},\n ...overrides,\n }\n}\n\n/**\n * The client on the `Arbi` session's mail transport (`arbi.mail`). The native inbox is unlocked\n * with the signed-in user's keys before each read (so mail that arrived since is readable too);\n * unlocking a connected account bridges its connector tokens or its sealed credentials.\n * `overrides` replace any of its reads (the default client in `useMailClient` keeps them working\n * offline with `offlineMailReads`).\n */\nexport function arbiMailClient(arbi: Arbi, overrides: Partial<MailClient> = {}): MailClient {\n return createMailClient((path, init) => arbi.mail.fetch(path, init), {\n unlock: (account) => arbi.mail.unlockAccount(account),\n ...overrides,\n })\n}\n\n/** A picked file as an attachment (its content base64-encoded). */\nexport async function fileAttachment(file: File): Promise<MailAttachment> {\n const data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result).split(',')[1])\n reader.onerror = () => reject(new Error(`Could not read ${file.name}`))\n reader.readAsDataURL(file)\n })\n return {\n id: '',\n name: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size,\n content_base64: data,\n }\n}\n\n/** The address suggested for a user's native inbox: given name and family name, lowercase ASCII, dot-joined. */\nexport function defaultMailAlias(\n user?: { given_name?: string | null; family_name?: string | null } | null\n): string {\n return [user?.given_name, user?.family_name]\n .filter(Boolean)\n .map((name) =>\n name!\n .normalize('NFKD')\n .replace(/[\u0300-\u036F]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n )\n .filter(Boolean)\n .join('.')\n .slice(0, 63)\n}\n\n/**\n * The alias to try after `alias` is taken: `grace.okoye` \u2192 `grace.okoye2`, `grace.okoye2` \u2192 `grace.okoye3`.\n * The server is the only judge of availability, so this is a guess to offer, not a promise.\n */\nexport function nextAliasSuggestion(alias: string): string {\n const number = /(\\d+)$/.exec(alias)\n if (!number) return `${alias}2`\n return `${alias.slice(0, -number[1].length)}${Number(number[1]) + 1}`\n}\n\n/** True when the claim failed because the address is already in use (HTTP 409). */\nexport function isAliasTakenError(err: Error): boolean {\n return 'status' in err && err.status === 409\n}\n\n/**\n * Shown after `alias` is taken. The suggestion is unverified, so the copy must not say it is free:\n * the server only checks availability when the user confirms the claim.\n */\nexport function aliasTakenMessage(alias: string, suggestion: string, domain: string): string {\n return `${alias}@${domain} is already taken. Try ${suggestion}@${domain}: we check it when you confirm.`\n}\n\n/** The draft a `mail_draft_ready` notification is about (its content is `{\"mail_id\": \u2026}`). */\nexport function mailDraftIdFromContent(content: string | null | undefined): string | undefined {\n try {\n const meta = JSON.parse(content || '{}') as { mail_id?: unknown }\n return typeof meta.mail_id === 'string' && meta.mail_id ? meta.mail_id : undefined\n } catch {\n return undefined\n }\n}\n"],
|
|
5
|
+
"mappings": "AAqGO,MAAM,oCAAoC,MAAM;AAAA,EACrD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,YAAY,IAAoB;AAC9C,SAAO,aAAa,mBAAmB,EAAE,CAAC;AAC5C;AAGO,SAAS,kBACd,WACA,UACA,OACA,QACQ;AACR,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,WAAW;AAAA,IACX,GAAG;AAAA,IACH,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B,CAAC;AACD,SAAO,GAAG,YAAY,SAAS,CAAC,kBAAkB,MAAM;AAC1D;AAGO,SAAS,WAAW,WAAmB,UAAkB,UAA0B;AACxF,SAAO,GAAG,YAAY,SAAS,CAAC,WAAW,IAAI,gBAAgB,EAAE,WAAW,UAAU,WAAW,SAAS,CAAC,CAAC;AAC9G;AAGA,eAAsB,SAAY,OAAkB,MAAc,MAAgC;AAChG,QAAM,WAAW,MAAM,MAAM,MAAM,IAAI;AACvC,SAAO,SAAS,WAAW,MAAO,SAAmB,SAAS,KAAK;AACrE;AAGO,SAAS,iBACd,OACA,YAAiC,CAAC,GACtB;AACZ,SAAO;AAAA,IACL;AAAA,IACA,WAAW,MAAM,SAAS,OAAO,SAAS;AAAA,IAC1C,cAAc,MAAM,SAAS,OAAO,WAAW;AAAA,IAC/C,aAAa,CAAC,YAAY,SAAS,OAAO,GAAG,YAAY,QAAQ,EAAE,CAAC,UAAU;AAAA,IAC9E,cAAc,CAAC,SAAS,UAAU,OAAO,WACvC;AAAA,MACE;AAAA,MACA,GAAG,YAAY,QAAQ,EAAE,CAAC,aAAa,IAAI,gBAAgB,EAAE,WAAW,UAAU,GAAG,OAAO,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC,CAAC;AAAA,IAC9H;AAAA,IACF,mBAAmB,CAAC,SAAS,UAAU,OAAO,WAC5C,SAAS,OAAO,kBAAkB,QAAQ,IAAI,UAAU,OAAO,MAAM,CAAC;AAAA,IACxE,WAAW,CAAC,SAAS,UAAU,aAC7B,SAAS,OAAO,WAAW,QAAQ,IAAI,UAAU,QAAQ,CAAC;AAAA,IAC5D,YAAY,CAAC,SAAS,cACpB,SAAS,OAAO,GAAG,YAAY,QAAQ,EAAE,CAAC,aAAa,mBAAmB,SAAS,CAAC,EAAE;AAAA,IACxF,QAAQ,YAAY;AAAA,IAAC;AAAA,IACrB,GAAG;AAAA,EACL;AACF;AASO,SAAS,eAAe,MAAY,YAAiC,CAAC,GAAe;AAC1F,SAAO,iBAAiB,CAAC,MAAM,SAAS,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG;AAAA,IACnE,QAAQ,CAAC,YAAY,KAAK,KAAK,cAAc,OAAO;AAAA,IACpD,GAAG;AAAA,EACL,CAAC;AACH;AAGA,eAAsB,eAAe,MAAqC;AACxE,QAAM,OAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC1D,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACjE,WAAO,UAAU,MAAM,OAAO,IAAI,MAAM,kBAAkB,KAAK,IAAI,EAAE,CAAC;AACtE,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,KAAK;AAAA,IACX,cAAc,KAAK,QAAQ;AAAA,IAC3B,MAAM,KAAK;AAAA,IACX,gBAAgB;AAAA,EAClB;AACF;AAGO,SAAS,iBACd,MACQ;AACR,SAAO,CAAC,MAAM,YAAY,MAAM,WAAW,EACxC,OAAO,OAAO,EACd;AAAA,IAAI,CAAC,SACJ,KACG,UAAU,MAAM,EAChB,QAAQ,UAAU,EAAE,EACpB,YAAY,EACZ,QAAQ,cAAc,EAAE;AAAA,EAC7B,EACC,OAAO,OAAO,EACd,KAAK,GAAG,EACR,MAAM,GAAG,EAAE;AAChB;AAMO,SAAS,oBAAoB,OAAuB;AACzD,QAAM,SAAS,SAAS,KAAK,KAAK;AAClC,MAAI,CAAC,OAAQ,QAAO,GAAG,KAAK;AAC5B,SAAO,GAAG,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC;AACrE;AAGO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,YAAY,OAAO,IAAI,WAAW;AAC3C;AAMO,SAAS,kBAAkB,OAAe,YAAoB,QAAwB;AAC3F,SAAO,GAAG,KAAK,IAAI,MAAM,0BAA0B,UAAU,IAAI,MAAM;AACzE;AAGO,SAAS,uBAAuB,SAAwD;AAC7F,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,WAAW,IAAI;AACvC,WAAO,OAAO,KAAK,YAAY,YAAY,KAAK,UAAU,KAAK,UAAU;AAAA,EAC3E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { onlineManager } from "@tanstack/react-query";
|
|
2
|
+
import { getDocumentTitle } from "../entities/index.js";
|
|
3
|
+
import { getOfflineDocument, loadOfflineDocument } from "../documents/offline-documents.js";
|
|
4
|
+
import { fileAttachment } from "./client.js";
|
|
5
|
+
async function documentMailAttachment(arbi, doc, maxBytes, version) {
|
|
6
|
+
const older = version && version !== (doc.current_version ?? 1) ? version : null;
|
|
7
|
+
if (!onlineManager.isOnline() && !older) return offlineDocumentAttachment(doc, maxBytes);
|
|
8
|
+
const failed = (cause) => new Error(`Could not download ${getDocumentTitle(doc, "the document")}`, { cause });
|
|
9
|
+
const response = await arbi.documents.download(doc.external_id, older ?? void 0).catch((error) => {
|
|
10
|
+
throw failed(error);
|
|
11
|
+
});
|
|
12
|
+
if (!response.ok) throw failed();
|
|
13
|
+
const blob = await response.blob();
|
|
14
|
+
if (blob.size > maxBytes) throw new Error("Document exceeds the email attachment limit");
|
|
15
|
+
const fileName = older ? doc.versions?.find((v) => v.n === older)?.file_name ?? doc.file_name : doc.file_name;
|
|
16
|
+
return fileAttachment(
|
|
17
|
+
new File([blob], fileName || getDocumentTitle(doc, "document"), { type: blob.type })
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
async function offlineDocumentAttachment(doc, maxBytes) {
|
|
21
|
+
const title = getDocumentTitle(doc, "This document");
|
|
22
|
+
const record = await getOfflineDocument(doc.external_id);
|
|
23
|
+
const isPdf = /\.pdf$/i.test(doc.file_name ?? "");
|
|
24
|
+
if (!record || record.kind === "pdf" && !isPdf)
|
|
25
|
+
throw new Error(
|
|
26
|
+
`${title} isn't available offline. Make it available offline first, or attach it when you're back online.`
|
|
27
|
+
);
|
|
28
|
+
const blob = await loadOfflineDocument(doc.external_id);
|
|
29
|
+
if (!blob) throw new Error(`${title} isn't available offline.`);
|
|
30
|
+
if (blob.size > maxBytes) throw new Error("Document exceeds the email attachment limit");
|
|
31
|
+
return fileAttachment(
|
|
32
|
+
new File([blob], doc.file_name || getDocumentTitle(doc, "document"), { type: blob.type })
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
documentMailAttachment
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=document-attachment.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/mail/document-attachment.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * A workspace document as a mail attachment: its file (the current version, or an older one), on\n * the session's `Arbi`. Offline, the copy kept on this device (\"Make available offline\") is used.\n */\n\nimport { onlineManager } from '@tanstack/react-query'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { getDocumentTitle } from '../entities'\nimport type { WorkspaceDocument } from '../documents/documents-cache'\nimport { getOfflineDocument, loadOfflineDocument } from '../documents/offline-documents'\nimport { fileAttachment } from './client'\nimport type { MailAttachment } from './types'\n\n/** A document as a mail attachment: its current version, or `version` (an older one). */\nexport async function documentMailAttachment(\n arbi: Arbi,\n doc: WorkspaceDocument,\n maxBytes: number,\n version?: number | null\n): Promise<MailAttachment> {\n const older = version && version !== (doc.current_version ?? 1) ? version : null\n // The offline copy is the current version's.\n if (!onlineManager.isOnline() && !older) return offlineDocumentAttachment(doc, maxBytes)\n const failed = (cause?: unknown) =>\n new Error(`Could not download ${getDocumentTitle(doc, 'the document')}`, { cause })\n // The SDK rejects a refused download (non-2xx); say which document, not the HTTP status.\n const response = await arbi.documents\n .download(doc.external_id, older ?? undefined)\n .catch((error: unknown) => {\n throw failed(error)\n })\n if (!response.ok) throw failed()\n const blob = await response.blob()\n if (blob.size > maxBytes) throw new Error('Document exceeds the email attachment limit')\n const fileName = older\n ? (doc.versions?.find((v) => v.n === older)?.file_name ?? doc.file_name)\n : doc.file_name\n return fileAttachment(\n new File([blob], fileName || getDocumentTitle(doc, 'document'), { type: blob.type })\n )\n}\n\n/**\n * Offline, a workspace document can be attached when its original file is saved on this device\n * (\"Make available offline\"). Only its PDF preview being saved isn't enough for a non-PDF document:\n * the recipient would get a different file than the one chosen, so that is refused with the reason.\n */\nasync function offlineDocumentAttachment(\n doc: WorkspaceDocument,\n maxBytes: number\n): Promise<MailAttachment> {\n const title = getDocumentTitle(doc, 'This document')\n const record = await getOfflineDocument(doc.external_id)\n const isPdf = /\\.pdf$/i.test(doc.file_name ?? '')\n if (!record || (record.kind === 'pdf' && !isPdf))\n throw new Error(\n `${title} isn't available offline. Make it available offline first, or attach it when you're back online.`\n )\n const blob = await loadOfflineDocument(doc.external_id)\n if (!blob) throw new Error(`${title} isn't available offline.`)\n if (blob.size > maxBytes) throw new Error('Document exceeds the email attachment limit')\n return fileAttachment(\n new File([blob], doc.file_name || getDocumentTitle(doc, 'document'), { type: blob.type })\n )\n}\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,qBAAqB;AAE9B,SAAS,wBAAwB;AAEjC,SAAS,oBAAoB,2BAA2B;AACxD,SAAS,sBAAsB;AAI/B,eAAsB,uBACpB,MACA,KACA,UACA,SACyB;AACzB,QAAM,QAAQ,WAAW,aAAa,IAAI,mBAAmB,KAAK,UAAU;AAE5E,MAAI,CAAC,cAAc,SAAS,KAAK,CAAC,MAAO,QAAO,0BAA0B,KAAK,QAAQ;AACvF,QAAM,SAAS,CAAC,UACd,IAAI,MAAM,sBAAsB,iBAAiB,KAAK,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC;AAEpF,QAAM,WAAW,MAAM,KAAK,UACzB,SAAS,IAAI,aAAa,SAAS,MAAS,EAC5C,MAAM,CAAC,UAAmB;AACzB,UAAM,OAAO,KAAK;AAAA,EACpB,CAAC;AACH,MAAI,CAAC,SAAS,GAAI,OAAM,OAAO;AAC/B,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,KAAK,OAAO,SAAU,OAAM,IAAI,MAAM,6CAA6C;AACvF,QAAM,WAAW,QACZ,IAAI,UAAU,KAAK,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,aAAa,IAAI,YAC5D,IAAI;AACR,SAAO;AAAA,IACL,IAAI,KAAK,CAAC,IAAI,GAAG,YAAY,iBAAiB,KAAK,UAAU,GAAG,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,EACrF;AACF;AAOA,eAAe,0BACb,KACA,UACyB;AACzB,QAAM,QAAQ,iBAAiB,KAAK,eAAe;AACnD,QAAM,SAAS,MAAM,mBAAmB,IAAI,WAAW;AACvD,QAAM,QAAQ,UAAU,KAAK,IAAI,aAAa,EAAE;AAChD,MAAI,CAAC,UAAW,OAAO,SAAS,SAAS,CAAC;AACxC,UAAM,IAAI;AAAA,MACR,GAAG,KAAK;AAAA,IACV;AACF,QAAM,OAAO,MAAM,oBAAoB,IAAI,WAAW;AACtD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,GAAG,KAAK,2BAA2B;AAC9D,MAAI,KAAK,OAAO,SAAU,OAAM,IAAI,MAAM,6CAA6C;AACvF,SAAO;AAAA,IACL,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,aAAa,iBAAiB,KAAK,UAAU,GAAG,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,EAC1F;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { logger } from "@arbidocs/client";
|
|
4
|
+
import { mail as mailOps } from "@arbidocs/sdk/browser";
|
|
5
|
+
import { useArbiHost } from "../host/config.js";
|
|
6
|
+
import { inWorkspace, primeOnArbi } from "../queued-writes.js";
|
|
7
|
+
import { mailQueryKeys } from "../query-keys.js";
|
|
8
|
+
import { useMailOnline } from "./hooks.js";
|
|
9
|
+
import { useMailClient } from "./useMailClient.js";
|
|
10
|
+
import { mailConversationKey } from "./threads.js";
|
|
11
|
+
const NO_PRIMER = () => void 0;
|
|
12
|
+
async function sendMailFile(fetch, prime, account, messageId, request) {
|
|
13
|
+
const { threadId } = request;
|
|
14
|
+
return inWorkspace(prime, request.workspaceExtId, async () => {
|
|
15
|
+
if (!threadId) return mailOps.fileMessage(fetch, messageId, request.workspaceExtId, account.id);
|
|
16
|
+
const { filed } = await mailOps.fileConversation(fetch, {
|
|
17
|
+
accountId: account.id,
|
|
18
|
+
threadId,
|
|
19
|
+
messageIds: request.messageIds?.length ? request.messageIds : [messageId],
|
|
20
|
+
workspaceExtId: request.workspaceExtId
|
|
21
|
+
});
|
|
22
|
+
return filed.find((f) => f.message_id === messageId) ?? filed[0];
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function useMailWorkspacePrimer() {
|
|
26
|
+
const { arbi } = useArbiHost();
|
|
27
|
+
return arbi ? primeOnArbi(arbi) : NO_PRIMER;
|
|
28
|
+
}
|
|
29
|
+
function useMailFiling(account, messageIds, threadIds, options = {}) {
|
|
30
|
+
const { client } = useMailClient();
|
|
31
|
+
const isOnline = useMailOnline();
|
|
32
|
+
return useQuery({
|
|
33
|
+
queryKey: mailQueryKeys.filing(account?.id, messageIds, threadIds),
|
|
34
|
+
queryFn: () => mailOps.getFilingState(client.fetch, { accountId: account.id, messageIds, threadIds }),
|
|
35
|
+
enabled: !!account && isOnline && (messageIds.length > 0 || threadIds.length > 0) && (options.enabled ?? true),
|
|
36
|
+
retry: false
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function useStopMailFilingRule() {
|
|
40
|
+
const { client } = useMailClient();
|
|
41
|
+
const queryClient = useQueryClient();
|
|
42
|
+
return useMutation({
|
|
43
|
+
mutationFn: ({ ruleId, threadId }) => mailOps.stopFilingConversation(client.fetch, ruleId, threadId),
|
|
44
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: mailQueryKeys.allFiling() })
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function useNativeMailFiling(options = {}) {
|
|
48
|
+
const { client, enabled } = useMailClient();
|
|
49
|
+
return useQuery({
|
|
50
|
+
queryKey: mailQueryKeys.nativeFiling(),
|
|
51
|
+
queryFn: () => mailOps.listNativeFiling(client.fetch),
|
|
52
|
+
enabled: enabled && (options.enabled ?? true),
|
|
53
|
+
retry: false
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function useSetNativeMailFiling() {
|
|
57
|
+
const { client } = useMailClient();
|
|
58
|
+
const prime = useMailWorkspacePrimer();
|
|
59
|
+
const queryClient = useQueryClient();
|
|
60
|
+
return useMutation({
|
|
61
|
+
mutationFn: (input) => inWorkspace(prime, input.workspaceExtId, () => mailOps.setNativeFiling(client.fetch, input)),
|
|
62
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: mailQueryKeys.allFiling() })
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function useFileWaitingNativeMail() {
|
|
66
|
+
const { arbi } = useArbiHost();
|
|
67
|
+
const queryClient = useQueryClient();
|
|
68
|
+
return useMutation({
|
|
69
|
+
mutationFn: (workspaceExtId) => {
|
|
70
|
+
if (!arbi) throw new Error("Filing needs a signed-in session");
|
|
71
|
+
return arbi.mail.fileWaiting(workspaceExtId);
|
|
72
|
+
},
|
|
73
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: mailQueryKeys.allFiling() })
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function useConnectedMailFiling(account, messages) {
|
|
77
|
+
const { client, enabled } = useMailClient();
|
|
78
|
+
const isOnline = useMailOnline();
|
|
79
|
+
const prime = useMailWorkspacePrimer();
|
|
80
|
+
const queryClient = useQueryClient();
|
|
81
|
+
const tried = useRef(/* @__PURE__ */ new Set());
|
|
82
|
+
const run = useCallback(
|
|
83
|
+
async (connected, listed) => {
|
|
84
|
+
const fresh = listed.filter((m) => m.thread_id && !tried.current.has(m.id));
|
|
85
|
+
if (!fresh.length) return;
|
|
86
|
+
for (const m of fresh) tried.current.add(m.id);
|
|
87
|
+
const threadIds = [...new Set(fresh.map(mailConversationKey))];
|
|
88
|
+
const state = await mailOps.getFilingState(client.fetch, {
|
|
89
|
+
accountId: connected.id,
|
|
90
|
+
messageIds: fresh.map((m) => m.id),
|
|
91
|
+
threadIds
|
|
92
|
+
});
|
|
93
|
+
const filed = new Set(state.filed.map((f) => f.message_id));
|
|
94
|
+
const rules = new Map(state.rules.map((r) => [r.thread_id, r]));
|
|
95
|
+
let added = 0;
|
|
96
|
+
for (const message of fresh) {
|
|
97
|
+
const rule = rules.get(mailConversationKey(message));
|
|
98
|
+
if (!rule || filed.has(message.id)) continue;
|
|
99
|
+
try {
|
|
100
|
+
await sendMailFile(client.fetch, prime, connected, message.id, {
|
|
101
|
+
workspaceExtId: rule.workspace_ext_id,
|
|
102
|
+
threadId: mailConversationKey(message),
|
|
103
|
+
messageIds: [message.id]
|
|
104
|
+
});
|
|
105
|
+
added++;
|
|
106
|
+
} catch (error) {
|
|
107
|
+
logger.warn("[mail] could not add a message to its conversation\u2019s workspace", error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (added) await queryClient.invalidateQueries({ queryKey: mailQueryKeys.allFiling() });
|
|
111
|
+
},
|
|
112
|
+
[client, prime, queryClient]
|
|
113
|
+
);
|
|
114
|
+
useEffect(() => {
|
|
115
|
+
if (!enabled || !isOnline || !account || account.provider === "native" || !messages?.length)
|
|
116
|
+
return;
|
|
117
|
+
run(account, messages).catch(
|
|
118
|
+
(error) => logger.warn("[mail] could not add new mail to its conversation\u2019s workspace", error)
|
|
119
|
+
);
|
|
120
|
+
}, [account, messages, enabled, isOnline, run]);
|
|
121
|
+
}
|
|
122
|
+
export {
|
|
123
|
+
sendMailFile,
|
|
124
|
+
useConnectedMailFiling,
|
|
125
|
+
useFileWaitingNativeMail,
|
|
126
|
+
useMailFiling,
|
|
127
|
+
useMailWorkspacePrimer,
|
|
128
|
+
useNativeMailFiling,
|
|
129
|
+
useSetNativeMailFiling,
|
|
130
|
+
useStopMailFilingRule
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=filing.js.map
|