@arbidocs/react 0.5.111 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
- package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +80 -80
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +80 -80
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +282 -282
- package/dist/index.js +702 -17116
- package/dist/index.js.map +7 -1
- package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +154 -154
- package/dist/ui/index.js +290 -10
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.js +61 -271
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/chunk-ZM6N7YZH.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/related-documents.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The documents related to each document of a workspace. It computes a map of related documents for each document in the workspace.\n * Relationships include:\n * - Email family: parent/child via parent_ext_id (an attachment and its email, a message and its\n * mailbox archive). Versions are NOT relations: they live inside their document.\n * - Made from: derivations (a crop's source image, a redline's inputs, a redacted copy's original,\n * a production's documents) from `derived_from`, with the source version when it is not the\n * current one; and the other way round, the copies made from a document\n * - Exact duplicates (same content_hash / fingerprint)\n * - Near-duplicates (from similarity API)\n *\n * Returns a stable Map<docExtId, RelatedDocs> recomputed only when\n * the documents array or similarity data changes.\n */\n\nimport { useMemo, useRef } from 'react'\nimport type { WorkspaceDocument } from './documents-cache'\nimport { SIMILARITY_THRESHOLD, useSimilarDocuments } from './documents-data'\n\nexport interface RelatedDocs<D extends WorkspaceDocument = WorkspaceDocument> {\n /** The email / mailbox archive this document was extracted from. */\n parent?: D\n /** Attachments: documents extracted from this one. */\n children: D[]\n /** Documents this one was made from (crop, redline, redacted copy); not the previous version. */\n madeFrom: D[]\n /** Documents made from this one (a redacted or annotated copy, a production, a crop). */\n copies: D[]\n /** How each made-from / copy document is related, by its id (a `derived_from` role). */\n roles: Record<string, string>\n /**\n * The version of a made-from document this one was made from, by its id \u2014 only when that is\n * not the source's current version (the copy was made from an older version).\n */\n versions?: Record<string, number>\n duplicates: D[]\n similar: Array<{ doc: D; similarity: number }>\n}\n\nexport type RelatedDocsMap<D extends WorkspaceDocument = WorkspaceDocument> = Map<\n string,\n RelatedDocs<D>\n>\n\n/** Count total related documents for a given entry */\nexport function getRelatedTotal(related: RelatedDocs<WorkspaceDocument>): number {\n return (\n (related.parent ? 1 : 0) +\n related.children.length +\n related.madeFrom.length +\n related.copies.length +\n related.duplicates.length +\n related.similar.length\n )\n}\n\n/** Build human-readable count labels per relationship type */\nexport function getRelatedLabels(related: RelatedDocs<WorkspaceDocument>): string[] {\n const parts: string[] = []\n if (related.parent) parts.push('1 parent')\n if (related.children.length > 0) {\n const n = related.children.length\n parts.push(`${n} ${n === 1 ? 'attachment' : 'attachments'}`)\n }\n if (related.madeFrom.length > 0) parts.push(`made from ${related.madeFrom.length}`)\n if (related.copies.length > 0) {\n const n = related.copies.length\n parts.push(`${n} ${n === 1 ? 'copy' : 'copies'}`)\n }\n if (related.duplicates.length > 0) {\n const n = related.duplicates.length\n parts.push(`${n} ${n === 1 ? 'duplicate' : 'duplicates'}`)\n }\n if (related.similar.length > 0) {\n const n = related.similar.length\n parts.push(`${n} similar`)\n }\n return parts\n}\n\n/**\n * Computes related documents map from workspace documents and similarity API.\n * Call this in a component that has access to the documents array.\n */\nexport function useRelatedDocuments<D extends WorkspaceDocument>(\n documents: D[]\n): RelatedDocsMap<D> {\n const { data: similarData } = useSimilarDocuments()\n\n // Structural fingerprint \u2014 only recompute when fields that affect relationships change.\n // Metadata-only changes (title rename, tag toggle, status update) produce the same\n // fingerprint and skip the expensive map rebuild.\n const structuralKey = useMemo(() => {\n const parts: string[] = []\n for (const doc of documents) {\n parts.push(doc.external_id)\n parts.push(doc.parent_ext_id || '')\n parts.push(doc.content_hash || '')\n parts.push(String(doc.current_version ?? 1))\n for (const source of doc.derived_from ?? [])\n parts.push(source.doc_ext_id, source.role, String(source.version ?? ''))\n }\n return parts.join('|')\n }, [documents])\n\n const prevKeyRef = useRef(structuralKey)\n const prevMapRef = useRef<RelatedDocsMap<D>>(new Map())\n // Also track documents ref so we rebuild map with fresh Doc objects when structure changes\n const prevDocsRef = useRef(documents)\n const prevSimilarRef = useRef(similarData)\n\n return useMemo(() => {\n // If nothing that affects relationships has changed, reuse the previous result.\n // Must also check similarData \u2014 it arrives async after the initial build.\n if (\n prevKeyRef.current === structuralKey &&\n prevSimilarRef.current === similarData &&\n prevMapRef.current.size > 0 &&\n prevDocsRef.current === documents\n ) {\n return prevMapRef.current\n }\n prevKeyRef.current = structuralKey\n prevDocsRef.current = documents\n prevSimilarRef.current = similarData\n const map = new Map<string, RelatedDocs<D>>()\n\n const getOrCreate = (docId: string): RelatedDocs<D> => {\n let entry = map.get(docId)\n if (!entry) {\n entry = { children: [], madeFrom: [], copies: [], roles: {}, duplicates: [], similar: [] }\n map.set(docId, entry)\n }\n return entry\n }\n\n // Index documents by ID for O(1) lookups\n const docById = new Map<string, D>()\n for (const doc of documents) {\n docById.set(doc.external_id, doc)\n }\n\n // Build content_hash index for exact duplicate detection\n const byHash = new Map<string, D[]>()\n for (const doc of documents) {\n if (doc.content_hash) {\n const list = byHash.get(doc.content_hash) || []\n list.push(doc)\n byHash.set(doc.content_hash, list)\n }\n }\n\n // Parent/child relationships\n for (const doc of documents) {\n if (doc.parent_ext_id) {\n const parent = docById.get(doc.parent_ext_id)\n if (parent) {\n getOrCreate(doc.external_id).parent = parent\n getOrCreate(parent.external_id).children.push(doc)\n }\n }\n }\n\n // Made from / copies \u2014 derivations of separate documents (versions live inside a document).\n for (const doc of documents) {\n for (const source of doc.derived_from ?? []) {\n const from = docById.get(source.doc_ext_id)\n if (!from) continue\n const made = getOrCreate(doc.external_id)\n made.madeFrom.push(from)\n made.roles[from.external_id] = source.role\n if (source.version && source.version !== (from.current_version ?? 1)) {\n made.versions = { ...made.versions, [from.external_id]: source.version }\n }\n const original = getOrCreate(from.external_id)\n original.copies.push(doc)\n original.roles[doc.external_id] = source.role\n }\n }\n\n // Exact duplicates \u2014 same content_hash, excluding self\n for (const [, docs] of byHash) {\n if (docs.length > 1) {\n for (const doc of docs) {\n getOrCreate(doc.external_id).duplicates = docs.filter(\n (d) => d.external_id !== doc.external_id\n )\n }\n }\n }\n\n // Near-duplicates from similarity API\n // Only include pairs with SIMILARITY_THRESHOLD \u2264 similarity < 1.0\n // (1.0 exact matches are already in duplicates above)\n if (similarData?.pairs) {\n for (const pair of similarData.pairs) {\n if (pair.similarity < SIMILARITY_THRESHOLD || pair.similarity >= 1.0) continue\n const docA = docById.get(pair.doc_a.external_id)\n const docB = docById.get(pair.doc_b.external_id)\n if (docA && docB) {\n getOrCreate(docA.external_id).similar.push({\n doc: docB,\n similarity: pair.similarity,\n })\n getOrCreate(docB.external_id).similar.push({\n doc: docA,\n similarity: pair.similarity,\n })\n }\n }\n }\n\n prevMapRef.current = map\n return map\n }, [documents, similarData, structuralKey])\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useArbiWsStore } from "../websocket/store.js";
|
|
2
|
+
import { useArbiHost } from "../host/config.js";
|
|
3
|
+
const NO_SUPPORT = {};
|
|
4
|
+
function useDocumentsSupport() {
|
|
5
|
+
return useArbiHost().documents ?? NO_SUPPORT;
|
|
6
|
+
}
|
|
7
|
+
function useProcessingTasks() {
|
|
8
|
+
return useArbiWsStore((state) => state.tasks);
|
|
9
|
+
}
|
|
10
|
+
function useProcessingTask(docId) {
|
|
11
|
+
return useArbiWsStore((state) => state.tasks[docId]);
|
|
12
|
+
}
|
|
13
|
+
const NO_ACTIONS = {};
|
|
14
|
+
function useDocumentHostActions() {
|
|
15
|
+
const { useHostActions } = useDocumentsSupport();
|
|
16
|
+
return useHostActions?.() ?? NO_ACTIONS;
|
|
17
|
+
}
|
|
18
|
+
function useOpenViewerDocumentId() {
|
|
19
|
+
const { useOpenViewerDocumentId: useHostViewing } = useDocumentsSupport();
|
|
20
|
+
return useHostViewing?.() ?? null;
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
useDocumentHostActions,
|
|
24
|
+
useDocumentsSupport,
|
|
25
|
+
useOpenViewerDocumentId,
|
|
26
|
+
useProcessingTask,
|
|
27
|
+
useProcessingTasks
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=support.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/support.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * What a host adds to the document hooks and the document kits, opt in (the host configuration's\n * `documents`): the live processing state it keeps (from its own live connection), what happens on\n * its side when documents are deleted or queued for processing, how it uploads (workspace key, zip\n * archives), and what it does with documents beyond the package (its workflows, chat, mail, offline\n * copies, viewer). Without it the hooks work on their own, and the kits offer less, never something\n * that does nothing.\n */\n\nimport type { components } from '@arbidocs/client'\nimport type { ZipExtractor } from './upload-files'\nimport type { WorkspaceDocument } from './documents-cache'\nimport type { ReactNode } from 'react'\nimport { useArbiWsStore } from '../websocket/store'\nimport { useArbiHost } from '../host/config'\n\n/** Something the host can start on documents or a folder (a workflow, a skill). */\nexport interface DocumentStartItem {\n id: string\n title: string\n run: () => void\n}\n\n/** What the host does with documents beyond the package. Each absent one is not offered. */\nexport interface DocumentHostActions {\n /** What can be started on one file. */\n startItemsForFile?: (document: WorkspaceDocument) => DocumentStartItem[]\n /** What can be started on everything in a folder. */\n startItemsForFolder?: (folderPath: string) => DocumentStartItem[]\n /** Start a chat about one document. */\n openDocumentChat?: (docId: string) => void\n /** Start a chat about several documents. */\n openDocumentsChat?: (docIds: string[]) => void\n /**\n * Hand a document to the host's mail composer as an attachment (offered while mail is on): its\n * current version, or an earlier one (`version`, 1-based).\n */\n emailDocument?: (\n document: WorkspaceDocument,\n options?: { version?: number | null }\n ) => Promise<void>\n /** Show how to raise the plan's limits (an upload was refused for them). */\n openUpgrade?: () => void\n /** Show the AI budget a document's processing ran into, and what can be done. */\n openQuota?: (quota: { spend: number; budget: number; projectExtId: string | null }) => void\n /** Open a person (yourself: your settings; someone else: a direct message). */\n openUser?: (userId: string) => void\n /** Open a document beside another, to compare them. */\n compareDocuments?: (docId: string, otherDocId: string) => void\n /** Open the fields manager (labels or AI fields), on its form for a new one with `create`. */\n openFieldsManager?: (kind?: 'label' | 'annotation', options?: { create?: boolean }) => void\n}\n\n/** A person as the document kits show them (who made a document, a field, a value). */\nexport type DocumentPerson = components['schemas']['UserResponse']\n\n/** A document's live processing, as the host follows it (a `task_update` and what it adds). */\nexport interface ProcessingTask {\n doc_ext_id: string\n status: string\n progress?: number | null\n workspace_ext_id?: string | null\n file_name?: string | null\n failed_stage?: string | null\n /** The event's order (`task_update.seq`; see `processing-order`). None on one set here. */\n seq?: number | null\n}\n\nexport interface DocumentsSupport {\n /**\n * The workspace's raw key, for the direct upload (encrypted here, sent straight to storage) that\n * the user's settings can turn on. Throws when the key is not held here (a public workspace, a\n * temporary grant): the upload then goes through the server. Absent: always through the server.\n */\n resolveWorkspaceKey?: (workspaceId: string) => Promise<Uint8Array>\n /** Opens a zip archive into its files (e.g. off the main thread). Default: on the main thread. */\n extractZip?: ZipExtractor\n /** The host's actions on documents, as a hook (a kit reads it once per view). */\n useHostActions?: () => DocumentHostActions\n /**\n * Called once documents are kept on this device (`useKeepDocumentsOffline`), while still online:\n * e.g. to load the viewer's code so a pinned document opens offline too.\n */\n onKeptOffline?: () => void | Promise<void>\n /** The document open in the host's viewer while it is open (null when closed), as a hook. */\n useOpenViewerDocumentId?: () => string | null\n /**\n * How the host shows a person (its presence, its card): by a document, a field, a thread's\n * entry or a message. `tooltip`: whether hovering shows their card; `variant`: their face alone\n * (`icon`, small, the default) or their face and name (`pill`). Absent: the kits' own avatar.\n */\n renderUser?: (\n user: DocumentPerson,\n options: { tooltip: boolean; variant?: 'icon' | 'pill' }\n ) => ReactNode\n}\n\nconst NO_SUPPORT: DocumentsSupport = {}\n\n/** The host's document support (the host configuration's `documents`; empty without one). */\nexport function useDocumentsSupport(): DocumentsSupport {\n return useArbiHost().documents ?? NO_SUPPORT\n}\n\n/** Every document's live processing (the shared WebSocket store's). */\nexport function useProcessingTasks(): Readonly<Record<string, ProcessingTask>> {\n return useArbiWsStore((state) => state.tasks)\n}\n\n/** One document's live processing: re-renders only when that document's changes. */\nexport function useProcessingTask(docId: string): ProcessingTask | undefined {\n return useArbiWsStore((state) => state.tasks[docId])\n}\n\nconst NO_ACTIONS: DocumentHostActions = {}\n\n/** The host's actions on documents (none without host support). */\nexport function useDocumentHostActions(): DocumentHostActions {\n const { useHostActions } = useDocumentsSupport()\n return useHostActions?.() ?? NO_ACTIONS\n}\n\n/** The document open in the host's viewer, while it is open (none without host support). */\nexport function useOpenViewerDocumentId(): string | null {\n const { useOpenViewerDocumentId: useHostViewing } = useDocumentsSupport()\n return useHostViewing?.() ?? null\n}\n"],
|
|
5
|
+
"mappings": "AAaA,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAmF5B,MAAM,aAA+B,CAAC;AAG/B,SAAS,sBAAwC;AACtD,SAAO,YAAY,EAAE,aAAa;AACpC;AAGO,SAAS,qBAA+D;AAC7E,SAAO,eAAe,CAAC,UAAU,MAAM,KAAK;AAC9C;AAGO,SAAS,kBAAkB,OAA2C;AAC3E,SAAO,eAAe,CAAC,UAAU,MAAM,MAAM,KAAK,CAAC;AACrD;AAEA,MAAM,aAAkC,CAAC;AAGlC,SAAS,yBAA8C;AAC5D,QAAM,EAAE,eAAe,IAAI,oBAAoB;AAC/C,SAAO,iBAAiB,KAAK;AAC/B;AAGO,SAAS,0BAAyC;AACvD,QAAM,EAAE,yBAAyB,eAAe,IAAI,oBAAoB;AACxE,SAAO,iBAAiB,KAAK;AAC/B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { documents } from "@arbidocs/sdk/browser";
|
|
2
|
+
const { SUPPORTED_EXTENSIONS, mimeFromName, sanitizeFolderPath } = documents;
|
|
3
|
+
const UPLOAD_ACCEPT = ".pdf,.txt,.md,.html,.doc,.docx,.rtf,.ppt,.pptx,.xls,.xlsx,.jpg,.jpeg,.png,.gif,.bmp,.tiff,.tif,.webp,.mp4,.mpeg,.mpg,.webm,.mov,.avi,.mkv,.mp3,.wav,.m4a,.aac,.ogg,.flac,.eml,.msg,.mbox,.pst,.ost,.zip,application/pdf,text/plain,text/markdown,text/html,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/rtf,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,image/jpeg,image/png,image/gif,image/bmp,image/tiff,image/webp,video/mp4,video/mpeg,video/webm,video/quicktime,video/x-msvideo,video/x-matroska,audio/mpeg,audio/wav,audio/mp4,audio/aac,audio/ogg,audio/flac,message/rfc822,application/vnd.ms-outlook,application/mbox,application/zip,application/x-zip-compressed";
|
|
4
|
+
const UPLOAD_MAX_FILE_SIZE = 2 * 1024 * 1024 * 1024;
|
|
5
|
+
const SUPPORTED_TYPES = /* @__PURE__ */ new Set([
|
|
6
|
+
"application/pdf",
|
|
7
|
+
"text/plain",
|
|
8
|
+
"text/markdown",
|
|
9
|
+
"text/html",
|
|
10
|
+
"application/msword",
|
|
11
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
12
|
+
"application/rtf",
|
|
13
|
+
"application/vnd.ms-powerpoint",
|
|
14
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
15
|
+
"application/vnd.ms-excel",
|
|
16
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
17
|
+
"image/jpeg",
|
|
18
|
+
"image/png",
|
|
19
|
+
"image/gif",
|
|
20
|
+
"image/bmp",
|
|
21
|
+
"image/tiff",
|
|
22
|
+
"image/webp",
|
|
23
|
+
"video/mp4",
|
|
24
|
+
"video/mpeg",
|
|
25
|
+
"video/webm",
|
|
26
|
+
"video/quicktime",
|
|
27
|
+
"video/x-msvideo",
|
|
28
|
+
"video/x-matroska",
|
|
29
|
+
"audio/mpeg",
|
|
30
|
+
"audio/wav",
|
|
31
|
+
"audio/mp4",
|
|
32
|
+
"audio/aac",
|
|
33
|
+
"audio/ogg",
|
|
34
|
+
"audio/flac",
|
|
35
|
+
"message/rfc822",
|
|
36
|
+
"application/vnd.ms-outlook",
|
|
37
|
+
"application/mbox"
|
|
38
|
+
]);
|
|
39
|
+
function extensionOf(name) {
|
|
40
|
+
const dot = name.lastIndexOf(".");
|
|
41
|
+
return dot === -1 ? "" : name.slice(dot).toLowerCase();
|
|
42
|
+
}
|
|
43
|
+
function withRelativePath(file, relativePath) {
|
|
44
|
+
const copy = new File([file], file.name, { type: file.type, lastModified: file.lastModified });
|
|
45
|
+
Object.defineProperty(copy, "webkitRelativePath", { value: relativePath, writable: false });
|
|
46
|
+
return copy;
|
|
47
|
+
}
|
|
48
|
+
function isZipFile(file) {
|
|
49
|
+
return file.name.toLowerCase().endsWith(".zip") || file.type === "application/zip" || file.type === "application/x-zip-compressed";
|
|
50
|
+
}
|
|
51
|
+
const extractZipFile = async (zip, maxFileSize) => {
|
|
52
|
+
const { unzip } = await import("unzipit");
|
|
53
|
+
const { entries } = await unzip(await zip.arrayBuffer());
|
|
54
|
+
const names = Object.keys(entries).filter((name) => !entries[name].isDirectory);
|
|
55
|
+
const roots = new Set(names.map((name) => name.split("/")[0]));
|
|
56
|
+
const hasSingleRoot = roots.size === 1 && names.every((name) => name.includes("/"));
|
|
57
|
+
const base = zip.name.replace(/\.zip$/i, "");
|
|
58
|
+
const extractedFiles = [];
|
|
59
|
+
const skippedLargeFiles = [];
|
|
60
|
+
for (const name of names) {
|
|
61
|
+
const entry = entries[name];
|
|
62
|
+
if (!SUPPORTED_EXTENSIONS.has(extensionOf(name))) continue;
|
|
63
|
+
const fileName = name.split("/").pop() ?? name;
|
|
64
|
+
if (entry.size > maxFileSize) {
|
|
65
|
+
skippedLargeFiles.push(fileName);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const file = new File([await entry.arrayBuffer()], fileName, {
|
|
69
|
+
type: mimeFromName(fileName) ?? "application/octet-stream",
|
|
70
|
+
lastModified: entry.lastModDate?.getTime() ?? Date.now()
|
|
71
|
+
});
|
|
72
|
+
extractedFiles.push(withRelativePath(file, hasSingleRoot ? name : `${base}/${name}`));
|
|
73
|
+
}
|
|
74
|
+
return { extractedFiles, skippedLargeFiles };
|
|
75
|
+
};
|
|
76
|
+
async function prepareUploadFiles(chosen, options = {}) {
|
|
77
|
+
const maxFileSize = options.maxFileSize ?? UPLOAD_MAX_FILE_SIZE;
|
|
78
|
+
const extractZip = options.extractZip ?? extractZipFile;
|
|
79
|
+
const accepted = [];
|
|
80
|
+
const refused = [];
|
|
81
|
+
const zips = [];
|
|
82
|
+
for (const file of Array.from(chosen)) {
|
|
83
|
+
if (isZipFile(file)) {
|
|
84
|
+
zips.push(file);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const extension = extensionOf(file.name);
|
|
88
|
+
if (file.size === 0) refused.push({ name: file.name, reason: "empty" });
|
|
89
|
+
else if (file.size > maxFileSize) refused.push({ name: file.name, reason: "too_large" });
|
|
90
|
+
else if (!extension) refused.push({ name: file.name, reason: "no_extension" });
|
|
91
|
+
else if (!SUPPORTED_TYPES.has(file.type) && !SUPPORTED_EXTENSIONS.has(extension))
|
|
92
|
+
refused.push({ name: file.name, reason: "unsupported" });
|
|
93
|
+
else accepted.push(file);
|
|
94
|
+
}
|
|
95
|
+
for (const zip of zips) {
|
|
96
|
+
try {
|
|
97
|
+
const { extractedFiles, skippedLargeFiles } = await extractZip(zip, maxFileSize);
|
|
98
|
+
for (const name of skippedLargeFiles)
|
|
99
|
+
refused.push({ name: `${name} (from ${zip.name})`, reason: "too_large" });
|
|
100
|
+
if (extractedFiles.length === 0 && skippedLargeFiles.length === 0)
|
|
101
|
+
refused.push({ name: zip.name, reason: "empty_zip" });
|
|
102
|
+
accepted.push(...extractedFiles);
|
|
103
|
+
} catch {
|
|
104
|
+
refused.push({ name: zip.name, reason: "zip_error" });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
accepted.sort(
|
|
108
|
+
(a, b) => (a.webkitRelativePath || a.name).toLowerCase().localeCompare((b.webkitRelativePath || b.name).toLowerCase())
|
|
109
|
+
);
|
|
110
|
+
return { accepted, refused };
|
|
111
|
+
}
|
|
112
|
+
function readDirectory(directory, path, into) {
|
|
113
|
+
return new Promise((resolve) => {
|
|
114
|
+
const reader = directory.createReader();
|
|
115
|
+
const readBatch = () => reader.readEntries(async (entries) => {
|
|
116
|
+
if (entries.length === 0) return resolve();
|
|
117
|
+
await Promise.all(
|
|
118
|
+
entries.map(
|
|
119
|
+
(entry) => entry.isFile ? new Promise(
|
|
120
|
+
(done) => entry.file(
|
|
121
|
+
(file) => {
|
|
122
|
+
into.push(withRelativePath(file, `${path}/${file.name}`));
|
|
123
|
+
done();
|
|
124
|
+
},
|
|
125
|
+
() => done()
|
|
126
|
+
)
|
|
127
|
+
) : entry.isDirectory ? readDirectory(entry, `${path}/${entry.name}`, into) : Promise.resolve()
|
|
128
|
+
)
|
|
129
|
+
);
|
|
130
|
+
readBatch();
|
|
131
|
+
});
|
|
132
|
+
readBatch();
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async function filesFromDrop(transfer) {
|
|
136
|
+
const items = Array.from(transfer.items ?? []);
|
|
137
|
+
if (items.length === 0) return Array.from(transfer.files ?? []);
|
|
138
|
+
const files = [];
|
|
139
|
+
const folders = [];
|
|
140
|
+
for (const item of items) {
|
|
141
|
+
if (item.kind !== "file") continue;
|
|
142
|
+
const entry = item.webkitGetAsEntry?.();
|
|
143
|
+
if (entry?.isDirectory) {
|
|
144
|
+
folders.push(readDirectory(entry, entry.name, files));
|
|
145
|
+
} else {
|
|
146
|
+
const file = item.getAsFile();
|
|
147
|
+
if (file) files.push(file);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await Promise.all(folders);
|
|
151
|
+
return files;
|
|
152
|
+
}
|
|
153
|
+
function uploadFolderOf(file, base) {
|
|
154
|
+
const relative = file.webkitRelativePath;
|
|
155
|
+
const slash = relative ? relative.lastIndexOf("/") : -1;
|
|
156
|
+
const own = slash > 0 ? relative.slice(0, slash) : "";
|
|
157
|
+
return sanitizeFolderPath([base, own].filter(Boolean).join("/")) || null;
|
|
158
|
+
}
|
|
159
|
+
export {
|
|
160
|
+
UPLOAD_ACCEPT,
|
|
161
|
+
UPLOAD_MAX_FILE_SIZE,
|
|
162
|
+
extractZipFile,
|
|
163
|
+
filesFromDrop,
|
|
164
|
+
isZipFile,
|
|
165
|
+
prepareUploadFiles,
|
|
166
|
+
uploadFolderOf,
|
|
167
|
+
withRelativePath
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=upload-files.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/upload-files.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Choosing files to upload: what the picker accepts, which files are refused and why, folders\n * dropped whole (each file keeps its path below the dropped folder), zip archives opened into\n * their files, and the folder a file goes to.\n */\n\nimport { documents } from '@arbidocs/sdk/browser'\n\nconst { SUPPORTED_EXTENSIONS, mimeFromName, sanitizeFolderPath } = documents\n\n/** The file picker's `accept`: every type an upload takes, zip archives included. */\nexport const UPLOAD_ACCEPT =\n '.pdf,.txt,.md,.html,.doc,.docx,.rtf,.ppt,.pptx,.xls,.xlsx,.jpg,.jpeg,.png,.gif,.bmp,.tiff,.tif,.webp,.mp4,.mpeg,.mpg,.webm,.mov,.avi,.mkv,.mp3,.wav,.m4a,.aac,.ogg,.flac,.eml,.msg,.mbox,.pst,.ost,.zip,application/pdf,text/plain,text/markdown,text/html,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/rtf,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,image/jpeg,image/png,image/gif,image/bmp,image/tiff,image/webp,video/mp4,video/mpeg,video/webm,video/quicktime,video/x-msvideo,video/x-matroska,audio/mpeg,audio/wav,audio/mp4,audio/aac,audio/ogg,audio/flac,message/rfc822,application/vnd.ms-outlook,application/mbox,application/zip,application/x-zip-compressed'\n\n/** The largest file a browser upload takes. */\nexport const UPLOAD_MAX_FILE_SIZE = 2 * 1024 * 1024 * 1024\n\nconst SUPPORTED_TYPES = new Set([\n 'application/pdf',\n 'text/plain',\n 'text/markdown',\n 'text/html',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/rtf',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/bmp',\n 'image/tiff',\n 'image/webp',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/x-msvideo',\n 'video/x-matroska',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/mp4',\n 'audio/aac',\n 'audio/ogg',\n 'audio/flac',\n 'message/rfc822',\n 'application/vnd.ms-outlook',\n 'application/mbox',\n])\n\n/** Why a chosen file is not uploaded. */\nexport type UploadRefusal =\n 'empty' | 'too_large' | 'no_extension' | 'unsupported' | 'empty_zip' | 'zip_error'\n\nexport interface RefusedUploadFile {\n name: string\n reason: UploadRefusal\n}\n\n/** A zip archive's files, and the names of those too large to take. */\nexport interface ExtractedZip {\n extractedFiles: File[]\n skippedLargeFiles: string[]\n}\n\n/** Opens a zip archive into its files (each with its path in `webkitRelativePath`). */\nexport type ZipExtractor = (zip: File, maxFileSize: number) => Promise<ExtractedZip>\n\nfunction extensionOf(name: string): string {\n const dot = name.lastIndexOf('.')\n return dot === -1 ? '' : name.slice(dot).toLowerCase()\n}\n\n/** A file with its path below a dropped or picked folder (as the browser's folder picker sets). */\nexport function withRelativePath(file: File, relativePath: string): File {\n const copy = new File([file], file.name, { type: file.type, lastModified: file.lastModified })\n Object.defineProperty(copy, 'webkitRelativePath', { value: relativePath, writable: false })\n return copy\n}\n\nexport function isZipFile(file: Pick<File, 'name' | 'type'>): boolean {\n return (\n file.name.toLowerCase().endsWith('.zip') ||\n file.type === 'application/zip' ||\n file.type === 'application/x-zip-compressed'\n )\n}\n\n/**\n * Open a zip archive into the files an upload takes. An archive whose files all sit in one folder\n * keeps that folder; otherwise they go under a folder named after the archive.\n */\nexport const extractZipFile: ZipExtractor = async (zip, maxFileSize) => {\n const { unzip } = await import('unzipit')\n const { entries } = await unzip(await zip.arrayBuffer())\n const names = Object.keys(entries).filter((name) => !entries[name].isDirectory)\n const roots = new Set(names.map((name) => name.split('/')[0]))\n const hasSingleRoot = roots.size === 1 && names.every((name) => name.includes('/'))\n const base = zip.name.replace(/\\.zip$/i, '')\n\n const extractedFiles: File[] = []\n const skippedLargeFiles: string[] = []\n for (const name of names) {\n const entry = entries[name]\n if (!SUPPORTED_EXTENSIONS.has(extensionOf(name))) continue\n const fileName = name.split('/').pop() ?? name\n if (entry.size > maxFileSize) {\n skippedLargeFiles.push(fileName)\n continue\n }\n const file = new File([await entry.arrayBuffer()], fileName, {\n type: mimeFromName(fileName) ?? 'application/octet-stream',\n lastModified: entry.lastModDate?.getTime() ?? Date.now(),\n })\n extractedFiles.push(withRelativePath(file, hasSingleRoot ? name : `${base}/${name}`))\n }\n return { extractedFiles, skippedLargeFiles }\n}\n\n/**\n * The chosen files an upload takes (zip archives opened into theirs), sorted by path, and those it\n * refuses with why.\n */\nexport async function prepareUploadFiles(\n chosen: ArrayLike<File>,\n options: { maxFileSize?: number; extractZip?: ZipExtractor } = {}\n): Promise<{ accepted: File[]; refused: RefusedUploadFile[] }> {\n const maxFileSize = options.maxFileSize ?? UPLOAD_MAX_FILE_SIZE\n const extractZip = options.extractZip ?? extractZipFile\n const accepted: File[] = []\n const refused: RefusedUploadFile[] = []\n const zips: File[] = []\n\n for (const file of Array.from(chosen)) {\n if (isZipFile(file)) {\n // An archive has no size limit: its files are checked one by one.\n zips.push(file)\n continue\n }\n const extension = extensionOf(file.name)\n if (file.size === 0) refused.push({ name: file.name, reason: 'empty' })\n else if (file.size > maxFileSize) refused.push({ name: file.name, reason: 'too_large' })\n else if (!extension) refused.push({ name: file.name, reason: 'no_extension' })\n else if (!SUPPORTED_TYPES.has(file.type) && !SUPPORTED_EXTENSIONS.has(extension))\n refused.push({ name: file.name, reason: 'unsupported' })\n else accepted.push(file)\n }\n\n for (const zip of zips) {\n try {\n const { extractedFiles, skippedLargeFiles } = await extractZip(zip, maxFileSize)\n for (const name of skippedLargeFiles)\n refused.push({ name: `${name} (from ${zip.name})`, reason: 'too_large' })\n if (extractedFiles.length === 0 && skippedLargeFiles.length === 0)\n refused.push({ name: zip.name, reason: 'empty_zip' })\n accepted.push(...extractedFiles)\n } catch {\n refused.push({ name: zip.name, reason: 'zip_error' })\n }\n }\n\n // Sorted by path, for a predictable (e-discovery) order.\n accepted.sort((a, b) =>\n (a.webkitRelativePath || a.name)\n .toLowerCase()\n .localeCompare((b.webkitRelativePath || b.name).toLowerCase())\n )\n return { accepted, refused }\n}\n\nfunction readDirectory(directory: FileSystemDirectoryEntry, path: string, into: File[]) {\n return new Promise<void>((resolve) => {\n const reader = directory.createReader()\n const readBatch = () =>\n reader.readEntries(async (entries) => {\n if (entries.length === 0) return resolve()\n await Promise.all(\n entries.map((entry) =>\n entry.isFile\n ? new Promise<void>((done) =>\n (entry as FileSystemFileEntry).file(\n (file) => {\n into.push(withRelativePath(file, `${path}/${file.name}`))\n done()\n },\n () => done()\n )\n )\n : entry.isDirectory\n ? readDirectory(entry as FileSystemDirectoryEntry, `${path}/${entry.name}`, into)\n : Promise.resolve()\n )\n )\n // A directory reader hands entries over in batches: read until it returns none.\n readBatch()\n })\n readBatch()\n })\n}\n\n/** The files of a drop: dropped folders are read whole, each file keeping its path. */\nexport async function filesFromDrop(transfer: DataTransfer): Promise<File[]> {\n const items = Array.from(transfer.items ?? [])\n if (items.length === 0) return Array.from(transfer.files ?? [])\n const files: File[] = []\n const folders: Promise<void>[] = []\n for (const item of items) {\n if (item.kind !== 'file') continue\n const entry = item.webkitGetAsEntry?.()\n if (entry?.isDirectory) {\n folders.push(readDirectory(entry as FileSystemDirectoryEntry, entry.name, files))\n } else {\n const file = item.getAsFile()\n if (file) files.push(file)\n }\n }\n await Promise.all(folders)\n return files\n}\n\n/**\n * The folder a file goes to: `base` (where the upload was started), then the folders the file sat\n * in below what was dropped or picked. Null at the workspace root.\n */\nexport function uploadFolderOf(file: File, base?: string | null): string | null {\n const relative = file.webkitRelativePath\n const slash = relative ? relative.lastIndexOf('/') : -1\n const own = slash > 0 ? relative.slice(0, slash) : ''\n return sanitizeFolderPath([base, own].filter(Boolean).join('/')) || null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
import { classifyMediaError } from "./media-error.js";
|
|
3
|
+
import {
|
|
4
|
+
createChunkedRecorder,
|
|
5
|
+
pickRecorderMimeType
|
|
6
|
+
} from "./chunked-recorder.js";
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_SEGMENTER_CONFIG,
|
|
9
|
+
flushSegmenter,
|
|
10
|
+
INITIAL_SEGMENTER_STATE,
|
|
11
|
+
levelFromRms,
|
|
12
|
+
stepSegmenter
|
|
13
|
+
} from "./audio-segmenter.js";
|
|
14
|
+
const LEVEL_UPDATE_INTERVAL_MS = 50;
|
|
15
|
+
function pickSegmentMimeType() {
|
|
16
|
+
if (MediaRecorder.isTypeSupported("audio/webm;codecs=opus")) return "audio/webm;codecs=opus";
|
|
17
|
+
return MediaRecorder.isTypeSupported("audio/webm") ? "audio/webm" : "audio/mp4";
|
|
18
|
+
}
|
|
19
|
+
function useAudioRecorder(options = {}) {
|
|
20
|
+
const optionsRef = useRef(options);
|
|
21
|
+
optionsRef.current = options;
|
|
22
|
+
const [state, setState] = useState("idle");
|
|
23
|
+
const [level, setLevel] = useState(0);
|
|
24
|
+
const [elapsedMs, setElapsedMs] = useState(0);
|
|
25
|
+
const [blob, setBlob] = useState(null);
|
|
26
|
+
const [mimeType, setMimeType] = useState(null);
|
|
27
|
+
const [error, setError] = useState(null);
|
|
28
|
+
const mediaRecorderRef = useRef(null);
|
|
29
|
+
const chunksRef = useRef([]);
|
|
30
|
+
const streamRef = useRef(null);
|
|
31
|
+
const ownsStreamRef = useRef(false);
|
|
32
|
+
const stateRef = useRef("idle");
|
|
33
|
+
stateRef.current = state;
|
|
34
|
+
const segmentStartRef = useRef(0);
|
|
35
|
+
const accumulatedMsRef = useRef(0);
|
|
36
|
+
const audioContextRef = useRef(null);
|
|
37
|
+
const analyserRef = useRef(null);
|
|
38
|
+
const levelRafRef = useRef(null);
|
|
39
|
+
const levelIntervalRef = useRef(null);
|
|
40
|
+
const segmentingRef = useRef(false);
|
|
41
|
+
const segmenterStateRef = useRef(INITIAL_SEGMENTER_STATE);
|
|
42
|
+
const openSegmentRef = useRef(null);
|
|
43
|
+
const segmentMimeTypeRef = useRef(null);
|
|
44
|
+
const chunkedRef = useRef(null);
|
|
45
|
+
const segmenterConfig = useCallback(
|
|
46
|
+
() => ({ ...DEFAULT_SEGMENTER_CONFIG, ...optionsRef.current.segmenter }),
|
|
47
|
+
[]
|
|
48
|
+
);
|
|
49
|
+
const beginSegment = useCallback(() => {
|
|
50
|
+
const stream = streamRef.current;
|
|
51
|
+
const mt = segmentMimeTypeRef.current;
|
|
52
|
+
if (!stream || !mt) return;
|
|
53
|
+
const recorder = new MediaRecorder(stream, { mimeType: mt });
|
|
54
|
+
const chunks = [];
|
|
55
|
+
recorder.ondataavailable = (e) => {
|
|
56
|
+
if (e.data.size > 0) chunks.push(e.data);
|
|
57
|
+
};
|
|
58
|
+
recorder.start();
|
|
59
|
+
openSegmentRef.current = { recorder, chunks, startedAt: Date.now() };
|
|
60
|
+
}, []);
|
|
61
|
+
const endSegment = useCallback((keep, voiceMs) => {
|
|
62
|
+
const open = openSegmentRef.current;
|
|
63
|
+
openSegmentRef.current = null;
|
|
64
|
+
if (!open) return;
|
|
65
|
+
const { recorder, chunks, startedAt } = open;
|
|
66
|
+
const durationMs = Date.now() - startedAt;
|
|
67
|
+
recorder.onstop = () => {
|
|
68
|
+
const onSegment = optionsRef.current.onSegment;
|
|
69
|
+
if (!keep || !chunks.length || !onSegment) return;
|
|
70
|
+
const type = recorder.mimeType || segmentMimeTypeRef.current || "audio/webm";
|
|
71
|
+
onSegment({
|
|
72
|
+
blob: new Blob(chunks, { type }),
|
|
73
|
+
mimeType: type,
|
|
74
|
+
startedAt,
|
|
75
|
+
durationMs,
|
|
76
|
+
voiceMs
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
if (recorder.state !== "inactive") recorder.stop();
|
|
80
|
+
}, []);
|
|
81
|
+
const applySegmenterEvents = useCallback(
|
|
82
|
+
(events) => {
|
|
83
|
+
for (const event of events) {
|
|
84
|
+
if (event.type === "start") beginSegment();
|
|
85
|
+
else endSegment(event.keep, event.voiceMs);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
[beginSegment, endSegment]
|
|
89
|
+
);
|
|
90
|
+
const flushOpenSegment = useCallback(() => {
|
|
91
|
+
if (!segmentingRef.current) return;
|
|
92
|
+
const flushed = flushSegmenter(segmenterStateRef.current, performance.now(), segmenterConfig());
|
|
93
|
+
segmenterStateRef.current = flushed.state;
|
|
94
|
+
applySegmenterEvents(flushed.events);
|
|
95
|
+
endSegment(false, 0);
|
|
96
|
+
}, [segmenterConfig, applySegmenterEvents, endSegment]);
|
|
97
|
+
const stopMeter = useCallback(() => {
|
|
98
|
+
if (levelRafRef.current !== null) cancelAnimationFrame(levelRafRef.current);
|
|
99
|
+
levelRafRef.current = null;
|
|
100
|
+
if (levelIntervalRef.current !== null) clearInterval(levelIntervalRef.current);
|
|
101
|
+
levelIntervalRef.current = null;
|
|
102
|
+
analyserRef.current = null;
|
|
103
|
+
void audioContextRef.current?.close().catch(() => {
|
|
104
|
+
});
|
|
105
|
+
audioContextRef.current = null;
|
|
106
|
+
}, []);
|
|
107
|
+
const startMeter = useCallback(
|
|
108
|
+
(stream) => {
|
|
109
|
+
const audioContext = new AudioContext();
|
|
110
|
+
const source = audioContext.createMediaStreamSource(stream);
|
|
111
|
+
const analyser = audioContext.createAnalyser();
|
|
112
|
+
analyser.fftSize = 256;
|
|
113
|
+
source.connect(analyser);
|
|
114
|
+
audioContextRef.current = audioContext;
|
|
115
|
+
analyserRef.current = analyser;
|
|
116
|
+
const data = new Uint8Array(analyser.frequencyBinCount);
|
|
117
|
+
const segmenting = segmentingRef.current;
|
|
118
|
+
let lastUpdate = 0;
|
|
119
|
+
const tick = (t) => {
|
|
120
|
+
const active = analyserRef.current;
|
|
121
|
+
if (!active) return;
|
|
122
|
+
if (t - lastUpdate >= LEVEL_UPDATE_INTERVAL_MS) {
|
|
123
|
+
lastUpdate = t;
|
|
124
|
+
active.getByteTimeDomainData(data);
|
|
125
|
+
let sumSquares = 0;
|
|
126
|
+
for (let i = 0; i < data.length; i++) {
|
|
127
|
+
const centered = (data[i] - 128) / 128;
|
|
128
|
+
sumSquares += centered * centered;
|
|
129
|
+
}
|
|
130
|
+
const rms = Math.sqrt(sumSquares / data.length);
|
|
131
|
+
const nextLevel = levelFromRms(rms);
|
|
132
|
+
setLevel(nextLevel);
|
|
133
|
+
setElapsedMs(accumulatedMsRef.current + (t - segmentStartRef.current));
|
|
134
|
+
if (segmenting) {
|
|
135
|
+
const step = stepSegmenter(segmenterStateRef.current, nextLevel, t, segmenterConfig());
|
|
136
|
+
segmenterStateRef.current = step.state;
|
|
137
|
+
applySegmenterEvents(step.events);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!segmenting) levelRafRef.current = requestAnimationFrame(tick);
|
|
141
|
+
};
|
|
142
|
+
if (segmenting) {
|
|
143
|
+
levelIntervalRef.current = setInterval(
|
|
144
|
+
() => tick(performance.now()),
|
|
145
|
+
LEVEL_UPDATE_INTERVAL_MS
|
|
146
|
+
);
|
|
147
|
+
} else {
|
|
148
|
+
levelRafRef.current = requestAnimationFrame(tick);
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
[segmenterConfig, applySegmenterEvents]
|
|
152
|
+
);
|
|
153
|
+
const stopTracks = useCallback(() => {
|
|
154
|
+
if (ownsStreamRef.current) streamRef.current?.getTracks().forEach((t) => t.stop());
|
|
155
|
+
streamRef.current = null;
|
|
156
|
+
ownsStreamRef.current = false;
|
|
157
|
+
}, []);
|
|
158
|
+
useEffect(
|
|
159
|
+
() => () => {
|
|
160
|
+
void chunkedRef.current?.stop();
|
|
161
|
+
chunkedRef.current = null;
|
|
162
|
+
flushOpenSegment();
|
|
163
|
+
endSegment(false, 0);
|
|
164
|
+
segmentingRef.current = false;
|
|
165
|
+
segmenterStateRef.current = INITIAL_SEGMENTER_STATE;
|
|
166
|
+
stopTracks();
|
|
167
|
+
stopMeter();
|
|
168
|
+
},
|
|
169
|
+
[flushOpenSegment, endSegment, stopTracks, stopMeter]
|
|
170
|
+
);
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
const onPageHide = () => flushOpenSegment();
|
|
173
|
+
window.addEventListener("pagehide", onPageHide);
|
|
174
|
+
return () => window.removeEventListener("pagehide", onPageHide);
|
|
175
|
+
}, [flushOpenSegment]);
|
|
176
|
+
const start = useCallback(async () => {
|
|
177
|
+
if (stateRef.current === "recording" || stateRef.current === "paused") return;
|
|
178
|
+
setError(null);
|
|
179
|
+
try {
|
|
180
|
+
const { track, onSegment } = optionsRef.current;
|
|
181
|
+
const stream = track ? new MediaStream([track]) : await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
182
|
+
streamRef.current = stream;
|
|
183
|
+
ownsStreamRef.current = !track;
|
|
184
|
+
const { chunkMs } = optionsRef.current;
|
|
185
|
+
if (onSegment && chunkMs) {
|
|
186
|
+
const mt2 = optionsRef.current.mimeType ?? pickRecorderMimeType("audio");
|
|
187
|
+
const chunked = createChunkedRecorder({
|
|
188
|
+
stream,
|
|
189
|
+
mimeType: mt2,
|
|
190
|
+
chunkMs,
|
|
191
|
+
audioBitsPerSecond: optionsRef.current.audioBitsPerSecond,
|
|
192
|
+
onChunk: (chunk) => optionsRef.current.onSegment?.({
|
|
193
|
+
blob: chunk.blob,
|
|
194
|
+
mimeType: chunk.mimeType,
|
|
195
|
+
startedAt: chunk.startedAt,
|
|
196
|
+
durationMs: chunk.durationMs,
|
|
197
|
+
voiceMs: chunk.durationMs,
|
|
198
|
+
index: chunk.index
|
|
199
|
+
}),
|
|
200
|
+
onError: (err) => setError(classifyMediaError(err, "microphone"))
|
|
201
|
+
});
|
|
202
|
+
chunkedRef.current = chunked;
|
|
203
|
+
segmentingRef.current = false;
|
|
204
|
+
setMimeType(mt2);
|
|
205
|
+
setBlob(null);
|
|
206
|
+
accumulatedMsRef.current = 0;
|
|
207
|
+
segmentStartRef.current = performance.now();
|
|
208
|
+
chunked.start();
|
|
209
|
+
stateRef.current = "recording";
|
|
210
|
+
setState("recording");
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (onSegment) {
|
|
214
|
+
const mt2 = pickSegmentMimeType();
|
|
215
|
+
segmentMimeTypeRef.current = mt2;
|
|
216
|
+
segmentingRef.current = true;
|
|
217
|
+
segmenterStateRef.current = INITIAL_SEGMENTER_STATE;
|
|
218
|
+
setMimeType(mt2);
|
|
219
|
+
setBlob(null);
|
|
220
|
+
accumulatedMsRef.current = 0;
|
|
221
|
+
segmentStartRef.current = performance.now();
|
|
222
|
+
stateRef.current = "recording";
|
|
223
|
+
setState("recording");
|
|
224
|
+
startMeter(stream);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
segmentingRef.current = false;
|
|
228
|
+
const mt = MediaRecorder.isTypeSupported("audio/webm") ? "audio/webm" : "audio/mp4";
|
|
229
|
+
const recorder = new MediaRecorder(stream, { mimeType: mt });
|
|
230
|
+
chunksRef.current = [];
|
|
231
|
+
recorder.ondataavailable = (e) => {
|
|
232
|
+
if (e.data.size > 0) chunksRef.current.push(e.data);
|
|
233
|
+
};
|
|
234
|
+
mediaRecorderRef.current = recorder;
|
|
235
|
+
setMimeType(mt);
|
|
236
|
+
setBlob(null);
|
|
237
|
+
accumulatedMsRef.current = 0;
|
|
238
|
+
segmentStartRef.current = performance.now();
|
|
239
|
+
recorder.start();
|
|
240
|
+
setState("recording");
|
|
241
|
+
startMeter(stream);
|
|
242
|
+
} catch (err) {
|
|
243
|
+
segmentingRef.current = false;
|
|
244
|
+
stopTracks();
|
|
245
|
+
setError(classifyMediaError(err, "microphone"));
|
|
246
|
+
}
|
|
247
|
+
}, [startMeter, stopTracks]);
|
|
248
|
+
const pause = useCallback(() => {
|
|
249
|
+
if (segmentingRef.current || chunkedRef.current) return;
|
|
250
|
+
const recorder = mediaRecorderRef.current;
|
|
251
|
+
if (!recorder || recorder.state !== "recording") return;
|
|
252
|
+
recorder.pause();
|
|
253
|
+
accumulatedMsRef.current += performance.now() - segmentStartRef.current;
|
|
254
|
+
stopMeter();
|
|
255
|
+
setLevel(0);
|
|
256
|
+
setState("paused");
|
|
257
|
+
}, [stopMeter]);
|
|
258
|
+
const resume = useCallback(() => {
|
|
259
|
+
if (segmentingRef.current || chunkedRef.current) return;
|
|
260
|
+
const recorder = mediaRecorderRef.current;
|
|
261
|
+
if (!recorder || recorder.state !== "paused") return;
|
|
262
|
+
recorder.resume();
|
|
263
|
+
segmentStartRef.current = performance.now();
|
|
264
|
+
setState("recording");
|
|
265
|
+
if (streamRef.current) startMeter(streamRef.current);
|
|
266
|
+
}, [startMeter]);
|
|
267
|
+
const stop = useCallback(() => {
|
|
268
|
+
const chunked = chunkedRef.current;
|
|
269
|
+
if (chunked) {
|
|
270
|
+
chunkedRef.current = null;
|
|
271
|
+
void chunked.stop();
|
|
272
|
+
setElapsedMs(accumulatedMsRef.current + (performance.now() - segmentStartRef.current));
|
|
273
|
+
stopTracks();
|
|
274
|
+
stateRef.current = "stopped";
|
|
275
|
+
setState("stopped");
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (segmentingRef.current) {
|
|
279
|
+
flushOpenSegment();
|
|
280
|
+
segmentingRef.current = false;
|
|
281
|
+
stopMeter();
|
|
282
|
+
stopTracks();
|
|
283
|
+
setLevel(0);
|
|
284
|
+
stateRef.current = "stopped";
|
|
285
|
+
setState("stopped");
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const recorder = mediaRecorderRef.current;
|
|
289
|
+
if (!recorder || recorder.state === "inactive") return;
|
|
290
|
+
const finalElapsed = recorder.state === "paused" ? accumulatedMsRef.current : accumulatedMsRef.current + (performance.now() - segmentStartRef.current);
|
|
291
|
+
stopMeter();
|
|
292
|
+
recorder.onstop = () => {
|
|
293
|
+
stopTracks();
|
|
294
|
+
const finalBlob = chunksRef.current.length ? new Blob(chunksRef.current, { type: recorder.mimeType }) : null;
|
|
295
|
+
setBlob(finalBlob);
|
|
296
|
+
setElapsedMs(finalElapsed);
|
|
297
|
+
setLevel(0);
|
|
298
|
+
setState("stopped");
|
|
299
|
+
};
|
|
300
|
+
recorder.stop();
|
|
301
|
+
}, [stopMeter, stopTracks, flushOpenSegment]);
|
|
302
|
+
const reset = useCallback(() => {
|
|
303
|
+
setState("idle");
|
|
304
|
+
setBlob(null);
|
|
305
|
+
setElapsedMs(0);
|
|
306
|
+
setLevel(0);
|
|
307
|
+
setMimeType(null);
|
|
308
|
+
setError(null);
|
|
309
|
+
}, []);
|
|
310
|
+
return { state, level, elapsedMs, blob, mimeType, error, start, pause, resume, stop, reset };
|
|
311
|
+
}
|
|
312
|
+
export {
|
|
313
|
+
useAudioRecorder
|
|
314
|
+
};
|
|
315
|
+
//# sourceMappingURL=useAudioRecorder.js.map
|