@arbidocs/react 0.5.111 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
- package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +80 -80
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +80 -80
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +282 -282
- package/dist/index.js +702 -17116
- package/dist/index.js.map +7 -1
- package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +154 -154
- package/dist/ui/index.js +290 -10
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.js +61 -271
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/chunk-ZM6N7YZH.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/query-keys.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The one query-key factory of the ARBI front end: every React Query key and mutation key the\n * packages and the app use is built here, under `['arbi', \u2026]`. Literal key arrays anywhere else\n * fail the `arbi/query-keys-from-factory` lint rule and `query-keys.guard.test.ts`, so a key can't\n * drift from the queries it names (a stale literal reads or invalidates nothing, silently).\n *\n * Dependency-free on purpose (types only): e2e helpers import it and pass keys into the page.\n */\n\nimport type {\n CalendarWindow,\n ListEventsParams,\n OverlayLayerName,\n RoomQuery,\n} from '@arbidocs/sdk/browser'\n\nexport const arbiQueryKeys = {\n fileShares: () => ['arbi', 'fileShares'] as const,\n fileShare: (id: string) => ['arbi', 'fileShare', id] as const,\n fileSharePdf: (id: string, status?: string) => ['arbi', 'fileSharePdf', id, status] as const,\n workspaces: () => ['arbi', 'workspaces'] as const,\n /** Every workspace's member list: what a workspace switch drops. */\n allWorkspaceUsers: () => ['arbi', 'workspaceUsers'] as const,\n workspaceUsers: (workspaceId: string) => ['arbi', 'workspaceUsers', workspaceId] as const,\n /** Every workspace's documents list: the prefix a write patches when it does not know the workspace. */\n allDocuments: () => ['arbi', 'documents'] as const,\n documents: (workspaceId: string) => ['arbi', 'documents', workspaceId] as const,\n /** One document (a viewer's); writes keep it current next to the list. */\n document: (docId: string) => ['arbi', 'document', docId] as const,\n documentsById: (docIds: string[]) =>\n ['arbi', 'documentsById', [...docIds].sort().join(',')] as const,\n /** Every workspace's near-duplicate pairs. */\n allSimilarDocuments: () => ['arbi', 'similarDocuments'] as const,\n similarDocuments: (workspaceId: string, threshold: number) =>\n ['arbi', 'similarDocuments', workspaceId, threshold] as const,\n /** Every version list: the prefix a new version invalidates. */\n allDocumentVersions: () => ['arbi', 'documentVersions'] as const,\n documentVersions: (docId: string) => ['arbi', 'documentVersions', docId] as const,\n conversations: (workspaceId: string) => ['arbi', 'conversations', workspaceId] as const,\n /** Every workspace's conversation list (and threads): the prefix a conversation write invalidates. */\n allConversations: () => ['arbi', 'conversations'] as const,\n /** A conversation's threads, under the conversations prefix (ids are unique across workspaces). */\n conversationThreads: (conversationId: string) =>\n ['arbi', 'conversations', conversationId, 'threads'] as const,\n /** One stored message with everything the server keeps on it (its trace and metadata). */\n messageDetails: (messageId: string) => ['arbi', 'messageDetails', messageId] as const,\n /** The backend's built-in slash commands. */\n assistantCommands: () => ['arbi', 'assistantCommands'] as const,\n /** Every workspace's tags (lists, tables and kinds): what a cross-workspace change refreshes. */\n allTags: () => ['arbi', 'tags'] as const,\n tags: (workspaceId: string) => ['arbi', 'tags', workspaceId] as const,\n /** Under the workspace's tags: the kinds' fields (refreshed with the tags). */\n tagKinds: (workspaceId: string) => ['arbi', 'tags', workspaceId, 'kinds'] as const,\n /** Every filtered list (a table of tags): what a tag write refreshes, the whole list aside. */\n tagLists: (workspaceId: string) => ['arbi', 'tags', workspaceId, 'list'] as const,\n /** Under the workspace's tags: a tag, doctag or fact write that invalidates `tags` refreshes it. */\n tagList: (workspaceId: string, query: string) =>\n ['arbi', 'tags', workspaceId, 'list', query] as const,\n /** A kind's fields, under the workspace's tags. */\n tagKind: (workspaceId: string, kind: string) =>\n ['arbi', 'tags', workspaceId, 'kind', kind] as const,\n /** A task's history, under the conversations prefix: every conversation write refreshes it. */\n conversationActivity: (conversationId: string) =>\n ['arbi', 'conversations', conversationId, 'activity'] as const,\n thumbnails: (docIds: string[]) => ['arbi', 'thumbnails', [...docIds].sort().join(',')] as const,\n /** Every stage of a document's parsed content. */\n parsedDocument: (docId: string) => ['arbi', 'parsedDoc', docId] as const,\n parsedDoc: (docId: string, stage: string) => ['arbi', 'parsedDoc', docId, stage] as const,\n agents: () => ['arbi', 'agents'] as const,\n sessions: () => ['arbi', 'sessions'] as const,\n health: () => ['arbi', 'health'] as const,\n workflows: () => ['arbi', 'workflows'] as const,\n /** Under `workflows()`: a workflow write or run refreshes its runs too. */\n workflowRuns: (workflowId: string) => ['arbi', 'workflows', workflowId, 'runs'] as const,\n /** Every workspace's facts: the prefix a fact write invalidates. */\n allFacts: () => ['arbi', 'facts'] as const,\n facts: (workspaceId: string) => ['arbi', 'facts', workspaceId] as const,\n configs: () => ['arbi', 'configs'] as const,\n activity: () => ['arbi', 'activity'] as const,\n /** Every transfer query (jobs, lists, plans): what a finished job refreshes. */\n allWorkspaceTransfers: () => ['arbi', 'workspaceTransfers'] as const,\n /** The caller's recent transfer jobs out of a workspace. */\n workspaceTransfers: (workspaceId: string) =>\n ['arbi', 'workspaceTransfers', 'list', workspaceId] as const,\n /** One transfer job's progress. */\n workspaceTransfer: (transferId: string) =>\n ['arbi', 'workspaceTransfers', 'job', transferId] as const,\n /** What a scope (serialised) would take in a workspace, for a mode. */\n workspaceTransferPlan: (workspaceId: string, scope: string, mode: string) =>\n ['arbi', 'workspaceTransfers', 'plan', workspaceId, scope, mode] as const,\n /**\n * A workspace's activity feed (all its pages), read `limit` entries a page (absent: the server's\n * default): each page size is its own entry, under the workspace's key.\n */\n workspaceActivity: (workspaceId: string, limit?: number) =>\n limit === undefined\n ? (['arbi', 'workspaceActivity', workspaceId] as const)\n : (['arbi', 'workspaceActivity', workspaceId, limit] as const),\n projects: () => ['arbi', 'projects'] as const,\n projectUsage: (projectExtId: string, monthsBack: number) =>\n ['arbi', 'projectUsage', projectExtId, monthsBack] as const,\n projectConversationUsage: (projectExtId: string, monthsBack: number) =>\n ['arbi', 'projectUsage', projectExtId, 'byConversation', monthsBack] as const,\n projectInvoices: (projectExtId: string) => ['arbi', 'projectInvoices', projectExtId] as const,\n /** The plans and add-ons on sale. */\n products: () => ['arbi', 'products'] as const,\n /** Prices of a purchase or a change (quotes, previews); nothing is bought. */\n billingQuotes: () => ['arbi', 'billingQuote'] as const,\n userUsageToday: () => ['arbi', 'userUsageToday'] as const,\n currentUser: () => ['arbi', 'currentUser'] as const,\n firmPool: () => ['arbi', 'firmPool'] as const,\n contacts: () => ['arbi', 'contacts'] as const,\n /** Every chat query (the list and each open thread). */\n chats: () => ['arbi', 'chats'] as const,\n /** My chats, raw (titles and last messages are ciphertext), most recently active first. */\n chatList: () => ['arbi', 'chats', 'list'] as const,\n /** One thread's loaded messages, decrypted, oldest first (`ChatThreadData`). */\n chatThread: (chatExtId: string) => ['arbi', 'chats', 'thread', chatExtId] as const,\n /** My own agent's progress on my last message to it (`agent_dm_status`), per agent. */\n agentDmStatus: (agentExtId: string) => ['arbi', 'chats', 'agentStatus', agentExtId] as const,\n /** The paid features this person may use (`/v1/user/entitlements`). */\n entitlements: () => ['arbi', 'entitlements'] as const,\n skills: () => ['arbi', 'skills'] as const,\n /** A skill's main file (SKILL.md), as text. */\n skillSource: (docExtId: string) => ['arbi', 'skills', 'source', docExtId] as const,\n /** An agent's pinned config; `undefined` = the library default config. */\n agentConfig: (agentExtId?: string) => ['arbi', 'agentConfig', agentExtId ?? 'default'] as const,\n agentWorkspaces: (agentExtId: string) => ['arbi', 'agentWorkspaces', agentExtId] as const,\n /** An agent's own login, polled while its controls are open. */\n agentSession: (agentExtId: string) => ['arbi', 'agentSession', agentExtId] as const,\n agentChats: (agentExtId: string) => ['arbi', 'agentChats', agentExtId] as const,\n authorizeLimits: () => ['arbi', 'authorizeLimits'] as const,\n mcpTools: () => ['arbi', 'mcpTools'] as const,\n models: () => ['arbi', 'models'] as const,\n availableModels: () => ['arbi', 'availableModels'] as const,\n modelConnections: (userId?: string) => ['arbi', 'modelConnections', userId] as const,\n directModelUsage: (userId?: string) => ['arbi', 'directModelUsage', userId] as const,\n /** The signed-in user's own profile (name, picture, email). */\n profile: () => ['arbi', 'profile'] as const,\n identity: () => ['arbi', 'identity'] as const,\n /** The signed-in user's settings record (notification preferences, flags). */\n userSettings: () => ['arbi', 'userSettings'] as const,\n /** Every notification list: the prefix a delete, a read receipt or an arrival invalidates. */\n allSupportTickets: () => ['arbi', 'support'] as const,\n supportTickets: () => ['arbi', 'support', 'tickets'] as const,\n supportTicket: (id: number) => ['arbi', 'support', 'tickets', id] as const,\n allNotifications: () => ['arbi', 'notifications'] as const,\n /** The newest `limit` notifications, received and sent. */\n notifications: (limit: number) => ['arbi', 'notifications', limit] as const,\n /** The documents a workspace may use as its Word house template. */\n houseTemplateCandidates: (workspaceId: string) =>\n ['arbi', 'houseTemplateCandidates', workspaceId] as const,\n // \u2500\u2500 Storage, archive \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\u2500\u2500\u2500\u2500\u2500\n /** Every storage view (projects, items, names, Recently deleted): what a restore or delete refreshes. */\n storage: () => ['arbi', 'storage'] as const,\n /** What each project stores; no params: every such list. */\n storageProjects: (params?: object) =>\n params === undefined\n ? (['arbi', 'storage', 'projects'] as const)\n : (['arbi', 'storage', 'projects', params] as const),\n /** The largest items stored; no params: every such list. */\n storageItems: (params?: object) =>\n params === undefined\n ? (['arbi', 'storage', 'items'] as const)\n : (['arbi', 'storage', 'items', params] as const),\n /** Decrypted document names of storage items. */\n storageItemNames: (params?: object) =>\n params === undefined\n ? (['arbi', 'storage', 'names'] as const)\n : (['arbi', 'storage', 'names', params] as const),\n /** The deployment's storage day by day. */\n storageSnapshots: (params?: object) =>\n params === undefined\n ? (['arbi', 'storage', 'snapshots'] as const)\n : (['arbi', 'storage', 'snapshots', params] as const),\n /** A workspace's Recently deleted documents; no id: every workspace's. */\n workspaceTrash: (workspaceId?: string) =>\n workspaceId === undefined\n ? (['arbi', 'storage', 'workspaceTrash'] as const)\n : (['arbi', 'storage', 'workspaceTrash', workspaceId] as const),\n /** A workspace's archive state; no id: every workspace's. */\n workspaceArchive: (workspaceId?: string) =>\n workspaceId === undefined\n ? (['arbi', 'workspaceArchive'] as const)\n : (['arbi', 'workspaceArchive', workspaceId] as const),\n // \u2500\u2500 Databases \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Every key below names its workspace right after its kind: a list read in one workspace is never\n // served, or overwritten, in another (the list is the session's open workspace on the server).\n /** Every database query of every workspace (what a write or a switch refreshes). */\n databases: () => ['arbi', 'databases'] as const,\n /** A workspace's databases; no id: every workspace's. */\n databaseList: (workspaceId?: string) =>\n workspaceId === undefined\n ? (['arbi', 'databases', 'list'] as const)\n : (['arbi', 'databases', 'list', workspaceId] as const),\n /** One database of a workspace; no workspace: every one read. */\n database: (workspaceId?: string, databaseId?: string) =>\n workspaceId === undefined\n ? (['arbi', 'databases', 'one'] as const)\n : (['arbi', 'databases', 'one', workspaceId, databaseId ?? ''] as const),\n /**\n * A database's rows (a search); no workspace: every database's, no params: every search of one.\n * `['arbi', 'databases', 'rows', workspaceId, databaseId, params]`.\n */\n databaseRows: (workspaceId?: string, databaseId?: string, params?: object) =>\n workspaceId === undefined\n ? (['arbi', 'databases', 'rows'] as const)\n : params === undefined\n ? (['arbi', 'databases', 'rows', workspaceId, databaseId ?? ''] as const)\n : (['arbi', 'databases', 'rows', workspaceId, databaseId ?? '', params] as const),\n /** The saved dashboards of a store's scope (the user's own, or a workspace's database). */\n dashboards: (scope: string) => ['arbi', 'dashboards', scope] as const,\n /** A database's rows grouped and measured (a chart); no workspace: every database's. */\n databaseAggregate: (workspaceId?: string, databaseId?: string, request?: object) =>\n workspaceId === undefined\n ? (['arbi', 'databases', 'aggregate'] as const)\n : (['arbi', 'databases', 'aggregate', workspaceId, databaseId ?? '', request ?? {}] as const),\n // \u2500\u2500 Configs, health \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\u2500\u2500\u2500\u2500\u2500\u2500\n /** Under `configs()`: the saved configuration versions. */\n configVersions: () => ['arbi', 'configs', 'versions'] as const,\n /** Under `configs()`: the JSON schema of every config model. */\n configSchema: () => ['arbi', 'configs', 'schema'] as const,\n /** Under `configs()`: one configuration. */\n config: (configId: string) => ['arbi', 'configs', 'one', configId] as const,\n /** The remote model providers' health. */\n remoteModels: () => ['arbi', 'remoteModels'] as const,\n // \u2500\u2500 Conversations \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Under the conversations prefix: what a parked run waits for the owner to allow. */\n conversationPendingAuth: (conversationId: string) =>\n ['arbi', 'conversations', conversationId, 'pending-auth'] as const,\n // \u2500\u2500 Document tools \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** Signatures on a document (a version); no id: every document's. */\n documentSignatures: (docId?: string, version?: number | null) =>\n docId === undefined\n ? (['arbi', 'documentSignatures'] as const)\n : (['arbi', 'documentSignatures', docId, version ?? null] as const),\n /** The certificate of a signature reference. */\n signatureVerification: (reference: string) =>\n ['arbi', 'signatureVerification', reference] as const,\n /** Every signature request list: what a request write refreshes. */\n signatureRequests: () => ['arbi', 'signatureRequests'] as const,\n signatureRequestsForDocument: (docId: string) =>\n ['arbi', 'signatureRequests', 'document', docId] as const,\n /** Who may sign in a workspace; no id: every workspace's. */\n signatureCandidates: (workspaceId?: string) =>\n workspaceId === undefined\n ? (['arbi', 'signatureRequests', 'candidates'] as const)\n : (['arbi', 'signatureRequests', 'candidates', workspaceId] as const),\n /** The user's saved (informal) signature. */\n savedSignature: () => ['arbi', 'savedSignature'] as const,\n /** An html/react artifact's source. */\n artifactSource: (docId: string) => ['arbi', 'artifactSource', docId] as const,\n /** An artifact's text, under its parsed content (refreshed with it). */\n artifactText: (docId: string) => ['arbi', 'parsedDoc', docId, 'marker', 'artifact-text'] as const,\n /** An image document's bytes as an object URL. */\n assetImage: (docId: string) => ['arbi', 'assetImage', docId] as const,\n // \u2500\u2500 Misc \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** An agent config's model tier (the builder's badge). */\n agentConfigModel: (configId: string) => ['arbi', 'agentConfigModel', configId] as const,\n /** Under `billingQuotes()`: the price of a plan change. */\n billingPreview: (projectExtId: string, change: unknown) =>\n ['arbi', 'billingQuote', 'preview', projectExtId, change] as const,\n billingPlanQuote: (projectExtId: string | null, body: unknown) =>\n ['arbi', 'billingQuote', 'plan', projectExtId, body] as const,\n billingAddonQuote: (projectExtId: string, kind: string) =>\n ['arbi', 'billingQuote', 'addon', projectExtId, kind] as const,\n /** Under `contacts()`: a search of the people one can reach. */\n contactSearch: (term: string) => ['arbi', 'contacts', 'search', term] as const,\n /** Under the workspace's facts: a filtered list. */\n factList: (workspaceId: string, filter: unknown) =>\n ['arbi', 'facts', workspaceId, filter] as const,\n /**\n * Under `skills()`: a workspace's list, hidden ones included or not. Without a marketplace the\n * server lists the open workspace's skills, so the list is kept per workspace.\n */\n skillList: (workspaceId: string, includeHidden: boolean) =>\n ['arbi', 'skills', 'list', workspaceId, includeHidden] as const,\n /** Under the project's events: one kind, one page size. */\n projectEventList: (projectExtId: string, kind: string, limit: number | 'default') =>\n ['arbi', 'projects', projectExtId, 'events', kind, limit] as const,\n /** The documents pinned for offline reading on this device. */\n offlineDocuments: () => ['arbi', 'offlineDocuments'] as const,\n /** Notifications of one kind for a deployment's user (polled). */\n typedNotifications: (kind: string, apiUrl: string, userId: string | undefined) =>\n ['arbi', 'typedNotifications', kind, apiUrl, userId ?? ''] as const,\n}\n\n/**\n * Keys of the mutations a host may need to follow (its own caches outside these hooks), e.g. with\n * a `MutationCache` subscription: a workflow run creates a task in the host's own task list.\n */\nexport const arbiMutationKeys = {\n /** A member's role changed. */\n setWorkspaceMemberRoles: () => ['arbi', 'workspaces', 'roles'] as const,\n runWorkflow: () => ['arbi', 'workflows', 'run'] as const,\n updateTagKindSchema: () => ['arbi', 'tags', 'kinds', 'update'] as const,\n createTag: () => ['arbi', 'tags', 'create'] as const,\n updateTag: () => ['arbi', 'tags', 'update'] as const,\n deleteTag: () => ['arbi', 'tags', 'delete'] as const,\n extractEntities: () => ['arbi', 'tags', 'entities', 'extract'] as const,\n updateDocuments: () => ['arbi', 'documents', 'update'] as const,\n deleteDocuments: () => ['arbi', 'documents', 'delete'] as const,\n uploadDocuments: () => ['arbi', 'documents', 'upload'] as const,\n uploadUrls: () => ['arbi', 'documents', 'uploadUrls'] as const,\n assignDocTags: () => ['arbi', 'doctags', 'assign'] as const,\n removeDocTags: () => ['arbi', 'doctags', 'remove'] as const,\n updateDocTag: () => ['arbi', 'doctags', 'update'] as const,\n generateDocTags: () => ['arbi', 'doctags', 'generate'] as const,\n /** Members added to or removed from a workspace (leaving included). */\n workspaceMembership: () => ['arbi', 'workspaces', 'members'] as const,\n /** A chat turn being sent (the app's send pipeline). */\n sendMessage: () => ['arbi', 'conversations', 'send'] as const,\n}\n\n/**\n * Query keys of the calendar hooks, all under `['arbi', 'calendar']`. The calendar is the user's,\n * not a workspace's; only the overlays carry the open workspace.\n */\nexport const calendarQueryKeys = {\n all: () => ['arbi', 'calendar'] as const,\n settings: () => ['arbi', 'calendar', 'settings'] as const,\n calendars: () => ['arbi', 'calendar', 'calendars'] as const,\n /** Every event list: the prefix an event write invalidates. */\n events: () => ['arbi', 'calendar', 'events'] as const,\n eventList: (p: ListEventsParams) =>\n [\n 'arbi',\n 'calendar',\n 'events',\n { start: p.start, end: p.end, calendars: p.calendars?.join(',') ?? null },\n ] as const,\n /** Every single event read. */\n eventDetails: () => ['arbi', 'calendar', 'event'] as const,\n event: (id: string, recurrenceId?: string | null) =>\n ['arbi', 'calendar', 'event', id, recurrenceId ?? null] as const,\n shares: (calId: string) => ['arbi', 'calendar', 'shares', calId] as const,\n invitations: () => ['arbi', 'calendar', 'invitations'] as const,\n holidayCountries: () => ['arbi', 'calendar', 'holiday-countries'] as const,\n allRooms: () => ['arbi', 'calendar', 'rooms'] as const,\n rooms: (q: RoomQuery) => ['arbi', 'calendar', 'rooms', q] as const,\n freebusy: (attendees: string[], start: string, end: string) =>\n ['arbi', 'calendar', 'freebusy', attendees.join(','), start, end] as const,\n allLookups: () => ['arbi', 'calendar', 'lookup'] as const,\n lookup: (uid: string) => ['arbi', 'calendar', 'lookup', uid] as const,\n overlays: (workspaceId: string | null, w?: CalendarWindow, layers?: OverlayLayerName[]) =>\n [\n 'arbi',\n 'calendar',\n 'overlays',\n workspaceId,\n w ? { start: w.start, end: w.end, layers: layers?.join(',') } : null,\n ] as const,\n accounts: () => ['arbi', 'calendar', 'accounts'] as const,\n caldavProfiles: () => ['arbi', 'calendar', 'caldav-profiles'] as const,\n bookingPages: () => ['arbi', 'calendar', 'booking-pages'] as const,\n /** The offline outbox (writes made offline, not yet sent). */\n outbox: () => ['arbi', 'calendar', 'outbox'] as const,\n}\n\n/** Query keys of the call hooks, all under `['arbi', 'calls']`. Calls are the user's, not a workspace's. */\nexport const callQueryKeys = {\n all: () => ['arbi', 'calls'] as const,\n config: () => ['arbi', 'calls', 'config'] as const,\n call: (callExtId: string) => ['arbi', 'calls', 'call', callExtId] as const,\n /** Everything about a call's recordings: the prefix a recording event invalidates. */\n recordingsOf: (callExtId: string) => ['arbi', 'calls', 'recordings', callExtId] as const,\n recordings: (callExtId: string) => ['arbi', 'calls', 'recordings', callExtId, 'list'] as const,\n recording: (callExtId: string, recordingExtId: string) =>\n ['arbi', 'calls', 'recordings', callExtId, 'one', recordingExtId] as const,\n inviteLinks: (callExtId: string) => ['arbi', 'calls', 'invite-links', callExtId] as const,\n}\n\nexport const connectorQueryKeys = {\n all: () => ['arbi', 'connectors'] as const,\n catalog: () => ['arbi', 'connectors', 'catalog'] as const,\n mine: () => ['arbi', 'connectors', 'mine'] as const,\n mailboxFolders: (vendor: string) => ['arbi', 'connectors', 'folders', vendor] as const,\n mailboxSyncProgress: (vendor: string, workspaceExtId: string) =>\n ['arbi', 'connectors', 'sync-progress', vendor, workspaceExtId] as const,\n allMailboxSyncProgress: () => ['arbi', 'connectors', 'sync-progress'] as const,\n driveFolders: (vendor: string) => ['arbi', 'connectors', 'drive-folders', vendor] as const,\n driveFolderChildren: (vendor: string, itemId: string) =>\n ['arbi', 'connectors', 'drive-folder-children', vendor, itemId] as const,\n driveFolderDocCount: (vendor: string, itemId: string) =>\n ['arbi', 'connectors', 'drive-folder-doc-count', vendor, itemId] as const,\n driveSyncEstimate: (vendor: string) =>\n ['arbi', 'connectors', 'drive-sync-estimate', vendor] as const,\n driveSyncProgress: (vendor: string) =>\n ['arbi', 'connectors', 'drive-sync-progress', vendor] as const,\n allDriveSyncProgress: () => ['arbi', 'connectors', 'drive-sync-progress'] as const,\n slack: () => ['arbi', 'connectors', 'slack'] as const,\n}\n\nexport const mailQueryKeys = {\n all: () => ['arbi', 'mail'] as const,\n policy: () => ['arbi', 'mail', 'policy'] as const,\n accounts: () => ['arbi', 'mail', 'accounts'] as const,\n unlock: (accountId: string | undefined, sessionKey: string | null) =>\n ['arbi', 'mail', 'unlock', accountId, sessionKey ?? ''] as const,\n allFolders: () => ['arbi', 'mail', 'folders'] as const,\n folders: (accountId: string | undefined) => ['arbi', 'mail', 'folders', accountId] as const,\n allMessages: () => ['arbi', 'mail', 'messages'] as const,\n messages: (\n accountId: string | undefined,\n folderId: string | undefined,\n query: string,\n cursor: string | null\n ) => ['arbi', 'mail', 'messages', accountId, folderId, query, cursor] as const,\n message: (accountId: string | undefined, messageId: string | null | undefined) =>\n ['arbi', 'mail', 'message', accountId, messageId] as const,\n /** Every conversation list: the prefix a flag or move patches or refreshes. */\n allConversations: () => ['arbi', 'mail', 'conversations'] as const,\n conversations: (\n accountId: string | undefined,\n folderId: string | undefined,\n query: string,\n cursor: string | null\n ) => ['arbi', 'mail', 'conversations', accountId, folderId, query, cursor] as const,\n /** Every thread read of an account. */\n accountThreads: (accountId: string) => ['arbi', 'mail', 'thread', accountId] as const,\n thread: (\n accountId: string | undefined,\n threadId: string | null | undefined,\n folderId: string | undefined\n ) => ['arbi', 'mail', 'thread', accountId, threadId, folderId] as const,\n /** Where the ARBI mailbox files mail (folders and conversations, per workspace). */\n nativeFiling: () => ['arbi', 'mail', 'filing', 'native'] as const,\n /** Every filing lookup: refreshed after mail is added to a workspace or a rule is stopped. */\n allFiling: () => ['arbi', 'mail', 'filing'] as const,\n filing: (accountId: string | undefined, messageIds: string[], threadIds: string[]) =>\n ['arbi', 'mail', 'filing', accountId, messageIds.join(' '), threadIds.join(' ')] as const,\n /** The key the user's client keys older native mail with: outside the `['arbi', 'mail']` prefix, so\n * refreshing mail never fetches it again. */\n threadSecret: () => ['arbi', 'mail-thread-secret'] as const,\n /** The projects an email's AI work can be billed to. */\n projects: () => ['arbi', 'mail', 'projects'] as const,\n /** A saved draft prepared for editing. */\n draftCompose: (accountId: string | undefined, draftId: string | undefined) =>\n ['arbi', 'mail', 'draft-compose', accountId, draftId] as const,\n attachmentText: (accountId: string, messageId: string, attachmentId: string) =>\n ['arbi', 'mail', 'attachment-text', accountId, messageId, attachmentId] as const,\n}\n\n/** `pdf`: the document as a PDF; `original`: the stored file (an image, a recording, a sheet). */\nexport type DocumentBytesKind = 'pdf' | 'original'\n\n/** Every version and kind of a document's bytes: the prefix a new version invalidates. */\nexport const documentBytesKey = (\n documentRef: string,\n version?: number | null,\n kind?: DocumentBytesKind\n) =>\n version === undefined\n ? (['arbi', 'documentBytes', documentRef] as const)\n : (['arbi', 'documentBytes', documentRef, version, kind ?? 'pdf'] as const)\n\n/** Whether `queryKey` lies under `prefix` (a factory key): React Query's own prefix match. */\nexport function isUnderQueryKey(queryKey: readonly unknown[], prefix: readonly unknown[]): boolean {\n return prefix.every((part, i) => queryKey[i] === part)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { get, set, del } from "idb-keyval";
|
|
2
|
+
import {
|
|
3
|
+
isOfflineReadableArbiQuery,
|
|
4
|
+
isReplayableArbiMutation,
|
|
5
|
+
isRestorableArbiQueryOnline
|
|
6
|
+
} from "./offline.js";
|
|
7
|
+
const IDB_KEY = "arbi-react-query-cache";
|
|
8
|
+
const OWNER_KEY = "arbi-react-query-cache-owner";
|
|
9
|
+
const CACHE_BUSTER = "arbi-rq-v2";
|
|
10
|
+
const MAX_AGE = 1e3 * 60 * 60 * 24 * 7;
|
|
11
|
+
function createIDBPersister() {
|
|
12
|
+
return {
|
|
13
|
+
persistClient: (client) => set(IDB_KEY, client),
|
|
14
|
+
// The offline persister must be INERT when online. Because the documents
|
|
15
|
+
// list never auto-refetches, a rehydrated copy would be trusted
|
|
16
|
+
// indefinitely and surface stale statuses across a reload — e.g. a document
|
|
17
|
+
// that finished processing while the tab was closed (its one-shot
|
|
18
|
+
// completion WS event is long gone) still renders as "queued". So when
|
|
19
|
+
// online we strip that query from the restored cache; it then loads
|
|
20
|
+
// fresh from the server exactly as it did before offline support existed.
|
|
21
|
+
// A document caught mid-processing is stripped for the same reason, and the
|
|
22
|
+
// entitlements are read fresh (isRestorableArbiQueryOnline).
|
|
23
|
+
// Queued offline mutations and all other queries restore normally. When
|
|
24
|
+
// offline we keep everything so the pages still have something to show.
|
|
25
|
+
restoreClient: async () => {
|
|
26
|
+
const persisted = await get(IDB_KEY);
|
|
27
|
+
if (!persisted) return persisted;
|
|
28
|
+
const isOffline = typeof navigator !== "undefined" && navigator.onLine === false;
|
|
29
|
+
if (isOffline) return persisted;
|
|
30
|
+
persisted.clientState.queries = persisted.clientState.queries.filter(
|
|
31
|
+
(q) => isRestorableArbiQueryOnline(q.queryKey, q.state.data)
|
|
32
|
+
);
|
|
33
|
+
return persisted;
|
|
34
|
+
},
|
|
35
|
+
removeClient: () => del(IDB_KEY)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function claimOfflineQueue(userExtId) {
|
|
39
|
+
const owner = await get(OWNER_KEY);
|
|
40
|
+
if (owner !== userExtId) await del(IDB_KEY);
|
|
41
|
+
await set(OWNER_KEY, userExtId);
|
|
42
|
+
}
|
|
43
|
+
function createArbiQueryPersistOptions() {
|
|
44
|
+
return {
|
|
45
|
+
persister: createIDBPersister(),
|
|
46
|
+
maxAge: MAX_AGE,
|
|
47
|
+
buster: CACHE_BUSTER,
|
|
48
|
+
dehydrateOptions: {
|
|
49
|
+
// Persist mutations that were paused offline so a queued write (apply tag,
|
|
50
|
+
// edit field) survives a reload and replays on reconnect. Resuming them
|
|
51
|
+
// after a reload requires the registered mutation defaults
|
|
52
|
+
// (registerArbiMutationDefaults). Scope to real offline EDITS: an incidental
|
|
53
|
+
// paused mutation (e.g. workspace-open) isn't a user change to queue/replay.
|
|
54
|
+
shouldDehydrateMutation: (mutation) => mutation.state.isPaused && isReplayableArbiMutation(mutation.options.mutationKey),
|
|
55
|
+
shouldDehydrateQuery: (query) => {
|
|
56
|
+
if (query.state.status !== "success") return false;
|
|
57
|
+
return isOfflineReadableArbiQuery(query.queryKey);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
claimOfflineQueue,
|
|
64
|
+
createArbiQueryPersistOptions
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=query-persist.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/query-persist.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The query cache kept for an offline start (`createArbiQueryClient({ persist: true })`).\n *\n * Persists a *metadata-only* slice of the query cache to IndexedDB so an already signed-in user\n * can cold-start offline and still see their workspaces and documents list (and open a pinned\n * document). Deliberately conservative about what is written to disk: only the families\n * {@link isOfflineReadableArbiQuery} names; NEVER conversations, messages or document bytes (the\n * pinned bytes live separately, encrypted: `offline-documents.ts`).\n *\n * An async IndexedDB persister (idb-keyval, structured clone) rather than the JSON sync persister:\n * the robust choice for binary-capable storage.\n */\n\nimport { get, set, del } from 'idb-keyval'\nimport type {\n PersistedClient,\n Persister,\n PersistQueryClientOptions,\n} from '@tanstack/react-query-persist-client'\nimport {\n isOfflineReadableArbiQuery,\n isReplayableArbiMutation,\n isRestorableArbiQueryOnline,\n} from './offline'\n\nconst IDB_KEY = 'arbi-react-query-cache'\n\n// Which account the persisted offline queue belongs to. The queue is one record\n// per browser, so it is only valid for the account that wrote it.\nconst OWNER_KEY = 'arbi-react-query-cache-owner'\n\n// Bump to invalidate everyone's persisted cache after an incompatible change.\n// v2: documents and their writes moved to the `@arbidocs/react` keys.\nconst CACHE_BUSTER = 'arbi-rq-v2'\n\nconst MAX_AGE = 1000 * 60 * 60 * 24 * 7 // 7 days\n\n/** What `<PersistQueryClientProvider persistOptions>` takes for the package's offline cache. */\nexport type ArbiQueryPersistOptions = Omit<PersistQueryClientOptions, 'queryClient'>\n\nfunction createIDBPersister(): Persister {\n return {\n persistClient: (client: PersistedClient) => set(IDB_KEY, client),\n // The offline persister must be INERT when online. Because the documents\n // list never auto-refetches, a rehydrated copy would be trusted\n // indefinitely and surface stale statuses across a reload \u2014 e.g. a document\n // that finished processing while the tab was closed (its one-shot\n // completion WS event is long gone) still renders as \"queued\". So when\n // online we strip that query from the restored cache; it then loads\n // fresh from the server exactly as it did before offline support existed.\n // A document caught mid-processing is stripped for the same reason, and the\n // entitlements are read fresh (isRestorableArbiQueryOnline).\n // Queued offline mutations and all other queries restore normally. When\n // offline we keep everything so the pages still have something to show.\n restoreClient: async () => {\n const persisted = await get<PersistedClient>(IDB_KEY)\n if (!persisted) return persisted\n const isOffline = typeof navigator !== 'undefined' && navigator.onLine === false\n if (isOffline) return persisted\n persisted.clientState.queries = persisted.clientState.queries.filter((q) =>\n isRestorableArbiQueryOnline(q.queryKey, q.state.data)\n )\n return persisted\n },\n removeClient: () => del(IDB_KEY),\n }\n}\n\n/**\n * Hand the offline write queue to the account that is signing in. Queued edits\n * are replayed under whoever is logged in on reload, so a queue left by a\n * different account (or one whose owner was never recorded) must be discarded\n * here \u2014 otherwise another person's edit syncs, and fails, as this user.\n * The same account keeps its queue across logins.\n */\nexport async function claimOfflineQueue(userExtId: string): Promise<void> {\n const owner = await get<string>(OWNER_KEY)\n if (owner !== userExtId) await del(IDB_KEY)\n await set(OWNER_KEY, userExtId)\n}\n\n/** The persistence of the offline cache (see the module comment). */\nexport function createArbiQueryPersistOptions(): ArbiQueryPersistOptions {\n return {\n persister: createIDBPersister(),\n maxAge: MAX_AGE,\n buster: CACHE_BUSTER,\n dehydrateOptions: {\n // Persist mutations that were paused offline so a queued write (apply tag,\n // edit field) survives a reload and replays on reconnect. Resuming them\n // after a reload requires the registered mutation defaults\n // (registerArbiMutationDefaults). Scope to real offline EDITS: an incidental\n // paused mutation (e.g. workspace-open) isn't a user change to queue/replay.\n shouldDehydrateMutation: (mutation) =>\n mutation.state.isPaused && isReplayableArbiMutation(mutation.options.mutationKey),\n shouldDehydrateQuery: (query) => {\n if (query.state.status !== 'success') return false\n // Every query key comes from the package factory: its offline families are the whole\n // list (document metadata, the workspace list, the settings, the projects, the\n // entitlements; never a document's content or bytes).\n return isOfflineReadableArbiQuery(query.queryKey)\n },\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "AAaA,SAAS,KAAK,KAAK,WAAW;AAM9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,UAAU;AAIhB,MAAM,YAAY;AAIlB,MAAM,eAAe;AAErB,MAAM,UAAU,MAAO,KAAK,KAAK,KAAK;AAKtC,SAAS,qBAAgC;AACvC,SAAO;AAAA,IACL,eAAe,CAAC,WAA4B,IAAI,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAY/D,eAAe,YAAY;AACzB,YAAM,YAAY,MAAM,IAAqB,OAAO;AACpD,UAAI,CAAC,UAAW,QAAO;AACvB,YAAM,YAAY,OAAO,cAAc,eAAe,UAAU,WAAW;AAC3E,UAAI,UAAW,QAAO;AACtB,gBAAU,YAAY,UAAU,UAAU,YAAY,QAAQ;AAAA,QAAO,CAAC,MACpE,4BAA4B,EAAE,UAAU,EAAE,MAAM,IAAI;AAAA,MACtD;AACA,aAAO;AAAA,IACT;AAAA,IACA,cAAc,MAAM,IAAI,OAAO;AAAA,EACjC;AACF;AASA,eAAsB,kBAAkB,WAAkC;AACxE,QAAM,QAAQ,MAAM,IAAY,SAAS;AACzC,MAAI,UAAU,UAAW,OAAM,IAAI,OAAO;AAC1C,QAAM,IAAI,WAAW,SAAS;AAChC;AAGO,SAAS,gCAAyD;AACvE,SAAO;AAAA,IACL,WAAW,mBAAmB;AAAA,IAC9B,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMhB,yBAAyB,CAAC,aACxB,SAAS,MAAM,YAAY,yBAAyB,SAAS,QAAQ,WAAW;AAAA,MAClF,sBAAsB,CAAC,UAAU;AAC/B,YAAI,MAAM,MAAM,WAAW,UAAW,QAAO;AAI7C,eAAO,2BAA2B,MAAM,QAAQ;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useCallback, useRef } from "react";
|
|
2
|
+
import { isAbortError } from "@arbidocs/client";
|
|
3
|
+
import { ArbiWorkspaceUnavailableError } from "@arbidocs/sdk/browser";
|
|
4
|
+
const QUEUED_WRITE_BLOCKED_MESSAGE = "This change belongs to a workspace that can't be opened right now, so it was not sent. It is kept here until it can be.";
|
|
5
|
+
function primeOnClient(client) {
|
|
6
|
+
return (workspaceId) => workspaceId === client.session.getState().selectedWorkspaceId ? void 0 : client.workspaceKeys.prime(workspaceId);
|
|
7
|
+
}
|
|
8
|
+
function primeOnArbi(arbi) {
|
|
9
|
+
return (workspaceId) => arbi.hasWorkspace && workspaceId === arbi.getWorkspaceId() ? void 0 : arbi.workspaces.open(workspaceId);
|
|
10
|
+
}
|
|
11
|
+
async function inWorkspace(prime, workspaceId, write) {
|
|
12
|
+
if (workspaceId) {
|
|
13
|
+
try {
|
|
14
|
+
await prime(workspaceId);
|
|
15
|
+
} catch (error) {
|
|
16
|
+
if (isAbortError(error)) throw error;
|
|
17
|
+
throw new ArbiWorkspaceUnavailableError(workspaceId, error, QUEUED_WRITE_BLOCKED_MESSAGE);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return write();
|
|
21
|
+
}
|
|
22
|
+
function isWorkspaceUnavailable(error) {
|
|
23
|
+
return error instanceof ArbiWorkspaceUnavailableError;
|
|
24
|
+
}
|
|
25
|
+
const QUEUED_WRITE_RETRY = {
|
|
26
|
+
retry: (failureCount, error) => isWorkspaceUnavailable(error) && failureCount < 8,
|
|
27
|
+
retryDelay: (attempt) => Math.min(1e3 * 2 ** attempt, 3e4)
|
|
28
|
+
};
|
|
29
|
+
function isBlockedOnWorkspace(mutation) {
|
|
30
|
+
return isWorkspaceUnavailable(mutation.state.error ?? mutation.state.failureReason);
|
|
31
|
+
}
|
|
32
|
+
function useCapturingWorkspace(mutation, capture) {
|
|
33
|
+
const captureRef = useRef(capture);
|
|
34
|
+
captureRef.current = capture;
|
|
35
|
+
const { mutate: rawMutate, mutateAsync: rawMutateAsync } = mutation;
|
|
36
|
+
const mutate = useCallback(
|
|
37
|
+
(variables, ...rest) => rawMutate(captureRef.current(variables), ...rest),
|
|
38
|
+
[rawMutate]
|
|
39
|
+
);
|
|
40
|
+
const mutateAsync = useCallback(
|
|
41
|
+
(variables, ...rest) => rawMutateAsync(
|
|
42
|
+
captureRef.current(variables),
|
|
43
|
+
...rest
|
|
44
|
+
),
|
|
45
|
+
[rawMutateAsync]
|
|
46
|
+
);
|
|
47
|
+
return { ...mutation, mutate, mutateAsync };
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
QUEUED_WRITE_BLOCKED_MESSAGE,
|
|
51
|
+
QUEUED_WRITE_RETRY,
|
|
52
|
+
inWorkspace,
|
|
53
|
+
isBlockedOnWorkspace,
|
|
54
|
+
isWorkspaceUnavailable,
|
|
55
|
+
primeOnArbi,
|
|
56
|
+
primeOnClient,
|
|
57
|
+
useCapturingWorkspace
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=queued-writes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/queued-writes.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The workspace of a write that may be queued (offline, then replayed on reconnect or after a\n * reload). The workspace is captured when the write is made and kept with it, and the write is\n * sent in that workspace: it is opened for this session first (its key deposited, without\n * switching to it), and the request names it or acts on resources the server keys by their own\n * workspace. So a replay never lands in whatever workspace happens to be open by then.\n *\n * When the workspace cannot be opened (signed out, access removed), nothing is sent: the write\n * fails with `ArbiWorkspaceUnavailableError`, is retried a few times (a reload replays before the\n * sign-in has finished), and then stays in the pending changes as not sent, with its local edit\n * kept, rather than going anywhere else.\n */\n\nimport { useCallback, useRef } from 'react'\nimport { isAbortError, type ArbiClient } from '@arbidocs/client'\nimport { ArbiWorkspaceUnavailableError } from '@arbidocs/sdk/browser'\n\n/** A queued write's own workspace (`wrk-\u2026`), captured when it was made. */\nexport interface QueuedWriteWorkspace {\n /** The workspace the write belongs to. Filled in when it is made; absent on older queued writes. */\n workspaceId?: string\n}\n\n/** What a write that could not be sent in its workspace says. */\nexport const QUEUED_WRITE_BLOCKED_MESSAGE =\n \"This change belongs to a workspace that can't be opened right now, so it was not sent. It is kept here until it can be.\"\n\n/** Opens a workspace for this server session without switching to it (nothing for the current one). */\nexport type WorkspacePrimer = (workspaceId: string) => Promise<void> | void\n\n/** {@link WorkspacePrimer} on a bare client (a replay after a reload): its key, via `/prime-key`. */\nexport function primeOnClient(client: ArbiClient): WorkspacePrimer {\n return (workspaceId) =>\n workspaceId === client.session.getState().selectedWorkspaceId\n ? undefined\n : client.workspaceKeys.prime(workspaceId)\n}\n\n/** {@link WorkspacePrimer} on an `Arbi` (`workspaces.open`, which never switches). */\nexport function primeOnArbi(arbi: {\n hasWorkspace: boolean\n getWorkspaceId(): string\n workspaces: { open(workspaceId: string): Promise<void> }\n}): WorkspacePrimer {\n return (workspaceId) =>\n arbi.hasWorkspace && workspaceId === arbi.getWorkspaceId()\n ? undefined\n : arbi.workspaces.open(workspaceId)\n}\n\n/**\n * Run `write` in `workspaceId`: that workspace is opened for this server session first (`prime`).\n * When it can't be, nothing is sent. No workspace (a write queued before workspaces were\n * recorded): as before.\n */\nexport async function inWorkspace<T>(\n prime: WorkspacePrimer,\n workspaceId: string | null | undefined,\n write: () => Promise<T>\n): Promise<T> {\n if (workspaceId) {\n try {\n await prime(workspaceId)\n } catch (error) {\n if (isAbortError(error)) throw error\n throw new ArbiWorkspaceUnavailableError(workspaceId, error, QUEUED_WRITE_BLOCKED_MESSAGE)\n }\n }\n return write()\n}\n\n/** Whether a write failed only because its workspace could not be opened (nothing was sent). */\nexport function isWorkspaceUnavailable(error: unknown): boolean {\n return error instanceof ArbiWorkspaceUnavailableError\n}\n\n/** How many times a write whose workspace cannot be opened is tried again, and how long apart. */\nexport const QUEUED_WRITE_RETRY = {\n retry: (failureCount: number, error: unknown) =>\n isWorkspaceUnavailable(error) && failureCount < 8,\n retryDelay: (attempt: number) => Math.min(1000 * 2 ** attempt, 30_000),\n} as const\n\n/** Whether a queued write is held back because its workspace cannot be opened. */\nexport function isBlockedOnWorkspace(mutation: {\n state: { error?: unknown; failureReason?: unknown }\n}): boolean {\n return isWorkspaceUnavailable(mutation.state.error ?? mutation.state.failureReason)\n}\n\n/**\n * Fill in the workspace of each write a mutation makes, when its caller gave none: `mutate` and\n * `mutateAsync` pass `capture(variables)` on. Read when the write is made, so a write queued\n * offline keeps the workspace it was made in. The wrapped functions are as stable as the mutation's.\n */\nexport function useCapturingWorkspace<\n V,\n T extends { mutate: (variables: V, ...rest: never[]) => unknown; mutateAsync: unknown },\n>(mutation: T, capture: (variables: V) => V): T {\n const captureRef = useRef(capture)\n captureRef.current = capture\n const { mutate: rawMutate, mutateAsync: rawMutateAsync } = mutation\n const mutate = useCallback(\n (variables: V, ...rest: never[]) =>\n (rawMutate as (v: V, ...r: never[]) => unknown)(captureRef.current(variables), ...rest),\n [rawMutate]\n ) as T['mutate']\n const mutateAsync = useCallback(\n (variables: V, ...rest: never[]) =>\n (rawMutateAsync as (v: V, ...r: never[]) => Promise<unknown>)(\n captureRef.current(variables),\n ...rest\n ),\n [rawMutateAsync]\n ) as T['mutateAsync']\n return { ...mutation, mutate, mutateAsync }\n}\n"],
|
|
5
|
+
"mappings": "AAaA,SAAS,aAAa,cAAc;AACpC,SAAS,oBAAqC;AAC9C,SAAS,qCAAqC;AASvC,MAAM,+BACX;AAMK,SAAS,cAAc,QAAqC;AACjE,SAAO,CAAC,gBACN,gBAAgB,OAAO,QAAQ,SAAS,EAAE,sBACtC,SACA,OAAO,cAAc,MAAM,WAAW;AAC9C;AAGO,SAAS,YAAY,MAIR;AAClB,SAAO,CAAC,gBACN,KAAK,gBAAgB,gBAAgB,KAAK,eAAe,IACrD,SACA,KAAK,WAAW,KAAK,WAAW;AACxC;AAOA,eAAsB,YACpB,OACA,aACA,OACY;AACZ,MAAI,aAAa;AACf,QAAI;AACF,YAAM,MAAM,WAAW;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,aAAa,KAAK,EAAG,OAAM;AAC/B,YAAM,IAAI,8BAA8B,aAAa,OAAO,4BAA4B;AAAA,IAC1F;AAAA,EACF;AACA,SAAO,MAAM;AACf;AAGO,SAAS,uBAAuB,OAAyB;AAC9D,SAAO,iBAAiB;AAC1B;AAGO,MAAM,qBAAqB;AAAA,EAChC,OAAO,CAAC,cAAsB,UAC5B,uBAAuB,KAAK,KAAK,eAAe;AAAA,EAClD,YAAY,CAAC,YAAoB,KAAK,IAAI,MAAO,KAAK,SAAS,GAAM;AACvE;AAGO,SAAS,qBAAqB,UAEzB;AACV,SAAO,uBAAuB,SAAS,MAAM,SAAS,SAAS,MAAM,aAAa;AACpF;AAOO,SAAS,sBAGd,UAAa,SAAiC;AAC9C,QAAM,aAAa,OAAO,OAAO;AACjC,aAAW,UAAU;AACrB,QAAM,EAAE,QAAQ,WAAW,aAAa,eAAe,IAAI;AAC3D,QAAM,SAAS;AAAA,IACb,CAAC,cAAiB,SACf,UAA+C,WAAW,QAAQ,SAAS,GAAG,GAAG,IAAI;AAAA,IACxF,CAAC,SAAS;AAAA,EACZ;AACA,QAAM,cAAc;AAAA,IAClB,CAAC,cAAiB,SACf;AAAA,MACC,WAAW,QAAQ,SAAS;AAAA,MAC5B,GAAG;AAAA,IACL;AAAA,IACF,CAAC,cAAc;AAAA,EACjB;AACA,SAAO,EAAE,GAAG,UAAU,QAAQ,YAAY;AAC5C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { logger } from "@arbidocs/client";
|
|
2
|
+
import { useArbiSessionState } from "./session/index.js";
|
|
3
|
+
const REMOTE_CONTROL_VIEW = "actions.remoteControl";
|
|
4
|
+
const OFF = { enabled: false, pending: null, controllingAgent: null };
|
|
5
|
+
const remoteControlStateOf = (state) => state.views.transient[REMOTE_CONTROL_VIEW] ?? OFF;
|
|
6
|
+
function useRemoteControl(selector) {
|
|
7
|
+
return useArbiSessionState((state) => selector(remoteControlStateOf(state)));
|
|
8
|
+
}
|
|
9
|
+
function remoteControlActions(session) {
|
|
10
|
+
const update = (change) => {
|
|
11
|
+
const state = remoteControlStateOf(session.getState());
|
|
12
|
+
session.setTransientView(REMOTE_CONTROL_VIEW, { ...state, ...change(state) });
|
|
13
|
+
};
|
|
14
|
+
return {
|
|
15
|
+
/** Stash a requested run and open the consent prompt (`pending` set). */
|
|
16
|
+
request: (req) => update(() => ({ pending: req })),
|
|
17
|
+
/** Resolve the pending request: `forSession` enables it for the whole session; either way
|
|
18
|
+
* the pending request is cleared. Running it is the caller's job. */
|
|
19
|
+
grant: ({ forSession }) => update((state) => ({ enabled: forSession || state.enabled, pending: null })),
|
|
20
|
+
/** Reject the pending request — clears it, changes nothing else. */
|
|
21
|
+
deny: () => update(() => ({ pending: null })),
|
|
22
|
+
/** Directly set the session enabled flag. Turning it OFF revokes immediately: clears any
|
|
23
|
+
* pending prompt and the controlling banner (GUARANTEE #5). */
|
|
24
|
+
setEnabled: (enabled) => update(() => enabled ? { enabled } : { enabled, pending: null, controllingAgent: null }),
|
|
25
|
+
/** Set (or clear) the agent whose run is currently executing. */
|
|
26
|
+
setControllingAgent: (agent) => update(() => ({ controllingAgent: agent })),
|
|
27
|
+
/** Back to the session start: off, nothing pending, nobody driving (a sign-in or sign-out). */
|
|
28
|
+
reset: () => session.setTransientView(REMOTE_CONTROL_VIEW, void 0)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function hasRunnableSteps(steps) {
|
|
32
|
+
return Array.isArray(steps) && steps.length > 0 && steps.every((s) => typeof s?.target === "string" && s.target.length > 0);
|
|
33
|
+
}
|
|
34
|
+
function toGuidedSteps(steps) {
|
|
35
|
+
return steps.map((s) => ({
|
|
36
|
+
target: s.target,
|
|
37
|
+
do: s.do ?? void 0,
|
|
38
|
+
value: s.value ?? void 0,
|
|
39
|
+
note: s.note ?? void 0,
|
|
40
|
+
pauseMs: s.pauseMs ?? void 0,
|
|
41
|
+
waitMs: s.waitMs ?? void 0
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
function toRemoteControlRequest(msg, isSequenceId) {
|
|
45
|
+
const steps = hasRunnableSteps(msg.steps) ? toGuidedSteps(msg.steps) : void 0;
|
|
46
|
+
const sequenceId = typeof msg.sequence_id === "string" && isSequenceId(msg.sequence_id) ? msg.sequence_id : void 0;
|
|
47
|
+
if (!steps && !sequenceId) {
|
|
48
|
+
logger.warn("[RemoteControl] Ignoring message with no runnable action", msg.sequence_id);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
// The agent is always named in the prompt; fall back to a neutral label rather than leaving
|
|
53
|
+
// the consent dialog anonymous.
|
|
54
|
+
agentName: msg.agent_name.trim() || "An assistant",
|
|
55
|
+
agentExtId: msg.agent_ext_id ?? void 0,
|
|
56
|
+
sequenceId,
|
|
57
|
+
steps
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
REMOTE_CONTROL_VIEW,
|
|
62
|
+
remoteControlActions,
|
|
63
|
+
remoteControlStateOf,
|
|
64
|
+
toRemoteControlRequest,
|
|
65
|
+
useRemoteControl
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=remote-control.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/remote-control.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Remote control's session state and its websocket message: an `agt-\u2026` assistant asks to drive\n * the UI over the live connection (`remote_control`), and the user's consent decides whether it\n * may. The guided run itself (the cursor, the clicks) is `@arbidocs/blocks`' (`createRemoteControl`).\n *\n * GUARANTEE #1: `enabled` is `false` at the start of EVERY session and is NEVER saved. The state is\n * a transient view of the session's layout (`views.transient`), which the layout never saves. Every\n * sign-in and sign-out drops it: `@arbidocs/blocks`' remote control resets it (`reset`) on the\n * host's sign-in, sign-out, expiry and change of user, on every host, and a host's own\n * `resetLayout` drops it too.\n *\n * The actions here are pure state. Running the requested run (and labelling the driver for its\n * duration) is the orchestration layer's.\n *\n * \u2500\u2500 BACKEND WS CONTRACT \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 * Message `type`: `'remote_control'`. Payload (snake_case, matching the other WS messages):\n * {\n * type: 'remote_control',\n * agent_name: string, // display name of the requesting agent\n * agent_ext_id?: string, // the agent's `agt-\u2026` external id\n * sequence_id?: string, // a REGISTERED guided-run id\n * steps?: GuidedStep[], // OR an inline guided run (target-based)\n * }\n * Exactly one of `sequence_id` / `steps` is expected. An unknown `sequence_id`, a `steps` list with\n * no valid target, and an empty/absent run are all ignored.\n */\nimport type { components } from '@arbidocs/client'\nimport { logger } from '@arbidocs/client'\nimport type { ArbiSessionState, ArbiSessionStore } from './session'\nimport { useArbiSessionState } from './session'\n\n/** The websocket message: an `agt-\u2026` agent asks to drive the UI (exactly one of `sequence_id` /\n * `steps`). The generated schema type is the single source of truth. */\nexport type RemoteControlMessage = components['schemas']['RemoteControlMessage']\n/** One guided-cursor step, as on the wire (nullable JSON fields). */\ntype RemoteControlStep = components['schemas']['RemoteControlStep']\n\n/** One UI operation: glide the cursor to `target`, then perform `do` on it. */\nexport interface GuidedStep {\n /** `[data-testid=...]` (or any CSS selector) the cursor glides to and acts on. */\n target: string\n /** Interaction once the cursor arrives. Defaults to 'click'. */\n do?: 'click' | 'type'\n /** Text to type for `do: 'type'`. */\n value?: string\n /** Narration toast shown when the step runs. */\n note?: string\n /** Pause (ms) AFTER this step, before the next. */\n pauseMs?: number\n /** Max ms to wait for the target to appear (it may follow a prior step). */\n waitMs?: number\n}\n\n/** A remote-control run requested by a backend agent (name always present so the consent prompt\n * can name who is asking \u2014 GUARANTEE #3). Carries either a registered `sequenceId` or an inline\n * `steps` list to execute. */\nexport interface RemoteControlRequest {\n /** Display name of the requesting assistant, e.g. \"Research Assistant\". */\n agentName: string\n /** The assistant's `agt-\u2026` external id, shown so the user knows which agent. */\n agentExtId?: string\n /** A registered guided-run id to execute. */\n sequenceId?: string\n /** An ad-hoc guided run to execute (used when no registered sequence fits). */\n steps?: GuidedStep[]\n}\n\n/** The agent whose run is actively executing \u2014 drives the \"controlling\" banner. */\nexport interface ControllingAgent {\n name: string\n extId?: string\n}\n\n/** Session-only remote-control state (never saved \u2014 see the file header). */\nexport interface RemoteControlState {\n /** Whether WS-driven runs may execute without re-prompting this session. */\n enabled: boolean\n /** The in-flight consent request awaiting the user's decision, or null. */\n pending: RemoteControlRequest | null\n /** Set while a WS-driven run is actively executing (labels the banner). */\n controllingAgent: ControllingAgent | null\n}\n\n/** The session the state lives in. */\nexport type RemoteControlSession = Pick<ArbiSessionStore, 'getState' | 'setTransientView'>\n\n/** The transient view that holds the state. */\nexport const REMOTE_CONTROL_VIEW = 'actions.remoteControl'\nconst OFF: RemoteControlState = { enabled: false, pending: null, controllingAgent: null }\n\n/** The remote-control state of a session state. */\nexport const remoteControlStateOf = (state: Pick<ArbiSessionState, 'views'>): RemoteControlState =>\n (state.views.transient[REMOTE_CONTROL_VIEW] as RemoteControlState | undefined) ?? OFF\n\n/** A slice of the remote-control state of the host's session; re-renders when it changes. */\nexport function useRemoteControl<T>(selector: (state: RemoteControlState) => T): T {\n return useArbiSessionState((state) => selector(remoteControlStateOf(state)))\n}\n\n/** The state's actions on a session. */\nexport function remoteControlActions(session: RemoteControlSession) {\n const update = (change: (state: RemoteControlState) => Partial<RemoteControlState>): void => {\n const state = remoteControlStateOf(session.getState())\n session.setTransientView(REMOTE_CONTROL_VIEW, { ...state, ...change(state) })\n }\n return {\n /** Stash a requested run and open the consent prompt (`pending` set). */\n request: (req: RemoteControlRequest): void => update(() => ({ pending: req })),\n /** Resolve the pending request: `forSession` enables it for the whole session; either way\n * the pending request is cleared. Running it is the caller's job. */\n grant: ({ forSession }: { forSession: boolean }): void =>\n update((state) => ({ enabled: forSession || state.enabled, pending: null })),\n /** Reject the pending request \u2014 clears it, changes nothing else. */\n deny: (): void => update(() => ({ pending: null })),\n /** Directly set the session enabled flag. Turning it OFF revokes immediately: clears any\n * pending prompt and the controlling banner (GUARANTEE #5). */\n setEnabled: (enabled: boolean): void =>\n update(() => (enabled ? { enabled } : { enabled, pending: null, controllingAgent: null })),\n /** Set (or clear) the agent whose run is currently executing. */\n setControllingAgent: (agent: ControllingAgent | null): void =>\n update(() => ({ controllingAgent: agent })),\n /** Back to the session start: off, nothing pending, nobody driving (a sign-in or sign-out). */\n reset: (): void => session.setTransientView(REMOTE_CONTROL_VIEW, undefined),\n }\n}\n\n/** A runnable steps list: a non-empty array whose every step has a real target selector \u2014 the\n * one field the runner cannot act without. Operates on the wire step (nullable JSON fields). */\nfunction hasRunnableSteps(\n steps: RemoteControlStep[] | null | undefined\n): steps is RemoteControlStep[] {\n return (\n Array.isArray(steps) &&\n steps.length > 0 &&\n steps.every((s) => typeof s?.target === 'string' && s.target.length > 0)\n )\n}\n\n/** Normalise wire steps (nullable JSON fields) into plain optionals \u2014 a `null` off the socket\n * becomes an absent field. */\nfunction toGuidedSteps(steps: RemoteControlStep[]): GuidedStep[] {\n return steps.map((s) => ({\n target: s.target,\n do: s.do ?? undefined,\n value: s.value ?? undefined,\n note: s.note ?? undefined,\n pauseMs: s.pauseMs ?? undefined,\n waitMs: s.waitMs ?? undefined,\n }))\n}\n\n/**\n * Narrow an incoming message into a request, or null if nothing is runnable: inline steps that\n * all have a target, or a `sequence_id` the site registered (`isSequenceId`).\n */\nexport function toRemoteControlRequest(\n msg: RemoteControlMessage,\n isSequenceId: (id: string) => boolean\n): RemoteControlRequest | null {\n const steps = hasRunnableSteps(msg.steps) ? toGuidedSteps(msg.steps) : undefined\n const sequenceId =\n typeof msg.sequence_id === 'string' && isSequenceId(msg.sequence_id)\n ? msg.sequence_id\n : undefined\n if (!steps && !sequenceId) {\n logger.warn('[RemoteControl] Ignoring message with no runnable action', msg.sequence_id)\n return null\n }\n return {\n // The agent is always named in the prompt; fall back to a neutral label rather than leaving\n // the consent dialog anonymous.\n agentName: msg.agent_name.trim() || 'An assistant',\n agentExtId: msg.agent_ext_id ?? undefined,\n sequenceId,\n steps,\n }\n}\n"],
|
|
5
|
+
"mappings": "AA2BA,SAAS,cAAc;AAEvB,SAAS,2BAA2B;AA0D7B,MAAM,sBAAsB;AACnC,MAAM,MAA0B,EAAE,SAAS,OAAO,SAAS,MAAM,kBAAkB,KAAK;AAGjF,MAAM,uBAAuB,CAAC,UAClC,MAAM,MAAM,UAAU,mBAAmB,KAAwC;AAG7E,SAAS,iBAAoB,UAA+C;AACjF,SAAO,oBAAoB,CAAC,UAAU,SAAS,qBAAqB,KAAK,CAAC,CAAC;AAC7E;AAGO,SAAS,qBAAqB,SAA+B;AAClE,QAAM,SAAS,CAAC,WAA6E;AAC3F,UAAM,QAAQ,qBAAqB,QAAQ,SAAS,CAAC;AACrD,YAAQ,iBAAiB,qBAAqB,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,EAAE,CAAC;AAAA,EAC9E;AACA,SAAO;AAAA;AAAA,IAEL,SAAS,CAAC,QAAoC,OAAO,OAAO,EAAE,SAAS,IAAI,EAAE;AAAA;AAAA;AAAA,IAG7E,OAAO,CAAC,EAAE,WAAW,MACnB,OAAO,CAAC,WAAW,EAAE,SAAS,cAAc,MAAM,SAAS,SAAS,KAAK,EAAE;AAAA;AAAA,IAE7E,MAAM,MAAY,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE;AAAA;AAAA;AAAA,IAGlD,YAAY,CAAC,YACX,OAAO,MAAO,UAAU,EAAE,QAAQ,IAAI,EAAE,SAAS,SAAS,MAAM,kBAAkB,KAAK,CAAE;AAAA;AAAA,IAE3F,qBAAqB,CAAC,UACpB,OAAO,OAAO,EAAE,kBAAkB,MAAM,EAAE;AAAA;AAAA,IAE5C,OAAO,MAAY,QAAQ,iBAAiB,qBAAqB,MAAS;AAAA,EAC5E;AACF;AAIA,SAAS,iBACP,OAC8B;AAC9B,SACE,MAAM,QAAQ,KAAK,KACnB,MAAM,SAAS,KACf,MAAM,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,YAAY,EAAE,OAAO,SAAS,CAAC;AAE3E;AAIA,SAAS,cAAc,OAA0C;AAC/D,SAAO,MAAM,IAAI,CAAC,OAAO;AAAA,IACvB,QAAQ,EAAE;AAAA,IACV,IAAI,EAAE,MAAM;AAAA,IACZ,OAAO,EAAE,SAAS;AAAA,IAClB,MAAM,EAAE,QAAQ;AAAA,IAChB,SAAS,EAAE,WAAW;AAAA,IACtB,QAAQ,EAAE,UAAU;AAAA,EACtB,EAAE;AACJ;AAMO,SAAS,uBACd,KACA,cAC6B;AAC7B,QAAM,QAAQ,iBAAiB,IAAI,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI;AACvE,QAAM,aACJ,OAAO,IAAI,gBAAgB,YAAY,aAAa,IAAI,WAAW,IAC/D,IAAI,cACJ;AACN,MAAI,CAAC,SAAS,CAAC,YAAY;AACzB,WAAO,KAAK,4DAA4D,IAAI,WAAW;AACvF,WAAO;AAAA,EACT;AACA,SAAO;AAAA;AAAA;AAAA,IAGL,WAAW,IAAI,WAAW,KAAK,KAAK;AAAA,IACpC,YAAY,IAAI,gBAAgB;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useSemanticSearch
|
|
3
|
+
} from "./useSemanticSearch.js";
|
|
4
|
+
import {
|
|
5
|
+
sharedSearchSession,
|
|
6
|
+
createSearchSession,
|
|
7
|
+
clearSearchSession,
|
|
8
|
+
requestSearch,
|
|
9
|
+
takePendingSearch,
|
|
10
|
+
persistSearchSession
|
|
11
|
+
} from "./session.js";
|
|
12
|
+
import { MAX_RETRIEVE_DOC_IDS } from "@arbidocs/sdk/browser";
|
|
13
|
+
export {
|
|
14
|
+
MAX_RETRIEVE_DOC_IDS,
|
|
15
|
+
clearSearchSession,
|
|
16
|
+
createSearchSession,
|
|
17
|
+
persistSearchSession,
|
|
18
|
+
requestSearch,
|
|
19
|
+
sharedSearchSession,
|
|
20
|
+
takePendingSearch,
|
|
21
|
+
useSemanticSearch
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/search/index.ts"],
|
|
4
|
+
"sourcesContent": ["export {\n useSemanticSearch,\n type SemanticSearch,\n type SemanticSearchOptions,\n type SearchMode,\n} from './useSemanticSearch'\n// Also in `@arbidocs/react/shell` (one module): a host's store reaches it without the root entry.\nexport {\n sharedSearchSession,\n createSearchSession,\n clearSearchSession,\n requestSearch,\n takePendingSearch,\n persistSearchSession,\n type SearchSession,\n type SearchSessionState,\n type SearchStatus,\n} from './session'\nexport { MAX_RETRIEVE_DOC_IDS, type SearchChunk } from '@arbidocs/sdk/browser'\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,OAIK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,4BAA8C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createStore } from "zustand/vanilla";
|
|
2
|
+
const EMPTY = {
|
|
3
|
+
query: "",
|
|
4
|
+
results: [],
|
|
5
|
+
searched: false,
|
|
6
|
+
status: "idle",
|
|
7
|
+
error: null,
|
|
8
|
+
pending: null
|
|
9
|
+
};
|
|
10
|
+
function createSearchSession() {
|
|
11
|
+
return createStore(() => ({ ...EMPTY, workspaceId: null, run: 0 }));
|
|
12
|
+
}
|
|
13
|
+
const sharedSearchSession = createSearchSession();
|
|
14
|
+
function clearSearchSession(workspaceId, session = sharedSearchSession) {
|
|
15
|
+
session.setState((s) => ({
|
|
16
|
+
...EMPTY,
|
|
17
|
+
workspaceId: workspaceId === void 0 ? s.workspaceId : workspaceId,
|
|
18
|
+
run: s.run + 1
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
function requestSearch(query, workspaceId, session = sharedSearchSession) {
|
|
22
|
+
clearSearchSession(workspaceId, session);
|
|
23
|
+
session.setState({ query, pending: query });
|
|
24
|
+
}
|
|
25
|
+
function takePendingSearch(session = sharedSearchSession) {
|
|
26
|
+
const { pending } = session.getState();
|
|
27
|
+
if (pending !== null) session.setState({ pending: null });
|
|
28
|
+
return pending;
|
|
29
|
+
}
|
|
30
|
+
function persistSearchSession(key, storage = globalThis.localStorage, session = sharedSearchSession) {
|
|
31
|
+
if (!storage) return () => {
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
const saved = JSON.parse(storage.getItem(key) ?? "null");
|
|
35
|
+
if (saved && typeof saved.query === "string" && !session.getState().query)
|
|
36
|
+
session.setState({ query: saved.query, workspaceId: saved.workspaceId ?? null });
|
|
37
|
+
} catch {
|
|
38
|
+
}
|
|
39
|
+
let last = "";
|
|
40
|
+
return session.subscribe(({ query, workspaceId }) => {
|
|
41
|
+
const next = JSON.stringify({ query, workspaceId });
|
|
42
|
+
if (next === last) return;
|
|
43
|
+
last = next;
|
|
44
|
+
try {
|
|
45
|
+
storage.setItem(key, next);
|
|
46
|
+
} catch {
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
clearSearchSession,
|
|
52
|
+
createSearchSession,
|
|
53
|
+
persistSearchSession,
|
|
54
|
+
requestSearch,
|
|
55
|
+
sharedSearchSession,
|
|
56
|
+
takePendingSearch
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/search/session.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * A search's state outside any component: the query last searched, its passages, and whether it\n * is running. A page that shows the shared session (`sharedSearchSession`) keeps its results when\n * it is left and opened again, another surface can hand it a query to run on arrival\n * ({@link requestSearch}), and {@link persistSearchSession} keeps the last query across reloads.\n */\nimport { createStore, type StoreApi } from 'zustand/vanilla'\nimport type { SearchChunk } from '@arbidocs/sdk/browser'\n\nexport type SearchStatus = 'idle' | 'running' | 'done' | 'error'\n\nexport interface SearchSessionState {\n /** The workspace the query and results belong to. */\n workspaceId: string | null\n /** The query last searched, or handed over to run. */\n query: string\n /** The last search's passages, best first. */\n results: SearchChunk[]\n /** A search has finished with results to show (cleared by {@link clearSearchSession}). */\n searched: boolean\n status: SearchStatus\n error: string | null\n /** A query handed over by {@link requestSearch}, run once by the page that shows the session. */\n pending: string | null\n /** Counts searches, so the reply to an older one never overwrites a newer one. */\n run: number\n}\n\nexport type SearchSession = StoreApi<SearchSessionState>\n\nconst EMPTY: Omit<SearchSessionState, 'workspaceId' | 'run'> = {\n query: '',\n results: [],\n searched: false,\n status: 'idle',\n error: null,\n pending: null,\n}\n\nexport function createSearchSession(): SearchSession {\n return createStore<SearchSessionState>(() => ({ ...EMPTY, workspaceId: null, run: 0 }))\n}\n\n/** The session a host's search page shows. */\nexport const sharedSearchSession: SearchSession = createSearchSession()\n\n/** Back to nothing searched (in `workspaceId` when given); a running search's reply is dropped. */\nexport function clearSearchSession(\n workspaceId?: string | null,\n session: SearchSession = sharedSearchSession\n): void {\n session.setState((s) => ({\n ...EMPTY,\n workspaceId: workspaceId === undefined ? s.workspaceId : workspaceId,\n run: s.run + 1,\n }))\n}\n\n/**\n * Hand a query to the search page, which runs it when it shows the session (the user already\n * asked once; the page must not wait for a second Enter).\n */\nexport function requestSearch(\n query: string,\n workspaceId: string | null,\n session: SearchSession = sharedSearchSession\n): void {\n clearSearchSession(workspaceId, session)\n session.setState({ query, pending: query })\n}\n\n/** The handed-over query, once: the next call returns null. */\nexport function takePendingSearch(session: SearchSession = sharedSearchSession): string | null {\n const { pending } = session.getState()\n if (pending !== null) session.setState({ pending: null })\n return pending\n}\n\ninterface SavedSearch {\n query?: string\n workspaceId?: string | null\n}\n\n/**\n * Keep the last query (and its workspace) in `storage` under `key`, so the search box shows it\n * after a reload. Results are not kept. Returns the unsubscribe.\n */\nexport function persistSearchSession(\n key: string,\n storage: Pick<Storage, 'getItem' | 'setItem'> | undefined = globalThis.localStorage,\n session: SearchSession = sharedSearchSession\n): () => void {\n if (!storage) return () => {}\n try {\n const saved = JSON.parse(storage.getItem(key) ?? 'null') as SavedSearch | null\n if (saved && typeof saved.query === 'string' && !session.getState().query)\n session.setState({ query: saved.query, workspaceId: saved.workspaceId ?? null })\n } catch {\n // Unreadable: start empty.\n }\n let last = ''\n return session.subscribe(({ query, workspaceId }) => {\n const next = JSON.stringify({ query, workspaceId })\n if (next === last) return\n last = next\n try {\n storage.setItem(key, next)\n } catch {\n // Storage full or blocked: the query is simply not kept.\n }\n })\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,mBAAkC;AAwB3C,MAAM,QAAyD;AAAA,EAC7D,OAAO;AAAA,EACP,SAAS,CAAC;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAAS,sBAAqC;AACnD,SAAO,YAAgC,OAAO,EAAE,GAAG,OAAO,aAAa,MAAM,KAAK,EAAE,EAAE;AACxF;AAGO,MAAM,sBAAqC,oBAAoB;AAG/D,SAAS,mBACd,aACA,UAAyB,qBACnB;AACN,UAAQ,SAAS,CAAC,OAAO;AAAA,IACvB,GAAG;AAAA,IACH,aAAa,gBAAgB,SAAY,EAAE,cAAc;AAAA,IACzD,KAAK,EAAE,MAAM;AAAA,EACf,EAAE;AACJ;AAMO,SAAS,cACd,OACA,aACA,UAAyB,qBACnB;AACN,qBAAmB,aAAa,OAAO;AACvC,UAAQ,SAAS,EAAE,OAAO,SAAS,MAAM,CAAC;AAC5C;AAGO,SAAS,kBAAkB,UAAyB,qBAAoC;AAC7F,QAAM,EAAE,QAAQ,IAAI,QAAQ,SAAS;AACrC,MAAI,YAAY,KAAM,SAAQ,SAAS,EAAE,SAAS,KAAK,CAAC;AACxD,SAAO;AACT;AAWO,SAAS,qBACd,KACA,UAA4D,WAAW,cACvE,UAAyB,qBACb;AACZ,MAAI,CAAC,QAAS,QAAO,MAAM;AAAA,EAAC;AAC5B,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,QAAQ,QAAQ,GAAG,KAAK,MAAM;AACvD,QAAI,SAAS,OAAO,MAAM,UAAU,YAAY,CAAC,QAAQ,SAAS,EAAE;AAClE,cAAQ,SAAS,EAAE,OAAO,MAAM,OAAO,aAAa,MAAM,eAAe,KAAK,CAAC;AAAA,EACnF,QAAQ;AAAA,EAER;AACA,MAAI,OAAO;AACX,SAAO,QAAQ,UAAU,CAAC,EAAE,OAAO,YAAY,MAAM;AACnD,UAAM,OAAO,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC;AAClD,QAAI,SAAS,KAAM;AACnB,WAAO;AACP,QAAI;AACF,cAAQ,QAAQ,KAAK,IAAI;AAAA,IAC3B,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState, useSyncExternalStore } from "react";
|
|
2
|
+
import { searchChunks } from "@arbidocs/sdk/browser";
|
|
3
|
+
import { useArbi } from "../useArbi.js";
|
|
4
|
+
import {
|
|
5
|
+
clearSearchSession,
|
|
6
|
+
createSearchSession
|
|
7
|
+
} from "./session.js";
|
|
8
|
+
const IDLE = {
|
|
9
|
+
query: "",
|
|
10
|
+
results: [],
|
|
11
|
+
searched: false,
|
|
12
|
+
status: "idle",
|
|
13
|
+
error: null
|
|
14
|
+
};
|
|
15
|
+
function useSemanticSearch(docIds = [], options = {}) {
|
|
16
|
+
const arbi = useArbi();
|
|
17
|
+
const [ownSession] = useState(createSearchSession);
|
|
18
|
+
const session = options.session ?? ownSession;
|
|
19
|
+
const { model, workspaceId } = options;
|
|
20
|
+
const state = useSyncExternalStore(session.subscribe, session.getState, session.getState);
|
|
21
|
+
const foreign = !!workspaceId && !!state.workspaceId && state.workspaceId !== workspaceId;
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!workspaceId) return;
|
|
24
|
+
const current = session.getState().workspaceId;
|
|
25
|
+
if (current !== workspaceId) {
|
|
26
|
+
if (current) clearSearchSession(workspaceId, session);
|
|
27
|
+
else session.setState({ workspaceId });
|
|
28
|
+
}
|
|
29
|
+
}, [session, workspaceId]);
|
|
30
|
+
const search = useCallback(
|
|
31
|
+
async (query, mode = "hybrid") => {
|
|
32
|
+
const trimmed = query.trim();
|
|
33
|
+
if (!trimmed) {
|
|
34
|
+
clearSearchSession(void 0, session);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const run = session.getState().run + 1;
|
|
38
|
+
const searched = workspaceId ?? session.getState().workspaceId ?? void 0;
|
|
39
|
+
session.setState((s) => ({
|
|
40
|
+
query: trimmed,
|
|
41
|
+
status: "running",
|
|
42
|
+
error: null,
|
|
43
|
+
run,
|
|
44
|
+
workspaceId: workspaceId ?? s.workspaceId
|
|
45
|
+
}));
|
|
46
|
+
try {
|
|
47
|
+
const result = await arbi.assistant.retrieve(trimmed, docIds, {
|
|
48
|
+
searchMode: mode,
|
|
49
|
+
store: false,
|
|
50
|
+
...model ? { model } : {},
|
|
51
|
+
...searched ? { workspaceId: searched } : {}
|
|
52
|
+
});
|
|
53
|
+
if (session.getState().run !== run) return;
|
|
54
|
+
session.setState({ results: searchChunks(result), searched: true, status: "done" });
|
|
55
|
+
} catch (error) {
|
|
56
|
+
if (session.getState().run !== run) return;
|
|
57
|
+
session.setState({
|
|
58
|
+
status: "error",
|
|
59
|
+
error: error instanceof Error ? error.message : "Search failed"
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
[arbi, docIds, model, session, workspaceId]
|
|
64
|
+
);
|
|
65
|
+
const clear = useCallback(() => clearSearchSession(void 0, session), [session]);
|
|
66
|
+
const shown = foreign ? IDLE : state;
|
|
67
|
+
return {
|
|
68
|
+
query: shown.query,
|
|
69
|
+
results: shown.results,
|
|
70
|
+
searched: shown.searched,
|
|
71
|
+
status: shown.status,
|
|
72
|
+
error: shown.error,
|
|
73
|
+
isRunning: shown.status === "running",
|
|
74
|
+
search,
|
|
75
|
+
clear,
|
|
76
|
+
session
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
useSemanticSearch
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=useSemanticSearch.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/search/useSemanticSearch.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Search documents for passages: retrieval only, no LLM answer. One implementation for every\n * search surface (the search page, the \u2318K palette, a compact doc search).\n */\nimport { useCallback, useEffect, useState, useSyncExternalStore } from 'react'\nimport { searchChunks, type SearchChunk } from '@arbidocs/sdk/browser'\nimport { useArbi } from '../useArbi'\nimport {\n clearSearchSession,\n createSearchSession,\n type SearchSession,\n type SearchSessionState,\n type SearchStatus,\n} from './session'\n\nexport type SearchMode = 'semantic' | 'keyword' | 'hybrid'\n\nexport interface SemanticSearchOptions {\n /** The assistant configuration the search runs with; default the server's. */\n model?: string\n /**\n * Where the search lives. Default: this component's own (gone when it unmounts). Pass\n * `sharedSearchSession` for a page whose results outlive it.\n */\n session?: SearchSession\n /**\n * The workspace searched (default: the current one). The request names it; a session holding\n * another workspace's search starts over.\n */\n workspaceId?: string | null\n}\n\nexport interface SemanticSearch {\n /** The query last searched. */\n query: string\n /** Its passages, best first. */\n results: SearchChunk[]\n /** A search has finished with results to show (they stay while the next one runs). */\n searched: boolean\n status: SearchStatus\n error: string | null\n isRunning: boolean\n /** Search; an empty query clears. */\n search: (query: string, mode?: SearchMode) => Promise<void>\n /** Back to nothing searched. */\n clear: () => void\n session: SearchSession\n}\n\nconst IDLE: Pick<SearchSessionState, 'query' | 'results' | 'searched' | 'status' | 'error'> = {\n query: '',\n results: [],\n searched: false,\n status: 'idle',\n error: null,\n}\n\n/**\n * Search `docIds` (none: the whole workspace) and return the matching passages. The reply is\n * ranked by the SDK's `searchChunks`; nothing is kept server-side.\n */\nexport function useSemanticSearch(\n docIds: string[] = [],\n options: SemanticSearchOptions = {}\n): SemanticSearch {\n const arbi = useArbi()\n const [ownSession] = useState(createSearchSession)\n const session = options.session ?? ownSession\n const { model, workspaceId } = options\n const state = useSyncExternalStore(session.subscribe, session.getState, session.getState)\n\n // Another workspace's search is not this one's: start over.\n const foreign = !!workspaceId && !!state.workspaceId && state.workspaceId !== workspaceId\n useEffect(() => {\n if (!workspaceId) return\n const current = session.getState().workspaceId\n if (current !== workspaceId) {\n if (current) clearSearchSession(workspaceId, session)\n else session.setState({ workspaceId })\n }\n }, [session, workspaceId])\n\n const search = useCallback(\n async (query: string, mode: SearchMode = 'hybrid') => {\n const trimmed = query.trim()\n if (!trimmed) {\n clearSearchSession(undefined, session)\n return\n }\n const run = session.getState().run + 1\n // The workspace searched, captured now: the request names it (opened for this session if it\n // is not the current one), so a switch while it runs cannot answer it from another workspace.\n const searched = workspaceId ?? session.getState().workspaceId ?? undefined\n session.setState((s) => ({\n query: trimmed,\n status: 'running',\n error: null,\n run,\n workspaceId: workspaceId ?? s.workspaceId,\n }))\n try {\n const result = await arbi.assistant.retrieve(trimmed, docIds, {\n searchMode: mode,\n store: false,\n ...(model ? { model } : {}),\n ...(searched ? { workspaceId: searched } : {}),\n })\n if (session.getState().run !== run) return\n session.setState({ results: searchChunks(result), searched: true, status: 'done' })\n } catch (error) {\n if (session.getState().run !== run) return\n session.setState({\n status: 'error',\n error: error instanceof Error ? error.message : 'Search failed',\n })\n }\n },\n [arbi, docIds, model, session, workspaceId]\n )\n\n const clear = useCallback(() => clearSearchSession(undefined, session), [session])\n\n const shown = foreign ? IDLE : state\n return {\n query: shown.query,\n results: shown.results,\n searched: shown.searched,\n status: shown.status,\n error: shown.error,\n isRunning: shown.status === 'running',\n search,\n clear,\n session,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAIA,SAAS,aAAa,WAAW,UAAU,4BAA4B;AACvE,SAAS,oBAAsC;AAC/C,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAoCP,MAAM,OAAwF;AAAA,EAC5F,OAAO;AAAA,EACP,SAAS,CAAC;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AACT;AAMO,SAAS,kBACd,SAAmB,CAAC,GACpB,UAAiC,CAAC,GAClB;AAChB,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,UAAU,IAAI,SAAS,mBAAmB;AACjD,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,EAAE,OAAO,YAAY,IAAI;AAC/B,QAAM,QAAQ,qBAAqB,QAAQ,WAAW,QAAQ,UAAU,QAAQ,QAAQ;AAGxF,QAAM,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,eAAe,MAAM,gBAAgB;AAC9E,YAAU,MAAM;AACd,QAAI,CAAC,YAAa;AAClB,UAAM,UAAU,QAAQ,SAAS,EAAE;AACnC,QAAI,YAAY,aAAa;AAC3B,UAAI,QAAS,oBAAmB,aAAa,OAAO;AAAA,UAC/C,SAAQ,SAAS,EAAE,YAAY,CAAC;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,CAAC;AAEzB,QAAM,SAAS;AAAA,IACb,OAAO,OAAe,OAAmB,aAAa;AACpD,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,CAAC,SAAS;AACZ,2BAAmB,QAAW,OAAO;AACrC;AAAA,MACF;AACA,YAAM,MAAM,QAAQ,SAAS,EAAE,MAAM;AAGrC,YAAM,WAAW,eAAe,QAAQ,SAAS,EAAE,eAAe;AAClE,cAAQ,SAAS,CAAC,OAAO;AAAA,QACvB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,QACA,aAAa,eAAe,EAAE;AAAA,MAChC,EAAE;AACF,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,UAAU,SAAS,SAAS,QAAQ;AAAA,UAC5D,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,UACzB,GAAI,WAAW,EAAE,aAAa,SAAS,IAAI,CAAC;AAAA,QAC9C,CAAC;AACD,YAAI,QAAQ,SAAS,EAAE,QAAQ,IAAK;AACpC,gBAAQ,SAAS,EAAE,SAAS,aAAa,MAAM,GAAG,UAAU,MAAM,QAAQ,OAAO,CAAC;AAAA,MACpF,SAAS,OAAO;AACd,YAAI,QAAQ,SAAS,EAAE,QAAQ,IAAK;AACpC,gBAAQ,SAAS;AAAA,UACf,QAAQ;AAAA,UACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,MAAM,QAAQ,OAAO,SAAS,WAAW;AAAA,EAC5C;AAEA,QAAM,QAAQ,YAAY,MAAM,mBAAmB,QAAW,OAAO,GAAG,CAAC,OAAO,CAAC;AAEjF,QAAM,QAAQ,UAAU,OAAO;AAC/B,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,WAAW,MAAM,WAAW;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|