@arbidocs/react 0.5.111 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
- package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +80 -80
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +80 -80
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +282 -282
- package/dist/index.js +702 -17116
- package/dist/index.js.map +7 -1
- package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +154 -154
- package/dist/ui/index.js +290 -10
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.js +61 -271
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/chunk-ZM6N7YZH.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const ADDABLE_STATUSES = /* @__PURE__ */ new Set(["completed", "empty", "low-content"]);
|
|
2
|
+
const isDocumentAddableToConversation = (document) => {
|
|
3
|
+
if (!document) return false;
|
|
4
|
+
if (!document.status) return true;
|
|
5
|
+
return ADDABLE_STATUSES.has(document.status.toLowerCase());
|
|
6
|
+
};
|
|
7
|
+
const getDocumentDate = (document) => {
|
|
8
|
+
if (!document) return void 0;
|
|
9
|
+
return document.doc_metadata?.doc_date;
|
|
10
|
+
};
|
|
11
|
+
const formatDocDate = (value) => {
|
|
12
|
+
if (!value) return "";
|
|
13
|
+
if (value.includes("T")) {
|
|
14
|
+
const d = new Date(value);
|
|
15
|
+
if (!Number.isNaN(d.getTime())) {
|
|
16
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
17
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
};
|
|
22
|
+
const getDocumentNature = (document) => {
|
|
23
|
+
if (!document) return void 0;
|
|
24
|
+
return document.doc_metadata?.doc_nature;
|
|
25
|
+
};
|
|
26
|
+
const getDocumentAuthor = (document) => {
|
|
27
|
+
if (!document) return void 0;
|
|
28
|
+
return document.doc_metadata?.doc_author;
|
|
29
|
+
};
|
|
30
|
+
const getDocumentSubject = (document) => {
|
|
31
|
+
if (!document) return void 0;
|
|
32
|
+
return document.doc_metadata?.doc_subject;
|
|
33
|
+
};
|
|
34
|
+
const DEFAULT_METADATA_TAGS = [
|
|
35
|
+
{ name: "doc_date", label: "Date" },
|
|
36
|
+
{ name: "doc_nature", label: "Type" },
|
|
37
|
+
{ name: "doc_author", label: "Author" },
|
|
38
|
+
{ name: "doc_subject", label: "Abstract" }
|
|
39
|
+
];
|
|
40
|
+
const canonicalFolderPath = (folder) => {
|
|
41
|
+
if (!folder) return null;
|
|
42
|
+
const segments = folder.split("/").map((segment) => segment.trim()).filter(Boolean);
|
|
43
|
+
return segments.length > 0 ? segments.join("/") : null;
|
|
44
|
+
};
|
|
45
|
+
const buildFolderTree = (docs) => {
|
|
46
|
+
const counts = /* @__PURE__ */ new Map();
|
|
47
|
+
let unfiledCount = 0;
|
|
48
|
+
for (const doc of docs) {
|
|
49
|
+
const folder = canonicalFolderPath(doc.folder);
|
|
50
|
+
if (!folder) {
|
|
51
|
+
unfiledCount++;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const parts = folder.split("/");
|
|
55
|
+
for (let i = 1; i <= parts.length; i++) {
|
|
56
|
+
const path = parts.slice(0, i).join("/");
|
|
57
|
+
counts.set(path, (counts.get(path) ?? 0) + 1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const nodes = [...counts.keys()].sort((a, b) => a.localeCompare(b)).map((path) => ({
|
|
61
|
+
path,
|
|
62
|
+
label: path.split("/").pop() ?? path,
|
|
63
|
+
depth: path.split("/").length - 1,
|
|
64
|
+
count: counts.get(path) ?? 0
|
|
65
|
+
}));
|
|
66
|
+
return { nodes, unfiledCount };
|
|
67
|
+
};
|
|
68
|
+
const formatFolderLabel = (path) => {
|
|
69
|
+
if (!path) return "";
|
|
70
|
+
const parts = path.split("/");
|
|
71
|
+
const name = parts[parts.length - 1] || path;
|
|
72
|
+
const depth = parts.length - 1;
|
|
73
|
+
if (depth === 0) return name;
|
|
74
|
+
return "../".repeat(depth) + name;
|
|
75
|
+
};
|
|
76
|
+
const COLUMN_LABEL_FALLBACKS = {
|
|
77
|
+
title: "Document Name",
|
|
78
|
+
doc_nature: "Type",
|
|
79
|
+
doc_author: "Author",
|
|
80
|
+
doc_subject: "Abstract",
|
|
81
|
+
doc_date: "Date",
|
|
82
|
+
n_pages: "Pages",
|
|
83
|
+
created_at: "Uploaded",
|
|
84
|
+
updated_at: "Last modified",
|
|
85
|
+
file_name: "File name",
|
|
86
|
+
file_size: "Size",
|
|
87
|
+
file_type: "File type",
|
|
88
|
+
shared: "Shared",
|
|
89
|
+
inConversation: "In chat",
|
|
90
|
+
created_by: "By",
|
|
91
|
+
sender: "From",
|
|
92
|
+
all_tags: "Labels",
|
|
93
|
+
doc_id: "DocID",
|
|
94
|
+
related: "Related"
|
|
95
|
+
};
|
|
96
|
+
export {
|
|
97
|
+
COLUMN_LABEL_FALLBACKS,
|
|
98
|
+
DEFAULT_METADATA_TAGS,
|
|
99
|
+
buildFolderTree,
|
|
100
|
+
canonicalFolderPath,
|
|
101
|
+
formatDocDate,
|
|
102
|
+
formatFolderLabel,
|
|
103
|
+
getDocumentAuthor,
|
|
104
|
+
getDocumentDate,
|
|
105
|
+
getDocumentNature,
|
|
106
|
+
getDocumentSubject,
|
|
107
|
+
isDocumentAddableToConversation
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=document-fields.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/document-fields.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * A document's fields as the lists show them: the metadata the pipeline extracts (date, type,\n * author, abstract), whether it can join a conversation, and its folder path in canonical form\n * (the form folder filters and the explorer navigate by).\n */\n\n/** What these read of a document (a workspace document has them all). */\ninterface Doc {\n status?: string | null\n doc_metadata?: {\n doc_date?: string | null\n doc_nature?: string | null\n doc_author?: string | null\n doc_subject?: string | null\n } | null\n}\n\n/**\n * Statuses for which a document carries usable content and can be attached to a\n * conversation. A document with no status yet is treated as addable (optimistic).\n * Terminal-but-unusable states ('failed', 'skipped') and in-progress states\n * ('processing', 'queued') are NOT addable.\n */\nconst ADDABLE_STATUSES = new Set(['completed', 'empty', 'low-content'])\n\n/**\n * Whether a document can be added to a conversation. This is the single source\n * of truth shared by the add flow (`useAddToConversation`) and any UI that\n * counts/enables an \"Add\" affordance \u2014 so a badge never advertises a document\n * that the add flow will silently refuse (e.g. a 'skipped' document).\n */\nexport const isDocumentAddableToConversation = (document: Doc | null | undefined): boolean => {\n if (!document) return false\n if (!document.status) return true\n return ADDABLE_STATUSES.has(document.status.toLowerCase())\n}\n\n/**\n * Gets the date of a document from doc_metadata.\n * @param document Document to get date from\n * @returns Document date string or undefined\n */\nexport const getDocumentDate = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_date\n}\n\n/**\n * Format a doc_date for display. Date-only values (\"YYYY-MM-DD\") are shown as-is;\n * full datetimes (e.g. emails, \"...T14:30:00Z\") are shown as \"YYYY-MM-DD HH:MM\"\n * in local time. Invalid/empty values return an empty string.\n */\nexport const formatDocDate = (value?: string | null): string => {\n if (!value) return ''\n if (value.includes('T')) {\n const d = new Date(value)\n if (!Number.isNaN(d.getTime())) {\n const pad = (n: number) => String(n).padStart(2, '0')\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`\n }\n }\n return value\n}\n\n/**\n * Gets the document nature (type) from doc_metadata.\n * @param document Document to get nature from\n * @returns Document nature (e.g., email, contract, memorandum) or undefined\n */\nexport const getDocumentNature = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_nature\n}\n\n/**\n * Gets the document author from doc_metadata.\n * @param document Document to get author from\n * @returns Document author or undefined\n */\nexport const getDocumentAuthor = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_author\n}\n\n/**\n * Gets the document subject from doc_metadata.\n * @param document Document to get subject from\n * @returns Document subject or undefined\n */\nexport const getDocumentSubject = (document: Doc | null | undefined): string | null | undefined => {\n if (!document) return undefined\n return document.doc_metadata?.doc_subject\n}\n\n/**\n * Default metadata tags that are automatically applied to all documents during indexing.\n * These are generated by AI during document processing and cannot be disabled.\n * Keep in sync with backend DocTagLLMConfig.DEFAULT_METADATA_TAGS\n */\nexport const DEFAULT_METADATA_TAGS = [\n { name: 'doc_date', label: 'Date' },\n { name: 'doc_nature', label: 'Type' },\n { name: 'doc_author', label: 'Author' },\n { name: 'doc_subject', label: 'Abstract' },\n] as const\n\n/**\n * Canonicalizes a `Doc.folder` path: trims each segment and drops empty ones,\n * returning null for a blank path. Drive-synced folders use provider names\n * verbatim, which can carry stray whitespace (\"Google Drive (u)/Reports \");\n * the explorer navigates via trimmed segments, so folder filter IDs and\n * navigation keys must agree on this canonical form.\n */\nexport const canonicalFolderPath = (folder: string | null | undefined): string | null => {\n if (!folder) return null\n const segments = folder\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n return segments.length > 0 ? segments.join('/') : null\n}\n\n/** One row of a folder picker: the folder itself plus every ancestor above it. */\nexport interface FolderTreeNode {\n /** Canonical path \u2014 the same form folder filter IDs are built from. */\n path: string\n /** Last segment, for display. */\n label: string\n /** How far down the tree, for indentation. */\n depth: number\n /** Documents at or below this folder. */\n count: number\n}\n\n/**\n * Builds the folder rows a picker shows, from the documents themselves.\n *\n * Every path here is canonical, and that is the point: a folder filter ID is\n * `folder:${canonicalFolderPath(doc.folder)}`, and an ID outside that set is\n * dropped as invalid \u2014 so a picker that emitted the raw path (\" Reports / Q1 \",\n * or \"/Inbox\" with its phantom blank root) would send the view back to \"All\"\n * instead of into the folder the user clicked.\n */\nexport const buildFolderTree = (\n docs: { folder?: string | null }[]\n): { nodes: FolderTreeNode[]; unfiledCount: number } => {\n const counts = new Map<string, number>()\n let unfiledCount = 0\n\n for (const doc of docs) {\n const folder = canonicalFolderPath(doc.folder)\n if (!folder) {\n unfiledCount++\n continue\n }\n const parts = folder.split('/')\n for (let i = 1; i <= parts.length; i++) {\n const path = parts.slice(0, i).join('/')\n counts.set(path, (counts.get(path) ?? 0) + 1)\n }\n }\n\n const nodes = [...counts.keys()]\n .sort((a, b) => a.localeCompare(b))\n .map((path) => ({\n path,\n label: path.split('/').pop() ?? path,\n depth: path.split('/').length - 1,\n count: counts.get(path) ?? 0,\n }))\n\n return { nodes, unfiledCount }\n}\n\n/**\n * Formats a folder path for display: \"Reports/Q1/January\" \u2192 \"../../January\"\n * Shows depth via `../` prefixes and only the last segment name.\n * @param path Folder path string (slash-separated)\n * @returns Formatted display label\n */\nexport const formatFolderLabel = (path: string | null | undefined): string => {\n if (!path) return ''\n const parts = path.split('/')\n const name = parts[parts.length - 1] || path\n const depth = parts.length - 1\n if (depth === 0) return name\n return '../'.repeat(depth) + name\n}\n\n/**\n * Fallback labels for standard document columns when grid isn't ready yet.\n * These match the headerName values in createDocumentColumns.tsx.\n */\nexport const COLUMN_LABEL_FALLBACKS: Record<string, string> = {\n title: 'Document Name',\n doc_nature: 'Type',\n doc_author: 'Author',\n doc_subject: 'Abstract',\n doc_date: 'Date',\n n_pages: 'Pages',\n created_at: 'Uploaded',\n updated_at: 'Last modified',\n file_name: 'File name',\n file_size: 'Size',\n file_type: 'File type',\n shared: 'Shared',\n inConversation: 'In chat',\n created_by: 'By',\n sender: 'From',\n all_tags: 'Labels',\n doc_id: 'DocID',\n related: 'Related',\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { arbiQueryKeys } from "../hooks.js";
|
|
2
|
+
const rowListeners = /* @__PURE__ */ new Set();
|
|
3
|
+
function subscribeDocumentRows(listener) {
|
|
4
|
+
rowListeners.add(listener);
|
|
5
|
+
return () => {
|
|
6
|
+
rowListeners.delete(listener);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function getCachedDocuments(qc, workspaceId) {
|
|
10
|
+
if (!workspaceId) return void 0;
|
|
11
|
+
return qc.getQueryData(arbiQueryKeys.documents(workspaceId));
|
|
12
|
+
}
|
|
13
|
+
function cachedLists(qc) {
|
|
14
|
+
return qc.getQueriesData({ queryKey: arbiQueryKeys.allDocuments() }).flatMap(
|
|
15
|
+
([key, data]) => typeof key[2] === "string" && Array.isArray(data) ? [[key[2], data]] : []
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
function diffRows(workspaceId, before, after) {
|
|
19
|
+
const beforeById = new Map(before.map((doc) => [doc.external_id, doc]));
|
|
20
|
+
const add = [];
|
|
21
|
+
const update = [];
|
|
22
|
+
const seen = /* @__PURE__ */ new Set();
|
|
23
|
+
for (const doc of after) {
|
|
24
|
+
seen.add(doc.external_id);
|
|
25
|
+
const previous = beforeById.get(doc.external_id);
|
|
26
|
+
if (!previous) add.push(doc);
|
|
27
|
+
else if (previous !== doc) update.push(doc);
|
|
28
|
+
}
|
|
29
|
+
const remove = [...beforeById.keys()].filter((id) => !seen.has(id));
|
|
30
|
+
return { workspaceId, add, update, remove };
|
|
31
|
+
}
|
|
32
|
+
function patchDocuments(qc, reducer, workspaceId) {
|
|
33
|
+
const lists = workspaceId ? (() => {
|
|
34
|
+
const current = getCachedDocuments(qc, workspaceId);
|
|
35
|
+
return current ? [[workspaceId, current]] : [];
|
|
36
|
+
})() : cachedLists(qc);
|
|
37
|
+
for (const [id, before] of lists) {
|
|
38
|
+
const after = reducer(before);
|
|
39
|
+
if (after === before) continue;
|
|
40
|
+
qc.setQueryData(arbiQueryKeys.documents(id), after);
|
|
41
|
+
const change = diffRows(id, before, after);
|
|
42
|
+
const beforeById = new Map(before.map((doc) => [doc.external_id, doc]));
|
|
43
|
+
if (change.update.some(
|
|
44
|
+
(doc) => doc.current_version !== beforeById.get(doc.external_id)?.current_version
|
|
45
|
+
))
|
|
46
|
+
void qc.invalidateQueries({ queryKey: arbiQueryKeys.allDocumentVersions() });
|
|
47
|
+
if (change.add.length || change.update.length || change.remove.length)
|
|
48
|
+
for (const listener of rowListeners) listener(change);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function upsertDocuments(qc, documents, workspaceId) {
|
|
52
|
+
if (!documents.length) return;
|
|
53
|
+
const byId = new Map(documents.map((doc) => [doc.external_id, doc]));
|
|
54
|
+
const byWorkspace = /* @__PURE__ */ new Map();
|
|
55
|
+
for (const doc of documents) {
|
|
56
|
+
const ws = workspaceId ?? doc.workspace_ext_id;
|
|
57
|
+
byWorkspace.set(ws, [...byWorkspace.get(ws) ?? [], doc]);
|
|
58
|
+
}
|
|
59
|
+
for (const [ws, incoming] of byWorkspace) {
|
|
60
|
+
patchDocuments(
|
|
61
|
+
qc,
|
|
62
|
+
(old) => {
|
|
63
|
+
const known = new Set(old.map((doc) => doc.external_id));
|
|
64
|
+
return [
|
|
65
|
+
...old.map((doc) => byId.get(doc.external_id) ?? doc),
|
|
66
|
+
...incoming.filter((doc) => !known.has(doc.external_id))
|
|
67
|
+
];
|
|
68
|
+
},
|
|
69
|
+
ws
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function setCachedDocument(qc, doc) {
|
|
74
|
+
qc.setQueryData(arbiQueryKeys.document(doc.external_id), doc);
|
|
75
|
+
}
|
|
76
|
+
function patchCachedDocument(qc, docId, reducer) {
|
|
77
|
+
const current = qc.getQueryData(arbiQueryKeys.document(docId));
|
|
78
|
+
if (current) qc.setQueryData(arbiQueryKeys.document(docId), reducer(current));
|
|
79
|
+
}
|
|
80
|
+
function dropTagFromCachedDocuments(qc, tagId) {
|
|
81
|
+
const strip = (doc) => {
|
|
82
|
+
const doctags = doc.doctags?.filter((dt) => dt.tag_ext_id !== tagId);
|
|
83
|
+
return doctags && doctags.length !== doc.doctags?.length ? { ...doc, doctags } : doc;
|
|
84
|
+
};
|
|
85
|
+
const carriers = [];
|
|
86
|
+
patchDocuments(qc, (docs) => {
|
|
87
|
+
const next = docs.map(strip);
|
|
88
|
+
next.forEach((doc, i) => doc !== docs[i] && carriers.push(doc.external_id));
|
|
89
|
+
return carriers.length ? next : docs;
|
|
90
|
+
});
|
|
91
|
+
for (const id of carriers) patchCachedDocument(qc, id, strip);
|
|
92
|
+
}
|
|
93
|
+
function forgetDocuments(qc, docIds) {
|
|
94
|
+
for (const id of docIds) {
|
|
95
|
+
qc.removeQueries({ queryKey: arbiQueryKeys.document(id) });
|
|
96
|
+
qc.removeQueries({ queryKey: arbiQueryKeys.documentVersions(id) });
|
|
97
|
+
qc.removeQueries({ queryKey: arbiQueryKeys.parsedDocument(id) });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
dropTagFromCachedDocuments,
|
|
102
|
+
forgetDocuments,
|
|
103
|
+
getCachedDocuments,
|
|
104
|
+
patchCachedDocument,
|
|
105
|
+
patchDocuments,
|
|
106
|
+
setCachedDocument,
|
|
107
|
+
subscribeDocumentRows,
|
|
108
|
+
upsertDocuments
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=documents-cache.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/documents-cache.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The workspace documents list in the query cache: one entry per workspace\n * (`arbiQueryKeys.documents(workspaceId)`), read once (progressively, see `documents-loader.ts`)\n * and then kept current in place. Every write goes through {@link patchDocuments}, which also\n * tells row listeners (a grid that applies row transactions instead of re-diffing the whole list)\n * exactly which rows were added, changed or removed.\n *\n * A single document's own entry (`arbiQueryKeys.document(id)`, read by a viewer) is patched next to\n * the list by {@link setCachedDocument}, so a viewer never blanks while a write settles.\n */\n\nimport type { QueryClient } from '@tanstack/react-query'\nimport type { components } from '@arbidocs/client'\nimport { arbiQueryKeys } from '../hooks'\n\n/** A document as the server lists it. */\nexport type WorkspaceDocument = components['schemas']['DocResponse']\n\n/** The rows one write added, changed and removed (removed: by id). */\nexport interface DocumentRowChange {\n workspaceId: string\n add: WorkspaceDocument[]\n update: WorkspaceDocument[]\n remove: string[]\n}\n\ntype RowListener = (change: DocumentRowChange) => void\n\nconst rowListeners = new Set<RowListener>()\n\n/**\n * Follow the row-level changes of every write to a workspace documents list (a grid applying them\n * as transactions). Returns the unsubscribe.\n */\nexport function subscribeDocumentRows(listener: RowListener): () => void {\n rowListeners.add(listener)\n return () => {\n rowListeners.delete(listener)\n }\n}\n\n/** The cached documents of a workspace (`undefined` before its list has been read). */\nexport function getCachedDocuments(\n qc: QueryClient,\n workspaceId: string | null | undefined\n): WorkspaceDocument[] | undefined {\n if (!workspaceId) return undefined\n return qc.getQueryData<WorkspaceDocument[]>(arbiQueryKeys.documents(workspaceId))\n}\n\n/** Every cached workspace documents list, with its workspace. */\nfunction cachedLists(qc: QueryClient): Array<[string, WorkspaceDocument[]]> {\n return qc\n .getQueriesData<WorkspaceDocument[]>({ queryKey: arbiQueryKeys.allDocuments() })\n .flatMap(([key, data]) =>\n typeof key[2] === 'string' && Array.isArray(data) ? [[key[2], data]] : []\n )\n}\n\n/** Diff two versions of a list by id. */\nfunction diffRows(\n workspaceId: string,\n before: WorkspaceDocument[],\n after: WorkspaceDocument[]\n): DocumentRowChange {\n const beforeById = new Map(before.map((doc) => [doc.external_id, doc]))\n const add: WorkspaceDocument[] = []\n const update: WorkspaceDocument[] = []\n const seen = new Set<string>()\n for (const doc of after) {\n seen.add(doc.external_id)\n const previous = beforeById.get(doc.external_id)\n if (!previous) add.push(doc)\n else if (previous !== doc) update.push(doc)\n }\n const remove = [...beforeById.keys()].filter((id) => !seen.has(id))\n return { workspaceId, add, update, remove }\n}\n\n/**\n * Apply `reducer` to a workspace's documents list, or (no `workspaceId`) to every cached one: the\n * one place a list is written after it was read. Returning the same array is a no-op. Row\n * listeners get the diff; a document that moved to a new version makes the open version lists\n * re-read. A workspace whose list has not been read is left alone (its first read brings it).\n */\nexport function patchDocuments(\n qc: QueryClient,\n reducer: (documents: WorkspaceDocument[]) => WorkspaceDocument[],\n workspaceId?: string | null\n): void {\n const lists: Array<[string, WorkspaceDocument[]]> = workspaceId\n ? (() => {\n const current = getCachedDocuments(qc, workspaceId)\n return current ? [[workspaceId, current] as [string, WorkspaceDocument[]]] : []\n })()\n : cachedLists(qc)\n for (const [id, before] of lists) {\n const after = reducer(before)\n if (after === before) continue\n qc.setQueryData(arbiQueryKeys.documents(id), after)\n const change = diffRows(id, before, after)\n const beforeById = new Map(before.map((doc) => [doc.external_id, doc]))\n if (\n change.update.some(\n (doc) => doc.current_version !== beforeById.get(doc.external_id)?.current_version\n )\n )\n void qc.invalidateQueries({ queryKey: arbiQueryKeys.allDocumentVersions() })\n if (change.add.length || change.update.length || change.remove.length)\n for (const listener of rowListeners) listener(change)\n }\n}\n\n/** Put `doc` in its list in place, or at the end when the list does not hold it yet. */\nexport function upsertDocuments(\n qc: QueryClient,\n documents: WorkspaceDocument[],\n workspaceId?: string | null\n): void {\n if (!documents.length) return\n const byId = new Map(documents.map((doc) => [doc.external_id, doc]))\n const byWorkspace = new Map<string, WorkspaceDocument[]>()\n for (const doc of documents) {\n const ws = workspaceId ?? doc.workspace_ext_id\n byWorkspace.set(ws, [...(byWorkspace.get(ws) ?? []), doc])\n }\n for (const [ws, incoming] of byWorkspace) {\n patchDocuments(\n qc,\n (old) => {\n const known = new Set(old.map((doc) => doc.external_id))\n return [\n ...old.map((doc) => byId.get(doc.external_id) ?? doc),\n ...incoming.filter((doc) => !known.has(doc.external_id)),\n ]\n },\n ws\n )\n }\n}\n\n/** Write a document's own entry (what `useDocument` reads), keeping a viewer current. */\nexport function setCachedDocument(qc: QueryClient, doc: WorkspaceDocument): void {\n qc.setQueryData(arbiQueryKeys.document(doc.external_id), doc)\n}\n\n/** Apply `reducer` to a document's own entry, when one is cached. */\nexport function patchCachedDocument(\n qc: QueryClient,\n docId: string,\n reducer: (doc: WorkspaceDocument) => WorkspaceDocument\n): void {\n const current = qc.getQueryData<WorkspaceDocument | null>(arbiQueryKeys.document(docId))\n if (current) qc.setQueryData(arbiQueryKeys.document(docId), reducer(current))\n}\n\n/** A deleted tag leaves every cached document that carried it: the lists' rows and their entries. */\nexport function dropTagFromCachedDocuments(qc: QueryClient, tagId: string): void {\n const strip = (doc: WorkspaceDocument): WorkspaceDocument => {\n const doctags = doc.doctags?.filter((dt) => dt.tag_ext_id !== tagId)\n return doctags && doctags.length !== doc.doctags?.length ? { ...doc, doctags } : doc\n }\n const carriers: string[] = []\n patchDocuments(qc, (docs) => {\n const next = docs.map(strip)\n next.forEach((doc, i) => doc !== docs[i] && carriers.push(doc.external_id))\n return carriers.length ? next : docs\n })\n for (const id of carriers) patchCachedDocument(qc, id, strip)\n}\n\n/** Forget everything cached about deleted documents, so nothing re-reads them into a 404. */\nexport function forgetDocuments(qc: QueryClient, docIds: string[]): void {\n for (const id of docIds) {\n qc.removeQueries({ queryKey: arbiQueryKeys.document(id) })\n qc.removeQueries({ queryKey: arbiQueryKeys.documentVersions(id) })\n qc.removeQueries({ queryKey: arbiQueryKeys.parsedDocument(id) })\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { useArbi } from "../useArbi.js";
|
|
4
|
+
import { arbiQueryKeys } from "../hooks.js";
|
|
5
|
+
import { invalidateTagTables, patchWorkspaceTags } from "../tags.js";
|
|
6
|
+
import {
|
|
7
|
+
getCachedDocuments,
|
|
8
|
+
setCachedDocument,
|
|
9
|
+
upsertDocuments
|
|
10
|
+
} from "./documents-cache.js";
|
|
11
|
+
import { loadDocuments } from "./documents-loader.js";
|
|
12
|
+
import { FINISHED_DOCUMENT_STATUSES, isRowNewer } from "./processing-order.js";
|
|
13
|
+
import { useArbiWsStore } from "../websocket/store.js";
|
|
14
|
+
function openWorkspaceId(arbi) {
|
|
15
|
+
return arbi.hasWorkspace ? arbi.getWorkspaceId() : null;
|
|
16
|
+
}
|
|
17
|
+
function useDocuments(workspaceId, options) {
|
|
18
|
+
const arbi = useArbi();
|
|
19
|
+
const qc = useQueryClient();
|
|
20
|
+
const workspace = workspaceId ?? openWorkspaceId(arbi) ?? "";
|
|
21
|
+
return useQuery({
|
|
22
|
+
queryKey: arbiQueryKeys.documents(workspace),
|
|
23
|
+
queryFn: ({ signal }) => {
|
|
24
|
+
if (openWorkspaceId(arbi) !== workspace)
|
|
25
|
+
return Promise.reject(new Error("The selected workspace changed."));
|
|
26
|
+
return loadDocuments(qc, arbi, workspace, signal);
|
|
27
|
+
},
|
|
28
|
+
enabled: (options?.enabled ?? true) && !!workspace && arbi.hasWorkspace,
|
|
29
|
+
staleTime: Infinity,
|
|
30
|
+
refetchOnMount: false,
|
|
31
|
+
refetchOnReconnect: false,
|
|
32
|
+
refetchOnWindowFocus: false
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const DOCUMENT_STATUS_POLL_MS = 4e3;
|
|
36
|
+
function processingInterval(doc) {
|
|
37
|
+
return doc?.status && !FINISHED_DOCUMENT_STATUSES.has(doc.status) ? DOCUMENT_STATUS_POLL_MS : false;
|
|
38
|
+
}
|
|
39
|
+
function useDocument(docId, options) {
|
|
40
|
+
const arbi = useArbi();
|
|
41
|
+
return useQuery({
|
|
42
|
+
queryKey: arbiQueryKeys.document(docId ?? ""),
|
|
43
|
+
queryFn: async () => (await arbi.documents.get([docId]))[0] ?? null,
|
|
44
|
+
enabled: (options?.enabled ?? true) && !!docId && arbi.isLoggedIn,
|
|
45
|
+
refetchInterval: options?.pollWhileProcessing ? (query) => processingInterval(query.state.data) : false
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const SIMILARITY_THRESHOLD = 0.98;
|
|
49
|
+
function useSimilarDocuments(options) {
|
|
50
|
+
const arbi = useArbi();
|
|
51
|
+
const workspace = openWorkspaceId(arbi) ?? "";
|
|
52
|
+
return useQuery({
|
|
53
|
+
queryKey: arbiQueryKeys.similarDocuments(workspace, SIMILARITY_THRESHOLD),
|
|
54
|
+
queryFn: () => arbi.readInWorkspace(
|
|
55
|
+
workspace,
|
|
56
|
+
() => arbi.documents.similar({ threshold: SIMILARITY_THRESHOLD })
|
|
57
|
+
),
|
|
58
|
+
enabled: (options?.enabled ?? true) && !!workspace
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
let readSeq = 0;
|
|
62
|
+
const latestReadByDoc = /* @__PURE__ */ new Map();
|
|
63
|
+
async function refreshDocuments(qc, arbi, docIds) {
|
|
64
|
+
if (!docIds.length) return [];
|
|
65
|
+
const seq = ++readSeq;
|
|
66
|
+
for (const id of docIds) latestReadByDoc.set(id, seq);
|
|
67
|
+
try {
|
|
68
|
+
const read = await arbi.documents.get(docIds);
|
|
69
|
+
const fresh = read.filter((doc) => latestReadByDoc.get(doc.external_id) === seq).map((doc) => {
|
|
70
|
+
const live = useArbiWsStore.getState().tasks[doc.external_id];
|
|
71
|
+
return live && FINISHED_DOCUMENT_STATUSES.has(live.status) && doc.status !== live.status && isRowNewer(doc, live) !== true ? { ...doc, status: live.status } : doc;
|
|
72
|
+
});
|
|
73
|
+
if (!fresh.length) return [];
|
|
74
|
+
reconcileTagCounts(qc, fresh);
|
|
75
|
+
upsertDocuments(qc, fresh);
|
|
76
|
+
for (const doc of fresh) setCachedDocument(qc, doc);
|
|
77
|
+
return fresh;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.error("Re-reading documents failed; the cached ones are kept:", error);
|
|
80
|
+
return [];
|
|
81
|
+
} finally {
|
|
82
|
+
for (const id of docIds) if (latestReadByDoc.get(id) === seq) latestReadByDoc.delete(id);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function useRefreshDocuments() {
|
|
86
|
+
const qc = useQueryClient();
|
|
87
|
+
const arbi = useArbi();
|
|
88
|
+
return useCallback((docIds) => refreshDocuments(qc, arbi, docIds), [qc, arbi]);
|
|
89
|
+
}
|
|
90
|
+
function reconcileTagCounts(qc, fresh) {
|
|
91
|
+
const byWorkspace = /* @__PURE__ */ new Map();
|
|
92
|
+
for (const doc of fresh) {
|
|
93
|
+
const cached = getCachedDocuments(qc, doc.workspace_ext_id)?.find(
|
|
94
|
+
(d) => d.external_id === doc.external_id
|
|
95
|
+
);
|
|
96
|
+
const before = new Set((cached?.doctags ?? []).map((dt) => dt.tag_ext_id));
|
|
97
|
+
const after = new Set((doc.doctags ?? []).map((dt) => dt.tag_ext_id));
|
|
98
|
+
const delta = byWorkspace.get(doc.workspace_ext_id) ?? /* @__PURE__ */ new Map();
|
|
99
|
+
for (const id of after) if (!before.has(id)) delta.set(id, (delta.get(id) ?? 0) + 1);
|
|
100
|
+
for (const id of before) if (!after.has(id)) delta.set(id, (delta.get(id) ?? 0) - 1);
|
|
101
|
+
byWorkspace.set(doc.workspace_ext_id, delta);
|
|
102
|
+
}
|
|
103
|
+
for (const [workspaceId, delta] of byWorkspace) adjustTagCounts(qc, workspaceId, delta);
|
|
104
|
+
}
|
|
105
|
+
function adjustTagCounts(qc, workspaceId, delta) {
|
|
106
|
+
if (![...delta.values()].some(Boolean)) return;
|
|
107
|
+
patchWorkspaceTags(
|
|
108
|
+
qc,
|
|
109
|
+
workspaceId,
|
|
110
|
+
(tags) => tags.map((tag) => {
|
|
111
|
+
const change = delta.get(tag.external_id);
|
|
112
|
+
return change ? { ...tag, doctag_count: Math.max(0, tag.doctag_count + change) } : tag;
|
|
113
|
+
})
|
|
114
|
+
);
|
|
115
|
+
void invalidateTagTables(qc, workspaceId);
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
DOCUMENT_STATUS_POLL_MS,
|
|
119
|
+
FINISHED_DOCUMENT_STATUSES,
|
|
120
|
+
SIMILARITY_THRESHOLD,
|
|
121
|
+
adjustTagCounts,
|
|
122
|
+
refreshDocuments,
|
|
123
|
+
useDocument,
|
|
124
|
+
useDocuments,
|
|
125
|
+
useRefreshDocuments,
|
|
126
|
+
useSimilarDocuments
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=documents-data.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/documents-data.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Reading documents: a workspace's list (`useDocuments`, progressive, read once and then patched in\n * place), one document (`useDocument`, for a viewer), a set of documents by id, near-duplicate pairs\n * (`useSimilarDocuments`), and {@link refreshDocuments}, which re-reads just the documents an event\n * named and patches them into every cache that shows them.\n */\n\nimport { useCallback } from 'react'\nimport { useQuery, useQueryClient, type QueryClient } from '@tanstack/react-query'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../hooks'\nimport { invalidateTagTables, patchWorkspaceTags } from '../tags'\nimport {\n getCachedDocuments,\n setCachedDocument,\n upsertDocuments,\n type WorkspaceDocument,\n} from './documents-cache'\nimport { loadDocuments } from './documents-loader'\nimport { FINISHED_DOCUMENT_STATUSES, isRowNewer } from './processing-order'\nimport { useArbiWsStore } from '../websocket/store'\n\nexport { FINISHED_DOCUMENT_STATUSES }\n\n/** The workspace open on `arbi`, or `null`. */\nfunction openWorkspaceId(arbi: Arbi): string | null {\n return arbi.hasWorkspace ? arbi.getWorkspaceId() : null\n}\n\n/**\n * A workspace's documents (default: the open one). Read progressively: the first page is the\n * result, the remaining pages arrive in the background (`useDocumentsLoading`). After that the list\n * is never re-read on its own (mounting, focus, reconnecting): writes, processing events and\n * {@link refreshDocuments} patch it in place, as re-reading 100k documents is slow and tells\n * nothing new. Invalidating it re-reads it.\n */\nexport function useDocuments(workspaceId?: string | null, options?: { enabled?: boolean }) {\n const arbi = useArbi()\n const qc = useQueryClient()\n const workspace = workspaceId ?? openWorkspaceId(arbi) ?? ''\n return useQuery({\n queryKey: arbiQueryKeys.documents(workspace),\n queryFn: ({ signal }) => {\n if (openWorkspaceId(arbi) !== workspace)\n return Promise.reject(new Error('The selected workspace changed.'))\n return loadDocuments(qc, arbi, workspace, signal)\n },\n enabled: (options?.enabled ?? true) && !!workspace && arbi.hasWorkspace,\n staleTime: Infinity,\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n })\n}\n\n/** How often a document still being processed is re-read (`useDocument`'s `pollWhileProcessing`). */\nexport const DOCUMENT_STATUS_POLL_MS = 4000\n\n/** Re-read a document while it is processing (a viewer waiting for its pages). */\nfunction processingInterval(doc: WorkspaceDocument | null | undefined): number | false {\n return doc?.status && !FINISHED_DOCUMENT_STATUSES.has(doc.status)\n ? DOCUMENT_STATUS_POLL_MS\n : false\n}\n\n/**\n * One document (`null`: not found or not visible). `pollWhileProcessing` re-reads it every few\n * seconds until its processing is over. Writes here keep it current.\n */\nexport function useDocument(\n docId: string | null | undefined,\n options?: { enabled?: boolean; pollWhileProcessing?: boolean }\n) {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.document(docId ?? ''),\n queryFn: async (): Promise<WorkspaceDocument | null> =>\n (await arbi.documents.get([docId as string]))[0] ?? null,\n enabled: (options?.enabled ?? true) && !!docId && arbi.isLoggedIn,\n refetchInterval: options?.pollWhileProcessing\n ? (query) => processingInterval(query.state.data)\n : false,\n })\n}\n\n/**\n * The similarity at or above which two documents count as near duplicates (the Related column).\n * The server keeps every pair above 0.75 but returns only those at or above what is asked.\n */\nexport const SIMILARITY_THRESHOLD = 0.98\n\n/** Near-duplicate document pairs in the open workspace, at or above {@link SIMILARITY_THRESHOLD}. */\nexport function useSimilarDocuments(options?: { enabled?: boolean }) {\n const arbi = useArbi()\n const workspace = openWorkspaceId(arbi) ?? ''\n return useQuery({\n queryKey: arbiQueryKeys.similarDocuments(workspace, SIMILARITY_THRESHOLD),\n queryFn: () =>\n arbi.readInWorkspace(workspace, () =>\n arbi.documents.similar({ threshold: SIMILARITY_THRESHOLD })\n ),\n enabled: (options?.enabled ?? true) && !!workspace,\n })\n}\n\n// Each re-read gets a number; only the latest one issued for a document may write it. Events can\n// return out of order, and an older read must not undo tags a newer one applied.\nlet readSeq = 0\nconst latestReadByDoc = new Map<string, number>()\n\n/**\n * Re-read `docIds` and patch them into the caches that show them: their workspace's list (added\n * when new), their own entries, and the tag list's document counts (tags the server applied, e.g.\n * AI fields). For events that name documents (a batch finished, a version saved, an upload): the\n * list is never re-read for them. A failed read leaves the caches as they were.\n */\nexport async function refreshDocuments(\n qc: QueryClient,\n arbi: Arbi,\n docIds: string[]\n): Promise<WorkspaceDocument[]> {\n if (!docIds.length) return []\n const seq = ++readSeq\n for (const id of docIds) latestReadByDoc.set(id, seq)\n try {\n const read = await arbi.documents.get(docIds)\n const fresh = read\n .filter((doc) => latestReadByDoc.get(doc.external_id) === seq)\n .map((doc) => {\n // A finished status heard live wins over a read that predates it (the row may not be\n // committed yet), never over a row that finished after it.\n const live = useArbiWsStore.getState().tasks[doc.external_id]\n return live &&\n FINISHED_DOCUMENT_STATUSES.has(live.status) &&\n doc.status !== live.status &&\n isRowNewer(doc, live) !== true\n ? { ...doc, status: live.status }\n : doc\n })\n if (!fresh.length) return []\n reconcileTagCounts(qc, fresh)\n upsertDocuments(qc, fresh)\n for (const doc of fresh) setCachedDocument(qc, doc)\n return fresh\n } catch (error) {\n // Leave the caches as they were: re-reading the whole list would shrink it to its first page.\n console.error('Re-reading documents failed; the cached ones are kept:', error)\n return []\n } finally {\n for (const id of docIds) if (latestReadByDoc.get(id) === seq) latestReadByDoc.delete(id)\n }\n}\n\n/** `refreshDocuments` on this host's cache and `Arbi`, for a component or a hook. */\nexport function useRefreshDocuments(): (docIds: string[]) => Promise<WorkspaceDocument[]> {\n const qc = useQueryClient()\n const arbi = useArbi()\n return useCallback((docIds: string[]) => refreshDocuments(qc, arbi, docIds), [qc, arbi])\n}\n\n/** Move each tag's document count by the tags the re-read documents gained or lost. */\nfunction reconcileTagCounts(qc: QueryClient, fresh: WorkspaceDocument[]): void {\n const byWorkspace = new Map<string, Map<string, number>>()\n for (const doc of fresh) {\n const cached = getCachedDocuments(qc, doc.workspace_ext_id)?.find(\n (d) => d.external_id === doc.external_id\n )\n const before = new Set((cached?.doctags ?? []).map((dt) => dt.tag_ext_id))\n const after = new Set((doc.doctags ?? []).map((dt) => dt.tag_ext_id))\n const delta = byWorkspace.get(doc.workspace_ext_id) ?? new Map<string, number>()\n for (const id of after) if (!before.has(id)) delta.set(id, (delta.get(id) ?? 0) + 1)\n for (const id of before) if (!after.has(id)) delta.set(id, (delta.get(id) ?? 0) - 1)\n byWorkspace.set(doc.workspace_ext_id, delta)\n }\n for (const [workspaceId, delta] of byWorkspace) adjustTagCounts(qc, workspaceId, delta)\n}\n\n/** Add `delta` (tag id \u2192 change) to the tags' document counts; the tag tables re-read. */\nexport function adjustTagCounts(\n qc: QueryClient,\n workspaceId: string,\n delta: Map<string, number>\n): void {\n if (![...delta.values()].some(Boolean)) return\n patchWorkspaceTags(qc, workspaceId, (tags) =>\n tags.map((tag) => {\n const change = delta.get(tag.external_id)\n return change ? { ...tag, doctag_count: Math.max(0, tag.doctag_count + change) } : tag\n })\n )\n void invalidateTagTables(qc, workspaceId)\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,mBAAmB;AAC5B,SAAS,UAAU,sBAAwC;AAE3D,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB,0BAA0B;AACxD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,qBAAqB;AAC9B,SAAS,4BAA4B,kBAAkB;AACvD,SAAS,sBAAsB;AAK/B,SAAS,gBAAgB,MAA2B;AAClD,SAAO,KAAK,eAAe,KAAK,eAAe,IAAI;AACrD;AASO,SAAS,aAAa,aAA6B,SAAiC;AACzF,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,eAAe;AAC1B,QAAM,YAAY,eAAe,gBAAgB,IAAI,KAAK;AAC1D,SAAO,SAAS;AAAA,IACd,UAAU,cAAc,UAAU,SAAS;AAAA,IAC3C,SAAS,CAAC,EAAE,OAAO,MAAM;AACvB,UAAI,gBAAgB,IAAI,MAAM;AAC5B,eAAO,QAAQ,OAAO,IAAI,MAAM,iCAAiC,CAAC;AACpE,aAAO,cAAc,IAAI,MAAM,WAAW,MAAM;AAAA,IAClD;AAAA,IACA,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC,aAAa,KAAK;AAAA,IAC3D,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,EACxB,CAAC;AACH;AAGO,MAAM,0BAA0B;AAGvC,SAAS,mBAAmB,KAA2D;AACrF,SAAO,KAAK,UAAU,CAAC,2BAA2B,IAAI,IAAI,MAAM,IAC5D,0BACA;AACN;AAMO,SAAS,YACd,OACA,SACA;AACA,QAAM,OAAO,QAAQ;AACrB,SAAO,SAAS;AAAA,IACd,UAAU,cAAc,SAAS,SAAS,EAAE;AAAA,IAC5C,SAAS,aACN,MAAM,KAAK,UAAU,IAAI,CAAC,KAAe,CAAC,GAAG,CAAC,KAAK;AAAA,IACtD,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC,SAAS,KAAK;AAAA,IACvD,iBAAiB,SAAS,sBACtB,CAAC,UAAU,mBAAmB,MAAM,MAAM,IAAI,IAC9C;AAAA,EACN,CAAC;AACH;AAMO,MAAM,uBAAuB;AAG7B,SAAS,oBAAoB,SAAiC;AACnE,QAAM,OAAO,QAAQ;AACrB,QAAM,YAAY,gBAAgB,IAAI,KAAK;AAC3C,SAAO,SAAS;AAAA,IACd,UAAU,cAAc,iBAAiB,WAAW,oBAAoB;AAAA,IACxE,SAAS,MACP,KAAK;AAAA,MAAgB;AAAA,MAAW,MAC9B,KAAK,UAAU,QAAQ,EAAE,WAAW,qBAAqB,CAAC;AAAA,IAC5D;AAAA,IACF,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC;AAAA,EAC3C,CAAC;AACH;AAIA,IAAI,UAAU;AACd,MAAM,kBAAkB,oBAAI,IAAoB;AAQhD,eAAsB,iBACpB,IACA,MACA,QAC8B;AAC9B,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAC;AAC5B,QAAM,MAAM,EAAE;AACd,aAAW,MAAM,OAAQ,iBAAgB,IAAI,IAAI,GAAG;AACpD,MAAI;AACF,UAAM,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM;AAC5C,UAAM,QAAQ,KACX,OAAO,CAAC,QAAQ,gBAAgB,IAAI,IAAI,WAAW,MAAM,GAAG,EAC5D,IAAI,CAAC,QAAQ;AAGZ,YAAM,OAAO,eAAe,SAAS,EAAE,MAAM,IAAI,WAAW;AAC5D,aAAO,QACL,2BAA2B,IAAI,KAAK,MAAM,KAC1C,IAAI,WAAW,KAAK,UACpB,WAAW,KAAK,IAAI,MAAM,OACxB,EAAE,GAAG,KAAK,QAAQ,KAAK,OAAO,IAC9B;AAAA,IACN,CAAC;AACH,QAAI,CAAC,MAAM,OAAQ,QAAO,CAAC;AAC3B,uBAAmB,IAAI,KAAK;AAC5B,oBAAgB,IAAI,KAAK;AACzB,eAAW,OAAO,MAAO,mBAAkB,IAAI,GAAG;AAClD,WAAO;AAAA,EACT,SAAS,OAAO;AAEd,YAAQ,MAAM,0DAA0D,KAAK;AAC7E,WAAO,CAAC;AAAA,EACV,UAAE;AACA,eAAW,MAAM,OAAQ,KAAI,gBAAgB,IAAI,EAAE,MAAM,IAAK,iBAAgB,OAAO,EAAE;AAAA,EACzF;AACF;AAGO,SAAS,sBAA0E;AACxF,QAAM,KAAK,eAAe;AAC1B,QAAM,OAAO,QAAQ;AACrB,SAAO,YAAY,CAAC,WAAqB,iBAAiB,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC;AACzF;AAGA,SAAS,mBAAmB,IAAiB,OAAkC;AAC7E,QAAM,cAAc,oBAAI,IAAiC;AACzD,aAAW,OAAO,OAAO;AACvB,UAAM,SAAS,mBAAmB,IAAI,IAAI,gBAAgB,GAAG;AAAA,MAC3D,CAAC,MAAM,EAAE,gBAAgB,IAAI;AAAA,IAC/B;AACA,UAAM,SAAS,IAAI,KAAK,QAAQ,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;AACzE,UAAM,QAAQ,IAAI,KAAK,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;AACpE,UAAM,QAAQ,YAAY,IAAI,IAAI,gBAAgB,KAAK,oBAAI,IAAoB;AAC/E,eAAW,MAAM,MAAO,KAAI,CAAC,OAAO,IAAI,EAAE,EAAG,OAAM,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK,KAAK,CAAC;AACnF,eAAW,MAAM,OAAQ,KAAI,CAAC,MAAM,IAAI,EAAE,EAAG,OAAM,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK,KAAK,CAAC;AACnF,gBAAY,IAAI,IAAI,kBAAkB,KAAK;AAAA,EAC7C;AACA,aAAW,CAAC,aAAa,KAAK,KAAK,YAAa,iBAAgB,IAAI,aAAa,KAAK;AACxF;AAGO,SAAS,gBACd,IACA,aACA,OACM;AACN,MAAI,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,OAAO,EAAG;AACxC;AAAA,IAAmB;AAAA,IAAI;AAAA,IAAa,CAAC,SACnC,KAAK,IAAI,CAAC,QAAQ;AAChB,YAAM,SAAS,MAAM,IAAI,IAAI,WAAW;AACxC,aAAO,SAAS,EAAE,GAAG,KAAK,cAAc,KAAK,IAAI,GAAG,IAAI,eAAe,MAAM,EAAE,IAAI;AAAA,IACrF,CAAC;AAAA,EACH;AACA,OAAK,oBAAoB,IAAI,WAAW;AAC1C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
import { patchDocuments } from "./documents-cache.js";
|
|
3
|
+
const DOCUMENTS_FIRST_PAGE_SIZE = 500;
|
|
4
|
+
const DOCUMENTS_PAGE_SIZE = 2e3;
|
|
5
|
+
const DOCUMENTS_FIRST_PAGE_MEASURE = "arbi:document-list:page1";
|
|
6
|
+
const FIRST_PAGE_MEASURE = DOCUMENTS_FIRST_PAGE_MEASURE;
|
|
7
|
+
const FIRST_PAGE_START = "arbi:document-list:start";
|
|
8
|
+
function mark(name) {
|
|
9
|
+
try {
|
|
10
|
+
performance.mark(name);
|
|
11
|
+
} catch {
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function measure(name, start) {
|
|
15
|
+
try {
|
|
16
|
+
performance.measure(name, start);
|
|
17
|
+
} catch {
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const backgroundReads = /* @__PURE__ */ new Map();
|
|
21
|
+
const loadingListeners = /* @__PURE__ */ new Set();
|
|
22
|
+
function emitLoading() {
|
|
23
|
+
for (const listener of loadingListeners) listener();
|
|
24
|
+
}
|
|
25
|
+
function subscribeLoading(listener) {
|
|
26
|
+
loadingListeners.add(listener);
|
|
27
|
+
return () => {
|
|
28
|
+
loadingListeners.delete(listener);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function isDocumentsLoading() {
|
|
32
|
+
return backgroundReads.size > 0;
|
|
33
|
+
}
|
|
34
|
+
function useDocumentsLoading() {
|
|
35
|
+
return useSyncExternalStore(subscribeLoading, isDocumentsLoading, () => false);
|
|
36
|
+
}
|
|
37
|
+
function stopDocumentsLoading(workspaceId) {
|
|
38
|
+
const controller = backgroundReads.get(workspaceId);
|
|
39
|
+
if (!controller) return;
|
|
40
|
+
controller.abort();
|
|
41
|
+
backgroundReads.delete(workspaceId);
|
|
42
|
+
emitLoading();
|
|
43
|
+
}
|
|
44
|
+
async function loadDocuments(qc, arbi, workspaceId, signal) {
|
|
45
|
+
let stopped = false;
|
|
46
|
+
for (const [id, controller2] of backgroundReads) {
|
|
47
|
+
if (id === workspaceId) continue;
|
|
48
|
+
controller2.abort();
|
|
49
|
+
backgroundReads.delete(id);
|
|
50
|
+
stopped = true;
|
|
51
|
+
}
|
|
52
|
+
if (stopped) emitLoading();
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
signal?.addEventListener("abort", () => controller.abort(), { once: true });
|
|
55
|
+
const pages = arbi.documents.listPaginated({
|
|
56
|
+
workspaceId,
|
|
57
|
+
pageSize: DOCUMENTS_PAGE_SIZE,
|
|
58
|
+
firstPageSize: DOCUMENTS_FIRST_PAGE_SIZE,
|
|
59
|
+
signal: controller.signal
|
|
60
|
+
});
|
|
61
|
+
mark(FIRST_PAGE_START);
|
|
62
|
+
const first = await pages.next();
|
|
63
|
+
const firstPage = first.done ? [] : first.value;
|
|
64
|
+
measure(FIRST_PAGE_MEASURE, FIRST_PAGE_START);
|
|
65
|
+
if (first.done || firstPage.length < DOCUMENTS_FIRST_PAGE_SIZE) return firstPage;
|
|
66
|
+
if (backgroundReads.has(workspaceId)) {
|
|
67
|
+
controller.abort();
|
|
68
|
+
return firstPage;
|
|
69
|
+
}
|
|
70
|
+
backgroundReads.set(workspaceId, controller);
|
|
71
|
+
emitLoading();
|
|
72
|
+
void appendRemainingPages(qc, workspaceId, pages, controller.signal).finally(() => {
|
|
73
|
+
if (backgroundReads.get(workspaceId) !== controller) return;
|
|
74
|
+
backgroundReads.delete(workspaceId);
|
|
75
|
+
emitLoading();
|
|
76
|
+
});
|
|
77
|
+
return firstPage;
|
|
78
|
+
}
|
|
79
|
+
async function appendRemainingPages(qc, workspaceId, pages, signal) {
|
|
80
|
+
await Promise.resolve();
|
|
81
|
+
try {
|
|
82
|
+
for await (const page of pages) {
|
|
83
|
+
if (signal.aborted) return;
|
|
84
|
+
patchDocuments(
|
|
85
|
+
qc,
|
|
86
|
+
(old) => {
|
|
87
|
+
const known = new Set(old.map((doc) => doc.external_id));
|
|
88
|
+
const fresh = page.filter((doc) => !known.has(doc.external_id));
|
|
89
|
+
return fresh.length ? [...old, ...fresh] : old;
|
|
90
|
+
},
|
|
91
|
+
workspaceId
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
} catch (error) {
|
|
95
|
+
if (!signal.aborted) console.error(`Reading the documents of ${workspaceId} failed:`, error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function resetDocumentsLoadingForTests() {
|
|
99
|
+
for (const controller of backgroundReads.values()) controller.abort();
|
|
100
|
+
backgroundReads.clear();
|
|
101
|
+
emitLoading();
|
|
102
|
+
}
|
|
103
|
+
export {
|
|
104
|
+
DOCUMENTS_FIRST_PAGE_MEASURE,
|
|
105
|
+
DOCUMENTS_FIRST_PAGE_SIZE,
|
|
106
|
+
DOCUMENTS_PAGE_SIZE,
|
|
107
|
+
isDocumentsLoading,
|
|
108
|
+
loadDocuments,
|
|
109
|
+
resetDocumentsLoadingForTests,
|
|
110
|
+
stopDocumentsLoading,
|
|
111
|
+
useDocumentsLoading
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=documents-loader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/documents-loader.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Reading a workspace's documents progressively: the first page is the query's result, so the\n * list shows within a few hundred milliseconds even for 100k documents, and the remaining pages\n * are appended to the same cache entry in the background as they arrive. One background read per\n * workspace; opening another workspace stops the previous one. Whether a background read is\n * running is observable ({@link useDocumentsLoading}), for a \"still loading\" indicator.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport type { QueryClient } from '@tanstack/react-query'\nimport type { Arbi } from '@arbidocs/sdk/browser'\nimport { patchDocuments, type WorkspaceDocument } from './documents-cache'\n\n/** First page: small, so rows are on screen in a few hundred ms even in a large workspace. */\nexport const DOCUMENTS_FIRST_PAGE_SIZE = 500\n\n/** Later pages: larger, fewer round trips (the server caps a page at 10 000). */\nexport const DOCUMENTS_PAGE_SIZE = 2000\n\n/**\n * The time to the first page, as a `performance` measure of this name (a host reporting\n * performance can observe it).\n */\nexport const DOCUMENTS_FIRST_PAGE_MEASURE = 'arbi:document-list:page1'\nconst FIRST_PAGE_MEASURE = DOCUMENTS_FIRST_PAGE_MEASURE\nconst FIRST_PAGE_START = 'arbi:document-list:start'\n\nfunction mark(name: string): void {\n try {\n performance.mark(name)\n } catch {\n // No performance timeline here (an old runtime, a test): nothing to record.\n }\n}\n\nfunction measure(name: string, start: string): void {\n try {\n performance.measure(name, start)\n } catch {\n // The start mark is missing: nothing to record.\n }\n}\n\nconst backgroundReads = new Map<string, AbortController>()\nconst loadingListeners = new Set<() => void>()\n\nfunction emitLoading(): void {\n for (const listener of loadingListeners) listener()\n}\n\nfunction subscribeLoading(listener: () => void): () => void {\n loadingListeners.add(listener)\n return () => {\n loadingListeners.delete(listener)\n }\n}\n\n/** Whether a workspace's remaining document pages are being read in the background. */\nexport function isDocumentsLoading(): boolean {\n return backgroundReads.size > 0\n}\n\n/** True while the remaining pages of a documents list are still arriving. */\nexport function useDocumentsLoading(): boolean {\n return useSyncExternalStore(subscribeLoading, isDocumentsLoading, () => false)\n}\n\n/** Stop a workspace's background read (closing the workspace). */\nexport function stopDocumentsLoading(workspaceId: string): void {\n const controller = backgroundReads.get(workspaceId)\n if (!controller) return\n controller.abort()\n backgroundReads.delete(workspaceId)\n emitLoading()\n}\n\n/**\n * Read a workspace's documents: resolves with the first page and appends the rest to\n * `arbiQueryKeys.documents(workspaceId)` in the background. The query function of `useDocuments`.\n */\nexport async function loadDocuments(\n qc: QueryClient,\n arbi: Arbi,\n workspaceId: string,\n signal?: AbortSignal\n): Promise<WorkspaceDocument[]> {\n let stopped = false\n for (const [id, controller] of backgroundReads) {\n if (id === workspaceId) continue\n controller.abort()\n backgroundReads.delete(id)\n stopped = true\n }\n if (stopped) emitLoading()\n\n const controller = new AbortController()\n signal?.addEventListener('abort', () => controller.abort(), { once: true })\n // Named, not the session's open workspace: the pages are this workspace's whatever the server\n // session is in, so a list read across a workspace switch can never be another's.\n const pages = arbi.documents.listPaginated({\n workspaceId,\n pageSize: DOCUMENTS_PAGE_SIZE,\n firstPageSize: DOCUMENTS_FIRST_PAGE_SIZE,\n signal: controller.signal,\n })\n mark(FIRST_PAGE_START)\n const first = await pages.next()\n const firstPage = first.done ? [] : first.value\n measure(FIRST_PAGE_MEASURE, FIRST_PAGE_START)\n if (first.done || firstPage.length < DOCUMENTS_FIRST_PAGE_SIZE) return firstPage\n if (backgroundReads.has(workspaceId)) {\n controller.abort()\n return firstPage\n }\n\n backgroundReads.set(workspaceId, controller)\n emitLoading()\n void appendRemainingPages(qc, workspaceId, pages, controller.signal).finally(() => {\n if (backgroundReads.get(workspaceId) !== controller) return\n backgroundReads.delete(workspaceId)\n emitLoading()\n })\n return firstPage\n}\n\nasync function appendRemainingPages(\n qc: QueryClient,\n workspaceId: string,\n pages: AsyncGenerator<WorkspaceDocument[]>,\n signal: AbortSignal\n): Promise<void> {\n // Let the query store the first page before the second is appended to it.\n await Promise.resolve()\n try {\n for await (const page of pages) {\n if (signal.aborted) return\n // A write may already have added some of these (an upload finishing meanwhile).\n patchDocuments(\n qc,\n (old) => {\n const known = new Set(old.map((doc) => doc.external_id))\n const fresh = page.filter((doc) => !known.has(doc.external_id))\n return fresh.length ? [...old, ...fresh] : old\n },\n workspaceId\n )\n }\n } catch (error) {\n if (!signal.aborted) console.error(`Reading the documents of ${workspaceId} failed:`, error)\n }\n}\n\n/** Test-only: stop every background read. @internal */\nexport function resetDocumentsLoadingForTests(): void {\n for (const controller of backgroundReads.values()) controller.abort()\n backgroundReads.clear()\n emitLoading()\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["controller"]
|
|
7
|
+
}
|