@arbidocs/react 0.5.111 → 0.5.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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.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.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.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.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.js +290 -10
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.js +61 -271
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/chunk-ZM6N7YZH.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
import { measureVisiblePages } from "./page-scroll.js";
|
|
3
|
+
const PAGE_UPDATE_DEBOUNCE_MS = 10;
|
|
4
|
+
const MIN_VISIBILITY_THRESHOLD = 0.15;
|
|
5
|
+
const INTERSECTION_THRESHOLDS = [0, 0.25, 0.5, 0.75, 1];
|
|
6
|
+
function usePageIntersectionObserver({
|
|
7
|
+
containerRef,
|
|
8
|
+
scrollCompleteRef,
|
|
9
|
+
isEnabled,
|
|
10
|
+
getPageElements,
|
|
11
|
+
getPageNumber,
|
|
12
|
+
onPageChange,
|
|
13
|
+
onVisibilityUpdate,
|
|
14
|
+
observeKey
|
|
15
|
+
}) {
|
|
16
|
+
const latest = useRef({ getPageElements, getPageNumber, onPageChange, onVisibilityUpdate });
|
|
17
|
+
latest.current = { getPageElements, getPageNumber, onPageChange, onVisibilityUpdate };
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (!isEnabled || !containerRef.current) return;
|
|
20
|
+
const container = containerRef.current;
|
|
21
|
+
let lastReportedPage = null;
|
|
22
|
+
let updateTimeout = null;
|
|
23
|
+
let frame = 0;
|
|
24
|
+
const evaluate = () => {
|
|
25
|
+
const root = container.getBoundingClientRect();
|
|
26
|
+
const pages = [];
|
|
27
|
+
for (const el of latest.current.getPageElements()) {
|
|
28
|
+
const n = latest.current.getPageNumber(el);
|
|
29
|
+
if (n <= 0) continue;
|
|
30
|
+
const r = el.getBoundingClientRect();
|
|
31
|
+
pages.push({ n, top: r.top, bottom: r.bottom });
|
|
32
|
+
}
|
|
33
|
+
const { page, score, visibility } = measureVisiblePages(pages, root.top, root.bottom);
|
|
34
|
+
if (scrollCompleteRef.current && page !== null && page !== lastReportedPage && score > MIN_VISIBILITY_THRESHOLD) {
|
|
35
|
+
lastReportedPage = page;
|
|
36
|
+
latest.current.onPageChange(page);
|
|
37
|
+
}
|
|
38
|
+
latest.current.onVisibilityUpdate?.(visibility);
|
|
39
|
+
};
|
|
40
|
+
const observer = new IntersectionObserver(
|
|
41
|
+
() => {
|
|
42
|
+
if (updateTimeout) clearTimeout(updateTimeout);
|
|
43
|
+
updateTimeout = setTimeout(evaluate, PAGE_UPDATE_DEBOUNCE_MS);
|
|
44
|
+
},
|
|
45
|
+
{ root: container, threshold: INTERSECTION_THRESHOLDS }
|
|
46
|
+
);
|
|
47
|
+
const onScroll = () => {
|
|
48
|
+
if (!frame) {
|
|
49
|
+
frame = requestAnimationFrame(() => {
|
|
50
|
+
frame = 0;
|
|
51
|
+
evaluate();
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
container.addEventListener("scroll", onScroll, { passive: true });
|
|
56
|
+
latest.current.getPageElements().forEach((element) => observer.observe(element));
|
|
57
|
+
return () => {
|
|
58
|
+
observer.disconnect();
|
|
59
|
+
container.removeEventListener("scroll", onScroll);
|
|
60
|
+
if (updateTimeout) clearTimeout(updateTimeout);
|
|
61
|
+
if (frame) cancelAnimationFrame(frame);
|
|
62
|
+
};
|
|
63
|
+
}, [containerRef, scrollCompleteRef, isEnabled, observeKey]);
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
usePageIntersectionObserver
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=usePageIntersectionObserver.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/viewers/usePageIntersectionObserver.ts"],
|
|
4
|
+
"sourcesContent": ["import { useEffect, useRef, RefObject } from 'react'\nimport { measureVisiblePages, type PageBox } from './page-scroll'\n\n// Page synchronization constants\nconst PAGE_UPDATE_DEBOUNCE_MS = 10 // Delay before updating page number after scroll (10ms)\nconst MIN_VISIBILITY_THRESHOLD = 0.15 // Minimum visibility (15%) to consider page \"visible\"\nconst INTERSECTION_THRESHOLDS = [0, 0.25, 0.5, 0.75, 1.0] // IntersectionObserver thresholds\n\ninterface UsePageIntersectionObserverOptions {\n /** Container element that scrolls */\n containerRef: RefObject<HTMLElement | null>\n /** Ref tracking whether initial scroll has completed */\n scrollCompleteRef: RefObject<boolean>\n /** Whether the observer should be active */\n isEnabled: boolean\n /** Function to get page elements to observe */\n getPageElements: () => Element[]\n /** Function to extract page number from element */\n getPageNumber: (element: Element) => number\n /** Callback when page number changes */\n onPageChange: (pageNumber: number) => void\n /** Optional callback with visibility data for custom logic (e.g., lazy loading) */\n onVisibilityUpdate?: (visibilityMap: Map<number, number>) => void\n /**\n * Re-subscribe when this changes (the set of page elements: page count, first layout). Callers\n * may pass fresh inline callbacks every render: they are read through refs and never cause a\n * re-subscribe (a re-subscribe re-delivers every page and, with a state-setting callback, loops).\n */\n observeKey?: unknown\n}\n\n/**\n * Custom hook to track the visible page of a page-stacked viewer.\n * Used for bidirectional page synchronization in document viewers.\n *\n * IntersectionObserver wakes it when pages enter or leave the viewport; a passive scroll listener\n * (at most one measurement per frame) keeps it current in between. The page itself is chosen from\n * live geometry (see `measureVisiblePages`).\n */\nexport function usePageIntersectionObserver({\n containerRef,\n scrollCompleteRef,\n isEnabled,\n getPageElements,\n getPageNumber,\n onPageChange,\n onVisibilityUpdate,\n observeKey,\n}: UsePageIntersectionObserverOptions) {\n const latest = useRef({ getPageElements, getPageNumber, onPageChange, onVisibilityUpdate })\n latest.current = { getPageElements, getPageNumber, onPageChange, onVisibilityUpdate }\n\n useEffect(() => {\n if (!isEnabled || !containerRef.current) return\n\n const container = containerRef.current\n let lastReportedPage: number | null = null\n let updateTimeout: ReturnType<typeof setTimeout> | null = null\n let frame = 0\n\n // Read the live geometry rather than IntersectionObserver ratios: a ratio is relative to the\n // page's own height, so a zoomed page much taller than the screen never reaches the threshold\n // (and ratios only update on a few crossings, which is too coarse for tall pages).\n const evaluate = () => {\n const root = container.getBoundingClientRect()\n const pages: PageBox[] = []\n for (const el of latest.current.getPageElements()) {\n const n = latest.current.getPageNumber(el)\n if (n <= 0) continue\n const r = el.getBoundingClientRect()\n pages.push({ n, top: r.top, bottom: r.bottom })\n }\n const { page, score, visibility } = measureVisiblePages(pages, root.top, root.bottom)\n\n // Only report when the scroll is complete and the page changed\n if (\n scrollCompleteRef.current &&\n page !== null &&\n page !== lastReportedPage &&\n score > MIN_VISIBILITY_THRESHOLD\n ) {\n lastReportedPage = page\n latest.current.onPageChange(page)\n }\n\n // Call optional visibility update callback (e.g., for lazy loading)\n latest.current.onVisibilityUpdate?.(visibility)\n }\n\n const observer = new IntersectionObserver(\n () => {\n // Debounce updates\n if (updateTimeout) clearTimeout(updateTimeout)\n updateTimeout = setTimeout(evaluate, PAGE_UPDATE_DEBOUNCE_MS)\n },\n { root: container, threshold: INTERSECTION_THRESHOLDS }\n )\n // At most one measurement per frame while scrolling; nothing is stored in React state here.\n const onScroll = () => {\n if (!frame) {\n frame = requestAnimationFrame(() => {\n frame = 0\n evaluate()\n })\n }\n }\n container.addEventListener('scroll', onScroll, { passive: true })\n\n // Observe all page elements\n latest.current.getPageElements().forEach((element) => observer.observe(element))\n\n return () => {\n observer.disconnect()\n container.removeEventListener('scroll', onScroll)\n if (updateTimeout) clearTimeout(updateTimeout)\n if (frame) cancelAnimationFrame(frame)\n }\n }, [containerRef, scrollCompleteRef, isEnabled, observeKey])\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,WAAW,cAAyB;AAC7C,SAAS,2BAAyC;AAGlD,MAAM,0BAA0B;AAChC,MAAM,2BAA2B;AACjC,MAAM,0BAA0B,CAAC,GAAG,MAAM,KAAK,MAAM,CAAG;AAiCjD,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,SAAS,OAAO,EAAE,iBAAiB,eAAe,cAAc,mBAAmB,CAAC;AAC1F,SAAO,UAAU,EAAE,iBAAiB,eAAe,cAAc,mBAAmB;AAEpF,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,aAAa,QAAS;AAEzC,UAAM,YAAY,aAAa;AAC/B,QAAI,mBAAkC;AACtC,QAAI,gBAAsD;AAC1D,QAAI,QAAQ;AAKZ,UAAM,WAAW,MAAM;AACrB,YAAM,OAAO,UAAU,sBAAsB;AAC7C,YAAM,QAAmB,CAAC;AAC1B,iBAAW,MAAM,OAAO,QAAQ,gBAAgB,GAAG;AACjD,cAAM,IAAI,OAAO,QAAQ,cAAc,EAAE;AACzC,YAAI,KAAK,EAAG;AACZ,cAAM,IAAI,GAAG,sBAAsB;AACnC,cAAM,KAAK,EAAE,GAAG,KAAK,EAAE,KAAK,QAAQ,EAAE,OAAO,CAAC;AAAA,MAChD;AACA,YAAM,EAAE,MAAM,OAAO,WAAW,IAAI,oBAAoB,OAAO,KAAK,KAAK,KAAK,MAAM;AAGpF,UACE,kBAAkB,WAClB,SAAS,QACT,SAAS,oBACT,QAAQ,0BACR;AACA,2BAAmB;AACnB,eAAO,QAAQ,aAAa,IAAI;AAAA,MAClC;AAGA,aAAO,QAAQ,qBAAqB,UAAU;AAAA,IAChD;AAEA,UAAM,WAAW,IAAI;AAAA,MACnB,MAAM;AAEJ,YAAI,cAAe,cAAa,aAAa;AAC7C,wBAAgB,WAAW,UAAU,uBAAuB;AAAA,MAC9D;AAAA,MACA,EAAE,MAAM,WAAW,WAAW,wBAAwB;AAAA,IACxD;AAEA,UAAM,WAAW,MAAM;AACrB,UAAI,CAAC,OAAO;AACV,gBAAQ,sBAAsB,MAAM;AAClC,kBAAQ;AACR,mBAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AACA,cAAU,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAGhE,WAAO,QAAQ,gBAAgB,EAAE,QAAQ,CAAC,YAAY,SAAS,QAAQ,OAAO,CAAC;AAE/E,WAAO,MAAM;AACX,eAAS,WAAW;AACpB,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,UAAI,cAAe,cAAa,aAAa;AAC7C,UAAI,MAAO,sBAAqB,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,cAAc,mBAAmB,WAAW,UAAU,CAAC;AAC7D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
function inlineFootnotes(content, footnotes) {
|
|
3
|
+
if (!footnotes || Object.keys(footnotes).length === 0) return content;
|
|
4
|
+
let result = content;
|
|
5
|
+
result = result.replace(/^\[\^[^\]]+\]:[ \t]+.*(?:\n(?:[ \t]+.+)?)*/gm, "");
|
|
6
|
+
result = result.replace(/\[\^([^\]]+)\]/g, (_match, key) => {
|
|
7
|
+
const fnContent = footnotes[key];
|
|
8
|
+
if (!fnContent) return `<sup class="fn-ref">${key}</sup>`;
|
|
9
|
+
const escaped = fnContent.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
10
|
+
return `<sup class="fn-ref">${key}</sup><span class="fn-inline" title="${escaped}">[${escaped}]</span>`;
|
|
11
|
+
});
|
|
12
|
+
return result.trim();
|
|
13
|
+
}
|
|
14
|
+
function useProcessedChunks(chunks, footnotes) {
|
|
15
|
+
return useMemo(() => {
|
|
16
|
+
if (!chunks || chunks.length === 0) {
|
|
17
|
+
return { processedChunks: [], maxPageNumber: 0 };
|
|
18
|
+
}
|
|
19
|
+
const hasFootnotes = footnotes && Object.keys(footnotes).length > 0;
|
|
20
|
+
const chunksByPage = [];
|
|
21
|
+
let currentPageNumber = -1;
|
|
22
|
+
let currentPageChunks = [];
|
|
23
|
+
let maxPageNumber = 0;
|
|
24
|
+
chunks.forEach((chunk) => {
|
|
25
|
+
const pageNum = chunk.metadata?.page_number;
|
|
26
|
+
if (pageNum && pageNum > maxPageNumber) {
|
|
27
|
+
maxPageNumber = pageNum;
|
|
28
|
+
}
|
|
29
|
+
if (pageNum !== currentPageNumber) {
|
|
30
|
+
if (currentPageChunks.length > 0) {
|
|
31
|
+
chunksByPage.push({
|
|
32
|
+
pageNumber: currentPageNumber > 0 ? currentPageNumber : null,
|
|
33
|
+
chunks: currentPageChunks
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
currentPageNumber = pageNum ?? -1;
|
|
37
|
+
currentPageChunks = [];
|
|
38
|
+
}
|
|
39
|
+
currentPageChunks.push({
|
|
40
|
+
content: hasFootnotes ? inlineFootnotes(chunk.content, footnotes) : chunk.content,
|
|
41
|
+
chunkIndex: chunk.metadata?.chunk_doc_idx,
|
|
42
|
+
chunkExtId: chunk.metadata?.chunk_ext_id,
|
|
43
|
+
docTitle: chunk.metadata?.doc_title ?? void 0
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
if (currentPageChunks.length > 0) {
|
|
47
|
+
chunksByPage.push({
|
|
48
|
+
pageNumber: currentPageNumber > 0 ? currentPageNumber : null,
|
|
49
|
+
chunks: currentPageChunks
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return { processedChunks: chunksByPage, maxPageNumber };
|
|
53
|
+
}, [chunks, footnotes]);
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
useProcessedChunks
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=useProcessedChunks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/viewers/useProcessedChunks.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Processed Chunks Hook\n *\n * Processes raw document chunks into page-grouped structure.\n * Pre-computes footnote inlining so it runs once during processing, not on every render.\n */\n\nimport { useMemo } from 'react'\n\nexport interface RawChunk {\n content: string\n metadata?: {\n page_number?: number\n chunk_doc_idx?: number\n chunk_ext_id?: string\n doc_title?: string | null\n }\n}\n\nexport interface ProcessedChunk {\n content: string\n chunkIndex: number | undefined\n chunkExtId: string | undefined\n docTitle: string | undefined\n}\n\nexport interface ProcessedPage {\n pageNumber: number | null\n chunks: ProcessedChunk[]\n}\n\nexport interface UseProcessedChunksResult {\n processedChunks: ProcessedPage[]\n maxPageNumber: number\n}\n\n/**\n * Replace GFM footnote references [^key] with inline footnote content\n * and strip footnote definition blocks from the chunk text.\n * Uses the pre-parsed footnotes map from the backend.\n */\nfunction inlineFootnotes(content: string, footnotes: Record<string, string>): string {\n if (!footnotes || Object.keys(footnotes).length === 0) return content\n\n let result = content\n\n // Strip GFM footnote definition blocks: [^key]: content (and continuation lines)\n result = result.replace(/^\\[\\^[^\\]]+\\]:[ \\t]+.*(?:\\n(?:[ \\t]+.+)?)*/gm, '')\n\n // Replace footnote references [^key] with superscript + inline content\n result = result.replace(/\\[\\^([^\\]]+)\\]/g, (_match, key) => {\n const fnContent = footnotes[key]\n if (!fnContent) return `<sup class=\"fn-ref\">${key}</sup>`\n const escaped = fnContent\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n return `<sup class=\"fn-ref\">${key}</sup><span class=\"fn-inline\" title=\"${escaped}\">[${escaped}]</span>`\n })\n\n return result.trim()\n}\n\nexport function useProcessedChunks(\n chunks: RawChunk[] | undefined,\n footnotes?: Record<string, string>\n): UseProcessedChunksResult {\n return useMemo(() => {\n if (!chunks || chunks.length === 0) {\n return { processedChunks: [], maxPageNumber: 0 }\n }\n\n const hasFootnotes = footnotes && Object.keys(footnotes).length > 0\n const chunksByPage: ProcessedPage[] = []\n let currentPageNumber = -1\n let currentPageChunks: ProcessedChunk[] = []\n let maxPageNumber = 0\n\n chunks.forEach((chunk) => {\n const pageNum = chunk.metadata?.page_number\n\n // Track max page number\n if (pageNum && pageNum > maxPageNumber) {\n maxPageNumber = pageNum\n }\n\n // If page changed, save previous page and start new one\n if (pageNum !== currentPageNumber) {\n if (currentPageChunks.length > 0) {\n chunksByPage.push({\n pageNumber: currentPageNumber > 0 ? currentPageNumber : null,\n chunks: currentPageChunks,\n })\n }\n currentPageNumber = pageNum ?? -1\n currentPageChunks = []\n }\n\n currentPageChunks.push({\n content: hasFootnotes ? inlineFootnotes(chunk.content, footnotes) : chunk.content,\n chunkIndex: chunk.metadata?.chunk_doc_idx,\n chunkExtId: chunk.metadata?.chunk_ext_id,\n docTitle: chunk.metadata?.doc_title ?? undefined,\n })\n })\n\n // Add the last page\n if (currentPageChunks.length > 0) {\n chunksByPage.push({\n pageNumber: currentPageNumber > 0 ? currentPageNumber : null,\n chunks: currentPageChunks,\n })\n }\n\n return { processedChunks: chunksByPage, maxPageNumber }\n }, [chunks, footnotes])\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,eAAe;AAkCxB,SAAS,gBAAgB,SAAiB,WAA2C;AACnF,MAAI,CAAC,aAAa,OAAO,KAAK,SAAS,EAAE,WAAW,EAAG,QAAO;AAE9D,MAAI,SAAS;AAGb,WAAS,OAAO,QAAQ,gDAAgD,EAAE;AAG1E,WAAS,OAAO,QAAQ,mBAAmB,CAAC,QAAQ,QAAQ;AAC1D,UAAM,YAAY,UAAU,GAAG;AAC/B,QAAI,CAAC,UAAW,QAAO,uBAAuB,GAAG;AACjD,UAAM,UAAU,UACb,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AACzB,WAAO,uBAAuB,GAAG,wCAAwC,OAAO,MAAM,OAAO;AAAA,EAC/F,CAAC;AAED,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,mBACd,QACA,WAC0B;AAC1B,SAAO,QAAQ,MAAM;AACnB,QAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,aAAO,EAAE,iBAAiB,CAAC,GAAG,eAAe,EAAE;AAAA,IACjD;AAEA,UAAM,eAAe,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS;AAClE,UAAM,eAAgC,CAAC;AACvC,QAAI,oBAAoB;AACxB,QAAI,oBAAsC,CAAC;AAC3C,QAAI,gBAAgB;AAEpB,WAAO,QAAQ,CAAC,UAAU;AACxB,YAAM,UAAU,MAAM,UAAU;AAGhC,UAAI,WAAW,UAAU,eAAe;AACtC,wBAAgB;AAAA,MAClB;AAGA,UAAI,YAAY,mBAAmB;AACjC,YAAI,kBAAkB,SAAS,GAAG;AAChC,uBAAa,KAAK;AAAA,YAChB,YAAY,oBAAoB,IAAI,oBAAoB;AAAA,YACxD,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,4BAAoB,WAAW;AAC/B,4BAAoB,CAAC;AAAA,MACvB;AAEA,wBAAkB,KAAK;AAAA,QACrB,SAAS,eAAe,gBAAgB,MAAM,SAAS,SAAS,IAAI,MAAM;AAAA,QAC1E,YAAY,MAAM,UAAU;AAAA,QAC5B,YAAY,MAAM,UAAU;AAAA,QAC5B,UAAU,MAAM,UAAU,aAAa;AAAA,MACzC,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,kBAAkB,SAAS,GAAG;AAChC,mBAAa,KAAK;AAAA,QAChB,YAAY,oBAAoB,IAAI,oBAAoB;AAAA,QACxD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,iBAAiB,cAAc,cAAc;AAAA,EACxD,GAAG,CAAC,QAAQ,SAAS,CAAC;AACxB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { useCallback, useEffect, useLayoutEffect, useRef } from "react";
|
|
2
|
+
const MIN_ZOOM = 0.5;
|
|
3
|
+
const MAX_ZOOM = 4;
|
|
4
|
+
const DOUBLE_TAP_ZOOM = 2;
|
|
5
|
+
const MAX_CANVAS_PIXELS = 8e6;
|
|
6
|
+
const MAX_RENDER_DPR = 2;
|
|
7
|
+
function clampZoom(zoom) {
|
|
8
|
+
if (!Number.isFinite(zoom)) return 1;
|
|
9
|
+
return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100;
|
|
10
|
+
}
|
|
11
|
+
const ZOOM_PRESETS = [1.5, 2, 3];
|
|
12
|
+
function cycleZoom(zoom) {
|
|
13
|
+
return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1;
|
|
14
|
+
}
|
|
15
|
+
function doubleTapZoom(zoom) {
|
|
16
|
+
return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM;
|
|
17
|
+
}
|
|
18
|
+
function zoomLabel(zoom) {
|
|
19
|
+
return `${Math.round(zoom * 100)}%`;
|
|
20
|
+
}
|
|
21
|
+
function pinchZoom(startZoom, startDistance, distance2) {
|
|
22
|
+
if (startDistance <= 0) return startZoom;
|
|
23
|
+
return clampZoom(startZoom * distance2 / startDistance);
|
|
24
|
+
}
|
|
25
|
+
function anchoredScroll(scroll, focal, oldZoom, newZoom) {
|
|
26
|
+
if (oldZoom <= 0) return scroll;
|
|
27
|
+
return (scroll + focal) * newZoom / oldZoom - focal;
|
|
28
|
+
}
|
|
29
|
+
function renderDpr(cssWidth, cssHeight, devicePixelRatio, maxPixels = MAX_CANVAS_PIXELS) {
|
|
30
|
+
const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR);
|
|
31
|
+
const area = cssWidth * cssHeight;
|
|
32
|
+
if (area <= 0) return wanted;
|
|
33
|
+
const fits = Math.sqrt(maxPixels / area);
|
|
34
|
+
return Math.max(1, Math.min(wanted, fits));
|
|
35
|
+
}
|
|
36
|
+
function fitPageWidth(contentWidth, pageBorder) {
|
|
37
|
+
if (!Number.isFinite(contentWidth)) return 0;
|
|
38
|
+
return Math.max(0, Math.floor(contentWidth) - pageBorder);
|
|
39
|
+
}
|
|
40
|
+
function contentBoxWidth(el) {
|
|
41
|
+
const style = getComputedStyle(el);
|
|
42
|
+
const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
|
|
43
|
+
return Math.max(0, el.clientWidth - padding);
|
|
44
|
+
}
|
|
45
|
+
const distance = (a, b) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);
|
|
46
|
+
const INTERACTIVE = 'button, a, input, textarea, select, [role="button"]';
|
|
47
|
+
const DOUBLE_TAP_MS = 300;
|
|
48
|
+
const DOUBLE_TAP_SLOP_PX = 30;
|
|
49
|
+
function usePinchZoom({ containerRef, zoom, onZoomChange }) {
|
|
50
|
+
const zoomRef = useRef(zoom);
|
|
51
|
+
const onChangeRef = useRef(onZoomChange);
|
|
52
|
+
onChangeRef.current = onZoomChange;
|
|
53
|
+
const focalRef = useRef(null);
|
|
54
|
+
const appliedZoomRef = useRef(zoom);
|
|
55
|
+
const request = useCallback((next, focal) => {
|
|
56
|
+
const clamped = clampZoom(next);
|
|
57
|
+
if (clamped === zoomRef.current) return;
|
|
58
|
+
focalRef.current = focal;
|
|
59
|
+
zoomRef.current = clamped;
|
|
60
|
+
onChangeRef.current?.(clamped);
|
|
61
|
+
}, []);
|
|
62
|
+
useLayoutEffect(() => {
|
|
63
|
+
zoomRef.current = zoom;
|
|
64
|
+
const container = containerRef.current;
|
|
65
|
+
const previous = appliedZoomRef.current;
|
|
66
|
+
appliedZoomRef.current = zoom;
|
|
67
|
+
if (!container || previous === zoom) return;
|
|
68
|
+
const rect = container.getBoundingClientRect();
|
|
69
|
+
const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 };
|
|
70
|
+
focalRef.current = null;
|
|
71
|
+
container.dataset.zooming = "true";
|
|
72
|
+
container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom);
|
|
73
|
+
container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom);
|
|
74
|
+
requestAnimationFrame(
|
|
75
|
+
() => requestAnimationFrame(() => {
|
|
76
|
+
delete container.dataset.zooming;
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}, [zoom, containerRef]);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
const el = containerRef.current;
|
|
82
|
+
if (!el) return;
|
|
83
|
+
let pinch = null;
|
|
84
|
+
let lastTap = null;
|
|
85
|
+
let frame = 0;
|
|
86
|
+
let pending = null;
|
|
87
|
+
const focalOf = (a, b) => {
|
|
88
|
+
const rect = el.getBoundingClientRect();
|
|
89
|
+
return {
|
|
90
|
+
x: (a.clientX + b.clientX) / 2 - rect.left,
|
|
91
|
+
y: (a.clientY + b.clientY) / 2 - rect.top
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
const flush = () => {
|
|
95
|
+
frame = 0;
|
|
96
|
+
if (pending) request(pending.zoom, pending.focal);
|
|
97
|
+
pending = null;
|
|
98
|
+
};
|
|
99
|
+
const onStart = (e) => {
|
|
100
|
+
if (e.touches.length === 2) {
|
|
101
|
+
pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current };
|
|
102
|
+
lastTap = null;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const onMove = (e) => {
|
|
106
|
+
if (!pinch || e.touches.length !== 2) return;
|
|
107
|
+
e.preventDefault();
|
|
108
|
+
pending = {
|
|
109
|
+
zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),
|
|
110
|
+
focal: focalOf(e.touches[0], e.touches[1])
|
|
111
|
+
};
|
|
112
|
+
if (!frame) frame = requestAnimationFrame(flush);
|
|
113
|
+
};
|
|
114
|
+
const onEnd = (e) => {
|
|
115
|
+
if (pinch && e.touches.length < 2) {
|
|
116
|
+
pinch = null;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (e.touches.length !== 0 || e.changedTouches.length !== 1) return;
|
|
120
|
+
const t = e.changedTouches[0];
|
|
121
|
+
if (e.target?.closest?.(INTERACTIVE)) return;
|
|
122
|
+
const now = e.timeStamp;
|
|
123
|
+
if (lastTap && now - lastTap.time < DOUBLE_TAP_MS && Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX) {
|
|
124
|
+
e.preventDefault();
|
|
125
|
+
const rect = el.getBoundingClientRect();
|
|
126
|
+
request(doubleTapZoom(zoomRef.current), {
|
|
127
|
+
x: t.clientX - rect.left,
|
|
128
|
+
y: t.clientY - rect.top
|
|
129
|
+
});
|
|
130
|
+
lastTap = null;
|
|
131
|
+
} else {
|
|
132
|
+
lastTap = { time: now, x: t.clientX, y: t.clientY };
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
el.addEventListener("touchstart", onStart, { passive: true });
|
|
136
|
+
el.addEventListener("touchmove", onMove, { passive: false });
|
|
137
|
+
el.addEventListener("touchend", onEnd, { passive: false });
|
|
138
|
+
el.addEventListener("touchcancel", onEnd, { passive: false });
|
|
139
|
+
return () => {
|
|
140
|
+
el.removeEventListener("touchstart", onStart);
|
|
141
|
+
el.removeEventListener("touchmove", onMove);
|
|
142
|
+
el.removeEventListener("touchend", onEnd);
|
|
143
|
+
el.removeEventListener("touchcancel", onEnd);
|
|
144
|
+
if (frame) cancelAnimationFrame(frame);
|
|
145
|
+
};
|
|
146
|
+
}, [containerRef, request]);
|
|
147
|
+
}
|
|
148
|
+
export {
|
|
149
|
+
MAX_CANVAS_PIXELS,
|
|
150
|
+
MAX_ZOOM,
|
|
151
|
+
MIN_ZOOM,
|
|
152
|
+
anchoredScroll,
|
|
153
|
+
clampZoom,
|
|
154
|
+
contentBoxWidth,
|
|
155
|
+
cycleZoom,
|
|
156
|
+
doubleTapZoom,
|
|
157
|
+
fitPageWidth,
|
|
158
|
+
pinchZoom,
|
|
159
|
+
renderDpr,
|
|
160
|
+
usePinchZoom,
|
|
161
|
+
zoomLabel
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=viewer-zoom.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/viewers/viewer-zoom.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Zoom for page-stacked viewers (PDF + parsed/HTML).\n *\n * Browser pinch-zoom only magnifies the bitmap the page already painted: a PDF canvas rendered at\n * fit-width stays blurry however far you pinch. The viewers therefore own the zoom: `zoom` is a\n * multiplier of the fit-width size (1 = fit width, 2 = twice as wide). The PDF viewer re-renders\n * its canvases at the new scale; the parsed viewer reflows its text. This module holds the pure\n * math and the touch gesture hook (pinch, double-tap) both use.\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport type { RefObject } from 'react'\n\nexport const MIN_ZOOM = 0.5\nexport const MAX_ZOOM = 4\nconst DOUBLE_TAP_ZOOM = 2\n/** Canvas pixel budget per page: iOS Safari fails above ~16.7M pixels in total, so stay well under. */\nexport const MAX_CANVAS_PIXELS = 8_000_000\n/** Device pixel ratio is capped: beyond 2x the extra sharpness is invisible and costs 2-3x memory. */\nconst MAX_RENDER_DPR = 2\n\nexport function clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) return 1\n return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100\n}\n\n/** The zoom levels the single zoom button steps through before it returns to fit width. */\nconst ZOOM_PRESETS = [1.5, 2, 3]\n\n/** The zoom button: the next preset above the current zoom, or back to fit width after the last. */\nexport function cycleZoom(zoom: number): number {\n return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1\n}\n\n/** Double-tap toggles between fit width and a comfortable reading zoom. */\nexport function doubleTapZoom(zoom: number): number {\n return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM\n}\n\nexport function zoomLabel(zoom: number): string {\n return `${Math.round(zoom * 100)}%`\n}\n\n/** The zoom a pinch has reached: the start zoom scaled by how far the fingers moved apart. */\nexport function pinchZoom(startZoom: number, startDistance: number, distance: number): number {\n if (startDistance <= 0) return startZoom\n return clampZoom((startZoom * distance) / startDistance)\n}\n\n/**\n * New scroll offset that keeps the content point under `focal` (a viewport coordinate) still while\n * the zoom changes from `oldZoom` to `newZoom`.\n */\nexport function anchoredScroll(\n scroll: number,\n focal: number,\n oldZoom: number,\n newZoom: number\n): number {\n if (oldZoom <= 0) return scroll\n return ((scroll + focal) * newZoom) / oldZoom - focal\n}\n\n/**\n * Device pixel ratio to rasterise a page of `cssWidth` x `cssHeight` at: the device's own, capped,\n * and lowered further when the page would otherwise exceed the canvas pixel budget.\n */\nexport function renderDpr(\n cssWidth: number,\n cssHeight: number,\n devicePixelRatio: number,\n maxPixels: number = MAX_CANVAS_PIXELS\n): number {\n const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR)\n const area = cssWidth * cssHeight\n if (area <= 0) return wanted\n const fits = Math.sqrt(maxPixels / area)\n return Math.max(1, Math.min(wanted, fits))\n}\n\n/**\n * Width a fit-width page's content gets in a scroller whose content box is `contentWidth` wide:\n * that box less the page's own border, floored so sub-pixel layout never rounds the page up past\n * the box into a sideways overflow.\n */\nexport function fitPageWidth(contentWidth: number, pageBorder: number): number {\n if (!Number.isFinite(contentWidth)) return 0\n return Math.max(0, Math.floor(contentWidth) - pageBorder)\n}\n\n/**\n * An element's content-box width: `clientWidth` (which, unlike `offsetWidth`, leaves out the\n * vertical scrollbar and the borders) less the horizontal padding.\n */\nexport function contentBoxWidth(el: HTMLElement): number {\n const style = getComputedStyle(el)\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0)\n return Math.max(0, el.clientWidth - padding)\n}\n\nconst distance = (a: Touch, b: Touch) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY)\nconst INTERACTIVE = 'button, a, input, textarea, select, [role=\"button\"]'\nconst DOUBLE_TAP_MS = 300\nconst DOUBLE_TAP_SLOP_PX = 30\n\ninterface PinchZoomOptions {\n containerRef: RefObject<HTMLElement | null>\n zoom: number\n onZoomChange?: (zoom: number) => void\n}\n\n/**\n * Pinch and double-tap zoom on a scroller, plus focal-point preservation for EVERY zoom change\n * (gesture, buttons, props): after the new zoom has laid out, the scroll offset is moved so the\n * content under the pinch centre (or the viewport centre) stays where it was.\n *\n * The scroller must carry `touch-action: pan-x pan-y` so the browser leaves two-finger gestures\n * to this hook instead of zooming the whole app.\n */\nexport function usePinchZoom({ containerRef, zoom, onZoomChange }: PinchZoomOptions): void {\n const zoomRef = useRef(zoom)\n const onChangeRef = useRef(onZoomChange)\n onChangeRef.current = onZoomChange\n const focalRef = useRef<{ x: number; y: number } | null>(null)\n const appliedZoomRef = useRef(zoom)\n\n const request = useCallback((next: number, focal: { x: number; y: number } | null) => {\n const clamped = clampZoom(next)\n if (clamped === zoomRef.current) return\n focalRef.current = focal\n zoomRef.current = clamped\n onChangeRef.current?.(clamped)\n }, [])\n\n // Zoom changed (from here or from outside): keep the focal point still once it has laid out.\n useLayoutEffect(() => {\n zoomRef.current = zoom\n const container = containerRef.current\n const previous = appliedZoomRef.current\n appliedZoomRef.current = zoom\n if (!container || previous === zoom) return\n const rect = container.getBoundingClientRect()\n const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 }\n focalRef.current = null\n // The page-anchoring observer must not also react to this resize.\n container.dataset.zooming = 'true'\n container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom)\n container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n delete container.dataset.zooming\n })\n )\n }, [zoom, containerRef])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n let pinch: { startDistance: number; startZoom: number } | null = null\n let lastTap: { time: number; x: number; y: number } | null = null\n let frame = 0\n let pending: { zoom: number; focal: { x: number; y: number } } | null = null\n\n const focalOf = (a: Touch, b: Touch) => {\n const rect = el.getBoundingClientRect()\n return {\n x: (a.clientX + b.clientX) / 2 - rect.left,\n y: (a.clientY + b.clientY) / 2 - rect.top,\n }\n }\n const flush = () => {\n frame = 0\n if (pending) request(pending.zoom, pending.focal)\n pending = null\n }\n\n const onStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current }\n lastTap = null\n }\n }\n const onMove = (e: TouchEvent) => {\n if (!pinch || e.touches.length !== 2) return\n e.preventDefault()\n pending = {\n zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),\n focal: focalOf(e.touches[0], e.touches[1]),\n }\n if (!frame) frame = requestAnimationFrame(flush)\n }\n const onEnd = (e: TouchEvent) => {\n if (pinch && e.touches.length < 2) {\n pinch = null\n return\n }\n if (e.touches.length !== 0 || e.changedTouches.length !== 1) return\n const t = e.changedTouches[0]\n if ((e.target as Element | null)?.closest?.(INTERACTIVE)) return\n const now = e.timeStamp\n if (\n lastTap &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX\n ) {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n request(doubleTapZoom(zoomRef.current), {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n })\n lastTap = null\n } else {\n lastTap = { time: now, x: t.clientX, y: t.clientY }\n }\n }\n\n el.addEventListener('touchstart', onStart, { passive: true })\n el.addEventListener('touchmove', onMove, { passive: false })\n el.addEventListener('touchend', onEnd, { passive: false })\n el.addEventListener('touchcancel', onEnd, { passive: false })\n return () => {\n el.removeEventListener('touchstart', onStart)\n el.removeEventListener('touchmove', onMove)\n el.removeEventListener('touchend', onEnd)\n el.removeEventListener('touchcancel', onEnd)\n if (frame) cancelAnimationFrame(frame)\n }\n }, [containerRef, request])\n}\n"],
|
|
5
|
+
"mappings": "AAUA,SAAS,aAAa,WAAW,iBAAiB,cAAc;AAGzD,MAAM,WAAW;AACjB,MAAM,WAAW;AACxB,MAAM,kBAAkB;AAEjB,MAAM,oBAAoB;AAEjC,MAAM,iBAAiB;AAEhB,SAAS,UAAU,MAAsB;AAC9C,MAAI,CAAC,OAAO,SAAS,IAAI,EAAG,QAAO;AACnC,SAAO,KAAK,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,IAAI,CAAC,IAAI,GAAG,IAAI;AAC1E;AAGA,MAAM,eAAe,CAAC,KAAK,GAAG,CAAC;AAGxB,SAAS,UAAU,MAAsB;AAC9C,SAAO,aAAa,KAAK,CAAC,WAAW,SAAS,OAAO,IAAI,KAAK;AAChE;AAGO,SAAS,cAAc,MAAsB;AAClD,SAAO,OAAO,OAAO,IAAI;AAC3B;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC;AAClC;AAGO,SAAS,UAAU,WAAmB,eAAuBA,WAA0B;AAC5F,MAAI,iBAAiB,EAAG,QAAO;AAC/B,SAAO,UAAW,YAAYA,YAAY,aAAa;AACzD;AAMO,SAAS,eACd,QACA,OACA,SACA,SACQ;AACR,MAAI,WAAW,EAAG,QAAO;AACzB,UAAS,SAAS,SAAS,UAAW,UAAU;AAClD;AAMO,SAAS,UACd,UACA,WACA,kBACA,YAAoB,mBACZ;AACR,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,oBAAoB,GAAG,CAAC,GAAG,cAAc;AAC1E,QAAM,OAAO,WAAW;AACxB,MAAI,QAAQ,EAAG,QAAO;AACtB,QAAM,OAAO,KAAK,KAAK,YAAY,IAAI;AACvC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,IAAI,CAAC;AAC3C;AAOO,SAAS,aAAa,cAAsB,YAA4B;AAC7E,MAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO;AAC3C,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,IAAI,UAAU;AAC1D;AAMO,SAAS,gBAAgB,IAAyB;AACvD,QAAM,QAAQ,iBAAiB,EAAE;AACjC,QAAM,WAAW,WAAW,MAAM,WAAW,KAAK,MAAM,WAAW,MAAM,YAAY,KAAK;AAC1F,SAAO,KAAK,IAAI,GAAG,GAAG,cAAc,OAAO;AAC7C;AAEA,MAAM,WAAW,CAAC,GAAU,MAAa,KAAK,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO;AAChG,MAAM,cAAc;AACpB,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAgBpB,SAAS,aAAa,EAAE,cAAc,MAAM,aAAa,GAA2B;AACzF,QAAM,UAAU,OAAO,IAAI;AAC3B,QAAM,cAAc,OAAO,YAAY;AACvC,cAAY,UAAU;AACtB,QAAM,WAAW,OAAwC,IAAI;AAC7D,QAAM,iBAAiB,OAAO,IAAI;AAElC,QAAM,UAAU,YAAY,CAAC,MAAc,UAA2C;AACpF,UAAM,UAAU,UAAU,IAAI;AAC9B,QAAI,YAAY,QAAQ,QAAS;AACjC,aAAS,UAAU;AACnB,YAAQ,UAAU;AAClB,gBAAY,UAAU,OAAO;AAAA,EAC/B,GAAG,CAAC,CAAC;AAGL,kBAAgB,MAAM;AACpB,YAAQ,UAAU;AAClB,UAAM,YAAY,aAAa;AAC/B,UAAM,WAAW,eAAe;AAChC,mBAAe,UAAU;AACzB,QAAI,CAAC,aAAa,aAAa,KAAM;AACrC,UAAM,OAAO,UAAU,sBAAsB;AAC7C,UAAM,QAAQ,SAAS,WAAW,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,SAAS,EAAE;AAC1E,aAAS,UAAU;AAEnB,cAAU,QAAQ,UAAU;AAC5B,cAAU,aAAa,eAAe,UAAU,YAAY,MAAM,GAAG,UAAU,IAAI;AACnF,cAAU,YAAY,eAAe,UAAU,WAAW,MAAM,GAAG,UAAU,IAAI;AACjF;AAAA,MAAsB,MACpB,sBAAsB,MAAM;AAC1B,eAAO,UAAU,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,YAAU,MAAM;AACd,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AACT,QAAI,QAA6D;AACjE,QAAI,UAAyD;AAC7D,QAAI,QAAQ;AACZ,QAAI,UAAoE;AAExE,UAAM,UAAU,CAAC,GAAU,MAAa;AACtC,YAAM,OAAO,GAAG,sBAAsB;AACtC,aAAO;AAAA,QACL,IAAI,EAAE,UAAU,EAAE,WAAW,IAAI,KAAK;AAAA,QACtC,IAAI,EAAE,UAAU,EAAE,WAAW,IAAI,KAAK;AAAA,MACxC;AAAA,IACF;AACA,UAAM,QAAQ,MAAM;AAClB,cAAQ;AACR,UAAI,QAAS,SAAQ,QAAQ,MAAM,QAAQ,KAAK;AAChD,gBAAU;AAAA,IACZ;AAEA,UAAM,UAAU,CAAC,MAAkB;AACjC,UAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,gBAAQ,EAAE,eAAe,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,WAAW,QAAQ,QAAQ;AAC1F,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,SAAS,CAAC,MAAkB;AAChC,UAAI,CAAC,SAAS,EAAE,QAAQ,WAAW,EAAG;AACtC,QAAE,eAAe;AACjB,gBAAU;AAAA,QACR,MAAM,UAAU,MAAM,WAAW,MAAM,eAAe,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,QAC1F,OAAO,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,MAC3C;AACA,UAAI,CAAC,MAAO,SAAQ,sBAAsB,KAAK;AAAA,IACjD;AACA,UAAM,QAAQ,CAAC,MAAkB;AAC/B,UAAI,SAAS,EAAE,QAAQ,SAAS,GAAG;AACjC,gBAAQ;AACR;AAAA,MACF;AACA,UAAI,EAAE,QAAQ,WAAW,KAAK,EAAE,eAAe,WAAW,EAAG;AAC7D,YAAM,IAAI,EAAE,eAAe,CAAC;AAC5B,UAAK,EAAE,QAA2B,UAAU,WAAW,EAAG;AAC1D,YAAM,MAAM,EAAE;AACd,UACE,WACA,MAAM,QAAQ,OAAO,iBACrB,KAAK,MAAM,EAAE,UAAU,QAAQ,GAAG,EAAE,UAAU,QAAQ,CAAC,IAAI,oBAC3D;AACA,UAAE,eAAe;AACjB,cAAM,OAAO,GAAG,sBAAsB;AACtC,gBAAQ,cAAc,QAAQ,OAAO,GAAG;AAAA,UACtC,GAAG,EAAE,UAAU,KAAK;AAAA,UACpB,GAAG,EAAE,UAAU,KAAK;AAAA,QACtB,CAAC;AACD,kBAAU;AAAA,MACZ,OAAO;AACL,kBAAU,EAAE,MAAM,KAAK,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAAA,MACpD;AAAA,IACF;AAEA,OAAG,iBAAiB,cAAc,SAAS,EAAE,SAAS,KAAK,CAAC;AAC5D,OAAG,iBAAiB,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;AAC3D,OAAG,iBAAiB,YAAY,OAAO,EAAE,SAAS,MAAM,CAAC;AACzD,OAAG,iBAAiB,eAAe,OAAO,EAAE,SAAS,MAAM,CAAC;AAC5D,WAAO,MAAM;AACX,SAAG,oBAAoB,cAAc,OAAO;AAC5C,SAAG,oBAAoB,aAAa,MAAM;AAC1C,SAAG,oBAAoB,YAAY,KAAK;AACxC,SAAG,oBAAoB,eAAe,KAAK;AAC3C,UAAI,MAAO,sBAAqB,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,CAAC;AAC5B;",
|
|
6
|
+
"names": ["distance"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
3
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
import { connectWithReconnect } from "@arbidocs/sdk/browser";
|
|
5
|
+
import {
|
|
6
|
+
isMessageType,
|
|
7
|
+
logger
|
|
8
|
+
} from "@arbidocs/client";
|
|
9
|
+
import { useArbi } from "../useArbi.js";
|
|
10
|
+
import { finishEntityExtraction } from "../entity-extraction.js";
|
|
11
|
+
import { useArbiWsStore } from "./store.js";
|
|
12
|
+
import { nextReconnectDelay, resolveSocketBaseUrl } from "./reconnect.js";
|
|
13
|
+
import { applyLiveUpdate } from "./live-updates.js";
|
|
14
|
+
import { applyRunFinished } from "../chat/run-finished.js";
|
|
15
|
+
import { useArbiSessionStore } from "../session/session-hooks.js";
|
|
16
|
+
import { applyChatEvent } from "../directmessages/chat-cache.js";
|
|
17
|
+
import { applyCallEvent } from "../calls/events.js";
|
|
18
|
+
import { applyNotificationRow, isNotificationRow } from "../notifications/live.js";
|
|
19
|
+
import { applyTaskEvent } from "../documents/processing-live.js";
|
|
20
|
+
import { refreshDocuments } from "../documents/documents-data.js";
|
|
21
|
+
import { arbiQueryKeys } from "../query-keys.js";
|
|
22
|
+
import { useFeature } from "../host/features.js";
|
|
23
|
+
import { useOnlineSync } from "../connectivity.js";
|
|
24
|
+
import { useArbiHost } from "../host/config.js";
|
|
25
|
+
import { ArbiWsContext } from "./context.js";
|
|
26
|
+
function signedInId(arbi) {
|
|
27
|
+
return arbi.isLoggedIn ? arbi.user.identity()?.externalId ?? null : null;
|
|
28
|
+
}
|
|
29
|
+
const EVICTED_CLOSE_CODE = 1008;
|
|
30
|
+
function ArbiWebSocketProvider({
|
|
31
|
+
enabled = true,
|
|
32
|
+
onAuthenticated,
|
|
33
|
+
handlers,
|
|
34
|
+
children
|
|
35
|
+
}) {
|
|
36
|
+
const arbi = useArbi();
|
|
37
|
+
const arbiRef = useRef(arbi);
|
|
38
|
+
arbiRef.current = arbi;
|
|
39
|
+
const queryClient = useQueryClient();
|
|
40
|
+
const subscribersRef = useRef(/* @__PURE__ */ new Set());
|
|
41
|
+
const setStatus = useArbiWsStore((s) => s.setStatus);
|
|
42
|
+
const applyTaskUpdate = useArbiWsStore((s) => s.applyTaskUpdate);
|
|
43
|
+
const applyPresence = useArbiWsStore((s) => s.applyPresence);
|
|
44
|
+
const reset = useArbiWsStore((s) => s.reset);
|
|
45
|
+
const setEvicted = useArbiWsStore((s) => s.setEvicted);
|
|
46
|
+
const onAuthenticatedRef = useRef(onAuthenticated);
|
|
47
|
+
onAuthenticatedRef.current = onAuthenticated;
|
|
48
|
+
const handlersRef = useRef(handlers);
|
|
49
|
+
handlersRef.current = handlers;
|
|
50
|
+
const session = useArbiSessionStore();
|
|
51
|
+
const sessionRef = useRef(session);
|
|
52
|
+
sessionRef.current = session;
|
|
53
|
+
const host = useArbiHost();
|
|
54
|
+
const hostRef = useRef(host);
|
|
55
|
+
hostRef.current = host;
|
|
56
|
+
const acceptRings = useFeature("calls");
|
|
57
|
+
const acceptRingsRef = useRef(acceptRings);
|
|
58
|
+
acceptRingsRef.current = acceptRings;
|
|
59
|
+
useOnlineSync();
|
|
60
|
+
const context = useMemo(
|
|
61
|
+
() => ({
|
|
62
|
+
subscribe: (fn) => {
|
|
63
|
+
subscribersRef.current.add(fn);
|
|
64
|
+
return () => {
|
|
65
|
+
subscribersRef.current.delete(fn);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
[]
|
|
70
|
+
);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (!enabled) {
|
|
73
|
+
reset();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
let conn = null;
|
|
77
|
+
let cancelled = false;
|
|
78
|
+
let evicted = false;
|
|
79
|
+
const me = () => signedInId(arbiRef.current);
|
|
80
|
+
const onMessage = (msg) => {
|
|
81
|
+
const type = msg.type;
|
|
82
|
+
if (type === "connection_closed") {
|
|
83
|
+
evicted = true;
|
|
84
|
+
setEvicted(true);
|
|
85
|
+
} else if (isMessageType(msg, "task_update")) {
|
|
86
|
+
if (applyTaskUpdate(msg)) applyTaskEvent(queryClient, arbiRef.current, msg, me());
|
|
87
|
+
} else if (isMessageType(msg, "presence_update")) applyPresence(msg);
|
|
88
|
+
else if (isMessageType(msg, "response_complete"))
|
|
89
|
+
applyRunFinished(
|
|
90
|
+
queryClient,
|
|
91
|
+
arbiRef.current,
|
|
92
|
+
sessionRef.current,
|
|
93
|
+
msg,
|
|
94
|
+
(quota) => hostRef.current.chat?.onQuotaExceeded?.(quota)
|
|
95
|
+
);
|
|
96
|
+
else if (type === "error")
|
|
97
|
+
logger.error("[WebSocket] Server error:", msg.message);
|
|
98
|
+
else if (isMessageType(msg, "batch_complete")) {
|
|
99
|
+
if (msg.batch_type === "entity_extract") {
|
|
100
|
+
finishEntityExtraction(msg.doc_ext_ids ?? []);
|
|
101
|
+
void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allFacts() });
|
|
102
|
+
}
|
|
103
|
+
if (msg.batch_type === "upload" || msg.batch_type === "entity_extract") {
|
|
104
|
+
if (msg.doc_ext_ids?.length)
|
|
105
|
+
void refreshDocuments(queryClient, arbiRef.current, msg.doc_ext_ids);
|
|
106
|
+
void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allTags() });
|
|
107
|
+
}
|
|
108
|
+
} else if (type.startsWith("chat.") || type === "agent_dm_status")
|
|
109
|
+
void applyChatEvent(arbiRef.current, queryClient, msg);
|
|
110
|
+
else if (type.startsWith("call."))
|
|
111
|
+
applyCallEvent(queryClient, msg, { me: me(), acceptRings: acceptRingsRef.current });
|
|
112
|
+
else if (isNotificationRow(msg)) applyNotificationRow(queryClient, msg, me());
|
|
113
|
+
else void applyLiveUpdate(queryClient, msg);
|
|
114
|
+
try {
|
|
115
|
+
handlersRef.current?.[type]?.(msg);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
logger.error(`[WebSocket] The host's ${type} handler failed:`, error);
|
|
118
|
+
}
|
|
119
|
+
for (const fn of subscribersRef.current) {
|
|
120
|
+
try {
|
|
121
|
+
fn(msg);
|
|
122
|
+
} catch {
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
let retryTimer = null;
|
|
127
|
+
let attempt = 0;
|
|
128
|
+
const scheduleRestart = () => {
|
|
129
|
+
if (cancelled || evicted || retryTimer) return;
|
|
130
|
+
setStatus("disconnected");
|
|
131
|
+
const delay = nextReconnectDelay(attempt);
|
|
132
|
+
attempt += 1;
|
|
133
|
+
retryTimer = setTimeout(() => {
|
|
134
|
+
retryTimer = null;
|
|
135
|
+
void start();
|
|
136
|
+
}, delay);
|
|
137
|
+
};
|
|
138
|
+
const start = async () => {
|
|
139
|
+
if (cancelled) return;
|
|
140
|
+
const info = arbiRef.current.getConnectionInfo();
|
|
141
|
+
if (!info) {
|
|
142
|
+
scheduleRestart();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
conn?.close();
|
|
146
|
+
conn = null;
|
|
147
|
+
setStatus("connecting");
|
|
148
|
+
try {
|
|
149
|
+
const c = await connectWithReconnect({
|
|
150
|
+
baseUrl: resolveSocketBaseUrl(
|
|
151
|
+
info.baseUrl,
|
|
152
|
+
typeof window === "undefined" ? void 0 : window.location.origin
|
|
153
|
+
),
|
|
154
|
+
accessToken: info.accessToken,
|
|
155
|
+
// Resolve the freshest token on every (re)connect so rotation is picked up.
|
|
156
|
+
getAccessToken: () => arbiRef.current.getConnectionInfo()?.accessToken ?? null,
|
|
157
|
+
// A reconnect refused for its token re-logs in silently first.
|
|
158
|
+
refreshAuth: () => arbiRef.current.refreshAccess(),
|
|
159
|
+
onAuthenticated: (message) => onAuthenticatedRef.current?.(message),
|
|
160
|
+
// The session's: a sign-out closes the socket before the server revokes the token.
|
|
161
|
+
signal: info.signal,
|
|
162
|
+
onMessage,
|
|
163
|
+
onReconnecting: () => setStatus("reconnecting"),
|
|
164
|
+
onReconnected: () => {
|
|
165
|
+
attempt = 0;
|
|
166
|
+
setStatus("connected");
|
|
167
|
+
},
|
|
168
|
+
// Evicted (a newer session of the same user, or the server took this connection over for a
|
|
169
|
+
// newer one of this session): reconnecting would be evicted again, or evict that one.
|
|
170
|
+
shouldReconnect: (code) => {
|
|
171
|
+
if (code !== EVICTED_CLOSE_CODE && !evicted) return true;
|
|
172
|
+
evicted = true;
|
|
173
|
+
setEvicted(true);
|
|
174
|
+
setStatus("disconnected");
|
|
175
|
+
return false;
|
|
176
|
+
},
|
|
177
|
+
onReconnectFailed: scheduleRestart,
|
|
178
|
+
onClose: () => {
|
|
179
|
+
if (!cancelled) setStatus(evicted ? "disconnected" : "reconnecting");
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
if (cancelled) {
|
|
183
|
+
c.close();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
conn = c;
|
|
187
|
+
attempt = 0;
|
|
188
|
+
setStatus("connected");
|
|
189
|
+
} catch {
|
|
190
|
+
if (!info.signal.aborted) scheduleRestart();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
setEvicted(false);
|
|
194
|
+
void start();
|
|
195
|
+
return () => {
|
|
196
|
+
cancelled = true;
|
|
197
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
198
|
+
conn?.close();
|
|
199
|
+
reset();
|
|
200
|
+
};
|
|
201
|
+
}, [enabled, queryClient, setStatus, setEvicted, applyTaskUpdate, applyPresence, reset]);
|
|
202
|
+
return /* @__PURE__ */ jsx(ArbiWsContext.Provider, { value: context, children });
|
|
203
|
+
}
|
|
204
|
+
export {
|
|
205
|
+
ArbiWebSocketProvider
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=ArbiWebSocketProvider.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/websocket/ArbiWebSocketProvider.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * ArbiWebSocketProvider \u2014 one shared, reconnecting WebSocket for the whole app.\n *\n * Opens a single authenticated socket (via the SDK transport's\n * `connectWithReconnect`, which handles auth, backoff, and live-token refresh),\n * feeds the canonical WS store, applies what every site applies (tasks, presence,\n * chats, calls, notification rows, finished runs, conversation, mail-draft and skill\n * events), then hands each message to the host's own `handlers` for its type and\n * fans it out to subscribers registered by the `useArbiWebSocket` /\n * `useArbiWsMessage` hooks.\n *\n * Mount it inside an `<ArbiHost>` with an `arbi` (it reads the Arbi instance for the base\n * URL + live access token). Gate it with `enabled` so it connects only once the\n * app is authenticated against a live backend.\n */\n\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { connectWithReconnect, type ReconnectableWsConnection } from '@arbidocs/sdk/browser'\nimport {\n isMessageType,\n type WebSocketServerMessage,\n type WsTaskUpdateMessage,\n type WsBatchCompleteMessage,\n type WsPresenceUpdateMessage,\n type WsAuthResultMessage,\n type WsResponseCompleteMessage,\n logger,\n} from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { finishEntityExtraction } from '../entity-extraction'\nimport { useArbiWsStore } from './store'\nimport { nextReconnectDelay, resolveSocketBaseUrl } from './reconnect'\nimport { applyLiveUpdate } from './live-updates'\nimport { applyRunFinished } from '../chat/run-finished'\nimport { useArbiSessionStore } from '../session/session-hooks'\nimport { applyChatEvent } from '../directmessages/chat-cache'\nimport { applyCallEvent } from '../calls/events'\nimport { applyNotificationRow, isNotificationRow } from '../notifications/live'\nimport { applyTaskEvent } from '../documents/processing-live'\nimport { refreshDocuments } from '../documents/documents-data'\nimport { arbiQueryKeys } from '../query-keys'\nimport { useFeature } from '../host/features'\nimport { useOnlineSync } from '../connectivity'\nimport { useArbiHost } from '../host/config'\nimport { ArbiWsContext, type ArbiWsContextValue, type ArbiWsSubscriber } from './context'\n\n/** A host's own handling of server messages, by message type (e.g. `remote_control`). */\nexport type ArbiWsHandlers = Partial<Record<string, (message: WebSocketServerMessage) => void>>\n\nexport interface ArbiWebSocketProviderProps {\n /**\n * Open the socket only when the app is authenticated against a live backend.\n * Defaults to `true`; pass the connection status so demo/logged-out sessions\n * don't try to connect.\n */\n enabled?: boolean\n /** Called each time the server accepts the socket's auth (e.g. to show the unread count). */\n onAuthenticated?: (message: WsAuthResultMessage) => void\n /**\n * The host's own handling of message types the provider does not apply (e.g. `remote_control`),\n * each called after the provider's own and before the subscribers. Read on each message, so a\n * new object never reopens the socket.\n */\n handlers?: ArbiWsHandlers\n children: ReactNode\n}\n\n/** The signed-in person's id on `arbi`, or null when nobody is signed in. */\nfunction signedInId(arbi: ReturnType<typeof useArbi>): string | null {\n return arbi.isLoggedIn ? (arbi.user.identity()?.externalId ?? null) : null\n}\n\n/** The close code of a server-side single-session eviction (a newer session of the same user). */\nconst EVICTED_CLOSE_CODE = 1008\n\nexport function ArbiWebSocketProvider({\n enabled = true,\n onAuthenticated,\n handlers,\n children,\n}: ArbiWebSocketProviderProps) {\n // The latest `Arbi`, read on each use: a host renews its instance (another server session, an\n // opened workspace) without that reopening the socket; the token is read afresh on each connect.\n const arbi = useArbi()\n const arbiRef = useRef(arbi)\n arbiRef.current = arbi\n const queryClient = useQueryClient()\n const subscribersRef = useRef<Set<ArbiWsSubscriber>>(new Set())\n const setStatus = useArbiWsStore((s) => s.setStatus)\n const applyTaskUpdate = useArbiWsStore((s) => s.applyTaskUpdate)\n const applyPresence = useArbiWsStore((s) => s.applyPresence)\n const reset = useArbiWsStore((s) => s.reset)\n const setEvicted = useArbiWsStore((s) => s.setEvicted)\n const onAuthenticatedRef = useRef(onAuthenticated)\n onAuthenticatedRef.current = onAuthenticated\n const handlersRef = useRef(handlers)\n handlersRef.current = handlers\n const session = useArbiSessionStore()\n const sessionRef = useRef(session)\n sessionRef.current = session\n const host = useArbiHost()\n const hostRef = useRef(host)\n hostRef.current = host\n // Calls ring only a person whose `calls` feature is on (ARBI: Settings \u2192 Experimental); unlisted, on.\n const acceptRings = useFeature('calls')\n const acceptRingsRef = useRef(acceptRings)\n acceptRingsRef.current = acceptRings\n // Online or not follows this connection too (and the network, and \"Work offline\").\n useOnlineSync()\n\n // Stable subscribe API \u2014 the subscriber set lives in a ref, so registering a\n // handler never re-opens the socket.\n const context = useMemo<ArbiWsContextValue>(\n () => ({\n subscribe: (fn) => {\n subscribersRef.current.add(fn)\n return () => {\n subscribersRef.current.delete(fn)\n }\n },\n }),\n []\n )\n\n useEffect(() => {\n if (!enabled) {\n reset()\n return\n }\n\n let conn: ReconnectableWsConnection | null = null\n let cancelled = false\n // Taken over by another connection of this session (the server says so, then closes):\n // reconnecting would take it back, and the two would evict each other in turn.\n let evicted = false\n\n const me = () => signedInId(arbiRef.current)\n\n // What every site applies, before the host's own subscribers hear the message.\n const onMessage = (msg: WebSocketServerMessage) => {\n const type = msg.type as string\n if (type === 'connection_closed') {\n evicted = true\n setEvicted(true)\n } else if (isMessageType<WsTaskUpdateMessage>(msg, 'task_update')) {\n // The live processing row, then the documents list (an upload's row, a finished re-read).\n if (applyTaskUpdate(msg)) applyTaskEvent(queryClient, arbiRef.current, msg, me())\n } else if (isMessageType<WsPresenceUpdateMessage>(msg, 'presence_update')) applyPresence(msg)\n else if (isMessageType<WsResponseCompleteMessage>(msg, 'response_complete'))\n // A run finished: its conversation stops generating, its follow-up leaves the queue, the\n // documents it saved are read again, the thread follows, and a run failed for the AI usage\n // says so the chat host's way.\n applyRunFinished(queryClient, arbiRef.current, sessionRef.current, msg, (quota) =>\n hostRef.current.chat?.onQuotaExceeded?.(quota)\n )\n else if (type === 'error')\n logger.error('[WebSocket] Server error:', (msg as { message?: unknown }).message)\n else if (isMessageType<WsBatchCompleteMessage>(msg, 'batch_complete')) {\n // An upload or an extraction finished: its documents are read again, and the tags (an\n // upload may create sender labels; an extraction creates people and organisations and\n // links facts). AI fields (`doctag_generate`) are the AI review's (blocks).\n if (msg.batch_type === 'entity_extract') {\n finishEntityExtraction(msg.doc_ext_ids ?? [])\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allFacts() })\n }\n if (msg.batch_type === 'upload' || msg.batch_type === 'entity_extract') {\n if (msg.doc_ext_ids?.length)\n void refreshDocuments(queryClient, arbiRef.current, msg.doc_ext_ids)\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.allTags() })\n }\n } else if (type.startsWith('chat.') || type === 'agent_dm_status')\n // Chats (direct messages, agent DM progress).\n void applyChatEvent(arbiRef.current, queryClient, msg)\n else if (type.startsWith('call.'))\n applyCallEvent(queryClient, msg, { me: me(), acceptRings: acceptRingsRef.current })\n else if (isNotificationRow(msg)) applyNotificationRow(queryClient, msg, me())\n // Conversation, mail-draft and skill events.\n else void applyLiveUpdate(queryClient, msg as unknown as { type: string })\n\n // The host's own handler for this type, then the subscribers. A throwing handler must not\n // kill the stream.\n try {\n handlersRef.current?.[type]?.(msg)\n } catch (error) {\n logger.error(`[WebSocket] The host's ${type} handler failed:`, error)\n }\n for (const fn of subscribersRef.current) {\n try {\n fn(msg)\n } catch {\n /* swallow \u2014 one bad handler can't break the socket */\n }\n }\n }\n\n let retryTimer: ReturnType<typeof setTimeout> | null = null\n let attempt = 0\n\n // The socket is best-effort and never gives up: after the transport's own retries (or a failed\n // connect) a fresh one is opened after a capped backoff, offline meanwhile. It never ends the\n // session; that is the HTTP layer's job.\n const scheduleRestart = () => {\n if (cancelled || evicted || retryTimer) return\n setStatus('disconnected')\n const delay = nextReconnectDelay(attempt)\n attempt += 1\n retryTimer = setTimeout(() => {\n retryTimer = null\n void start()\n }, delay)\n }\n\n const start = async () => {\n if (cancelled) return\n const info = arbiRef.current.getConnectionInfo()\n if (!info) {\n // Not signed in on this client yet: try again shortly.\n scheduleRestart()\n return\n }\n conn?.close()\n conn = null\n setStatus('connecting')\n try {\n const c = await connectWithReconnect({\n baseUrl: resolveSocketBaseUrl(\n info.baseUrl,\n typeof window === 'undefined' ? undefined : window.location.origin\n ),\n accessToken: info.accessToken,\n // Resolve the freshest token on every (re)connect so rotation is picked up.\n getAccessToken: () => arbiRef.current.getConnectionInfo()?.accessToken ?? null,\n // A reconnect refused for its token re-logs in silently first.\n refreshAuth: () => arbiRef.current.refreshAccess(),\n onAuthenticated: (message) => onAuthenticatedRef.current?.(message),\n // The session's: a sign-out closes the socket before the server revokes the token.\n signal: info.signal,\n onMessage,\n onReconnecting: () => setStatus('reconnecting'),\n onReconnected: () => {\n attempt = 0\n setStatus('connected')\n },\n // Evicted (a newer session of the same user, or the server took this connection over for a\n // newer one of this session): reconnecting would be evicted again, or evict that one.\n shouldReconnect: (code) => {\n if (code !== EVICTED_CLOSE_CODE && !evicted) return true\n evicted = true\n setEvicted(true)\n setStatus('disconnected')\n return false\n },\n onReconnectFailed: scheduleRestart,\n onClose: () => {\n if (!cancelled) setStatus(evicted ? 'disconnected' : 'reconnecting')\n },\n })\n if (cancelled) {\n c.close()\n return\n }\n conn = c\n attempt = 0\n setStatus('connected')\n } catch {\n // Stopped by a sign-out: the session is gone, nothing to reopen.\n if (!info.signal.aborted) scheduleRestart()\n }\n }\n setEvicted(false)\n void start()\n\n return () => {\n cancelled = true\n if (retryTimer) clearTimeout(retryTimer)\n conn?.close()\n reset()\n }\n }, [enabled, queryClient, setStatus, setEvicted, applyTaskUpdate, applyPresence, reset])\n\n return <ArbiWsContext.Provider value={context}>{children}</ArbiWsContext.Provider>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
const ArbiWsContext = createContext(null);
|
|
3
|
+
function useArbiWsContext() {
|
|
4
|
+
const ctx = useContext(ArbiWsContext);
|
|
5
|
+
if (!ctx) {
|
|
6
|
+
throw new Error("useArbiWebSocket hooks must be used within an <ArbiWebSocketProvider>");
|
|
7
|
+
}
|
|
8
|
+
return ctx;
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
ArbiWsContext,
|
|
12
|
+
useArbiWsContext
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/websocket/context.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Context for the shared WebSocket \u2014 the subscribe registry the provider fills\n * and the hooks read. Kept separate from the provider component so both can be\n * imported without tripping react-refresh's component-only-export rule.\n */\n\nimport { createContext, useContext } from 'react'\nimport type { WebSocketServerMessage } from '@arbidocs/client'\n\nexport type ArbiWsSubscriber = (msg: WebSocketServerMessage) => void\n\nexport interface ArbiWsContextValue {\n subscribe: (fn: ArbiWsSubscriber) => () => void\n}\n\nexport const ArbiWsContext = createContext<ArbiWsContextValue | null>(null)\n\nexport function useArbiWsContext(): ArbiWsContextValue {\n const ctx = useContext(ArbiWsContext)\n if (!ctx) {\n throw new Error('useArbiWebSocket hooks must be used within an <ArbiWebSocketProvider>')\n }\n return ctx\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,eAAe,kBAAkB;AASnC,MAAM,gBAAgB,cAAyC,IAAI;AAEnE,SAAS,mBAAuC;AACrD,QAAM,MAAM,WAAW,aAAa;AACpC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|