@arbidocs/react 0.5.110 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
- package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.cjs +13 -13
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.cjs +48 -48
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
- package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
- package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
- package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
- package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
- package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
- package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
- package/dist/chunk-PWGSIM3F.cjs +291 -0
- package/dist/chunk-PWGSIM3F.cjs.map +1 -0
- package/dist/chunk-QP3WQSAA.cjs +23 -0
- package/dist/chunk-QP3WQSAA.cjs.map +1 -0
- package/dist/chunk-T5FZICXN.cjs +50 -0
- package/dist/chunk-T5FZICXN.cjs.map +1 -0
- package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
- package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
- package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +99 -99
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +101 -101
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +1689 -1619
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +702 -17060
- package/dist/index.js.map +7 -1
- package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
- package/dist/lazy-chunk.js +46 -0
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
- package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +167 -154
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +290 -9
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.cjs +17 -0
- package/dist/viewers/PdfViewer.cjs.map +1 -0
- package/dist/viewers/PdfViewer.d.ts +9 -0
- package/dist/viewers/PdfViewer.js +20 -0
- package/dist/viewers/PdfViewer.js.map +7 -0
- package/dist/viewers/PdfViewerImpl.js +384 -0
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.cjs +79 -653
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +3 -1
- package/dist/viewers/index.js +60 -903
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +12 -4
- package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-6H3O63TQ.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-CPQ3CU4B.js +0 -246
- package/dist/chunk-CPQ3CU4B.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DQALOQPI.js +0 -2766
- package/dist/chunk-DQALOQPI.js.map +0 -1
- package/dist/chunk-FZJMA32S.js +0 -1011
- package/dist/chunk-FZJMA32S.js.map +0 -1
- package/dist/chunk-H5M7FXLB.js +0 -2057
- package/dist/chunk-H5M7FXLB.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-P6WLV5UY.js +0 -644
- package/dist/chunk-P6WLV5UY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-BMhTH98a.d.cts +0 -2035
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15893
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -25
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/index.d.cts +0 -260
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
const AUDIO_MIME_PREFERENCE = [
|
|
2
|
+
"audio/webm;codecs=opus",
|
|
3
|
+
"audio/ogg;codecs=opus",
|
|
4
|
+
"audio/mp4;codecs=mp4a.40.2",
|
|
5
|
+
"audio/mp4"
|
|
6
|
+
];
|
|
7
|
+
const VIDEO_MIME_PREFERENCE = [
|
|
8
|
+
"video/webm;codecs=av01,opus",
|
|
9
|
+
"video/webm;codecs=av1,opus",
|
|
10
|
+
"video/webm;codecs=vp9,opus",
|
|
11
|
+
"video/webm;codecs=vp8,opus",
|
|
12
|
+
"video/webm",
|
|
13
|
+
"video/mp4"
|
|
14
|
+
];
|
|
15
|
+
function pickRecorderMimeType(kind, isTypeSupported = (t) => typeof MediaRecorder !== "undefined" && MediaRecorder.isTypeSupported(t)) {
|
|
16
|
+
const list = kind === "audio" ? AUDIO_MIME_PREFERENCE : VIDEO_MIME_PREFERENCE;
|
|
17
|
+
for (const type of list) {
|
|
18
|
+
try {
|
|
19
|
+
if (isTypeSupported(type)) return type;
|
|
20
|
+
} catch {
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return list[list.length - 1];
|
|
24
|
+
}
|
|
25
|
+
function createChunkedRecorder(options) {
|
|
26
|
+
const now = options.now ?? (() => Date.now());
|
|
27
|
+
const mode = options.mode ?? "restart";
|
|
28
|
+
let running = false;
|
|
29
|
+
let index = 0;
|
|
30
|
+
let timer = null;
|
|
31
|
+
let tail = Promise.resolve();
|
|
32
|
+
const recorderInit = () => ({
|
|
33
|
+
mimeType: options.mimeType,
|
|
34
|
+
...options.audioBitsPerSecond ? { audioBitsPerSecond: options.audioBitsPerSecond } : {},
|
|
35
|
+
...options.videoBitsPerSecond ? { videoBitsPerSecond: options.videoBitsPerSecond } : {}
|
|
36
|
+
});
|
|
37
|
+
const fail = (err) => {
|
|
38
|
+
running = false;
|
|
39
|
+
if (timer !== null) clearTimeout(timer);
|
|
40
|
+
timer = null;
|
|
41
|
+
options.onError?.(err);
|
|
42
|
+
};
|
|
43
|
+
const beginPart = () => {
|
|
44
|
+
let recorder;
|
|
45
|
+
try {
|
|
46
|
+
recorder = new MediaRecorder(options.stream, recorderInit());
|
|
47
|
+
} catch (err) {
|
|
48
|
+
fail(err);
|
|
49
|
+
return void 0;
|
|
50
|
+
}
|
|
51
|
+
const chunks = [];
|
|
52
|
+
const part = { recorder, startedAt: now(), chunks };
|
|
53
|
+
recorder.ondataavailable = (e) => {
|
|
54
|
+
if (e.data.size > 0) chunks.push(e.data);
|
|
55
|
+
};
|
|
56
|
+
recorder.onstart = () => {
|
|
57
|
+
part.startedAt = now();
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
recorder.start();
|
|
61
|
+
} catch (err) {
|
|
62
|
+
fail(err);
|
|
63
|
+
return void 0;
|
|
64
|
+
}
|
|
65
|
+
return part;
|
|
66
|
+
};
|
|
67
|
+
const endPart = (part) => new Promise((resolve) => {
|
|
68
|
+
const { recorder, startedAt, chunks } = part;
|
|
69
|
+
const durationMs = Math.max(0, now() - startedAt);
|
|
70
|
+
const partIndex = index++;
|
|
71
|
+
const emit = () => {
|
|
72
|
+
if (chunks.length) {
|
|
73
|
+
const type = recorder.mimeType || options.mimeType;
|
|
74
|
+
options.onChunk({
|
|
75
|
+
blob: new Blob(chunks, { type }),
|
|
76
|
+
mimeType: type,
|
|
77
|
+
index: partIndex,
|
|
78
|
+
startedAt,
|
|
79
|
+
durationMs,
|
|
80
|
+
standalone: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
resolve();
|
|
84
|
+
};
|
|
85
|
+
if (recorder.state === "inactive") {
|
|
86
|
+
emit();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
recorder.onstop = emit;
|
|
90
|
+
recorder.stop();
|
|
91
|
+
});
|
|
92
|
+
let open;
|
|
93
|
+
const rotate = () => {
|
|
94
|
+
if (!running || !open) return;
|
|
95
|
+
const finished = open;
|
|
96
|
+
open = beginPart();
|
|
97
|
+
tail = tail.then(() => endPart(finished));
|
|
98
|
+
if (running) timer = setTimeout(rotate, options.chunkMs);
|
|
99
|
+
};
|
|
100
|
+
let sliceStartedAt = 0;
|
|
101
|
+
let sliceRecorder = null;
|
|
102
|
+
let stopResolve = null;
|
|
103
|
+
const startTimeslice = () => {
|
|
104
|
+
let recorder;
|
|
105
|
+
try {
|
|
106
|
+
recorder = new MediaRecorder(options.stream, recorderInit());
|
|
107
|
+
} catch (err) {
|
|
108
|
+
fail(err);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
sliceRecorder = recorder;
|
|
112
|
+
sliceStartedAt = now();
|
|
113
|
+
recorder.ondataavailable = (e) => {
|
|
114
|
+
const at = now();
|
|
115
|
+
const startedAt = sliceStartedAt;
|
|
116
|
+
sliceStartedAt = at;
|
|
117
|
+
if (!e.data.size) return;
|
|
118
|
+
const type = recorder.mimeType || options.mimeType;
|
|
119
|
+
const partIndex = index++;
|
|
120
|
+
options.onChunk({
|
|
121
|
+
blob: e.data,
|
|
122
|
+
mimeType: type,
|
|
123
|
+
index: partIndex,
|
|
124
|
+
startedAt,
|
|
125
|
+
durationMs: Math.max(0, at - startedAt),
|
|
126
|
+
standalone: partIndex === 0
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
recorder.onstop = () => {
|
|
130
|
+
stopResolve?.();
|
|
131
|
+
stopResolve = null;
|
|
132
|
+
};
|
|
133
|
+
try {
|
|
134
|
+
recorder.start();
|
|
135
|
+
} catch (err) {
|
|
136
|
+
sliceRecorder = null;
|
|
137
|
+
fail(err);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
timer = setInterval(() => {
|
|
141
|
+
if (recorder.state === "recording") recorder.requestData();
|
|
142
|
+
}, options.chunkMs);
|
|
143
|
+
};
|
|
144
|
+
return {
|
|
145
|
+
get running() {
|
|
146
|
+
return running;
|
|
147
|
+
},
|
|
148
|
+
start() {
|
|
149
|
+
if (running) return;
|
|
150
|
+
running = true;
|
|
151
|
+
index = 0;
|
|
152
|
+
if (mode === "timeslice") {
|
|
153
|
+
startTimeslice();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
open = beginPart();
|
|
157
|
+
if (running) timer = setTimeout(rotate, options.chunkMs);
|
|
158
|
+
},
|
|
159
|
+
stop() {
|
|
160
|
+
if (!running && !open && !sliceRecorder) return tail;
|
|
161
|
+
running = false;
|
|
162
|
+
if (timer !== null) {
|
|
163
|
+
clearTimeout(timer);
|
|
164
|
+
clearInterval(timer);
|
|
165
|
+
}
|
|
166
|
+
timer = null;
|
|
167
|
+
if (mode === "timeslice") {
|
|
168
|
+
const recorder = sliceRecorder;
|
|
169
|
+
sliceRecorder = null;
|
|
170
|
+
if (!recorder || recorder.state === "inactive") return tail;
|
|
171
|
+
tail = new Promise((resolve) => {
|
|
172
|
+
stopResolve = resolve;
|
|
173
|
+
recorder.stop();
|
|
174
|
+
});
|
|
175
|
+
return tail;
|
|
176
|
+
}
|
|
177
|
+
const finished = open;
|
|
178
|
+
open = void 0;
|
|
179
|
+
if (finished) tail = tail.then(() => endPart(finished));
|
|
180
|
+
return tail;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export {
|
|
185
|
+
AUDIO_MIME_PREFERENCE,
|
|
186
|
+
VIDEO_MIME_PREFERENCE,
|
|
187
|
+
createChunkedRecorder,
|
|
188
|
+
pickRecorderMimeType
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=chunked-recorder.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/chunked-recorder.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Chunked MediaRecorder engine \u2014 records a stream in fixed-length parts for a\n * long-running recording that is uploaded as it goes (call recording).\n *\n * Two ways to cut the parts:\n * - `restart` (default): every `chunkMs` the recorder is stopped and a new\n * one started on the same stream, so EVERY part is a standalone file with\n * its own container header (playable, decodable and transcribable on its\n * own). The gap between two parts is the few ms between stop and start.\n * - `timeslice`: one recorder, `requestData()` every `chunkMs` \u2014 the parts\n * are consecutive byte ranges of ONE file (only the first carries the\n * header), so concatenating them in order gives the whole recording with\n * no gap. Used where the parts are only ever played back as one file.\n *\n * Framework-free (no React) so it can be driven by `useAudioRecorder`'s\n * chunk mode and directly by a host that records a composed stream.\n */\n\n/** One part of a chunked recording. */\nexport interface RecordedChunk {\n blob: Blob\n mimeType: string\n /** 0, 1, 2\u2026 in recording order (per recorder instance). */\n index: number\n /** Wall-clock start of the part, ms since epoch. */\n startedAt: number\n durationMs: number\n /** `restart`: always true. `timeslice`: only the first part starts a file. */\n standalone: boolean\n}\n\nexport interface ChunkedRecorderOptions {\n stream: MediaStream\n /** MediaRecorder MIME type (pick it with {@link pickRecorderMimeType}). */\n mimeType: string\n /** Part length, ms (~30 s for call recording). */\n chunkMs: number\n mode?: 'restart' | 'timeslice'\n audioBitsPerSecond?: number\n videoBitsPerSecond?: number\n onChunk(chunk: RecordedChunk): void\n /** Called when a MediaRecorder fails; the recorder stops. */\n onError?(error: unknown): void\n /** Wall clock (tests). */\n now?: () => number\n}\n\nexport interface ChunkedRecorder {\n readonly running: boolean\n start(): void\n /** Stop and flush the tail part; resolves once it was handed to `onChunk`. */\n stop(): Promise<void>\n}\n\n/** Audio MIME types in preference order: Opus/WebM, then AAC/MP4 (Safari). */\nexport const AUDIO_MIME_PREFERENCE = [\n 'audio/webm;codecs=opus',\n 'audio/ogg;codecs=opus',\n 'audio/mp4;codecs=mp4a.40.2',\n 'audio/mp4',\n] as const\n\n/** Video MIME types in preference order: AV1, VP9, VP8 (with Opus), then MP4. */\nexport const VIDEO_MIME_PREFERENCE = [\n 'video/webm;codecs=av01,opus',\n 'video/webm;codecs=av1,opus',\n 'video/webm;codecs=vp9,opus',\n 'video/webm;codecs=vp8,opus',\n 'video/webm',\n 'video/mp4',\n] as const\n\n/**\n * The first MIME type `isTypeSupported` accepts, or the last of the list (the\n * broadest container) when it accepts none.\n */\nexport function pickRecorderMimeType(\n kind: 'audio' | 'video',\n isTypeSupported: (type: string) => boolean = (t) =>\n typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported(t)\n): string {\n const list: readonly string[] = kind === 'audio' ? AUDIO_MIME_PREFERENCE : VIDEO_MIME_PREFERENCE\n for (const type of list) {\n try {\n if (isTypeSupported(type)) return type\n } catch {\n // A browser that throws on an unknown type: try the next one.\n }\n }\n return list[list.length - 1]\n}\n\nexport function createChunkedRecorder(options: ChunkedRecorderOptions): ChunkedRecorder {\n const now = options.now ?? (() => Date.now())\n const mode = options.mode ?? 'restart'\n let running = false\n let index = 0\n let timer: ReturnType<typeof setInterval> | ReturnType<typeof setTimeout> | null = null\n let tail: Promise<void> = Promise.resolve()\n\n const recorderInit = (): MediaRecorderOptions => ({\n mimeType: options.mimeType,\n ...(options.audioBitsPerSecond ? { audioBitsPerSecond: options.audioBitsPerSecond } : {}),\n ...(options.videoBitsPerSecond ? { videoBitsPerSecond: options.videoBitsPerSecond } : {}),\n })\n\n const fail = (err: unknown) => {\n running = false\n if (timer !== null) clearTimeout(timer as ReturnType<typeof setTimeout>)\n timer = null\n options.onError?.(err)\n }\n\n /** `restart`: one recorder per part; resolves when that part was emitted. */\n const beginPart = ():\n { recorder: MediaRecorder; startedAt: number; chunks: Blob[] } | undefined => {\n let recorder: MediaRecorder\n try {\n recorder = new MediaRecorder(options.stream, recorderInit())\n } catch (err) {\n fail(err)\n return undefined\n }\n const chunks: Blob[] = []\n const part = { recorder, startedAt: now(), chunks }\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data)\n }\n // Capture begins at the recorder's `start` event, which can come a second or more after\n // start() while the encoder spins up. Time the part from there: a part timed from start()\n // carries that latency as phantom silence at its start, and a transcript cut there splits a\n // sentence spoken across the part boundary.\n recorder.onstart = () => {\n part.startedAt = now()\n }\n try {\n recorder.start()\n } catch (err) {\n fail(err)\n return undefined\n }\n return part\n }\n\n const endPart = (part: { recorder: MediaRecorder; startedAt: number; chunks: Blob[] }) =>\n new Promise<void>((resolve) => {\n const { recorder, startedAt, chunks } = part\n const durationMs = Math.max(0, now() - startedAt)\n const partIndex = index++\n const emit = () => {\n if (chunks.length) {\n const type = recorder.mimeType || options.mimeType\n options.onChunk({\n blob: new Blob(chunks, { type }),\n mimeType: type,\n index: partIndex,\n startedAt,\n durationMs,\n standalone: true,\n })\n }\n resolve()\n }\n if (recorder.state === 'inactive') {\n emit()\n return\n }\n recorder.onstop = emit\n recorder.stop()\n })\n\n let open: { recorder: MediaRecorder; startedAt: number; chunks: Blob[] } | undefined\n\n const rotate = () => {\n if (!running || !open) return\n const finished = open\n // Start the next part before the previous one flushes: no gap but the start latency.\n open = beginPart()\n tail = tail.then(() => endPart(finished))\n if (running) timer = setTimeout(rotate, options.chunkMs)\n }\n\n // `timeslice`: one recorder; each dataavailable is a part.\n let sliceStartedAt = 0\n let sliceRecorder: MediaRecorder | null = null\n let stopResolve: (() => void) | null = null\n\n const startTimeslice = () => {\n let recorder: MediaRecorder\n try {\n recorder = new MediaRecorder(options.stream, recorderInit())\n } catch (err) {\n fail(err)\n return\n }\n sliceRecorder = recorder\n sliceStartedAt = now()\n recorder.ondataavailable = (e) => {\n const at = now()\n const startedAt = sliceStartedAt\n sliceStartedAt = at\n if (!e.data.size) return\n const type = recorder.mimeType || options.mimeType\n const partIndex = index++\n options.onChunk({\n blob: e.data,\n mimeType: type,\n index: partIndex,\n startedAt,\n durationMs: Math.max(0, at - startedAt),\n standalone: partIndex === 0,\n })\n }\n recorder.onstop = () => {\n stopResolve?.()\n stopResolve = null\n }\n try {\n recorder.start()\n } catch (err) {\n sliceRecorder = null\n fail(err)\n return\n }\n timer = setInterval(() => {\n if (recorder.state === 'recording') recorder.requestData()\n }, options.chunkMs)\n }\n\n return {\n get running() {\n return running\n },\n start() {\n if (running) return\n running = true\n index = 0\n if (mode === 'timeslice') {\n startTimeslice()\n return\n }\n open = beginPart()\n if (running) timer = setTimeout(rotate, options.chunkMs)\n },\n stop() {\n if (!running && !open && !sliceRecorder) return tail\n running = false\n if (timer !== null) {\n clearTimeout(timer as ReturnType<typeof setTimeout>)\n clearInterval(timer as ReturnType<typeof setInterval>)\n }\n timer = null\n if (mode === 'timeslice') {\n const recorder = sliceRecorder\n sliceRecorder = null\n if (!recorder || recorder.state === 'inactive') return tail\n tail = new Promise<void>((resolve) => {\n stopResolve = resolve\n // stop() fires a final dataavailable (the tail), then stop.\n recorder.stop()\n })\n return tail\n }\n const finished = open\n open = undefined\n if (finished) tail = tail.then(() => endPart(finished))\n return tail\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { getDocumentDate } from "./document-fields.js";
|
|
2
|
+
import { getDocumentTitle } from "../entities/DocumentEntity.js";
|
|
3
|
+
function fallbackFileName(doc) {
|
|
4
|
+
if (doc.file_name) return doc.file_name;
|
|
5
|
+
const title = getDocumentTitle(doc, `document-${doc.external_id}`);
|
|
6
|
+
const extension = doc.file_type || "pdf";
|
|
7
|
+
const ext = extension.startsWith(".") ? extension : `.${extension}`;
|
|
8
|
+
return title.toLowerCase().endsWith(ext.toLowerCase()) ? title : `${title}${ext}`;
|
|
9
|
+
}
|
|
10
|
+
const COLUMN_MAPPING = {
|
|
11
|
+
file_name: {
|
|
12
|
+
header: "File Name",
|
|
13
|
+
getValue: (d) => d.file_name || getDocumentTitle(d, `document-${d.external_id}.pdf`)
|
|
14
|
+
},
|
|
15
|
+
title: { header: "Title", getValue: (d) => getDocumentTitle(d) },
|
|
16
|
+
n_pages: { header: "Pages", getValue: (d) => d.n_pages || "" },
|
|
17
|
+
doc_date: { header: "Document Date", getValue: (d) => getDocumentDate(d) || "" },
|
|
18
|
+
doc_id: { header: "Document ID", getValue: (d) => d.external_id },
|
|
19
|
+
status: { header: "Status", getValue: (d) => d.status || "" },
|
|
20
|
+
uploaded: { header: "Upload Date", getValue: (d) => d.created_at || "" },
|
|
21
|
+
updated_at: { header: "Last Modified", getValue: (d) => d.updated_at || "" },
|
|
22
|
+
file_type: { header: "File Type", getValue: (d) => d.file_type || "" },
|
|
23
|
+
file_size: { header: "File Size", getValue: (d) => d.file_size || "" },
|
|
24
|
+
shared: { header: "Shared", getValue: (d) => d.shared ? "Yes" : "No" }
|
|
25
|
+
};
|
|
26
|
+
function buildDocumentMetadataRows(documents, selectedColumns) {
|
|
27
|
+
const columns = selectedColumns || Object.keys(COLUMN_MAPPING);
|
|
28
|
+
return documents.map((doc) => {
|
|
29
|
+
const row = {};
|
|
30
|
+
for (const colId of columns) {
|
|
31
|
+
const standard = COLUMN_MAPPING[colId];
|
|
32
|
+
if (standard) {
|
|
33
|
+
row[standard.header] = standard.getValue(doc);
|
|
34
|
+
} else if (colId.startsWith("tag-")) {
|
|
35
|
+
const bare = colId.replace(/^tag-/, "");
|
|
36
|
+
const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === colId || dt.tag_ext_id === bare);
|
|
37
|
+
if (doctag) row[colId] = doctag.note || "Yes";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return row;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function archiveName(workspaceName, suffix) {
|
|
44
|
+
const date = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
45
|
+
const sanitizedName = (workspaceName || "workspace").replace(/[^a-z0-9-_]/gi, "_");
|
|
46
|
+
return `${date}_${sanitizedName}_${suffix}.zip`;
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
archiveName,
|
|
50
|
+
buildDocumentMetadataRows,
|
|
51
|
+
fallbackFileName
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=document-download.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/document-download.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Document download building blocks shared by the documents ZIP (`useDownloadDocuments`) and a\n * workspace export archive: name a file and the archive, and build the metadata rows of\n * `index.csv`. Fetching and saving are the document tools' `fetchDocumentFile` and `downloadBlob`.\n */\n\nimport type { WorkspaceDocument as Doc } from './documents-cache'\nimport { getDocumentDate } from './document-fields'\nimport { getDocumentTitle } from '../entities/DocumentEntity'\n\n/** The ZIP entry name for a document when the server did not name it. */\nexport function fallbackFileName(doc: Doc): string {\n if (doc.file_name) return doc.file_name\n const title = getDocumentTitle(doc, `document-${doc.external_id}`)\n const extension = doc.file_type || 'pdf'\n const ext = extension.startsWith('.') ? extension : `.${extension}`\n return title.toLowerCase().endsWith(ext.toLowerCase()) ? title : `${title}${ext}`\n}\n\nconst COLUMN_MAPPING: Record<string, { header: string; getValue: (d: Doc) => string | number }> = {\n file_name: {\n header: 'File Name',\n getValue: (d) => d.file_name || getDocumentTitle(d, `document-${d.external_id}.pdf`),\n },\n title: { header: 'Title', getValue: (d) => getDocumentTitle(d) },\n n_pages: { header: 'Pages', getValue: (d) => d.n_pages || '' },\n doc_date: { header: 'Document Date', getValue: (d) => getDocumentDate(d) || '' },\n doc_id: { header: 'Document ID', getValue: (d) => d.external_id },\n status: { header: 'Status', getValue: (d) => d.status || '' },\n uploaded: { header: 'Upload Date', getValue: (d) => d.created_at || '' },\n updated_at: { header: 'Last Modified', getValue: (d) => d.updated_at || '' },\n file_type: { header: 'File Type', getValue: (d) => d.file_type || '' },\n file_size: { header: 'File Size', getValue: (d) => d.file_size || '' },\n shared: { header: 'Shared', getValue: (d) => (d.shared ? 'Yes' : 'No') },\n}\n\n/**\n * One `index.csv` row per document for the chosen columns (`undefined` = every\n * standard column). A `tag-\u2026` column holds that tag's value, or \"Yes\" for a\n * label without one.\n */\nexport function buildDocumentMetadataRows(\n documents: Doc[],\n selectedColumns?: string[]\n): Record<string, string | number>[] {\n const columns = selectedColumns || Object.keys(COLUMN_MAPPING)\n return documents.map((doc) => {\n const row: Record<string, string | number> = {}\n for (const colId of columns) {\n const standard = COLUMN_MAPPING[colId]\n if (standard) {\n row[standard.header] = standard.getValue(doc)\n } else if (colId.startsWith('tag-')) {\n // Column ids are tag ext ids; older callers passed them without the prefix.\n const bare = colId.replace(/^tag-/, '')\n const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === colId || dt.tag_ext_id === bare)\n if (doctag) row[colId] = doctag.note || 'Yes'\n }\n }\n return row\n })\n}\n\n/** `2026-10-15_My_Workspace_<suffix>.zip` */\nexport function archiveName(workspaceName: string | undefined, suffix: string): string {\n const date = new Date().toISOString().split('T')[0]\n const sanitizedName = (workspaceName || 'workspace').replace(/[^a-z0-9-_]/gi, '_')\n return `${date}_${sanitizedName}_${suffix}.zip`\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AAG1B,SAAS,iBAAiB,KAAkB;AACjD,MAAI,IAAI,UAAW,QAAO,IAAI;AAC9B,QAAM,QAAQ,iBAAiB,KAAK,YAAY,IAAI,WAAW,EAAE;AACjE,QAAM,YAAY,IAAI,aAAa;AACnC,QAAM,MAAM,UAAU,WAAW,GAAG,IAAI,YAAY,IAAI,SAAS;AACjE,SAAO,MAAM,YAAY,EAAE,SAAS,IAAI,YAAY,CAAC,IAAI,QAAQ,GAAG,KAAK,GAAG,GAAG;AACjF;AAEA,MAAM,iBAA4F;AAAA,EAChG,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,UAAU,CAAC,MAAM,EAAE,aAAa,iBAAiB,GAAG,YAAY,EAAE,WAAW,MAAM;AAAA,EACrF;AAAA,EACA,OAAO,EAAE,QAAQ,SAAS,UAAU,CAAC,MAAM,iBAAiB,CAAC,EAAE;AAAA,EAC/D,SAAS,EAAE,QAAQ,SAAS,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG;AAAA,EAC7D,UAAU,EAAE,QAAQ,iBAAiB,UAAU,CAAC,MAAM,gBAAgB,CAAC,KAAK,GAAG;AAAA,EAC/E,QAAQ,EAAE,QAAQ,eAAe,UAAU,CAAC,MAAM,EAAE,YAAY;AAAA,EAChE,QAAQ,EAAE,QAAQ,UAAU,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG;AAAA,EAC5D,UAAU,EAAE,QAAQ,eAAe,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG;AAAA,EACvE,YAAY,EAAE,QAAQ,iBAAiB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG;AAAA,EAC3E,WAAW,EAAE,QAAQ,aAAa,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG;AAAA,EACrE,WAAW,EAAE,QAAQ,aAAa,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG;AAAA,EACrE,QAAQ,EAAE,QAAQ,UAAU,UAAU,CAAC,MAAO,EAAE,SAAS,QAAQ,KAAM;AACzE;AAOO,SAAS,0BACd,WACA,iBACmC;AACnC,QAAM,UAAU,mBAAmB,OAAO,KAAK,cAAc;AAC7D,SAAO,UAAU,IAAI,CAAC,QAAQ;AAC5B,UAAM,MAAuC,CAAC;AAC9C,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,eAAe,KAAK;AACrC,UAAI,UAAU;AACZ,YAAI,SAAS,MAAM,IAAI,SAAS,SAAS,GAAG;AAAA,MAC9C,WAAW,MAAM,WAAW,MAAM,GAAG;AAEnC,cAAM,OAAO,MAAM,QAAQ,SAAS,EAAE;AACtC,cAAM,SAAS,IAAI,SAAS,KAAK,CAAC,OAAO,GAAG,eAAe,SAAS,GAAG,eAAe,IAAI;AAC1F,YAAI,OAAQ,KAAI,KAAK,IAAI,OAAO,QAAQ;AAAA,MAC1C;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAGO,SAAS,YAAY,eAAmC,QAAwB;AACrF,QAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAClD,QAAM,iBAAiB,iBAAiB,aAAa,QAAQ,iBAAiB,GAAG;AACjF,SAAO,GAAG,IAAI,IAAI,aAAa,IAAI,MAAM;AAC3C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -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
|
+
}
|