@arbidocs/react 0.5.110 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
- package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.cjs +13 -13
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.cjs +48 -48
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
- package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
- package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
- package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
- package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
- package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
- package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
- package/dist/chunk-PWGSIM3F.cjs +291 -0
- package/dist/chunk-PWGSIM3F.cjs.map +1 -0
- package/dist/chunk-QP3WQSAA.cjs +23 -0
- package/dist/chunk-QP3WQSAA.cjs.map +1 -0
- package/dist/chunk-T5FZICXN.cjs +50 -0
- package/dist/chunk-T5FZICXN.cjs.map +1 -0
- package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
- package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
- package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +99 -99
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +101 -101
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +1689 -1619
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +702 -17060
- package/dist/index.js.map +7 -1
- package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
- package/dist/lazy-chunk.js +46 -0
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
- package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +167 -154
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +290 -9
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.cjs +17 -0
- package/dist/viewers/PdfViewer.cjs.map +1 -0
- package/dist/viewers/PdfViewer.d.ts +9 -0
- package/dist/viewers/PdfViewer.js +20 -0
- package/dist/viewers/PdfViewer.js.map +7 -0
- package/dist/viewers/PdfViewerImpl.js +384 -0
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.cjs +79 -653
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +3 -1
- package/dist/viewers/index.js +60 -903
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +12 -4
- package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-6H3O63TQ.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-CPQ3CU4B.js +0 -246
- package/dist/chunk-CPQ3CU4B.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DQALOQPI.js +0 -2766
- package/dist/chunk-DQALOQPI.js.map +0 -1
- package/dist/chunk-FZJMA32S.js +0 -1011
- package/dist/chunk-FZJMA32S.js.map +0 -1
- package/dist/chunk-H5M7FXLB.js +0 -2057
- package/dist/chunk-H5M7FXLB.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-P6WLV5UY.js +0 -644
- package/dist/chunk-P6WLV5UY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-BMhTH98a.d.cts +0 -2035
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15893
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -25
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/index.d.cts +0 -260
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { useCallback, useRef } from "react";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { useArbi } from "../useArbi.js";
|
|
4
|
+
import { arbiQueryKeys } from "../query-keys.js";
|
|
5
|
+
import { useAvailableModels, useConfig } from "../hooks.js";
|
|
6
|
+
import { useUserSettings } from "../account/settings.js";
|
|
7
|
+
import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
|
|
8
|
+
import { notify } from "../notifications/notify-store.js";
|
|
9
|
+
function isFullConfig(config) {
|
|
10
|
+
return config != null && "QueryLLM" in config;
|
|
11
|
+
}
|
|
12
|
+
function formatConfigValidationError(error) {
|
|
13
|
+
const apiError = error?.apiError;
|
|
14
|
+
const detail = apiError?.detail ?? error?.detail;
|
|
15
|
+
if (Array.isArray(detail)) {
|
|
16
|
+
const parts = detail.map((item) => {
|
|
17
|
+
if (!item || typeof item !== "object") return null;
|
|
18
|
+
const e = item;
|
|
19
|
+
const field = Array.isArray(e.loc) && e.loc.length > 0 ? e.loc.filter((p) => p !== "body").join(".") : "";
|
|
20
|
+
return field ? `${field}: ${e.msg ?? "invalid value"}` : e.msg ?? null;
|
|
21
|
+
}).filter(Boolean);
|
|
22
|
+
if (parts.length > 0) return parts.join("; ");
|
|
23
|
+
}
|
|
24
|
+
if (typeof detail === "string") return detail;
|
|
25
|
+
if (error instanceof Error) return error.message;
|
|
26
|
+
return "Invalid configuration value (out of range)";
|
|
27
|
+
}
|
|
28
|
+
function useConfigSchema() {
|
|
29
|
+
const arbi = useArbi();
|
|
30
|
+
return useQuery({
|
|
31
|
+
queryKey: arbiQueryKeys.configSchema(),
|
|
32
|
+
queryFn: () => arbi.agentConfig.getSchema(),
|
|
33
|
+
enabled: arbi.isLoggedIn
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function useSaveConfig() {
|
|
37
|
+
const arbi = useArbi();
|
|
38
|
+
const queryClient = useQueryClient();
|
|
39
|
+
return useMutation({
|
|
40
|
+
mutationFn: (body) => arbi.agentConfig.save(body),
|
|
41
|
+
onSuccess: () => {
|
|
42
|
+
void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() });
|
|
43
|
+
void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() });
|
|
44
|
+
},
|
|
45
|
+
onError: (error) => {
|
|
46
|
+
notify.error(formatConfigValidationError(error), {
|
|
47
|
+
description: "Configuration not saved \u2014 fix the highlighted values and try again."
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function useDeleteConfig() {
|
|
53
|
+
const arbi = useArbi();
|
|
54
|
+
const queryClient = useQueryClient();
|
|
55
|
+
return useMutation({
|
|
56
|
+
mutationFn: (configId) => arbi.agentConfig.delete(configId),
|
|
57
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() })
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function configDelta(active, defaults) {
|
|
61
|
+
const delta = {};
|
|
62
|
+
for (const [instrument, value] of Object.entries(active)) {
|
|
63
|
+
if (typeof value !== "object" || value === null) continue;
|
|
64
|
+
const defaultInstrument = defaults[instrument];
|
|
65
|
+
if (typeof defaultInstrument !== "object" || defaultInstrument === null) continue;
|
|
66
|
+
const fieldDelta = {};
|
|
67
|
+
for (const [field, fieldValue] of Object.entries(value)) {
|
|
68
|
+
if (JSON.stringify(fieldValue) !== JSON.stringify(defaultInstrument[field])) {
|
|
69
|
+
fieldDelta[field] = fieldValue;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (Object.keys(fieldDelta).length > 0) delta[instrument] = fieldDelta;
|
|
73
|
+
}
|
|
74
|
+
return delta;
|
|
75
|
+
}
|
|
76
|
+
function deltaOnto(changes, active, defaults) {
|
|
77
|
+
const delta = configDelta(active, defaults);
|
|
78
|
+
for (const [instrument, fields] of Object.entries(changes)) {
|
|
79
|
+
delta[instrument] = { ...delta[instrument] ?? {}, ...fields };
|
|
80
|
+
const defaultInstrument = defaults[instrument];
|
|
81
|
+
if (defaultInstrument) {
|
|
82
|
+
const instrumentDelta = delta[instrument];
|
|
83
|
+
for (const [field, value] of Object.entries(fields)) {
|
|
84
|
+
if (JSON.stringify(value) === JSON.stringify(defaultInstrument[field])) {
|
|
85
|
+
delete instrumentDelta[field];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (Object.keys(instrumentDelta).length === 0) delete delta[instrument];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return delta;
|
|
92
|
+
}
|
|
93
|
+
function useSaveConfigField(baseConfigId) {
|
|
94
|
+
const arbi = useArbi();
|
|
95
|
+
const queryClient = useQueryClient();
|
|
96
|
+
const saveConfig = useSaveConfig();
|
|
97
|
+
const { data: defaultConfig } = useConfig("default");
|
|
98
|
+
const chatModel = useArbiSessionState((state) => state.chatModel);
|
|
99
|
+
const { data: userSettings } = useUserSettings();
|
|
100
|
+
const activeConfigId = baseConfigId || chatModel || userSettings?.last_config || "default";
|
|
101
|
+
const { data: activeConfigData } = useConfig(activeConfigId);
|
|
102
|
+
const session = useArbiSessionStore();
|
|
103
|
+
const chain = useRef(null);
|
|
104
|
+
const buildDelta = (changes) => deltaOnto(
|
|
105
|
+
changes,
|
|
106
|
+
activeConfigData ?? {},
|
|
107
|
+
defaultConfig ?? {}
|
|
108
|
+
);
|
|
109
|
+
const readConfig = (configId) => queryClient.fetchQuery({
|
|
110
|
+
queryKey: arbiQueryKeys.config(configId),
|
|
111
|
+
queryFn: () => arbi.agentConfig.get(configId),
|
|
112
|
+
staleTime: 10 * 60 * 1e3
|
|
113
|
+
});
|
|
114
|
+
const saveOnBase = (base, changes, title) => {
|
|
115
|
+
const current = chain.current?.ids.has(base) ? chain.current : null;
|
|
116
|
+
const ids = current?.ids ?? /* @__PURE__ */ new Set([base]);
|
|
117
|
+
const from = current?.latest ?? Promise.resolve(base);
|
|
118
|
+
const saved = from.then(async (configId) => {
|
|
119
|
+
const [defaults, active] = await Promise.all([
|
|
120
|
+
readConfig("default"),
|
|
121
|
+
readConfig(configId)
|
|
122
|
+
]).catch((error) => {
|
|
123
|
+
notify.error(formatConfigValidationError(error), {
|
|
124
|
+
description: "Configuration not saved \u2014 the settings it builds on could not be read."
|
|
125
|
+
});
|
|
126
|
+
throw error;
|
|
127
|
+
});
|
|
128
|
+
const response = await saveConfig.mutateAsync({
|
|
129
|
+
...deltaOnto(changes, active ?? {}, defaults ?? {}),
|
|
130
|
+
title
|
|
131
|
+
});
|
|
132
|
+
if (response?.external_id) {
|
|
133
|
+
ids.add(response.external_id);
|
|
134
|
+
const { chatModel: chatModel2 } = session.getState();
|
|
135
|
+
const followsSettings = !chatModel2 && base === userSettings?.last_config;
|
|
136
|
+
if (chain.current?.ids === ids && !followsSettings) {
|
|
137
|
+
session.setChatModel(response.external_id);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return { response, configId: response?.external_id ?? configId };
|
|
141
|
+
});
|
|
142
|
+
chain.current = {
|
|
143
|
+
ids,
|
|
144
|
+
latest: Promise.all([from, saved]).then(
|
|
145
|
+
([, done]) => done.configId,
|
|
146
|
+
() => from
|
|
147
|
+
)
|
|
148
|
+
};
|
|
149
|
+
return saved.then(({ response }) => response);
|
|
150
|
+
};
|
|
151
|
+
return {
|
|
152
|
+
save: (instrument, field, value, title) => {
|
|
153
|
+
const changes = { [instrument]: { [field]: value } };
|
|
154
|
+
const name = title ?? `prefs-${Date.now()}`;
|
|
155
|
+
if (baseConfigId) return void saveOnBase(baseConfigId, changes, name).catch(() => {
|
|
156
|
+
});
|
|
157
|
+
saveConfig.mutate({ ...buildDelta(changes), title: name });
|
|
158
|
+
},
|
|
159
|
+
saveDelta: (changes, title) => {
|
|
160
|
+
const name = title ?? `prefs-${Date.now()}`;
|
|
161
|
+
if (baseConfigId) return saveOnBase(baseConfigId, changes, name);
|
|
162
|
+
return saveConfig.mutateAsync({ ...buildDelta(changes), title: name });
|
|
163
|
+
},
|
|
164
|
+
isPending: saveConfig.isPending
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const AUTO_CHAT_MODEL = "auto";
|
|
168
|
+
const chatModelSaves = /* @__PURE__ */ new WeakMap();
|
|
169
|
+
function pendingChatModelSave(session) {
|
|
170
|
+
return chatModelSaves.get(session);
|
|
171
|
+
}
|
|
172
|
+
function useApplyChatModel() {
|
|
173
|
+
const session = useArbiSessionStore();
|
|
174
|
+
const { data: availableModels } = useAvailableModels();
|
|
175
|
+
const configField = useSaveConfigField();
|
|
176
|
+
return useCallback(
|
|
177
|
+
async (model, label) => {
|
|
178
|
+
session.setChatModelName(model);
|
|
179
|
+
const agents = model === AUTO_CHAT_MODEL ? { AGENT_MODEL_NAME: AUTO_CHAT_MODEL, ENABLED: true } : {
|
|
180
|
+
AGENT_MODEL_NAME: model,
|
|
181
|
+
AGENT_API_TYPE: availableModels?.models?.find((m) => m.model_name === model)?.api_type || "remote",
|
|
182
|
+
ENABLED: true
|
|
183
|
+
};
|
|
184
|
+
const save = configField.saveDelta({ Agents: agents }, label).then((response) => {
|
|
185
|
+
if (chatModelSaves.get(session) === save && response?.external_id)
|
|
186
|
+
session.setChatModel(response.external_id);
|
|
187
|
+
});
|
|
188
|
+
chatModelSaves.set(session, save);
|
|
189
|
+
try {
|
|
190
|
+
await save;
|
|
191
|
+
} finally {
|
|
192
|
+
if (chatModelSaves.get(session) === save) chatModelSaves.delete(session);
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
[availableModels, configField, session]
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
export {
|
|
199
|
+
AUTO_CHAT_MODEL,
|
|
200
|
+
formatConfigValidationError,
|
|
201
|
+
isFullConfig,
|
|
202
|
+
pendingChatModelSave,
|
|
203
|
+
useApplyChatModel,
|
|
204
|
+
useConfigSchema,
|
|
205
|
+
useDeleteConfig,
|
|
206
|
+
useSaveConfig,
|
|
207
|
+
useSaveConfigField
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=config-hooks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/config/config-hooks.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Saved assistant configurations (configs): the schema their forms are drawn from, saving one,\n * deleting one, and saving a change on top of the person's active config (only what differs\n * from the defaults is sent). The chat's model choice (`useApplyChatModel`) goes through here.\n */\n\nimport { useCallback, useRef } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { components } from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../query-keys'\nimport { useAvailableModels, useConfig } from '../hooks'\nimport { useUserSettings } from '../account/settings'\nimport { useArbiSessionState, useArbiSessionStore } from '../session'\nimport { notify } from '../notifications/notify-store'\n\ntype AllConfigs = components['schemas']['AllConfigs']\ntype NonDeveloperConfig = components['schemas']['NonDeveloperConfig']\n/** A config to save: only the fields that differ from the defaults, and a title. */\nexport type ConfigUpdate = components['schemas']['ConfigUpdateData']\n\n/**\n * Whether a config is the full one (a developer's): a non-developer's exposes only its Agents\n * and ArtifactLLM sections.\n */\nexport function isFullConfig(\n config: AllConfigs | NonDeveloperConfig | undefined | null\n): config is AllConfigs {\n return config != null && 'QueryLLM' in config\n}\n\n/** A refused save, in words: each invalid field and why (FastAPI's 422), else the message. */\nexport function formatConfigValidationError(error: unknown): string {\n const apiError = (error as { apiError?: { detail?: unknown } } | null)?.apiError\n const detail = apiError?.detail ?? (error as { detail?: unknown } | null)?.detail\n if (Array.isArray(detail)) {\n const parts = detail\n .map((item) => {\n if (!item || typeof item !== 'object') return null\n const e = item as { loc?: unknown[]; msg?: string }\n const field =\n Array.isArray(e.loc) && e.loc.length > 0\n ? e.loc.filter((p) => p !== 'body').join('.')\n : ''\n return field ? `${field}: ${e.msg ?? 'invalid value'}` : (e.msg ?? null)\n })\n .filter(Boolean)\n if (parts.length > 0) return parts.join('; ')\n }\n if (typeof detail === 'string') return detail\n if (error instanceof Error) return error.message\n return 'Invalid configuration value (out of range)'\n}\n\n/** The JSON schema of every config section (what the config forms draw). */\nexport function useConfigSchema() {\n const arbi = useArbi()\n return useQuery({\n queryKey: arbiQueryKeys.configSchema(),\n queryFn: () => arbi.agentConfig.getSchema(),\n enabled: arbi.isLoggedIn,\n })\n}\n\n/**\n * Save a config (the server makes it the person's active one). A refused save says which values\n * were wrong.\n */\nexport function useSaveConfig() {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (body: ConfigUpdate) => arbi.agentConfig.save(body),\n onSuccess: () => {\n // Every config read refreshes, and the settings name the new active config.\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() })\n void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.userSettings() })\n },\n onError: (error) => {\n notify.error(formatConfigValidationError(error), {\n description: 'Configuration not saved \u2014 fix the highlighted values and try again.',\n })\n },\n })\n}\n\n/** Delete one of the person's saved configs. */\nexport function useDeleteConfig() {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (configId: string) => arbi.agentConfig.delete(configId),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.configs() }),\n })\n}\n\n/** The instrument-level fields of `active` that differ from `defaults`. */\nfunction configDelta(\n active: Record<string, unknown>,\n defaults: Record<string, unknown>\n): Record<string, unknown> {\n const delta: Record<string, unknown> = {}\n for (const [instrument, value] of Object.entries(active)) {\n if (typeof value !== 'object' || value === null) continue\n const defaultInstrument = defaults[instrument]\n if (typeof defaultInstrument !== 'object' || defaultInstrument === null) continue\n const fieldDelta: Record<string, unknown> = {}\n for (const [field, fieldValue] of Object.entries(value as Record<string, unknown>)) {\n if (\n JSON.stringify(fieldValue) !==\n JSON.stringify((defaultInstrument as Record<string, unknown>)[field])\n ) {\n fieldDelta[field] = fieldValue\n }\n }\n if (Object.keys(fieldDelta).length > 0) delta[instrument] = fieldDelta\n }\n return delta\n}\n\n/** `changes` on top of `active`'s overrides, without any field back at its default. */\nfunction deltaOnto(\n changes: Record<string, Record<string, unknown>>,\n active: Record<string, unknown>,\n defaults: Record<string, unknown>\n): Record<string, unknown> {\n const delta = configDelta(active, defaults)\n for (const [instrument, fields] of Object.entries(changes)) {\n delta[instrument] = { ...((delta[instrument] as Record<string, unknown>) ?? {}), ...fields }\n // A field back at its default is not an override.\n const defaultInstrument = defaults[instrument] as Record<string, unknown> | undefined\n if (defaultInstrument) {\n const instrumentDelta = delta[instrument] as Record<string, unknown>\n for (const [field, value] of Object.entries(fields)) {\n if (JSON.stringify(value) === JSON.stringify(defaultInstrument[field])) {\n delete instrumentDelta[field]\n }\n }\n if (Object.keys(instrumentDelta).length === 0) delete delta[instrument]\n }\n }\n return delta\n}\n\n/**\n * Save changes on top of the active config (the chat's choice, else the person's last, else the\n * defaults), keeping its other overrides and sending only what differs from the defaults.\n *\n * save(instrument, field, value, title?) one field (a switch)\n * saveDelta(changes, title?) several at once: { Agents: { ENABLED: true, \u2026 } }\n *\n * `baseConfigId`: the config a host shows (it can differ from the chat's), which saves build on\n * instead. Each save reads it first, so one made while it loads keeps its overrides, and builds on\n * the config the previous save made, so quick edits keep each other, also once the host shows a\n * config one of them made. The config a save makes becomes the chat's (`session.chatModel`), so\n * the host shows and uses it. A base that cannot be read is reported like a refused save.\n */\nexport function useSaveConfigField(baseConfigId?: string | null) {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n const saveConfig = useSaveConfig()\n const { data: defaultConfig } = useConfig('default')\n const chatModel = useArbiSessionState((state) => state.chatModel)\n const { data: userSettings } = useUserSettings()\n const activeConfigId = baseConfigId || chatModel || userSettings?.last_config || 'default'\n const { data: activeConfigData } = useConfig(activeConfigId)\n const session = useArbiSessionStore()\n // The saves on the shown config, one after another: every config id they started from or made\n // (the host shows the one a save made once the settings refetch), and the config the latest one\n // leaves (its own on success, the one it started from if refused), which never rejects.\n const chain = useRef<{ ids: Set<string>; latest: Promise<string> } | null>(null)\n\n const buildDelta = (changes: Record<string, Record<string, unknown>>) =>\n deltaOnto(\n changes,\n (activeConfigData ?? {}) as Record<string, unknown>,\n (defaultConfig ?? {}) as Record<string, unknown>\n )\n\n const readConfig = (configId: string) =>\n queryClient.fetchQuery({\n queryKey: arbiQueryKeys.config(configId),\n queryFn: () => arbi.agentConfig.get(configId),\n staleTime: 10 * 60 * 1000,\n }) as Promise<Record<string, unknown>>\n\n const saveOnBase = (\n base: string,\n changes: Record<string, Record<string, unknown>>,\n title: string\n ) => {\n // The shown config is one this chain made or started from: build on whatever it leaves.\n // Anything else is a config the host moved to: start a new chain there.\n const current = chain.current?.ids.has(base) ? chain.current : null\n const ids = current?.ids ?? new Set([base])\n const from = current?.latest ?? Promise.resolve(base)\n const saved = from.then(async (configId) => {\n const [defaults, active] = await Promise.all([\n readConfig('default'),\n readConfig(configId),\n ]).catch((error: unknown) => {\n notify.error(formatConfigValidationError(error), {\n description: 'Configuration not saved \u2014 the settings it builds on could not be read.',\n })\n throw error\n })\n const response = await saveConfig.mutateAsync({\n ...deltaOnto(changes, active ?? {}, defaults ?? {}),\n title,\n } as ConfigUpdate)\n if (response?.external_id) {\n ids.add(response.external_id)\n // The host shows the config this save made: the settings refetch does that for the\n // person's last config; one the chat (or a reply) runs on follows it here, as a model\n // pick does. A chain the host has since left does not pull it back.\n const { chatModel } = session.getState()\n const followsSettings = !chatModel && base === userSettings?.last_config\n if (chain.current?.ids === ids && !followsSettings) {\n session.setChatModel(response.external_id)\n }\n }\n return { response, configId: response?.external_id ?? configId }\n })\n chain.current = {\n ids,\n latest: Promise.all([from, saved]).then(\n ([, done]) => done.configId,\n () => from\n ),\n }\n return saved.then(({ response }) => response)\n }\n\n return {\n save: (instrument: string, field: string, value: unknown, title?: string) => {\n const changes = { [instrument]: { [field]: value } }\n const name = title ?? `prefs-${Date.now()}`\n // A refused save, or a base that could not be read, is already reported.\n if (baseConfigId) return void saveOnBase(baseConfigId, changes, name).catch(() => {})\n saveConfig.mutate({ ...buildDelta(changes), title: name } as ConfigUpdate)\n },\n saveDelta: (changes: Record<string, Record<string, unknown>>, title?: string) => {\n const name = title ?? `prefs-${Date.now()}`\n if (baseConfigId) return saveOnBase(baseConfigId, changes, name)\n return saveConfig.mutateAsync({ ...buildDelta(changes), title: name } as ConfigUpdate)\n },\n isPending: saveConfig.isPending,\n }\n}\n\n/** The model a chat runs on when no one picked one: the server chooses per turn. */\nexport const AUTO_CHAT_MODEL = 'auto'\n\n/** Each session's latest model save (a pick the next turn must run on), while it is in flight. */\nconst chatModelSaves = new WeakMap<object, Promise<unknown>>()\n\n/**\n * The chat's model save still in flight, if any: a send waits for it, so the turn runs on the model\n * the picker shows rather than on the config before the pick.\n */\nexport function pendingChatModelSave(session: object): Promise<unknown> | undefined {\n return chatModelSaves.get(session)\n}\n\n/**\n * Run the chat on a model (`auto` for the server's choice): the picker shows it at once, and it is\n * saved as a config delta (the Agents model, under `label`) that the next turn runs on. A send made\n * before the save lands waits for it; of two quick picks, the later one wins.\n */\nexport function useApplyChatModel(): (model: string, label: string) => Promise<void> {\n const session = useArbiSessionStore()\n const { data: availableModels } = useAvailableModels()\n const configField = useSaveConfigField()\n return useCallback(\n async (model, label) => {\n session.setChatModelName(model)\n const agents =\n model === AUTO_CHAT_MODEL\n ? { AGENT_MODEL_NAME: AUTO_CHAT_MODEL, ENABLED: true }\n : {\n AGENT_MODEL_NAME: model,\n AGENT_API_TYPE:\n availableModels?.models?.find((m) => m.model_name === model)?.api_type || 'remote',\n ENABLED: true,\n }\n const save = configField.saveDelta({ Agents: agents }, label).then((response) => {\n if (chatModelSaves.get(session) === save && response?.external_id)\n session.setChatModel(response.external_id)\n })\n chatModelSaves.set(session, save)\n try {\n await save\n } finally {\n if (chatModelSaves.get(session) === save) chatModelSaves.delete(session)\n }\n },\n [availableModels, configField, session]\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["chatModel"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
+
import { onlineManager } from "@tanstack/react-query";
|
|
3
|
+
import { useArbiSession } from "./session/signed-in.js";
|
|
4
|
+
import { useArbiSessionState, useArbiSessionStore } from "./session/session-hooks.js";
|
|
5
|
+
import { useArbiWsStore } from "./websocket/store.js";
|
|
6
|
+
const WORK_OFFLINE_VIEW = "app.workOffline";
|
|
7
|
+
const isWorkingOffline = (session) => session.getState().views.transient[WORK_OFFLINE_VIEW] === true;
|
|
8
|
+
const setWorkOfflineIn = (session, on) => session.setTransientView(WORK_OFFLINE_VIEW, on || void 0);
|
|
9
|
+
function useWorkOffline() {
|
|
10
|
+
const session = useArbiSessionStore();
|
|
11
|
+
const on = useArbiSessionState((s) => s.views.transient[WORK_OFFLINE_VIEW] === true);
|
|
12
|
+
const set = useCallback((next) => setWorkOfflineIn(session, next), [session]);
|
|
13
|
+
return [on, set];
|
|
14
|
+
}
|
|
15
|
+
function computeOnline(wsStatus, isAuthenticated, workOffline, wsEverConnected) {
|
|
16
|
+
if (workOffline) return false;
|
|
17
|
+
const navOnline = typeof navigator === "undefined" ? true : navigator.onLine;
|
|
18
|
+
const wsIsEvidence = isAuthenticated && wsEverConnected;
|
|
19
|
+
const wsOnline = !wsIsEvidence || wsStatus !== "disconnected" && wsStatus !== "error";
|
|
20
|
+
return navOnline && wsOnline;
|
|
21
|
+
}
|
|
22
|
+
function useOnlineSync() {
|
|
23
|
+
const session = useArbiSessionStore();
|
|
24
|
+
const wsStatus = useArbiWsStore((s) => s.status);
|
|
25
|
+
const signedIn = useArbiSession().status === "signed-in";
|
|
26
|
+
const [workOffline] = useWorkOffline();
|
|
27
|
+
const wsEverConnected = useRef(false);
|
|
28
|
+
if (wsStatus === "connected") wsEverConnected.current = true;
|
|
29
|
+
const signedInRef = useRef(signedIn);
|
|
30
|
+
signedInRef.current = signedIn;
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
onlineManager.setOnline(computeOnline(wsStatus, signedIn, workOffline, wsEverConnected.current));
|
|
33
|
+
}, [wsStatus, signedIn, workOffline]);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
const update = () => onlineManager.setOnline(
|
|
36
|
+
computeOnline(
|
|
37
|
+
useArbiWsStore.getState().status,
|
|
38
|
+
signedInRef.current,
|
|
39
|
+
isWorkingOffline(session),
|
|
40
|
+
wsEverConnected.current
|
|
41
|
+
)
|
|
42
|
+
);
|
|
43
|
+
window.addEventListener("online", update);
|
|
44
|
+
window.addEventListener("offline", update);
|
|
45
|
+
return () => {
|
|
46
|
+
window.removeEventListener("online", update);
|
|
47
|
+
window.removeEventListener("offline", update);
|
|
48
|
+
};
|
|
49
|
+
}, [session]);
|
|
50
|
+
}
|
|
51
|
+
function useReconnect() {
|
|
52
|
+
const session = useArbiSessionStore();
|
|
53
|
+
return useCallback(() => {
|
|
54
|
+
if (isWorkingOffline(session)) {
|
|
55
|
+
setWorkOfflineIn(session, false);
|
|
56
|
+
return "resumed";
|
|
57
|
+
}
|
|
58
|
+
if (typeof navigator !== "undefined" && navigator.onLine === false) return "no-network";
|
|
59
|
+
window.location.reload();
|
|
60
|
+
return "reloading";
|
|
61
|
+
}, [session]);
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
WORK_OFFLINE_VIEW,
|
|
65
|
+
computeOnline,
|
|
66
|
+
isWorkingOffline,
|
|
67
|
+
setWorkOfflineIn,
|
|
68
|
+
useOnlineSync,
|
|
69
|
+
useReconnect,
|
|
70
|
+
useWorkOffline
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=connectivity.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/connectivity.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Whether the site is online, for every host. React Query's `onlineManager` follows three things:\n * - the browser's network;\n * - the live connection: once it has been up, a dropped socket means the server cannot be reached;\n * - the person's own \"Work offline\" choice.\n *\n * Offline, queries serve their cache and writes wait until the connection is back.\n *\n * `ArbiWebSocketProvider` runs {@link useOnlineSync}. {@link useWorkOffline} is the one \"Work\n * offline\" switch, used by the settings toggle and the account menu; the offline pill's Reconnect\n * clears it through {@link useReconnect}.\n * The choice is a transient view of the session: this session's only and never saved, as a saved\n * `true` would boot the app offline and stall the sign-in.\n */\nimport { useCallback, useEffect, useRef } from 'react'\nimport { onlineManager } from '@tanstack/react-query'\nimport { useArbiSession } from './session/signed-in'\nimport { useArbiSessionState, useArbiSessionStore } from './session/session-hooks'\nimport type { ArbiSessionStore } from './session/store'\nimport { useArbiWsStore, type ArbiWsStatus } from './websocket/store'\n\n/** The session's transient view holding the \"Work offline\" choice. */\nexport const WORK_OFFLINE_VIEW = 'app.workOffline'\n\n/** Whether the person chose \"Work offline\" (outside React). */\nexport const isWorkingOffline = (session: Pick<ArbiSessionStore, 'getState'>): boolean =>\n session.getState().views.transient[WORK_OFFLINE_VIEW] === true\n\n/** Turn \"Work offline\" on or off (outside React). */\nexport const setWorkOfflineIn = (\n session: Pick<ArbiSessionStore, 'setTransientView'>,\n on: boolean\n): void => session.setTransientView(WORK_OFFLINE_VIEW, on || undefined)\n\n/** The \"Work offline\" choice and its setter. */\nexport function useWorkOffline(): [boolean, (on: boolean) => void] {\n const session = useArbiSessionStore()\n const on = useArbiSessionState((s) => s.views.transient[WORK_OFFLINE_VIEW] === true)\n const set = useCallback((next: boolean) => setWorkOfflineIn(session, next), [session])\n return [on, set]\n}\n\n/**\n * Online or not, from the socket's status, the session, the \"Work offline\" choice and whether the\n * socket has ever connected in this tab.\n */\nexport function computeOnline(\n wsStatus: ArbiWsStatus | undefined,\n isAuthenticated: boolean,\n workOffline: boolean,\n /** Until the socket has been up once, 'disconnected' means \"not connected yet\", not \"dropped\". */\n wsEverConnected: boolean\n): boolean {\n // A deliberate \"Work offline\" choice wins over actual reachability.\n if (workOffline) return false\n const navOnline = typeof navigator === 'undefined' ? true : navigator.onLine\n // The socket is evidence only once a session should be holding it open. Before sign-in it is\n // down by design: reading that as offline would pause the sign-in request forever, and the app\n // would hang on \"Signing in\u2026\". Right after a reload the session is back a tick before the\n // socket's handshake: reading that as offline would tell the person they are offline on a\n // working network, and stop the workspace switch restoring the workspace they reloaded on.\n // 'connecting' counts as online, to avoid flapping.\n const wsIsEvidence = isAuthenticated && wsEverConnected\n const wsOnline = !wsIsEvidence || (wsStatus !== 'disconnected' && wsStatus !== 'error')\n return navOnline && wsOnline\n}\n\n/** Drive `onlineManager` from the network, the live connection and \"Work offline\". */\nexport function useOnlineSync(): void {\n const session = useArbiSessionStore()\n const wsStatus = useArbiWsStore((s) => s.status)\n const signedIn = useArbiSession().status === 'signed-in'\n const [workOffline] = useWorkOffline()\n\n // Latches on the first 'connected' and never clears: after that, a drop is a real drop. A ref,\n // not state: the 'connected' status that sets it already renders.\n const wsEverConnected = useRef(false)\n if (wsStatus === 'connected') wsEverConnected.current = true\n const signedInRef = useRef(signedIn)\n signedInRef.current = signedIn\n\n useEffect(() => {\n onlineManager.setOnline(computeOnline(wsStatus, signedIn, workOffline, wsEverConnected.current))\n }, [wsStatus, signedIn, workOffline])\n\n useEffect(() => {\n const update = () =>\n onlineManager.setOnline(\n computeOnline(\n useArbiWsStore.getState().status,\n signedInRef.current,\n isWorkingOffline(session),\n wsEverConnected.current\n )\n )\n window.addEventListener('online', update)\n window.addEventListener('offline', update)\n return () => {\n window.removeEventListener('online', update)\n window.removeEventListener('offline', update)\n }\n }, [session])\n}\n\n/** What a reconnect did. */\nexport type ReconnectOutcome = 'resumed' | 'no-network' | 'reloading'\n\n/**\n * Reconnect, cheapest path first:\n * - offline only by choice: clear it, and the queued writes resume in place (no reload);\n * - no network: there is nothing to reconnect to yet;\n * - otherwise the socket gave up after a real drop: reload, which reopens it, renews the session\n * and replays the queue.\n */\nexport function useReconnect(): () => ReconnectOutcome {\n const session = useArbiSessionStore()\n return useCallback(() => {\n if (isWorkingOffline(session)) {\n setWorkOfflineIn(session, false)\n return 'resumed'\n }\n if (typeof navigator !== 'undefined' && navigator.onLine === false) return 'no-network'\n window.location.reload()\n return 'reloading'\n }, [session])\n}\n"],
|
|
5
|
+
"mappings": "AAcA,SAAS,aAAa,WAAW,cAAc;AAC/C,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB,2BAA2B;AAEzD,SAAS,sBAAyC;AAG3C,MAAM,oBAAoB;AAG1B,MAAM,mBAAmB,CAAC,YAC/B,QAAQ,SAAS,EAAE,MAAM,UAAU,iBAAiB,MAAM;AAGrD,MAAM,mBAAmB,CAC9B,SACA,OACS,QAAQ,iBAAiB,mBAAmB,MAAM,MAAS;AAG/D,SAAS,iBAAmD;AACjE,QAAM,UAAU,oBAAoB;AACpC,QAAM,KAAK,oBAAoB,CAAC,MAAM,EAAE,MAAM,UAAU,iBAAiB,MAAM,IAAI;AACnF,QAAM,MAAM,YAAY,CAAC,SAAkB,iBAAiB,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC;AACrF,SAAO,CAAC,IAAI,GAAG;AACjB;AAMO,SAAS,cACd,UACA,iBACA,aAEA,iBACS;AAET,MAAI,YAAa,QAAO;AACxB,QAAM,YAAY,OAAO,cAAc,cAAc,OAAO,UAAU;AAOtE,QAAM,eAAe,mBAAmB;AACxC,QAAM,WAAW,CAAC,gBAAiB,aAAa,kBAAkB,aAAa;AAC/E,SAAO,aAAa;AACtB;AAGO,SAAS,gBAAsB;AACpC,QAAM,UAAU,oBAAoB;AACpC,QAAM,WAAW,eAAe,CAAC,MAAM,EAAE,MAAM;AAC/C,QAAM,WAAW,eAAe,EAAE,WAAW;AAC7C,QAAM,CAAC,WAAW,IAAI,eAAe;AAIrC,QAAM,kBAAkB,OAAO,KAAK;AACpC,MAAI,aAAa,YAAa,iBAAgB,UAAU;AACxD,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,YAAU,MAAM;AACd,kBAAc,UAAU,cAAc,UAAU,UAAU,aAAa,gBAAgB,OAAO,CAAC;AAAA,EACjG,GAAG,CAAC,UAAU,UAAU,WAAW,CAAC;AAEpC,YAAU,MAAM;AACd,UAAM,SAAS,MACb,cAAc;AAAA,MACZ;AAAA,QACE,eAAe,SAAS,EAAE;AAAA,QAC1B,YAAY;AAAA,QACZ,iBAAiB,OAAO;AAAA,QACxB,gBAAgB;AAAA,MAClB;AAAA,IACF;AACF,WAAO,iBAAiB,UAAU,MAAM;AACxC,WAAO,iBAAiB,WAAW,MAAM;AACzC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,MAAM;AAC3C,aAAO,oBAAoB,WAAW,MAAM;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AACd;AAYO,SAAS,eAAuC;AACrD,QAAM,UAAU,oBAAoB;AACpC,SAAO,YAAY,MAAM;AACvB,QAAI,iBAAiB,OAAO,GAAG;AAC7B,uBAAiB,SAAS,KAAK;AAC/B,aAAO;AAAA,IACT;AACA,QAAI,OAAO,cAAc,eAAe,UAAU,WAAW,MAAO,QAAO;AAC3E,WAAO,SAAS,OAAO;AACvB,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AACd;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { ArbiApiError, isConnectorVendorVisible } from "@arbidocs/sdk/browser";
|
|
4
|
+
import { logger } from "@arbidocs/client";
|
|
5
|
+
import { useArbi } from "../useArbi.js";
|
|
6
|
+
import { useUserSettings } from "../account/settings.js";
|
|
7
|
+
import { useIsEntitled } from "../account/entitlements.js";
|
|
8
|
+
import { connectorQueryKeys } from "../query-keys.js";
|
|
9
|
+
import { connectorQueryKeys as connectorQueryKeys2, mailQueryKeys } from "../query-keys.js";
|
|
10
|
+
function useConnectorMutation(mutationFn) {
|
|
11
|
+
const qc = useQueryClient();
|
|
12
|
+
return useMutation({
|
|
13
|
+
mutationFn,
|
|
14
|
+
onSuccess: () => qc.invalidateQueries({ queryKey: connectorQueryKeys2.all() })
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function useConnectorCatalog() {
|
|
18
|
+
const arbi = useArbi();
|
|
19
|
+
return useQuery({
|
|
20
|
+
queryKey: connectorQueryKeys2.catalog(),
|
|
21
|
+
queryFn: () => arbi.connectors.catalog(),
|
|
22
|
+
staleTime: 5 * 6e4,
|
|
23
|
+
enabled: arbi.isLoggedIn
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function useMyConnectors() {
|
|
27
|
+
const arbi = useArbi();
|
|
28
|
+
return useQuery({
|
|
29
|
+
queryKey: connectorQueryKeys2.mine(),
|
|
30
|
+
queryFn: () => arbi.connectors.mine(),
|
|
31
|
+
staleTime: 3e4,
|
|
32
|
+
enabled: arbi.isLoggedIn
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function useDisconnectConnector() {
|
|
36
|
+
const arbi = useArbi();
|
|
37
|
+
return useConnectorMutation(
|
|
38
|
+
({ vendorKey }) => arbi.connectors.disconnect(vendorKey)
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function useConnectorVendorVisibility() {
|
|
42
|
+
const { data: settings } = useUserSettings();
|
|
43
|
+
return (vendorKey) => isConnectorVendorVisible(settings, vendorKey);
|
|
44
|
+
}
|
|
45
|
+
function connectorReturnTo(reopen) {
|
|
46
|
+
const params = new URLSearchParams(window.location.search);
|
|
47
|
+
params.delete("connected");
|
|
48
|
+
params.delete("connect_error");
|
|
49
|
+
params.set("stay", "1");
|
|
50
|
+
if (reopen) params.set("reopen", reopen);
|
|
51
|
+
else params.delete("reopen");
|
|
52
|
+
return `${window.location.pathname}?${params.toString()}`;
|
|
53
|
+
}
|
|
54
|
+
function useMailboxFolders(vendorKey, enabled) {
|
|
55
|
+
const arbi = useArbi();
|
|
56
|
+
return useQuery({
|
|
57
|
+
queryKey: connectorQueryKeys2.mailboxFolders(vendorKey),
|
|
58
|
+
queryFn: () => arbi.connectors.mailboxFolders(vendorKey),
|
|
59
|
+
enabled: enabled && arbi.isLoggedIn,
|
|
60
|
+
staleTime: 6e4
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function useEnableMailboxSync() {
|
|
64
|
+
const arbi = useArbi();
|
|
65
|
+
return useConnectorMutation(
|
|
66
|
+
(v) => arbi.connectors.enableMailboxSync(v.vendorKey, {
|
|
67
|
+
workspace_ext_id: v.workspaceExtId,
|
|
68
|
+
backfill_window: v.backfillWindow,
|
|
69
|
+
backfill_since: v.backfillSince ?? null,
|
|
70
|
+
folders: v.folders,
|
|
71
|
+
skip_duplicates: v.skipDuplicates,
|
|
72
|
+
auto_rename: v.autoRename ?? false,
|
|
73
|
+
shared: v.shared ?? false,
|
|
74
|
+
auto_sync: v.autoSync
|
|
75
|
+
})
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
function useTriggerMailboxSync() {
|
|
79
|
+
const arbi = useArbi();
|
|
80
|
+
return useConnectorMutation(
|
|
81
|
+
({ vendorKey, workspaceExtId }) => arbi.connectors.syncMailbox(vendorKey, workspaceExtId)
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
function useMailboxSyncProgress(vendorKey, workspaceExtId, enabled) {
|
|
85
|
+
const arbi = useArbi();
|
|
86
|
+
return useQuery({
|
|
87
|
+
queryKey: connectorQueryKeys2.mailboxSyncProgress(vendorKey, workspaceExtId),
|
|
88
|
+
queryFn: () => arbi.connectors.mailboxSyncProgress(vendorKey, workspaceExtId),
|
|
89
|
+
enabled: enabled && !!workspaceExtId && arbi.isLoggedIn,
|
|
90
|
+
refetchInterval: (query) => query.state.data?.running ? 1500 : false,
|
|
91
|
+
staleTime: 0
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function useCancelMailboxSync() {
|
|
95
|
+
const arbi = useArbi();
|
|
96
|
+
return useMutation({
|
|
97
|
+
mutationFn: ({ vendorKey, workspaceExtId }) => arbi.connectors.cancelMailboxSync(vendorKey, workspaceExtId)
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function useDriveFolders(vendorKey, enabled) {
|
|
101
|
+
const arbi = useArbi();
|
|
102
|
+
return useQuery({
|
|
103
|
+
queryKey: connectorQueryKeys2.driveFolders(vendorKey),
|
|
104
|
+
queryFn: () => arbi.connectors.driveFolders(vendorKey),
|
|
105
|
+
enabled: enabled && arbi.isLoggedIn,
|
|
106
|
+
retry: false,
|
|
107
|
+
staleTime: 6e4
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function useDriveFolderChildren(vendorKey, itemId, enabled) {
|
|
111
|
+
const arbi = useArbi();
|
|
112
|
+
return useQuery({
|
|
113
|
+
queryKey: connectorQueryKeys2.driveFolderChildren(vendorKey, itemId),
|
|
114
|
+
queryFn: () => arbi.connectors.driveFolderChildren(vendorKey, itemId),
|
|
115
|
+
enabled: enabled && arbi.isLoggedIn,
|
|
116
|
+
staleTime: 3e4
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function useDriveFolderDocCount(vendorKey, itemId, enabled) {
|
|
120
|
+
const arbi = useArbi();
|
|
121
|
+
return useQuery({
|
|
122
|
+
queryKey: connectorQueryKeys2.driveFolderDocCount(vendorKey, itemId),
|
|
123
|
+
queryFn: () => arbi.connectors.driveFolderDocCount(vendorKey, itemId),
|
|
124
|
+
enabled: enabled && arbi.isLoggedIn,
|
|
125
|
+
staleTime: 5 * 6e4
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function useEnableDriveSync() {
|
|
129
|
+
const arbi = useArbi();
|
|
130
|
+
return useConnectorMutation(
|
|
131
|
+
(v) => arbi.connectors.enableDriveSync(v.vendorKey, {
|
|
132
|
+
workspace_ext_id: v.workspaceExtId,
|
|
133
|
+
folders: v.folders,
|
|
134
|
+
skip_duplicates: v.skipDuplicates,
|
|
135
|
+
auto_rename: v.autoRename,
|
|
136
|
+
shared: v.shared,
|
|
137
|
+
auto_sync: v.autoSync
|
|
138
|
+
})
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function useTriggerDriveSync() {
|
|
142
|
+
const arbi = useArbi();
|
|
143
|
+
return useConnectorMutation(
|
|
144
|
+
({ vendorKey }) => arbi.connectors.syncDrive(vendorKey)
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
function useDriveSyncEstimate(vendorKey, enabled) {
|
|
148
|
+
const arbi = useArbi();
|
|
149
|
+
return useQuery({
|
|
150
|
+
queryKey: connectorQueryKeys2.driveSyncEstimate(vendorKey),
|
|
151
|
+
queryFn: () => arbi.connectors.driveSyncEstimate(vendorKey),
|
|
152
|
+
enabled: enabled && arbi.isLoggedIn,
|
|
153
|
+
staleTime: 3e4
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
function useDriveSyncProgress(vendorKey, enabled) {
|
|
157
|
+
const arbi = useArbi();
|
|
158
|
+
return useQuery({
|
|
159
|
+
queryKey: connectorQueryKeys2.driveSyncProgress(vendorKey),
|
|
160
|
+
queryFn: () => arbi.connectors.driveSyncProgress(vendorKey),
|
|
161
|
+
enabled: enabled && arbi.isLoggedIn,
|
|
162
|
+
refetchInterval: (query) => query.state.data?.running ? 1500 : false,
|
|
163
|
+
staleTime: 0
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function useCancelDriveSync() {
|
|
167
|
+
const arbi = useArbi();
|
|
168
|
+
return useMutation({
|
|
169
|
+
mutationFn: ({ vendorKey }) => arbi.connectors.cancelDriveSync(vendorKey)
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function useSlackConnection() {
|
|
173
|
+
const arbi = useArbi();
|
|
174
|
+
return useQuery({
|
|
175
|
+
queryKey: connectorQueryKeys2.slack(),
|
|
176
|
+
queryFn: () => arbi.connectors.slack.status(),
|
|
177
|
+
enabled: arbi.isLoggedIn,
|
|
178
|
+
// Fresh on every visit: the OAuth return lands here before the status changed server-side.
|
|
179
|
+
staleTime: 0,
|
|
180
|
+
refetchOnMount: "always",
|
|
181
|
+
refetchOnWindowFocus: true
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
function useDisconnectSlack() {
|
|
185
|
+
const arbi = useArbi();
|
|
186
|
+
return useConnectorMutation(() => arbi.connectors.slack.disconnect());
|
|
187
|
+
}
|
|
188
|
+
function useRefreshConnectorsOnRunEnd(running) {
|
|
189
|
+
const qc = useQueryClient();
|
|
190
|
+
const wasRunning = useRef(running);
|
|
191
|
+
useEffect(() => {
|
|
192
|
+
if (wasRunning.current && !running) {
|
|
193
|
+
void qc.invalidateQueries({ queryKey: connectorQueryKeys2.mine() });
|
|
194
|
+
}
|
|
195
|
+
wasRunning.current = running;
|
|
196
|
+
}, [running, qc]);
|
|
197
|
+
}
|
|
198
|
+
const FOCUS_RECHECK_MS = 6e4;
|
|
199
|
+
function checkNowAndOnFocus(check) {
|
|
200
|
+
let lastCheck = Date.now();
|
|
201
|
+
check();
|
|
202
|
+
const onVisible = () => {
|
|
203
|
+
if (document.visibilityState !== "visible") return;
|
|
204
|
+
if (Date.now() - lastCheck < FOCUS_RECHECK_MS) return;
|
|
205
|
+
lastCheck = Date.now();
|
|
206
|
+
check();
|
|
207
|
+
};
|
|
208
|
+
document.addEventListener("visibilitychange", onVisible);
|
|
209
|
+
return () => document.removeEventListener("visibilitychange", onVisible);
|
|
210
|
+
}
|
|
211
|
+
function useConnectorAutoSync(workspaceExtId, opened) {
|
|
212
|
+
const arbi = useArbi();
|
|
213
|
+
const qc = useQueryClient();
|
|
214
|
+
const hasMail = useIsEntitled("mail");
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
if (!opened || !workspaceExtId || !arbi.isLoggedIn) return;
|
|
217
|
+
return checkNowAndOnFocus(() => {
|
|
218
|
+
void arbi.connectors.bridgeTokens({ autoSyncWorkspaceExtId: workspaceExtId }).then(() => {
|
|
219
|
+
void qc.invalidateQueries({ queryKey: connectorQueryKeys2.mine() });
|
|
220
|
+
void qc.invalidateQueries({ queryKey: connectorQueryKeys2.allMailboxSyncProgress() });
|
|
221
|
+
void qc.invalidateQueries({ queryKey: connectorQueryKeys2.allDriveSyncProgress() });
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
}, [opened, workspaceExtId, arbi, qc]);
|
|
225
|
+
useEffect(() => {
|
|
226
|
+
if (!opened || !workspaceExtId || !arbi.isLoggedIn || !hasMail) return;
|
|
227
|
+
return checkNowAndOnFocus(() => {
|
|
228
|
+
void arbi.mail.fileWaiting(workspaceExtId).then(({ filed }) => {
|
|
229
|
+
if (filed) void qc.invalidateQueries({ queryKey: mailQueryKeys.allFiling() });
|
|
230
|
+
}).catch((error) => logger.warn("[mail] could not file waiting mail", error));
|
|
231
|
+
});
|
|
232
|
+
}, [opened, workspaceExtId, arbi, qc, hasMail]);
|
|
233
|
+
}
|
|
234
|
+
function connectorErrorStatus(err) {
|
|
235
|
+
return err instanceof ArbiApiError ? err.status : void 0;
|
|
236
|
+
}
|
|
237
|
+
export {
|
|
238
|
+
connectorErrorStatus,
|
|
239
|
+
connectorQueryKeys,
|
|
240
|
+
connectorReturnTo,
|
|
241
|
+
useCancelDriveSync,
|
|
242
|
+
useCancelMailboxSync,
|
|
243
|
+
useConnectorAutoSync,
|
|
244
|
+
useConnectorCatalog,
|
|
245
|
+
useConnectorVendorVisibility,
|
|
246
|
+
useDisconnectConnector,
|
|
247
|
+
useDisconnectSlack,
|
|
248
|
+
useDriveFolderChildren,
|
|
249
|
+
useDriveFolderDocCount,
|
|
250
|
+
useDriveFolders,
|
|
251
|
+
useDriveSyncEstimate,
|
|
252
|
+
useDriveSyncProgress,
|
|
253
|
+
useEnableDriveSync,
|
|
254
|
+
useEnableMailboxSync,
|
|
255
|
+
useMailboxFolders,
|
|
256
|
+
useMailboxSyncProgress,
|
|
257
|
+
useMyConnectors,
|
|
258
|
+
useRefreshConnectorsOnRunEnd,
|
|
259
|
+
useSlackConnection,
|
|
260
|
+
useTriggerDriveSync,
|
|
261
|
+
useTriggerMailboxSync
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/connectors/hooks.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Connectors over the SDK (`arbi.connectors`): the catalog and the user's connections, mailbox and\n * drive sync into a workspace, Slack, and the session token bridge. Every key is under\n * `['arbi', 'connectors']`, and every write refreshes all of it (a sync changes the connection\n * rows, the progress and the folders alike).\n */\n\nimport { useEffect, useRef } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { ArbiApiError, isConnectorVendorVisible } from '@arbidocs/sdk/browser'\nimport { logger } from '@arbidocs/client'\nimport { useArbi } from '../useArbi'\nimport { useUserSettings } from '../account/settings'\nimport { useIsEntitled } from '../account/entitlements'\n\nexport { connectorQueryKeys } from '../query-keys'\nimport { connectorQueryKeys, mailQueryKeys } from '../query-keys'\n\n/** A write that refreshes every connector read. */\nfunction useConnectorMutation<TVars, TResult>(mutationFn: (vars: TVars) => Promise<TResult>) {\n const qc = useQueryClient()\n return useMutation({\n mutationFn,\n onSuccess: () => qc.invalidateQueries({ queryKey: connectorQueryKeys.all() }),\n })\n}\n\n// \u2500\u2500 Catalog and connections \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** The connectors this deployment offers. */\nexport function useConnectorCatalog() {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.catalog(),\n queryFn: () => arbi.connectors.catalog(),\n staleTime: 5 * 60_000,\n enabled: arbi.isLoggedIn,\n })\n}\n\n/** The user's connections, with their sync settings. */\nexport function useMyConnectors() {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.mine(),\n queryFn: () => arbi.connectors.mine(),\n staleTime: 30_000,\n enabled: arbi.isLoggedIn,\n })\n}\n\nexport function useDisconnectConnector() {\n const arbi = useArbi()\n return useConnectorMutation(({ vendorKey }: { vendorKey: string }) =>\n arbi.connectors.disconnect(vendorKey)\n )\n}\n\n/** Whether a vendor shows under the user's per-provider switches (`isConnectorVendorVisible`). */\nexport function useConnectorVendorVisibility(): (vendorKey: string) => boolean {\n const { data: settings } = useUserSettings()\n return (vendorKey) => isConnectorVendorVisible(settings, vendorKey)\n}\n\n/**\n * Where a connect's OAuth should land: back on this page, with `stay=1` (do not open the settings\n * on return) and, optionally, `reopen=accounts` (bring the \"Add from accounts\" dialog back).\n */\nexport function connectorReturnTo(reopen?: 'accounts'): string {\n const params = new URLSearchParams(window.location.search)\n params.delete('connected')\n params.delete('connect_error')\n params.set('stay', '1')\n if (reopen) params.set('reopen', reopen)\n else params.delete('reopen')\n return `${window.location.pathname}?${params.toString()}`\n}\n\n// \u2500\u2500 Mailbox sync \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function useMailboxFolders(vendorKey: string, enabled: boolean) {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.mailboxFolders(vendorKey),\n queryFn: () => arbi.connectors.mailboxFolders(vendorKey),\n enabled: enabled && arbi.isLoggedIn,\n staleTime: 60_000,\n })\n}\n\nexport interface EnableMailboxSyncVars {\n vendorKey: string\n workspaceExtId: string\n backfillWindow: number\n /** A fixed start date (ISO); overrides the window. */\n backfillSince?: string | null\n /** Folder or label ids (at least one). */\n folders: string[]\n skipDuplicates: boolean\n /** An AI title instead of \"<sender> - <subject>\". */\n autoRename?: boolean\n /** Shared with the workspace rather than private to the importer. */\n shared?: boolean\n /** Sync at sign-in, not only on \"Sync now\". */\n autoSync: boolean\n}\n\nexport function useEnableMailboxSync() {\n const arbi = useArbi()\n return useConnectorMutation((v: EnableMailboxSyncVars) =>\n arbi.connectors.enableMailboxSync(v.vendorKey, {\n workspace_ext_id: v.workspaceExtId,\n backfill_window: v.backfillWindow,\n backfill_since: v.backfillSince ?? null,\n folders: v.folders,\n skip_duplicates: v.skipDuplicates,\n auto_rename: v.autoRename ?? false,\n shared: v.shared ?? false,\n auto_sync: v.autoSync,\n })\n )\n}\n\n/** Sync now (404: no sync set up, 409: reconnect needed). */\nexport function useTriggerMailboxSync() {\n const arbi = useArbi()\n return useConnectorMutation(\n ({ vendorKey, workspaceExtId }: { vendorKey: string; workspaceExtId?: string | null }) =>\n arbi.connectors.syncMailbox(vendorKey, workspaceExtId)\n )\n}\n\n/** A running sync's progress: polled every 1.5 s while it runs, idle otherwise. */\nexport function useMailboxSyncProgress(\n vendorKey: string,\n workspaceExtId: string,\n enabled: boolean\n) {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.mailboxSyncProgress(vendorKey, workspaceExtId),\n queryFn: () => arbi.connectors.mailboxSyncProgress(vendorKey, workspaceExtId),\n enabled: enabled && !!workspaceExtId && arbi.isLoggedIn,\n refetchInterval: (query) => (query.state.data?.running ? 1500 : false),\n staleTime: 0,\n })\n}\n\nexport function useCancelMailboxSync() {\n const arbi = useArbi()\n return useMutation({\n mutationFn: ({ vendorKey, workspaceExtId }: { vendorKey: string; workspaceExtId: string }) =>\n arbi.connectors.cancelMailboxSync(vendorKey, workspaceExtId),\n })\n}\n\n// \u2500\u2500 Drive sync \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function useDriveFolders(vendorKey: string, enabled: boolean) {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.driveFolders(vendorKey),\n queryFn: () => arbi.connectors.driveFolders(vendorKey),\n enabled: enabled && arbi.isLoggedIn,\n retry: false,\n staleTime: 60_000,\n })\n}\n\n/** One level of the folder tree (`root` or a folder id), fetched as the user drills in. */\nexport function useDriveFolderChildren(vendorKey: string, itemId: string, enabled: boolean) {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.driveFolderChildren(vendorKey, itemId),\n queryFn: () => arbi.connectors.driveFolderChildren(vendorKey, itemId),\n enabled: enabled && arbi.isLoggedIn,\n staleTime: 30_000,\n })\n}\n\n/** The \"(N)\" next to a folder: what selecting it would import. */\nexport function useDriveFolderDocCount(vendorKey: string, itemId: string, enabled: boolean) {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.driveFolderDocCount(vendorKey, itemId),\n queryFn: () => arbi.connectors.driveFolderDocCount(vendorKey, itemId),\n enabled: enabled && arbi.isLoggedIn,\n staleTime: 5 * 60_000,\n })\n}\n\nexport interface EnableDriveSyncVars {\n vendorKey: string\n workspaceExtId: string\n folders: string[]\n skipDuplicates: boolean\n autoRename: boolean\n shared: boolean\n autoSync: boolean\n}\n\n/** Enable drive sync (409: reconnect for the files scope). */\nexport function useEnableDriveSync() {\n const arbi = useArbi()\n return useConnectorMutation((v: EnableDriveSyncVars) =>\n arbi.connectors.enableDriveSync(v.vendorKey, {\n workspace_ext_id: v.workspaceExtId,\n folders: v.folders,\n skip_duplicates: v.skipDuplicates,\n auto_rename: v.autoRename,\n shared: v.shared,\n auto_sync: v.autoSync,\n })\n )\n}\n\n/** Drive Sync now (404: none set up, 409: reconnect, 425: the session token is not bridged yet). */\nexport function useTriggerDriveSync() {\n const arbi = useArbi()\n return useConnectorMutation(({ vendorKey }: { vendorKey: string }) =>\n arbi.connectors.syncDrive(vendorKey)\n )\n}\n\nexport function useDriveSyncEstimate(vendorKey: string, enabled: boolean) {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.driveSyncEstimate(vendorKey),\n queryFn: () => arbi.connectors.driveSyncEstimate(vendorKey),\n enabled: enabled && arbi.isLoggedIn,\n staleTime: 30_000,\n })\n}\n\n/** Polled while a run is active; the poll after it ends carries the run's `summary`. */\nexport function useDriveSyncProgress(vendorKey: string, enabled: boolean) {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.driveSyncProgress(vendorKey),\n queryFn: () => arbi.connectors.driveSyncProgress(vendorKey),\n enabled: enabled && arbi.isLoggedIn,\n refetchInterval: (query) => (query.state.data?.running ? 1500 : false),\n staleTime: 0,\n })\n}\n\nexport function useCancelDriveSync() {\n const arbi = useArbi()\n return useMutation({\n mutationFn: ({ vendorKey }: { vendorKey: string }) =>\n arbi.connectors.cancelDriveSync(vendorKey),\n })\n}\n\n// \u2500\u2500 Slack \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function useSlackConnection() {\n const arbi = useArbi()\n return useQuery({\n queryKey: connectorQueryKeys.slack(),\n queryFn: () => arbi.connectors.slack.status(),\n enabled: arbi.isLoggedIn,\n // Fresh on every visit: the OAuth return lands here before the status changed server-side.\n staleTime: 0,\n refetchOnMount: 'always',\n refetchOnWindowFocus: true,\n })\n}\n\nexport function useDisconnectSlack() {\n const arbi = useArbi()\n return useConnectorMutation<void, void>(() => arbi.connectors.slack.disconnect())\n}\n\n// \u2500\u2500 Session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Refresh the connections when a sync run ends (their \"last synced\" and counts change). */\nexport function useRefreshConnectorsOnRunEnd(running: boolean) {\n const qc = useQueryClient()\n const wasRunning = useRef(running)\n useEffect(() => {\n if (wasRunning.current && !running) {\n void qc.invalidateQueries({ queryKey: connectorQueryKeys.mine() })\n }\n wasRunning.current = running\n }, [running, qc])\n}\n\n/** The least time between two re-checks on tab focus (the server keeps its own floor). */\nconst FOCUS_RECHECK_MS = 60_000\n\n/** Run `check` now, and again when the tab comes back (at most once a minute); returns the cleanup. */\nfunction checkNowAndOnFocus(check: () => void): () => void {\n let lastCheck = Date.now()\n check()\n const onVisible = () => {\n if (document.visibilityState !== 'visible') return\n if (Date.now() - lastCheck < FOCUS_RECHECK_MS) return\n lastCheck = Date.now()\n check()\n }\n document.addEventListener('visibilitychange', onVisible)\n return () => document.removeEventListener('visibilitychange', onVisible)\n}\n\n/**\n * Start the due auto-syncs into the open workspace, and file the ARBI mail waiting for it. The\n * server starts connector syncs from the token bridge, and only for a workspace whose key is on the\n * session, so this bridges once the workspace is open\n * and again when the tab comes back (at most once a minute), then refreshes the connections and\n * progress so the import panels pick a new run up.\n */\nexport function useConnectorAutoSync(workspaceExtId: string | null | undefined, opened: boolean) {\n const arbi = useArbi()\n const qc = useQueryClient()\n // Only people with mail have an ARBI mailbox to file from (no refused calls for the others).\n const hasMail = useIsEntitled('mail')\n useEffect(() => {\n if (!opened || !workspaceExtId || !arbi.isLoggedIn) return\n return checkNowAndOnFocus(() => {\n void arbi.connectors.bridgeTokens({ autoSyncWorkspaceExtId: workspaceExtId }).then(() => {\n void qc.invalidateQueries({ queryKey: connectorQueryKeys.mine() })\n void qc.invalidateQueries({ queryKey: connectorQueryKeys.allMailboxSyncProgress() })\n void qc.invalidateQueries({ queryKey: connectorQueryKeys.allDriveSyncProgress() })\n })\n })\n }, [opened, workspaceExtId, arbi, qc])\n useEffect(() => {\n if (!opened || !workspaceExtId || !arbi.isLoggedIn || !hasMail) return\n // The ARBI mailbox files into a workspace the same way: what arrived while the user was away is\n // filed now, with this session (nothing waits for most people: one small read).\n return checkNowAndOnFocus(() => {\n void arbi.mail\n .fileWaiting(workspaceExtId)\n .then(({ filed }) => {\n if (filed) void qc.invalidateQueries({ queryKey: mailQueryKeys.allFiling() })\n })\n .catch((error: unknown) => logger.warn('[mail] could not file waiting mail', error))\n })\n }, [opened, workspaceExtId, arbi, qc, hasMail])\n}\n\n/** The HTTP status of a failed connector call (403, 404, 409, 425\u2026), to say what went wrong. */\nexport function connectorErrorStatus(err: unknown): number | undefined {\n return err instanceof ArbiApiError ? err.status : undefined\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["connectorQueryKeys"]
|
|
7
|
+
}
|