@arbidocs/react 0.5.111 → 0.5.113
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/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.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.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.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.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.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/chat/useConversationActions.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The chat engine's actions on a conversation: send (a turn, or a comment to the people in a\n * thread), branch, retry, stop, and the run-control commands typed while a turn runs. A turn goes\n * through `arbi.assistant.ask`, its frames through the stream handlers, and its state lives in the\n * session (`ArbiSessionState`) and the conversation cache.\n */\n\nimport { pendingChatModelSave } from '../config/config-hooks'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { useQueryClient, type QueryClient } from '@tanstack/react-query'\nimport {\n ArbiApiError,\n STOP_REPEAT_WINDOW_MS,\n getRunToCancel,\n quotaFromStreamError,\n type ConversationResponse as Conversation,\n type ThreadsResponse,\n} from '@arbidocs/sdk/browser'\nimport type { components } from '@arbidocs/client'\nimport { notify } from '../shell'\nimport { arbiQueryKeys } from '../hooks'\nimport { useArbi } from '../useArbi'\nimport { useArbiHost } from '../host/config'\nimport { selectDraft, useArbiSessionStore } from '../session'\nimport type { ArbiSessionStore } from '../session/store'\nimport {\n invalidateConversationLists,\n isConversationShared,\n patchConversation,\n patchConversationList,\n removeConversationFromLists,\n} from '../conversation-list'\nimport {\n allConversationThreads,\n clearLoadingState,\n flushStreamingTokens,\n getThreadsQueryKey,\n updateUserMessageStateInCache,\n} from './conversation-cache'\nimport {\n assistantLabels,\n cachedAssistantMode,\n cachedMentionCandidates,\n isCommentToPeople,\n} from './conversation-mentions'\nimport { useAssistantName } from '../host/assistant-copy'\nimport { hasMessageBody, toMessageMentions, extractMentions } from './mentions'\nimport { takeDocumentForTurn } from './open-document'\nimport { agentChatOwnerOf, creatorOf } from './agent-chat-owner'\nimport { bindThreadDocument, boundDocumentOf } from './thread-binding'\nimport { resolveReplyTarget } from './reply-target'\nimport {\n confirmConversationWorkspace,\n conversationWorkspaceOf,\n watchConversationWorkspaces,\n} from './conversation-workspace'\nimport { useStreamHandlers, type StreamState } from './stream-handlers'\nimport {\n AGENT_CONTROL_COMMANDS,\n cachedQuotaUsedUp,\n disconnectAttachedRun,\n refuseChatWhenOffline,\n waitForResponseId,\n} from './turn-control'\n\ntype MessageInput = components['schemas']['MessageInput']\ntype MessageMention = components['schemas']['MessageMention']\n\n/** How long a dropped turn holds its generating state while the thread is re-read. */\nconst RECONCILE_TIMEOUT_MS = 5000\n\nexport interface SendMessageOptions {\n /** An explicit edit/fork, rather than appending a human message to the shared thread. */\n branch?: boolean\n queuedContinuation?: boolean\n queueOwnerAssistantId?: string\n queuedClientId?: string\n /**\n * Bypasses the normal single-pinned-document tools computation (the chat's documents and its\n * pin, see `buildTurnRequest`) for this one send.\n * The app's general \"pin a document\" feature is deliberately one-at-a-time\n * (`selectFullContextDocument`) \u2014 a pinned TEXT doc's full content goes\n * straight into the AGENT's chat prompt, so more than one at a time risks\n * blowing that context window. Generate image is a different resource\n * entirely: reference images never touch the agent's chat context \u2014 they go\n * to the separate ImageGen model in its own request \u2014 so multiple\n * references (e.g. \"combine these two logos\") don't compound against that\n * budget, even though they still cost real tokens against ImageGen's own\n * call. This lets that caller build its own tools object with every\n * selected reference doc instead of touching the single global pin.\n */\n toolsOverride?: MessageInput['tools']\n /**\n * Send in this conversation and workspace rather than the open ones: a follow-up captured when\n * its turn started (a deferred interjection), sent after the view may have moved on.\n */\n target?: TurnTarget\n}\n\n/** The conversation and workspace a turn belongs to, captured when it starts. */\nexport interface TurnTarget {\n workspaceId: string\n conversationId: string\n}\n\n/**\n * The draft a send leaves behind. A shared chat addresses ARBI again, except after a comment to\n * people: then the box is left empty, which a shared chat reads as a comment to the thread.\n */\nfunction draftAfterSend(\n queryClient: QueryClient,\n session: ArbiSessionStore,\n wasComment: boolean,\n assistantName: string\n): string {\n const shared = isConversationShared(queryClient, session.getState().conversationId)\n return shared && !wasComment ? `@${assistantName} ` : ''\n}\n\n/**\n * A queued follow-up the backend refused before its turn started: mark its bubble failed and\n * take it out of the queue, so it does not sit there as if it were still waiting.\n */\nfunction failQueuedContinuation(\n queryClient: QueryClient,\n session: ArbiSessionStore,\n streamState: {\n conversationId: string\n queuedUserMessageId: string | null\n queueOwnerAssistantId: string | null\n queuedClientId: string | null\n }\n): void {\n if (streamState.queuedUserMessageId) {\n updateUserMessageStateInCache(\n queryClient,\n streamState.conversationId,\n streamState.queuedUserMessageId,\n 'failed',\n false\n )\n }\n if (streamState.queuedClientId) {\n session.removeQueuedMessage(streamState.queuedClientId)\n }\n notify.error('Queued message failed to send')\n}\n\n/** The signed-in user's id, or null before the session is known. */\nfunction signedInUserId(arbi: { user: { identity: () => { externalId: string } | null } }) {\n try {\n return arbi.user.identity()?.externalId ?? null\n } catch {\n return null\n }\n}\n\n/** What the actions act on: the open workspace and conversation, as the session holds them. */\nexport interface ConversationActionsInput {\n selectedWorkspaceId: string | null\n /** The cursor when the view rendered (the stream handlers place a branch against it). */\n parentMessageId: string | null\n /** The open conversation's key (`new` for a new chat). */\n conversationKey: string\n isGenerating: boolean\n lastFailedMessage: string | null\n}\n\n/** The actions on the open conversation. */\nexport function useConversationActions({\n selectedWorkspaceId,\n parentMessageId,\n conversationKey,\n isGenerating,\n lastFailedMessage,\n}: ConversationActionsInput) {\n const queryClient = useQueryClient()\n const session = useArbiSessionStore()\n const currentConversationId = conversationKey === 'new' ? null : conversationKey\n const invalidateUserWorkspaces = useCallback(\n () => void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.workspaces() }),\n [queryClient]\n )\n\n const arbi = useArbi()\n // Each conversation stays in the workspace it was opened in, though the surface switches.\n useState(() => watchConversationWorkspaces(queryClient, session))\n const createHandlers = useStreamHandlers()\n const chatHost = useArbiHost().chat\n const assistantName = useAssistantName()\n const mentionCandidates = useCallback(\n () =>\n cachedMentionCandidates(\n queryClient,\n session.getState().workspaceId,\n signedInUserId(arbi),\n assistantName\n ),\n [queryClient, session, arbi, assistantName]\n )\n // The local stream a Stop is closing. Stop cancels the run on the server before it aborts the\n // stream, so the connection can drop first with a network error that is not an abort.\n const stoppedStreamRef = useRef<AbortController | null>(null)\n // True while a Stop's server cancel is in flight, so a second press does not cancel again.\n const stopInFlightRef = useRef(false)\n // When the last Stop was pressed. A press within STOP_REPEAT_WINDOW_MS of it is a double tap.\n const lastStopAtRef = useRef(0)\n // True while a Retry deletes and resends, so a second press does not do it again.\n const retryInFlightRef = useRef(false)\n // Lets sendMessage resubmit a deferred interjection as a new turn without a\n // self-reference (it is a useCallback that would otherwise close over a stale\n // or not-yet-defined copy of itself). Kept current just below its definition.\n const sendMessageRef = useRef<\n | ((content: string, parentId?: string | null, options?: SendMessageOptions) => Promise<void>)\n | null\n >(null)\n\n /**\n * Shared posts, and posts in a `mentioned` thread, run ARBI only when addressed; posts in an\n * ordinary solo chat address it implicitly.\n */\n const routeMessage = useCallback(\n (content: string, conversationId?: string | null) => {\n const state = session.getState()\n const convId = conversationId === undefined ? state.conversationId : conversationId\n const { newConversationAssistantMode } = state\n const candidates = mentionCandidates()\n const mentioned = extractMentions(content, candidates)\n const assistantMode = cachedAssistantMode(queryClient, convId, newConversationAssistantMode)\n const isComment = isCommentToPeople(queryClient, convId, content, candidates)\n const mentions = toMessageMentions(mentioned) as MessageMention[]\n // A message not taken as a comment addresses ARBI. In an existing `mentioned` thread that is\n // only one that @mentions it; what is left is the first message of a thread not created\n // yet, whose turn creates it in `mentioned` mode.\n if (\n !isComment &&\n assistantMode === 'mentioned' &&\n !mentions.some((m) => m.type === 'assistant')\n ) {\n mentions.push({ type: 'assistant' })\n }\n return {\n mentions,\n assistantMode,\n isComment,\n }\n },\n [queryClient, session, mentionCandidates]\n )\n\n /** Post a comment (no assistant run) and land the thread on it. */\n const postComment = useCallback(\n async (\n content: string,\n parentId: string | null,\n mentions: MessageMention[],\n branch = false\n ) => {\n const convId = session.getState().conversationId\n try {\n const saved = await arbi.conversations.postMessage({\n content,\n mentions,\n // Only an explicit edit creates a branch. Ordinary comments append to the\n // server's latest message, so simultaneous sends stay visible together. Else\n // (nothing yet) start a thread. The mode only applies to a conversation it creates.\n ...(branch && parentId\n ? { previous_message_ext_id: parentId }\n : convId\n ? { conversation_ext_id: convId }\n : {}),\n assistant_mode: 'mentioned',\n })\n const conversationId = saved.conversation_ext_id\n const nowIso = new Date().toISOString()\n if (!convId) {\n // A comment starts the thread without a turn to carry its binding: bind it right after.\n const bindTo = session.getState().newChatDocumentId\n session.moveConversation('new', conversationId)\n if (bindTo) session.setNewChatDocumentId(null)\n patchConversationList(queryClient, session.getState().workspaceId, (old) => [\n {\n external_id: conversationId,\n title: content.slice(0, 40),\n created_by_ext_id: saved.created_by_ext_id,\n updated_by_ext_id: null,\n created_at: nowIso,\n updated_at: nowIso,\n // A mention of someone who cannot see it yet shares it server-side: refetched below.\n is_shared: false,\n message_count: 1,\n last_message_status: 'completed',\n assistant_mode: 'mentioned',\n } as Conversation,\n ...old,\n ])\n if (bindTo)\n bindThreadDocument(arbi, queryClient, conversationId, bindTo).catch(() =>\n notify.error('Could not attach the document to this thread')\n )\n invalidateUserWorkspaces()\n } else {\n patchConversation(queryClient, conversationId, (c) => ({\n ...c,\n message_count: c.message_count + 1,\n updated_at: nowIso,\n }))\n }\n // Mentioning someone shares the conversation on the server, which this cache cannot know.\n if (mentions.some((m) => m.type === 'user')) {\n await invalidateConversationLists(queryClient)\n }\n await queryClient.invalidateQueries({ queryKey: getThreadsQueryKey(conversationId) })\n session.setCursor(saved.external_id)\n } catch (error) {\n notify.error(\n (error instanceof ArbiApiError && error.detail) || 'Failed to post the message'\n )\n // Give the text back rather than lose it.\n if (!selectDraft(session.getState())) session.setDraft(content)\n }\n },\n [arbi, session, queryClient, invalidateUserWorkspaces]\n )\n\n const sendMessage = useCallback(\n async (content: string, requestedParentId?: string | null, options?: SendMessageOptions) => {\n // Never reply to a failed or deleted message: the server refuses it, so every Retry and every\n // new message would fail again. A queued follow-up names the running turn on purpose. With\n // nothing above to reply to, the parent stays: only a fresh conversation could take it.\n const target = options?.target\n const parentId =\n options?.queuedContinuation || !requestedParentId\n ? requestedParentId\n : (resolveReplyTarget(\n queryClient,\n (target ? target.conversationId : session.getState().conversationId) || 'new',\n requestedParentId\n ) ?? requestedParentId)\n const route = routeMessage(content, target?.conversationId)\n if (route.isComment && !options?.queuedContinuation && !target) {\n await postComment(content, parentId ?? null, route.mentions, options?.branch)\n return\n }\n // A model picked just now is still being saved: the turn runs on it, not on the config before.\n const modelSave = pendingChatModelSave(session)\n if (modelSave) await modelSave.catch(() => undefined)\n const state = session.getState()\n const convId = target ? target.conversationId : state.conversationId\n const convKey = convId || 'new'\n // The turn's workspace, captured now: the conversation's own (a docked or scoped chat keeps\n // its conversation across a switch), else the surface's for a new conversation. Named on the\n // request, so neither a switch nor the session's open workspace can move it.\n const turnWorkspaceId =\n target?.workspaceId ?? conversationWorkspaceOf(queryClient, convId) ?? selectedWorkspaceId\n const agentChat = state.newAgentChat\n // An existing conversation's agent: as recorded, else its creator when that is one of the\n // person's own agents (an agent chat runs under the agent's session; the record does not\n // survive a sign-out, or another device).\n let agentExtId = convId\n ? state.agentChatOwners[convId]\n : agentChat?.workspaceId === turnWorkspaceId\n ? agentChat.agentId\n : undefined\n // Only a conversation an agent created is looked up (an ordinary send never waits on it).\n if (convId && !agentExtId && creatorOf(queryClient, convId)?.startsWith('agt-')) {\n agentExtId = await agentChatOwnerOf(queryClient, () => arbi.agents.list(), convId)\n if (agentExtId) session.setAgentChatOwner(convId, agentExtId)\n }\n const queuedContinuation = options?.queuedContinuation === true\n // First message of a brand-new conversation bumps the workspace's\n // conversation_count \u2014 used to tick the \"Ask ARBI\" onboarding step.\n const isNewConversation = !convId\n\n const documentIds = (state.conversationDocuments[convKey] || []).map((doc) => doc.docId)\n // The chat's facts ride every message of it (snapshot semantics, like its documents).\n const factIds = [...(state.conversationFacts[convKey] || [])]\n\n const newConfigId = state.chatModel\n\n // Frontend is the single source of truth for which config a request\n // uses (Option B): send the same config the model selector resolves &\n // displays (see useConversationSettings) \u2014 explicit per-conversation\n // choice (`newConfigId`) wins, otherwise the user's persisted\n // `last_config`, so a selected config (e.g. one with ARTIFACTS_ENABLED)\n // actually drives the chat instead of being silently dropped to an\n // empty config. `newConfigId` alone is insufficient \u2014 it is transient\n // and cleared on every new conversation. Read `last_config` from the\n // shared settings cache by partial key match: openapi-react-query\n // suffixes the query key with request options and the settings hook is\n // token-gated, so the hook value can momentarily be undefined here even\n // though the data is cached app-wide.\n const cachedSettings = queryClient\n .getQueriesData<{ last_config?: string }>({ queryKey: arbiQueryKeys.userSettings() })\n .map(([, data]) => data)\n .find((data) => data?.last_config)\n const lastConfigId = cachedSettings?.last_config\n const resolvedConfigId = newConfigId || (agentExtId ? undefined : lastConfigId)\n\n // PA mode delegates the turn to the personal agent (`buildTurnRequest` prefixes `/pa ` so\n // the backend routes it straight to the delegation stream).\n const isPaMode = !agentExtId && state.paMode\n\n // Drafting mode: the thread's own document is named (a reference, never its content): the one\n // the thread is bound to (started from it, or attached in it), else one made in this thread\n // and open. A document merely open beside a chat is not: a new chat starts unbound. While an\n // earlier version of it is on screen the viewer returns to the live document. For a Word\n // document the server binds the live document: the assistant reads what it needs on demand\n // and edits it as tracked changes. For an html/react artifact it gets the source and a\n // targeted edit tool. PA-mode turns are delegated to a separate agent and never touch\n // artifacts.\n const threadDocumentId = boundDocumentOf(queryClient, { ...state, conversationId: convId })\n const activeArtifactExtId = isPaMode\n ? null\n : takeDocumentForTurn({\n boundDocumentId: threadDocumentId,\n conversationId: convId,\n workspaceId: turnWorkspaceId,\n })\n\n // A workflow launch can leave structured tools for its one send; consume them here.\n const pendingTools = state.pendingTools\n if (pendingTools) session.setPendingTools(null)\n const toolsOverride = options?.toolsOverride ?? pendingTools ?? undefined\n\n const request = {\n question: content,\n workspaceId: turnWorkspaceId!,\n docIds: documentIds,\n pinnedDocumentId: state.pinnedDocumentId,\n factIds,\n tools: toolsOverride,\n personalAgent: isPaMode,\n activeArtifactExtId,\n // A new chat about a document is bound by its first turn, on the server (every device).\n ...(!convId && threadDocumentId ? { bindDocumentId: threadDocumentId } : {}),\n previousResponseId: parentId,\n agentId: agentExtId,\n model: resolvedConfigId,\n mentions: route.mentions,\n // A brand-new conversation starts in the mode picked in the composer.\n ...(!convId && route.assistantMode === 'mentioned'\n ? { assistantMode: 'mentioned' as const }\n : {}),\n }\n\n const abortController = new AbortController()\n if (!queuedContinuation) {\n session.setConversationGenerating(convKey, true, abortController)\n }\n\n // Optimistically mark this conversation in-progress the instant we start a\n // turn. Without this, Conversation's \"reconcile stale isGenerating\" effect\n // runs on the setConversationGenerating(true) above, sees the conversation\n // list's last_message_status still 'completed' from the PREVIOUS turn (the\n // stream_start patch below only lands ~50ms later), and immediately clears\n // isGenerating \u2014 which race-hid the live status bar on every follow-up\n // turn (first turns were exempt: the new conversation isn't in the list\n // yet). Patching here closes that window. No-op for a brand-new\n // conversation (convKey === 'new' isn't in the list).\n if (!queuedContinuation) {\n patchConversation(queryClient, convKey, { last_message_status: 'in_progress' })\n }\n\n // Mutable stream state \u2014 shared by all SSE handlers via closure\n const streamState: StreamState = {\n conversationId: convKey,\n workspaceId: turnWorkspaceId,\n assistantId: null,\n // 0 = nothing narrated yet, so nothing is owed a reading window.\n lastNarrationSettledAt: 0,\n // True once the model has pivoted to a tool call and not yet resumed\n // prose. Prose arriving while this is set opens a NEW narration, so the\n // one before it closes: paragraph break, and everything above becomes\n // superseded. Item boundaries alone cannot say this \u2014 the backend splits\n // a single sentence across several items.\n pivotedSinceProse: false,\n // Steering that landed too late to steer this turn; resubmitted as a new\n // turn once this one completes (see after the ask below).\n deferredInterjections: [],\n queuedContinuation,\n queuedUserMessageId: null,\n hasStreamStarted: false,\n queuedFailed: false,\n abortController,\n isStopped: () => stoppedStreamRef.current === abortController,\n queueOwnerAssistantId: options?.queueOwnerAssistantId ?? null,\n queuedClientId: options?.queuedClientId ?? null,\n // Set when a create_fact / label_facts tool runs this turn, so the Facts\n // table + label vocabulary refresh on completion (see handleComplete).\n factsTouched: false,\n threadDocumentId,\n // Set by the handlers: the server stored the question / reported its own failure.\n userMessageId: null,\n serverError: null,\n }\n\n // A follow-up sent for another conversation than the one on screen places itself under its own\n // parent, not under the screen's cursor.\n const handlers = createHandlers({\n streamState,\n parentMessageId: target ? (parentId ?? null) : parentMessageId,\n parentId,\n })\n // The server's word on the turn's workspace binds the conversation to it.\n const confirmTurnWorkspace = () => {\n if (streamState.workspaceId)\n confirmConversationWorkspace(\n queryClient,\n streamState.conversationId,\n streamState.workspaceId\n )\n }\n const onUserMessageInWorkspace = handlers.onUserMessage\n handlers.onUserMessage = (message) => {\n onUserMessageInWorkspace(message)\n confirmTurnWorkspace()\n }\n if (agentExtId) {\n const onUserMessage = handlers.onUserMessage\n handlers.onUserMessage = (message) => {\n if (message.conversation_ext_id) {\n session.setAgentChatOwner(message.conversation_ext_id, agentExtId)\n queryClient.invalidateQueries({ queryKey: arbiQueryKeys.agentChats(agentExtId) })\n }\n onUserMessage(message)\n }\n }\n\n const ownsActiveGeneration = () => {\n const activeGeneration = session.getState().generating[streamState.conversationId]\n return (\n activeGeneration?.abortController === abortController ||\n (!!streamState.assistantId &&\n activeGeneration?.streamingAssistantId === streamState.assistantId)\n )\n }\n\n try {\n performance.mark('arbi:send-message:start')\n await arbi.assistant.ask(request, {\n signal: abortController.signal,\n onMessageQueued: handlers.onMessageQueued,\n onUserMessage: handlers.onUserMessage,\n onStreamStart: handlers.onStreamStart,\n onToken: handlers.onToken,\n onMetadata: handlers.onMetadata,\n onError: handlers.onError,\n onComplete: handlers.onComplete,\n // `response.output_item.added` is deliberately NOT consumed: an item\n // opening told us only that SOME block had started, which is exactly the\n // guess this design gave up. Text arrives via onOutputTextDelta and\n // settles via onOutputItemDone.\n onOutputItemDone: handlers.onOutputItemDone,\n onOutputTextDelta: handlers.onOutputTextDelta,\n onUserInputRequest: handlers.onUserInputRequest,\n onProbeAnswer: handlers.onProbeAnswer,\n onDeferredInterjection: handlers.onDeferredInterjection,\n onAgentControlState: handlers.onAgentControlState,\n onArtifact: handlers.onArtifact,\n onMailDraft: handlers.onMailDraft,\n onElapsedTime: handlers.onElapsedTime,\n onContextUpdate: handlers.onContextUpdate,\n onQuotaExceeded: (quota) => chatHost?.onQuotaExceeded?.(quota),\n onWorkspace: (workspaceId) => {\n streamState.workspaceId = workspaceId\n confirmTurnWorkspace()\n },\n })\n // The stream is over: commit the text still waiting for a frame now, while the message is\n // the streamed one. Left buffered, it lands after the thread is re-read and is appended\n // to the answer the server stored.\n flushStreamingTokens(queryClient)\n\n // A steering response has no assistant stream of its own. The backend\n // accepted the queued user message into the active tool loop. Keep it\n // visibly queued until the parent stream emits its interjection step at\n // the actual tool boundary; that event settles the cache entry.\n if (queuedContinuation && !streamState.hasStreamStarted) {\n if (streamState.queuedFailed) failQueuedContinuation(queryClient, session, streamState)\n return\n }\n\n // The server refused the turn before storing anything (a parent that is gone, a model\n // that is down): say the send failed and offer Retry with the question, instead of letting\n // it vanish with nothing in the thread. Re-read the thread in case the server did store it.\n if (\n streamState.serverError &&\n !streamState.userMessageId &&\n !streamState.assistantId &&\n !queuedContinuation\n ) {\n if (ownsActiveGeneration()) {\n session.setConversationError(\n streamState.conversationId,\n streamState.serverError,\n content\n )\n void queryClient.invalidateQueries({\n queryKey: getThreadsQueryKey(streamState.conversationId),\n })\n // Undo the optimistic 'in_progress' set when the send started.\n void invalidateConversationLists(queryClient)\n }\n return\n }\n\n const ownsGeneration = ownsActiveGeneration()\n if (ownsGeneration) {\n session.setConversationGenerating(streamState.conversationId, false, null)\n }\n\n // The user's own generation just consumed AI usage \u2014 refresh the\n // \"\u00A3 used today\" indicator now instead of polling for it.\n queryClient.invalidateQueries({ queryKey: arbiQueryKeys.userUsageToday() })\n\n // Steering that reached the agent too late to steer this turn was\n // deferred by the backend rather than allowed to derail the answer.\n // Now that the turn is done, submit it as a new turn \u2014 threaded off the\n // assistant message that just finished, exactly as if the user had sent\n // it a moment later. Sent as one turn so a burst reads as a single\n // follow-up. Fire-and-forget via the ref so we don't block this turn's\n // completion bookkeeping (and to sidestep the self-reference).\n if (streamState.deferredInterjections.length > 0) {\n const followUp = streamState.deferredInterjections.join('\\n\\n')\n const threadParent = streamState.assistantId\n if (threadParent) {\n session.clearQueuedMessages(threadParent)\n }\n // In the conversation and workspace of the turn it steered, captured now: the view (or\n // the surface's workspace) may have moved on while the turn ran.\n void sendMessageRef.current?.(\n followUp,\n threadParent,\n streamState.workspaceId && streamState.conversationId !== 'new'\n ? {\n target: {\n workspaceId: streamState.workspaceId,\n conversationId: streamState.conversationId,\n },\n }\n : undefined\n )\n }\n\n // The conversations list cache is patched to 'in_progress' on stream\n // start (see the stream handlers). Patch it back to 'completed' here\n // so the Status column / sidebar reflect reality without a refetch.\n if (ownsGeneration) {\n const lastStatus = streamState.serverError ? 'failed' : 'completed'\n patchConversation(queryClient, streamState.conversationId, {\n last_message_status: lastStatus,\n })\n }\n\n // A new conversation changes the workspace's conversation_count \u2014 refresh\n // the workspaces list so onboarding's \"Ask ARBI\" step ticks reactively.\n if (isNewConversation && ownsGeneration) invalidateUserWorkspaces()\n\n if (ownsGeneration) {\n clearLoadingState(queryClient, streamState.conversationId)\n }\n } catch (error) {\n flushStreamingTokens(queryClient)\n const isAbort = error instanceof Error && error.name === 'AbortError'\n // The server stored the turn and only the connection dropped: the run is not over.\n const isDroppedConnection = !streamState.serverError && !isAbort && !streamState.isStopped()\n if (queuedContinuation && !streamState.hasStreamStarted) {\n // The server holds this follow-up in its queue already, and runs it in turn.\n if (isDroppedConnection && streamState.queuedUserMessageId) {\n if (streamState.queuedClientId) {\n session.removeQueuedMessage(streamState.queuedClientId)\n }\n void queryClient.invalidateQueries({\n queryKey: getThreadsQueryKey(streamState.conversationId),\n })\n return\n }\n failQueuedContinuation(queryClient, session, streamState)\n return\n }\n\n if (streamState.isStopped() || isAbort) {\n console.debug('Message sending was aborted by user')\n // The stopped stream leaves its assistant message loading with no stream behind it, and\n // a queued follow-up is not the owner so nothing else clears it. Clear it and re-read the\n // thread: a follow-up the server still runs is attached again, a stopped one shows its end.\n clearLoadingState(queryClient, streamState.conversationId)\n void queryClient.invalidateQueries({\n queryKey: getThreadsQueryKey(streamState.conversationId),\n })\n if (ownsActiveGeneration()) {\n session.setConversationGenerating(streamState.conversationId, false, null)\n patchConversation(queryClient, streamState.conversationId, {\n last_message_status: 'completed',\n })\n }\n return\n }\n\n console.error('Message sending failed:', error)\n if (!ownsActiveGeneration()) return\n\n // A dropped connection after the server stored the question does not end the turn: the\n // run goes on there. Failing it here offered Retry, which deleted the question under the\n // live answer (its answer then landed in the thread with no question) and, if the resend\n // failed too, left the view on the deleted turn. Re-read the thread instead: a running\n // answer is attached again, a failed one shows Retry, a finished one shows its answer.\n // Generation is held until the thread is re-read (or a few seconds pass, offline), so no\n // \"Response Incomplete\" alert offers to delete the question meanwhile.\n if (isDroppedConnection && streamState.userMessageId) {\n let timer: ReturnType<typeof setTimeout> | undefined\n await Promise.race([\n queryClient.invalidateQueries({\n queryKey: getThreadsQueryKey(streamState.conversationId),\n }),\n new Promise((resolve) => {\n timer = setTimeout(resolve, RECONCILE_TIMEOUT_MS)\n }),\n ])\n clearTimeout(timer)\n clearLoadingState(queryClient, streamState.conversationId)\n if (ownsActiveGeneration()) {\n session.setConversationGenerating(streamState.conversationId, false, null)\n }\n void invalidateConversationLists(queryClient)\n return\n }\n\n patchConversation(queryClient, streamState.conversationId, {\n last_message_status: 'failed',\n })\n\n // Open the upgrade modal if either (a) the error string carries\n // LiteLLM's ExceededBudget payload directly, or (b) the project's\n // cached AI usage is used up. Either path beats showing only\n // the conversation's generic error.\n const quota =\n quotaFromStreamError(error) ??\n cachedQuotaUsedUp(queryClient, session.getState().workspaceId)\n if (quota) chatHost?.onQuotaExceeded?.(quota)\n\n session.setConversationError(\n streamState.conversationId,\n error instanceof Error ? error.message : String(error),\n content\n )\n }\n },\n [\n selectedWorkspaceId,\n parentMessageId,\n queryClient,\n session,\n createHandlers,\n chatHost,\n arbi,\n invalidateUserWorkspaces,\n routeMessage,\n postComment,\n ]\n )\n\n // Keep the ref pointing at the latest sendMessage so the deferred-interjection\n // resubmit inside sendMessage always calls the current closure.\n sendMessageRef.current = sendMessage\n\n const handleCreateBranch = useCallback(\n async (parentMessageExtId: string | null, newContent: string) => {\n if (!newContent.trim() || !selectedWorkspaceId) return\n await sendMessage(newContent, parentMessageExtId, { branch: true })\n },\n [selectedWorkspaceId, sendMessage]\n )\n\n const handleSendMessage = useCallback(\n async (options?: SendMessageOptions) => {\n const currentMessage = selectDraft(session.getState()).trim()\n // The draft a shared thread starts with (`@<assistant> `) is not a question yet.\n if (!selectedWorkspaceId || !hasMessageBody(currentMessage, assistantLabels(assistantName)))\n return\n\n // A send consumes the suggested follow-up, whether or not it was used \u2014\n // the next turn's metadata brings a fresh one.\n session.setSuggestedQuery(null)\n\n // Chat runs against the server-side AI \u2014 there's nothing to queue offline.\n // Don't fire a mutation that would just pause and hang; tell the user.\n if (refuseChatWhenOffline()) return\n\n // While a turn is active, only true out-of-band controls use /interject.\n // Ordinary text still goes through the typed query endpoint, whose\n // arbi.message_queued event persists and renders it before the response gate\n // opens. The backend then either steers it into the next tool boundary or\n // starts a normal follow-up turn after the current final answer completes.\n if (isGenerating) {\n const convKey = session.getState().conversationId || 'new'\n const genState = session.getState().generating[convKey]\n const streamingAssistantId = genState?.streamingAssistantId\n\n // In a thread, a message that does not @mention the assistant is a comment between\n // people: post it straight away instead of queueing it into the running turn.\n const route = routeMessage(currentMessage)\n if (route.isComment && streamingAssistantId) {\n session.setDraft(draftAfterSend(queryClient, session, route.isComment, assistantName))\n await postComment(currentMessage, streamingAssistantId, route.mentions)\n return\n }\n\n if (streamingAssistantId) {\n const command = currentMessage.toLowerCase()\n const isPause = command === AGENT_CONTROL_COMMANDS.pause\n const isResume = command === AGENT_CONTROL_COMMANDS.resume\n const isReport =\n command === AGENT_CONTROL_COMMANDS.report ||\n command.startsWith(`${AGENT_CONTROL_COMMANDS.report} `)\n\n session.setDraft(draftAfterSend(queryClient, session, route.isComment, assistantName))\n\n if (isPause) {\n session.setAgentControlState(streamingAssistantId, 'pausing')\n } else if (isResume) {\n session.setAgentControlState(streamingAssistantId, 'resuming')\n } else if (isReport) {\n session.setAgentProbePending(streamingAssistantId, true)\n }\n\n if (isPause || isResume || isReport) {\n await arbi.assistant.interject(streamingAssistantId, currentMessage)\n } else {\n const queuedClientId = `queued-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n session.addQueuedMessage(streamingAssistantId, {\n clientId: queuedClientId,\n content: currentMessage,\n serverId: null,\n acknowledged: false,\n createdAt: Date.now(),\n })\n await sendMessage(currentMessage, streamingAssistantId, {\n ...options,\n queuedContinuation: true,\n queueOwnerAssistantId: streamingAssistantId,\n queuedClientId,\n })\n }\n return\n }\n // Keep the draft intact during the brief pre-stream window.\n return\n }\n\n const parentId = session.getState().cursor\n\n session.setDraft(\n draftAfterSend(queryClient, session, routeMessage(currentMessage).isComment, assistantName)\n )\n\n await sendMessage(currentMessage, parentId, options)\n },\n [\n selectedWorkspaceId,\n isGenerating,\n session,\n sendMessage,\n arbi,\n routeMessage,\n postComment,\n queryClient,\n assistantName,\n ]\n )\n\n const handleAbortGeneration = useCallback(async () => {\n // A second press (a double-click) must not stop the run again: it would cancel twice, and\n // once the local abort has landed it would clear the stopped-stream marker, so the stream's\n // error would read as a failed answer.\n const stream = session.getState().generating[conversationKey]\n if (stopInFlightRef.current || stream?.isGenerating === false) return\n // A tap right after a Stop must not stop the follow-up the queue started in the meantime.\n if (Date.now() - lastStopAtRef.current < STOP_REPEAT_WINDOW_MS) return\n lastStopAtRef.current = Date.now()\n stopInFlightRef.current = true\n try {\n // Stop the run on the server first; closing the stream alone leaves it running and\n // its answer would arrive later.\n const controller = stream?.abortController ?? null\n stoppedStreamRef.current = controller\n let streamKey = conversationKey\n let responseId = stream?.streamingAssistantId ?? null\n // Pressed before the stream reported its id: the run already exists on the server, so wait\n // for the id instead of only closing the stream. Further presses meanwhile do nothing.\n if (!responseId && controller) {\n const reported = await waitForResponseId(session, controller)\n if (reported) {\n streamKey = reported.conversationKey\n responseId = reported.responseId\n }\n }\n // In a sub-agent's branch this is the run that delegated it.\n const threads =\n queryClient.getQueryData<ThreadsResponse>(getThreadsQueryKey(streamKey))?.threads ?? []\n const runId = responseId ? getRunToCancel(threads, responseId) : null\n if (runId) {\n try {\n await arbi.assistant.cancel(runId)\n } catch {\n // Still stop here (the run may already have ended); say the server may keep going.\n notify.warning(\n \"Stopped here, but the server didn't confirm: the answer may still appear later.\"\n )\n }\n }\n // The cancel is awaited, and the server starts the next queued follow-up as soon as it lands:\n // that follow-up may already own this conversation's generation state and attach. Only close\n // the stream this Stop belongs to, or the next answer goes silent (\"Working\", no stop square).\n const current = session.getState().generating[streamKey]\n const isStoppedStream = controller\n ? current?.abortController === controller\n : !current?.streamingAssistantId || current.streamingAssistantId === responseId\n if (isStoppedStream) session.abortConversationGeneration(streamKey)\n // A reattached run has no local controller: close its stream too, or it keeps painting. The\n // attach follows this conversation's streaming message (in a sub-agent branch, the branch's\n // reply), not the delegating run that was cancelled, so match it by that id.\n if (responseId) disconnectAttachedRun(streamKey, responseId)\n } finally {\n stopInFlightRef.current = false\n }\n }, [session, arbi, conversationKey, queryClient])\n\n const handleRetryOrphanedMessage = useCallback(\n async (messageContent: string, parentId: string | null, messageExtId: string) => {\n // One retry at a time: the alert's Retry and the composer's retry (or a double click) must\n // not delete and resend twice. Released however the retry ends.\n if (retryInFlightRef.current) return\n // Offline the delete would be paused and the resend refused, leaving neither done.\n if (refuseChatWhenOffline()) return\n retryInFlightRef.current = true\n try {\n // A failed parent (a follow-up the restart sweep failed behind a failed answer) is\n // refused by the server, so the resend goes to the nearest message above it instead.\n const replyTo = currentConversationId\n ? resolveReplyTarget(queryClient, currentConversationId, parentId)\n : parentId\n if (!replyTo && currentConversationId) {\n try {\n await arbi.conversations.delete(currentConversationId)\n removeConversationFromLists(queryClient, currentConversationId)\n session.startNewConversation()\n } catch (error) {\n console.error('Failed to delete conversation with orphaned first message:', error)\n }\n } else if (replyTo) {\n try {\n await arbi.conversations.deleteMessage(messageExtId)\n // The message and its replies are gone from whichever thread held them.\n void queryClient.invalidateQueries(allConversationThreads)\n } catch (error) {\n console.error('Failed to delete orphaned message:', error)\n }\n }\n\n await sendMessage(messageContent, replyTo)\n } finally {\n retryInFlightRef.current = false\n }\n },\n [currentConversationId, arbi, session, sendMessage, queryClient]\n )\n\n const handleRetrySend = useCallback(async () => {\n if (isGenerating || !lastFailedMessage || retryInFlightRef.current) return\n if (refuseChatWhenOffline()) return\n retryInFlightRef.current = true\n try {\n session.clearConversationError(conversationKey)\n // sendMessage replies to the nearest message the server accepts: the view may still point at\n // a turn a Retry deleted, or at a failed answer.\n const parentId = session.getState().cursor\n await sendMessage(lastFailedMessage, parentId)\n } finally {\n retryInFlightRef.current = false\n }\n }, [isGenerating, lastFailedMessage, session, conversationKey, sendMessage])\n\n const clearErrorState = useCallback(() => {\n session.clearConversationError(conversationKey)\n }, [session, conversationKey])\n\n // Clear error state when starting a new conversation\n useEffect(() => {\n if (currentConversationId === null) {\n session.clearConversationError('new')\n }\n }, [currentConversationId, session])\n\n return {\n handleCreateBranch,\n handleSendMessage,\n handleAbortGeneration,\n handleRetrySend,\n handleRetryOrphanedMessage,\n clearErrorState,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
2
|
+
import {
|
|
3
|
+
extractDocumentIdsFromMessages,
|
|
4
|
+
extractFactIdsFromMessages,
|
|
5
|
+
hydrateAgentSteps,
|
|
6
|
+
pickMainThread
|
|
7
|
+
} from "@arbidocs/sdk/browser";
|
|
8
|
+
import { useConversationThreads } from "../hooks.js";
|
|
9
|
+
import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
|
|
10
|
+
const CONVERSATION_SWITCH_MEASURE = "arbi:conversation-switch:ready";
|
|
11
|
+
const SWITCH_START = "arbi:conversation-switch:start";
|
|
12
|
+
function mark(name) {
|
|
13
|
+
try {
|
|
14
|
+
performance.mark(name);
|
|
15
|
+
} catch {
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function measureSwitch() {
|
|
19
|
+
try {
|
|
20
|
+
if (performance.getEntriesByName(SWITCH_START, "mark").length === 0) return;
|
|
21
|
+
performance.measure(CONVERSATION_SWITCH_MEASURE, SWITCH_START, CONVERSATION_SWITCH_MEASURE);
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function selectThread(session, leafId) {
|
|
26
|
+
if (session.getState().cursor !== leafId) session.setCursor(leafId);
|
|
27
|
+
}
|
|
28
|
+
function useConversationData() {
|
|
29
|
+
const session = useArbiSessionStore();
|
|
30
|
+
const selectedWorkspaceId = useArbiSessionState((s) => s.workspaceId);
|
|
31
|
+
const currentConversationId = useArbiSessionState((s) => s.conversationId);
|
|
32
|
+
const parentMessageId = useArbiSessionState((s) => s.cursor);
|
|
33
|
+
const deepLinkMessageId = useArbiSessionState((s) => s.deepLinkMessageId);
|
|
34
|
+
const {
|
|
35
|
+
data: threadsData,
|
|
36
|
+
isLoading: threadsLoading,
|
|
37
|
+
error: threadsError
|
|
38
|
+
} = useConversationThreads(currentConversationId || void 0);
|
|
39
|
+
const processedDeepLinkRef = useRef(null);
|
|
40
|
+
const prevConversationIdRef = useRef(null);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!threadsData?.threads || threadsData.threads.length === 0 || !currentConversationId) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const threads2 = threadsData.threads;
|
|
46
|
+
if (deepLinkMessageId) {
|
|
47
|
+
if (processedDeepLinkRef.current === deepLinkMessageId) return;
|
|
48
|
+
const threadWithMessage = pickMainThread(
|
|
49
|
+
threads2.filter((t) => t.history.some((m) => m.external_id === deepLinkMessageId))
|
|
50
|
+
);
|
|
51
|
+
if (threadWithMessage) {
|
|
52
|
+
const leafId = threadWithMessage.leaf_message_ext_id;
|
|
53
|
+
if (!leafId || leafId === deepLinkMessageId) session.setDeepLinkMessageId(null);
|
|
54
|
+
processedDeepLinkRef.current = deepLinkMessageId;
|
|
55
|
+
if (leafId) selectThread(session, leafId);
|
|
56
|
+
} else {
|
|
57
|
+
const firstLeaf = pickMainThread(threads2)?.leaf_message_ext_id;
|
|
58
|
+
if (firstLeaf) selectThread(session, firstLeaf);
|
|
59
|
+
session.setDeepLinkMessageId(null);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
processedDeepLinkRef.current = null;
|
|
64
|
+
if (!parentMessageId) {
|
|
65
|
+
const defaultThread = pickMainThread(threads2);
|
|
66
|
+
const firstThreadId = defaultThread?.leaf_message_ext_id;
|
|
67
|
+
if (firstThreadId) {
|
|
68
|
+
selectThread(session, firstThreadId);
|
|
69
|
+
const history = defaultThread?.history || [];
|
|
70
|
+
const key = session.getState().conversationId || "new";
|
|
71
|
+
const documents = extractDocumentIdsFromMessages(history);
|
|
72
|
+
if (documents.length > 0 && session.getState().conversationDocuments[key] === void 0)
|
|
73
|
+
session.setConversationDocuments(key, documents);
|
|
74
|
+
const factIds = extractFactIdsFromMessages(history);
|
|
75
|
+
if (factIds && factIds.length > 0) session.setConversationFacts(key, factIds);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (session.getState().generating[currentConversationId]?.isGenerating) return;
|
|
80
|
+
if (threads2.some((t) => t.leaf_message_ext_id === parentMessageId)) return;
|
|
81
|
+
const threadContainingMessage = pickMainThread(
|
|
82
|
+
threads2.filter((t) => t.history.some((m) => m.external_id === parentMessageId))
|
|
83
|
+
);
|
|
84
|
+
if (threadContainingMessage?.leaf_message_ext_id) {
|
|
85
|
+
selectThread(session, threadContainingMessage.leaf_message_ext_id);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const mainLeaf = pickMainThread(threads2)?.leaf_message_ext_id;
|
|
89
|
+
if (mainLeaf) selectThread(session, mainLeaf);
|
|
90
|
+
}, [threadsData, parentMessageId, currentConversationId, deepLinkMessageId, session]);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!currentConversationId) return;
|
|
93
|
+
if (prevConversationIdRef.current !== null && prevConversationIdRef.current !== currentConversationId) {
|
|
94
|
+
mark(SWITCH_START);
|
|
95
|
+
}
|
|
96
|
+
prevConversationIdRef.current = currentConversationId;
|
|
97
|
+
}, [currentConversationId]);
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
if (!threadsData || !currentConversationId) return;
|
|
100
|
+
mark(CONVERSATION_SWITCH_MEASURE);
|
|
101
|
+
measureSwitch();
|
|
102
|
+
}, [threadsData, currentConversationId]);
|
|
103
|
+
const messageHistory = useMemo(() => {
|
|
104
|
+
if (!threadsData?.threads || threadsData.threads.length === 0) return [];
|
|
105
|
+
const threads2 = threadsData.threads;
|
|
106
|
+
const thread = parentMessageId && threads2.find((t) => t.leaf_message_ext_id === parentMessageId) || pickMainThread(threads2);
|
|
107
|
+
const history = thread?.history || [];
|
|
108
|
+
return history.map((message) => {
|
|
109
|
+
if (message.agentSteps) return message;
|
|
110
|
+
const hydrated = hydrateAgentSteps(message);
|
|
111
|
+
if (!hydrated) return message;
|
|
112
|
+
return {
|
|
113
|
+
...message,
|
|
114
|
+
agentSteps: hydrated.steps,
|
|
115
|
+
agentStepsTotalElapsed: hydrated.totalElapsed,
|
|
116
|
+
finalContextUsage: hydrated.finalContext
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}, [threadsData, parentMessageId]);
|
|
120
|
+
const threads = useMemo(() => threadsData?.threads || [], [threadsData?.threads]);
|
|
121
|
+
const setParentMessageId = useCallback(
|
|
122
|
+
(leafId) => selectThread(session, leafId),
|
|
123
|
+
[session]
|
|
124
|
+
);
|
|
125
|
+
return {
|
|
126
|
+
selectedWorkspaceId,
|
|
127
|
+
currentConversationId,
|
|
128
|
+
parentMessageId,
|
|
129
|
+
setParentMessageId,
|
|
130
|
+
messageHistory,
|
|
131
|
+
threads,
|
|
132
|
+
threadsLoading,
|
|
133
|
+
/** Reading the open conversation failed. */
|
|
134
|
+
threadsError,
|
|
135
|
+
/** No message yet: a new chat, or an existing one known empty once its threads have loaded. */
|
|
136
|
+
isEmptyConversation: !currentConversationId || Boolean(threadsData && !threadsData.threads.some((thread) => thread.history.length > 0))
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
CONVERSATION_SWITCH_MEASURE,
|
|
141
|
+
useConversationData
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=useConversationData.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/chat/useConversationData.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The open conversation's line of messages: which thread is viewed (the session's `cursor`, the\n * leaf of that line), kept on a thread that exists, opened on the conversation's own thread (never\n * a sub-agent's branch) or on the thread of a linked message, and the messages of that line with\n * their stored steps rebuilt.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport {\n extractDocumentIdsFromMessages,\n extractFactIdsFromMessages,\n hydrateAgentSteps,\n pickMainThread,\n type ChatMessage,\n type Thread,\n} from '@arbidocs/sdk/browser'\nimport { useConversationThreads } from '../hooks'\nimport { useArbiSessionState, useArbiSessionStore } from '../session'\nimport type { ArbiSessionStore } from '../session/store'\n\n/**\n * The measure of a conversation switch: from opening another conversation to its threads being\n * there (a host reporting performance can observe it).\n */\nexport const CONVERSATION_SWITCH_MEASURE = 'arbi:conversation-switch:ready'\nconst SWITCH_START = 'arbi:conversation-switch:start'\n\nfunction mark(name: string): void {\n try {\n performance.mark(name)\n } catch {\n // No performance timeline here (an old runtime, a test): nothing to record.\n }\n}\n\nfunction measureSwitch(): void {\n try {\n if (performance.getEntriesByName(SWITCH_START, 'mark').length === 0) return\n performance.measure(CONVERSATION_SWITCH_MEASURE, SWITCH_START, CONVERSATION_SWITCH_MEASURE)\n } catch {\n // The marks are missing: nothing to record.\n }\n}\n\n/** View the line ending at `leafId` (no update when it is already viewed). */\nfunction selectThread(session: ArbiSessionStore, leafId: string): void {\n if (session.getState().cursor !== leafId) session.setCursor(leafId)\n}\n\n/** The open conversation's viewed line, its threads, and the workspace it is in. */\nexport function useConversationData() {\n const session = useArbiSessionStore()\n const selectedWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n const currentConversationId = useArbiSessionState((s) => s.conversationId)\n const parentMessageId = useArbiSessionState((s) => s.cursor)\n // A message a link opened the conversation at.\n const deepLinkMessageId = useArbiSessionState((s) => s.deepLinkMessageId)\n\n const {\n data: threadsData,\n isLoading: threadsLoading,\n error: threadsError,\n } = useConversationThreads(currentConversationId || undefined)\n\n // The deep link already handled, so a later threads read does not handle it again.\n const processedDeepLinkRef = useRef<string | null>(null)\n // The conversation viewed before, to time a switch.\n const prevConversationIdRef = useRef<string | null>(null)\n\n // Which thread is viewed: the linked message's, else the one viewed, kept on a thread that exists.\n useEffect(() => {\n if (!threadsData?.threads || threadsData.threads.length === 0 || !currentConversationId) {\n return\n }\n const threads = threadsData.threads as Thread[]\n\n if (deepLinkMessageId) {\n if (processedDeepLinkRef.current === deepLinkMessageId) return\n // A message before a sub-agent's spawn point is in the delegation's branch too: open the\n // conversation's own thread for it.\n const threadWithMessage = pickMainThread(\n threads.filter((t) => t.history.some((m) => m.external_id === deepLinkMessageId))\n )\n if (threadWithMessage) {\n const leafId = threadWithMessage.leaf_message_ext_id\n // A linked message that is not the leaf stays set: the view scrolls to it and marks it.\n if (!leafId || leafId === deepLinkMessageId) session.setDeepLinkMessageId(null)\n processedDeepLinkRef.current = deepLinkMessageId\n if (leafId) selectThread(session, leafId)\n } else {\n // The message is not there: open the main thread.\n const firstLeaf = pickMainThread(threads)?.leaf_message_ext_id\n if (firstLeaf) selectThread(session, firstLeaf)\n session.setDeepLinkMessageId(null)\n }\n return\n }\n\n // Ready for the next deep link.\n processedDeepLinkRef.current = null\n\n if (!parentMessageId) {\n // The default thread is the conversation's own, never a sub-agent's branch.\n const defaultThread = pickMainThread(threads)\n const firstThreadId = defaultThread?.leaf_message_ext_id\n if (firstThreadId) {\n selectThread(session, firstThreadId)\n // The documents and facts the conversation was last asked with are its context again.\n const history = defaultThread?.history || []\n const key = session.getState().conversationId || 'new'\n const documents = extractDocumentIdsFromMessages(history)\n // History seeds a first visit; it must not replace a stored manual selection (an empty one\n // included) when this conversation is reopened.\n if (documents.length > 0 && session.getState().conversationDocuments[key] === undefined)\n session.setConversationDocuments(key, documents)\n const factIds = extractFactIdsFromMessages(history)\n if (factIds && factIds.length > 0) session.setConversationFacts(key, factIds)\n }\n return\n }\n\n // While a turn streams, its stream handlers own the cursor: a thread read in between holds a\n // stale leaf, and following it would break the next turn's chaining.\n if (session.getState().generating[currentConversationId]?.isGenerating) return\n\n if (threads.some((t) => t.leaf_message_ext_id === parentMessageId)) return\n\n // Follow the viewed message to its thread's leaf.\n const threadContainingMessage = pickMainThread(\n threads.filter((t) => t.history.some((m) => m.external_id === parentMessageId))\n )\n if (threadContainingMessage?.leaf_message_ext_id) {\n selectThread(session, threadContainingMessage.leaf_message_ext_id)\n return\n }\n\n // The viewed message is gone (a Retry deleted the failed turn it pointed at). Open the main\n // thread, so the view and the next send agree on a thread that exists: kept, the view showed\n // the first thread while every new message replied to the deleted one and failed.\n const mainLeaf = pickMainThread(threads)?.leaf_message_ext_id\n if (mainLeaf) selectThread(session, mainLeaf)\n }, [threadsData, parentMessageId, currentConversationId, deepLinkMessageId, session])\n\n // A switch to another conversation starts here...\n useEffect(() => {\n if (!currentConversationId) return\n if (\n prevConversationIdRef.current !== null &&\n prevConversationIdRef.current !== currentConversationId\n ) {\n mark(SWITCH_START)\n }\n prevConversationIdRef.current = currentConversationId\n }, [currentConversationId])\n\n // ...and ends when its threads are there.\n useEffect(() => {\n if (!threadsData || !currentConversationId) return\n mark(CONVERSATION_SWITCH_MEASURE)\n measureSwitch()\n }, [threadsData, currentConversationId])\n\n // The viewed line, with the steps of stored answers rebuilt from their persisted stream events.\n const messageHistory = useMemo((): ChatMessage[] => {\n if (!threadsData?.threads || threadsData.threads.length === 0) return []\n const threads = threadsData.threads as Thread[]\n // Before a thread is chosen (the effect above chooses it), and when the viewed one is gone\n // (a stale cursor), the main thread shows.\n const thread =\n (parentMessageId && threads.find((t) => t.leaf_message_ext_id === parentMessageId)) ||\n pickMainThread(threads)\n const history = (thread?.history || []) as ChatMessage[]\n return history.map((message) => {\n if (message.agentSteps) return message\n const hydrated = hydrateAgentSteps(message)\n if (!hydrated) return message\n return {\n ...message,\n agentSteps: hydrated.steps,\n agentStepsTotalElapsed: hydrated.totalElapsed,\n finalContextUsage: hydrated.finalContext,\n }\n })\n }, [threadsData, parentMessageId])\n\n const threads = useMemo(() => (threadsData?.threads || []) as Thread[], [threadsData?.threads])\n const setParentMessageId = useCallback(\n (leafId: string) => selectThread(session, leafId),\n [session]\n )\n\n return {\n selectedWorkspaceId,\n currentConversationId,\n parentMessageId,\n setParentMessageId,\n messageHistory,\n threads,\n threadsLoading,\n /** Reading the open conversation failed. */\n threadsError,\n /** No message yet: a new chat, or an existing one known empty once its threads have loaded. */\n isEmptyConversation:\n !currentConversationId ||\n Boolean(threadsData && !threadsData.threads.some((thread) => thread.history.length > 0)),\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["threads"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { useArbiSessionState } from "../session/index.js";
|
|
3
|
+
import { useDocuments } from "../documents/documents-data.js";
|
|
4
|
+
const EMPTY_DOCS = [];
|
|
5
|
+
function useConversationDocuments() {
|
|
6
|
+
const currentConversationId = useArbiSessionState((state) => state.conversationId);
|
|
7
|
+
const convKey = currentConversationId || "new";
|
|
8
|
+
const inConversationDocuments = useArbiSessionState(
|
|
9
|
+
(state) => state.conversationDocuments[convKey] || EMPTY_DOCS
|
|
10
|
+
);
|
|
11
|
+
const { data: documents = [], isLoading: isLoadingDocs } = useDocuments();
|
|
12
|
+
const conversationDocuments = React.useMemo(() => {
|
|
13
|
+
if (inConversationDocuments.length === 0) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const docArray = Array.isArray(documents) ? documents : [];
|
|
17
|
+
const conversationDocMap = new Map(
|
|
18
|
+
inConversationDocuments.map((doc) => [doc.docId, doc.isPinned])
|
|
19
|
+
);
|
|
20
|
+
const filteredDocs = docArray.filter((doc) => {
|
|
21
|
+
if (!doc || !("external_id" in doc)) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const docId = doc.external_id;
|
|
25
|
+
if (!docId || docId === "") {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return conversationDocMap.has(docId);
|
|
29
|
+
});
|
|
30
|
+
return filteredDocs;
|
|
31
|
+
}, [documents, inConversationDocuments]);
|
|
32
|
+
return {
|
|
33
|
+
data: conversationDocuments,
|
|
34
|
+
isLoading: isLoadingDocs,
|
|
35
|
+
isError: false
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
useConversationDocuments
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=useConversationDocuments.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/chat/useConversationDocuments.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Hook that manages documents associated with a conversation\n *\n * Simple approach: uses the session's 'in conversation' documents\n * and performs one-time extraction from parent message when conversation/parent changes\n */\n\nimport React from 'react'\nimport type { components } from '@arbidocs/client'\nimport { useArbiSessionState } from '../session'\nimport { useDocuments } from '../documents/documents-data'\n\ntype Doc = components['schemas']['DocResponse']\n\nconst EMPTY_DOCS: Array<{ docId: string; isPinned: boolean }> = []\n\nexport function useConversationDocuments() {\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n const convKey = currentConversationId || 'new'\n const inConversationDocuments = useArbiSessionState(\n (state) => state.conversationDocuments[convKey] || EMPTY_DOCS\n )\n\n // Get all workspace documents to get full document objects\n const { data: documents = [], isLoading: isLoadingDocs } = useDocuments()\n\n // No useEffect - zustand handles change detection\n // Documents are managed through direct zustand actions:\n // - Manual: addToConversationDocuments/removeFromConversationDocuments\n // - Auto-extract: called explicitly when parentMessageId actually changes (not here)\n\n // Filter documents that are marked as 'in conversation'\n const conversationDocuments = React.useMemo(() => {\n if (inConversationDocuments.length === 0) {\n return []\n }\n\n // Make sure documents is an array\n const docArray = Array.isArray(documents) ? documents : []\n\n // Create a map for quick lookup of conversation document IDs\n const conversationDocMap = new Map(\n inConversationDocuments.map((doc) => [doc.docId, doc.isPinned])\n )\n\n // Filter documents to only include those marked as 'in conversation'\n const filteredDocs = docArray.filter((doc) => {\n if (!doc || !('external_id' in doc)) {\n return false\n }\n const docId = (doc as { external_id: string }).external_id\n if (!docId || docId === '') {\n return false\n }\n return conversationDocMap.has(docId)\n })\n\n return filteredDocs as Doc[]\n }, [documents, inConversationDocuments])\n\n return {\n data: conversationDocuments,\n isLoading: isLoadingDocs,\n isError: false,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,WAAW;AAElB,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAI7B,MAAM,aAA0D,CAAC;AAE1D,SAAS,2BAA2B;AACzC,QAAM,wBAAwB,oBAAoB,CAAC,UAAU,MAAM,cAAc;AACjF,QAAM,UAAU,yBAAyB;AACzC,QAAM,0BAA0B;AAAA,IAC9B,CAAC,UAAU,MAAM,sBAAsB,OAAO,KAAK;AAAA,EACrD;AAGA,QAAM,EAAE,MAAM,YAAY,CAAC,GAAG,WAAW,cAAc,IAAI,aAAa;AAQxE,QAAM,wBAAwB,MAAM,QAAQ,MAAM;AAChD,QAAI,wBAAwB,WAAW,GAAG;AACxC,aAAO,CAAC;AAAA,IACV;AAGA,UAAM,WAAW,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC;AAGzD,UAAM,qBAAqB,IAAI;AAAA,MAC7B,wBAAwB,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,IAAI,QAAQ,CAAC;AAAA,IAChE;AAGA,UAAM,eAAe,SAAS,OAAO,CAAC,QAAQ;AAC5C,UAAI,CAAC,OAAO,EAAE,iBAAiB,MAAM;AACnC,eAAO;AAAA,MACT;AACA,YAAM,QAAS,IAAgC;AAC/C,UAAI,CAAC,SAAS,UAAU,IAAI;AAC1B,eAAO;AAAA,MACT;AACA,aAAO,mBAAmB,IAAI,KAAK;AAAA,IACrC,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,uBAAuB,CAAC;AAEvC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
import { useConfig } from "../hooks.js";
|
|
3
|
+
import { useUserSettings } from "../account/settings.js";
|
|
4
|
+
import { isFullConfig } from "../config/config-hooks.js";
|
|
5
|
+
import { useArbiSessionState, useArbiSessionStore } from "../session/index.js";
|
|
6
|
+
import { useArbiSession } from "../session/signed-in.js";
|
|
7
|
+
import { useConversationItems, useUpdateConversation } from "../workforce.js";
|
|
8
|
+
import { resolveConfigModel } from "./config-model.js";
|
|
9
|
+
import { useConversationData } from "./useConversationData.js";
|
|
10
|
+
const TITLE_MAX = 50;
|
|
11
|
+
function useConversationSettings() {
|
|
12
|
+
const session = useArbiSessionStore();
|
|
13
|
+
const conversationId = useArbiSessionState((s) => s.conversationId);
|
|
14
|
+
const chatModel = useArbiSessionState((s) => s.chatModel);
|
|
15
|
+
const parentMessageId = useArbiSessionState((s) => s.cursor);
|
|
16
|
+
const currentUser = useArbiSession().user;
|
|
17
|
+
const { messageHistory } = useConversationData();
|
|
18
|
+
const { conversations } = useConversationItems();
|
|
19
|
+
const { data: userSettings } = useUserSettings();
|
|
20
|
+
const parentMessage = messageHistory?.find((m) => m.external_id === parentMessageId);
|
|
21
|
+
const configToLoad = chatModel || parentMessage?.config_ext_id || userSettings?.last_config || "default";
|
|
22
|
+
const { data: activeConfig } = useConfig(configToLoad);
|
|
23
|
+
const { refetch: refetchSystemDefaults } = useConfig("default");
|
|
24
|
+
const conversation = conversations.find((c) => c.external_id === conversationId);
|
|
25
|
+
const isOwner = !!conversation && conversation.created_by_ext_id === currentUser?.external_id;
|
|
26
|
+
const isShared = conversation?.is_shared ?? false;
|
|
27
|
+
const [title, setTitle] = useState("");
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
setTitle(conversation?.title || "");
|
|
30
|
+
}, [conversation?.title]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (isFullConfig(activeConfig)) session.setChatModelName(resolveConfigModel(activeConfig));
|
|
33
|
+
}, [activeConfig, configToLoad]);
|
|
34
|
+
const update = useUpdateConversation();
|
|
35
|
+
const pending = update.isPending ? update.variables?.patch : void 0;
|
|
36
|
+
const saveTitle = useCallback(() => {
|
|
37
|
+
const trimmed = title.trim();
|
|
38
|
+
if (!conversationId || !isOwner || !trimmed || trimmed.length > TITLE_MAX) return;
|
|
39
|
+
if (trimmed === conversation?.title) return;
|
|
40
|
+
update.mutate({ conversationId, patch: { title: trimmed } });
|
|
41
|
+
}, [conversationId, isOwner, title, conversation?.title, update]);
|
|
42
|
+
const setShared = useCallback(
|
|
43
|
+
(shared) => {
|
|
44
|
+
if (!conversationId || !isOwner || isShared === shared) return;
|
|
45
|
+
update.mutate({ conversationId, patch: { shared } });
|
|
46
|
+
},
|
|
47
|
+
[conversationId, isOwner, isShared, update]
|
|
48
|
+
);
|
|
49
|
+
const share = useCallback(() => setShared(true), [setShared]);
|
|
50
|
+
const unshare = useCallback(() => setShared(false), [setShared]);
|
|
51
|
+
const resetToDefaults = useCallback(async () => {
|
|
52
|
+
try {
|
|
53
|
+
const { data } = await refetchSystemDefaults();
|
|
54
|
+
session.setChatModel(void 0);
|
|
55
|
+
if (isFullConfig(data)) session.setChatModelName(resolveConfigModel(data));
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error("Failed to reset to system defaults:", error);
|
|
58
|
+
}
|
|
59
|
+
}, [refetchSystemDefaults, session]);
|
|
60
|
+
return {
|
|
61
|
+
/** No message yet: nothing to title or share. */
|
|
62
|
+
isNewConversation: !parentMessageId,
|
|
63
|
+
title,
|
|
64
|
+
setTitle,
|
|
65
|
+
isOwner,
|
|
66
|
+
isShared,
|
|
67
|
+
isSavingTitle: pending !== void 0 && "title" in pending,
|
|
68
|
+
isSharing: pending !== void 0 && "shared" in pending,
|
|
69
|
+
saveTitle,
|
|
70
|
+
share,
|
|
71
|
+
unshare,
|
|
72
|
+
resetToDefaults
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
useConversationSettings
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=useConversationSettings.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/chat/useConversationSettings.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The open conversation's settings: its title and sharing (one PATCH of the conversation, which\n * the server resolves from the conversation's own workspace), and the model its next turn runs on.\n * The views are `ConnectedConversationSettings` in `@arbidocs/blocks`.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { useConfig } from '../hooks'\nimport { useUserSettings } from '../account/settings'\nimport { isFullConfig } from '../config/config-hooks'\nimport { useArbiSessionState, useArbiSessionStore } from '../session'\nimport { useArbiSession } from '../session/signed-in'\nimport { useConversationItems, useUpdateConversation } from '../workforce'\nimport { resolveConfigModel } from './config-model'\nimport { useConversationData } from './useConversationData'\n\n/** Longest title the server keeps. */\nconst TITLE_MAX = 50\n\nexport function useConversationSettings() {\n const session = useArbiSessionStore()\n const conversationId = useArbiSessionState((s) => s.conversationId)\n const chatModel = useArbiSessionState((s) => s.chatModel)\n const parentMessageId = useArbiSessionState((s) => s.cursor)\n const currentUser = useArbiSession().user\n\n const { messageHistory } = useConversationData()\n const { conversations } = useConversationItems()\n const { data: userSettings } = useUserSettings()\n\n // The config the next turn runs on: the one picked, else the parent message's, else the user's\n // last saved one, else the system default.\n const parentMessage = messageHistory?.find((m) => m.external_id === parentMessageId)\n const configToLoad =\n chatModel || parentMessage?.config_ext_id || userSettings?.last_config || 'default'\n const { data: activeConfig } = useConfig(configToLoad)\n const { refetch: refetchSystemDefaults } = useConfig('default')\n\n const conversation = conversations.find((c) => c.external_id === conversationId)\n const isOwner = !!conversation && conversation.created_by_ext_id === currentUser?.external_id\n const isShared = conversation?.is_shared ?? false\n\n const [title, setTitle] = useState('')\n useEffect(() => {\n setTitle(conversation?.title || '')\n }, [conversation?.title])\n\n // The picker shows the model of the config the next turn runs on.\n useEffect(() => {\n if (isFullConfig(activeConfig)) session.setChatModelName(resolveConfigModel(activeConfig))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeConfig, configToLoad])\n\n // Rename, share and unshare are all the one PATCH; which is in flight shows in its body.\n const update = useUpdateConversation()\n const pending = update.isPending ? update.variables?.patch : undefined\n\n const saveTitle = useCallback(() => {\n const trimmed = title.trim()\n if (!conversationId || !isOwner || !trimmed || trimmed.length > TITLE_MAX) return\n // Leaving the field without a change sends nothing.\n if (trimmed === conversation?.title) return\n update.mutate({ conversationId, patch: { title: trimmed } })\n }, [conversationId, isOwner, title, conversation?.title, update])\n\n const setShared = useCallback(\n (shared: boolean) => {\n if (!conversationId || !isOwner || isShared === shared) return\n update.mutate({ conversationId, patch: { shared } })\n },\n [conversationId, isOwner, isShared, update]\n )\n const share = useCallback(() => setShared(true), [setShared])\n const unshare = useCallback(() => setShared(false), [setShared])\n\n /** Back to the system default config: the picked one is dropped. */\n const resetToDefaults = useCallback(async () => {\n try {\n const { data } = await refetchSystemDefaults()\n session.setChatModel(undefined)\n if (isFullConfig(data)) session.setChatModelName(resolveConfigModel(data))\n } catch (error) {\n console.error('Failed to reset to system defaults:', error)\n }\n }, [refetchSystemDefaults, session])\n\n return {\n /** No message yet: nothing to title or share. */\n isNewConversation: !parentMessageId,\n title,\n setTitle,\n isOwner,\n isShared,\n isSavingTitle: pending !== undefined && 'title' in pending,\n isSharing: pending !== undefined && 'shared' in pending,\n saveTitle,\n share,\n unshare,\n resetToDefaults,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useArbiSessionState } from "../session/index.js";
|
|
2
|
+
import { useConversationActions } from "./useConversationActions.js";
|
|
3
|
+
function useConversationTurn({
|
|
4
|
+
selectedWorkspaceId,
|
|
5
|
+
parentMessageId
|
|
6
|
+
}) {
|
|
7
|
+
const currentConversationId = useArbiSessionState((state) => state.conversationId);
|
|
8
|
+
const conversationKey = currentConversationId || "new";
|
|
9
|
+
const generationState = useArbiSessionState((state) => state.generating[conversationKey]);
|
|
10
|
+
const isGenerating = generationState?.isGenerating ?? false;
|
|
11
|
+
const generationError = generationState?.error ?? null;
|
|
12
|
+
const lastFailedMessage = generationState?.lastFailedMessage ?? null;
|
|
13
|
+
const actions = useConversationActions({
|
|
14
|
+
selectedWorkspaceId,
|
|
15
|
+
parentMessageId,
|
|
16
|
+
conversationKey,
|
|
17
|
+
isGenerating,
|
|
18
|
+
lastFailedMessage
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
isGenerating,
|
|
22
|
+
hasError: !!generationError,
|
|
23
|
+
lastFailedMessage,
|
|
24
|
+
lastErrorMessage: generationError,
|
|
25
|
+
...actions
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
useConversationTurn
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=useConversationTurn.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/chat/useConversationTurn.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The open conversation's turn: whether an answer runs, the last send's failure, and the actions on\n * it (send, branch, retry, stop) from `useConversationActions`. The generation state lives in the\n * session, so it survives leaving the conversation and coming back.\n */\n\nimport { useArbiSessionState } from '../session'\nimport { useConversationActions } from './useConversationActions'\n\ninterface UseConversationTurnProps {\n selectedWorkspaceId: string | null\n parentMessageId: string | null\n}\n\nexport function useConversationTurn({\n selectedWorkspaceId,\n parentMessageId,\n}: UseConversationTurnProps) {\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n const conversationKey = currentConversationId || 'new'\n const generationState = useArbiSessionState((state) => state.generating[conversationKey])\n\n const isGenerating = generationState?.isGenerating ?? false\n const generationError = generationState?.error ?? null\n const lastFailedMessage = generationState?.lastFailedMessage ?? null\n\n const actions = useConversationActions({\n selectedWorkspaceId,\n parentMessageId,\n conversationKey,\n isGenerating,\n lastFailedMessage,\n })\n\n return {\n isGenerating,\n hasError: !!generationError,\n lastFailedMessage,\n lastErrorMessage: generationError,\n ...actions,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AAOhC,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,wBAAwB,oBAAoB,CAAC,UAAU,MAAM,cAAc;AACjF,QAAM,kBAAkB,yBAAyB;AACjD,QAAM,kBAAkB,oBAAoB,CAAC,UAAU,MAAM,WAAW,eAAe,CAAC;AAExF,QAAM,eAAe,iBAAiB,gBAAgB;AACtD,QAAM,kBAAkB,iBAAiB,SAAS;AAClD,QAAM,oBAAoB,iBAAiB,qBAAqB;AAEhE,QAAM,UAAU,uBAAuB;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,UAAU,CAAC,CAAC;AAAA,IACZ;AAAA,IACA,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACL;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { useArbiSessionState } from "../session/index.js";
|
|
3
|
+
import { conversationWorkspaceOf } from "./conversation-workspace.js";
|
|
4
|
+
function useConversationWorkspace(conversationId) {
|
|
5
|
+
const queryClient = useQueryClient();
|
|
6
|
+
const sessionWorkspaceId = useArbiSessionState((s) => s.workspaceId);
|
|
7
|
+
return conversationWorkspaceOf(queryClient, conversationId) ?? sessionWorkspaceId;
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
useConversationWorkspace
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useConversationWorkspace.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/chat/useConversationWorkspace.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The workspace a conversation is in, for a write that belongs to it (a fact saved from one of its\n * answers, say): the one this client knows it is in (`conversationWorkspaceOf`), else the\n * session's workspace (a new conversation, or one not seen yet).\n */\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useArbiSessionState } from '../session'\nimport { conversationWorkspaceOf } from './conversation-workspace'\n\nexport function useConversationWorkspace(conversationId: string | null | undefined): string | null {\n const queryClient = useQueryClient()\n const sessionWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n return conversationWorkspaceOf(queryClient, conversationId) ?? sessionWorkspaceId\n}\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AACpC,SAAS,+BAA+B;AAEjC,SAAS,yBAAyB,gBAA0D;AACjG,QAAM,cAAc,eAAe;AACnC,QAAM,qBAAqB,oBAAoB,CAAC,MAAM,EAAE,WAAW;AACnE,SAAO,wBAAwB,aAAa,cAAc,KAAK;AACjE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { useArbi } from "../useArbi.js";
|
|
3
|
+
import { allConversationThreads } from "./conversation-cache.js";
|
|
4
|
+
function useDeleteMessage() {
|
|
5
|
+
const arbi = useArbi();
|
|
6
|
+
const queryClient = useQueryClient();
|
|
7
|
+
return useMutation({
|
|
8
|
+
mutationFn: (messageId) => arbi.conversations.deleteMessage(messageId),
|
|
9
|
+
onSuccess: () => queryClient.invalidateQueries(allConversationThreads)
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
useDeleteMessage
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=useDeleteMessage.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/chat/useDeleteMessage.ts"],
|
|
4
|
+
"sourcesContent": ["import { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useArbi } from '../useArbi'\nimport { allConversationThreads } from './conversation-cache'\n\n/**\n * Delete a message and every message after it on its branch (a failed answer, say). Which\n * conversation it was in is not known here, so every cached thread is re-read: they are small.\n */\nexport function useDeleteMessage() {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (messageId: string) => arbi.conversations.deleteMessage(messageId),\n onSuccess: () => queryClient.invalidateQueries(allConversationThreads),\n })\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,eAAe;AACxB,SAAS,8BAA8B;AAMhC,SAAS,mBAAmB;AACjC,QAAM,OAAO,QAAQ;AACrB,QAAM,cAAc,eAAe;AACnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,cAAsB,KAAK,cAAc,cAAc,SAAS;AAAA,IAC7E,WAAW,MAAM,YAAY,kBAAkB,sBAAsB;AAAA,EACvE,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|