@arbidocs/react 0.5.61 → 0.5.63

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.
Files changed (103) hide show
  1. package/dist/ProductionDialog.d-CpzslFn0.d.cts +51 -0
  2. package/dist/ProductionDialog.d-CpzslFn0.d.ts +51 -0
  3. package/dist/annotations/freeze/index.cjs +14 -14
  4. package/dist/annotations/freeze/index.js +3 -3
  5. package/dist/annotations/index.d.cts +3 -2
  6. package/dist/annotations/index.d.ts +3 -2
  7. package/dist/artifacts/index.cjs +12 -12
  8. package/dist/artifacts/index.js +5 -5
  9. package/dist/bundle-IC65W2AO.cjs +14 -0
  10. package/dist/{bundle-DCWPYNGD.cjs.map → bundle-IC65W2AO.cjs.map} +1 -1
  11. package/dist/bundle-YNOX7VIL.js +5 -0
  12. package/dist/{bundle-JCKKGEJE.js.map → bundle-YNOX7VIL.js.map} +1 -1
  13. package/dist/calls/livekit/index.cjs +54 -54
  14. package/dist/calls/livekit/index.js +6 -6
  15. package/dist/{chunk-S2W3ZOWG.js → chunk-2LV53J46.js} +85 -16
  16. package/dist/chunk-2LV53J46.js.map +1 -0
  17. package/dist/{chunk-H3HYKAS5.cjs → chunk-3BFSALPC.cjs} +3 -3
  18. package/dist/{chunk-H3HYKAS5.cjs.map → chunk-3BFSALPC.cjs.map} +1 -1
  19. package/dist/{chunk-2NFUEC5O.js → chunk-3NBPMR3X.js} +3 -3
  20. package/dist/{chunk-2NFUEC5O.js.map → chunk-3NBPMR3X.js.map} +1 -1
  21. package/dist/chunk-4DTTEUVY.js +1042 -0
  22. package/dist/chunk-4DTTEUVY.js.map +1 -0
  23. package/dist/{chunk-U64WCQP3.js → chunk-AOEJ744V.js} +25 -14
  24. package/dist/chunk-AOEJ744V.js.map +1 -0
  25. package/dist/{chunk-4E737GNX.cjs → chunk-BLBXADTN.cjs} +86 -73
  26. package/dist/chunk-BLBXADTN.cjs.map +1 -0
  27. package/dist/{chunk-X7JXQT6F.cjs → chunk-DVL7EFZZ.cjs} +42 -46
  28. package/dist/chunk-DVL7EFZZ.cjs.map +1 -0
  29. package/dist/{chunk-VAMPYLQ4.cjs → chunk-DZUBZ45Y.cjs} +78 -2
  30. package/dist/chunk-DZUBZ45Y.cjs.map +1 -0
  31. package/dist/{chunk-OSWKXZTJ.js → chunk-ER4LFZG3.js} +12 -16
  32. package/dist/chunk-ER4LFZG3.js.map +1 -0
  33. package/dist/{chunk-5HDC43MF.js → chunk-G4Z3IP4J.js} +72 -3
  34. package/dist/chunk-G4Z3IP4J.js.map +1 -0
  35. package/dist/chunk-GOJHU7RZ.cjs +1122 -0
  36. package/dist/chunk-GOJHU7RZ.cjs.map +1 -0
  37. package/dist/{chunk-G76ASVVH.cjs → chunk-GQAXAZN7.cjs} +25 -14
  38. package/dist/chunk-GQAXAZN7.cjs.map +1 -0
  39. package/dist/{chunk-TUPSNW3B.cjs → chunk-LMW46NBD.cjs} +11 -11
  40. package/dist/{chunk-TUPSNW3B.cjs.map → chunk-LMW46NBD.cjs.map} +1 -1
  41. package/dist/{chunk-KRH55LXW.js → chunk-NCMSQACC.js} +37 -24
  42. package/dist/chunk-NCMSQACC.js.map +1 -0
  43. package/dist/{chunk-A2XSLTIP.js → chunk-NIKPG4PW.js} +3 -3
  44. package/dist/{chunk-A2XSLTIP.js.map → chunk-NIKPG4PW.js.map} +1 -1
  45. package/dist/{chunk-B6I2HRRF.cjs → chunk-PC4O3JDV.cjs} +3 -3
  46. package/dist/{chunk-B6I2HRRF.cjs.map → chunk-PC4O3JDV.cjs.map} +1 -1
  47. package/dist/{chunk-M2SZQBCO.js → chunk-SI7DJWBT.js} +3 -3
  48. package/dist/{chunk-M2SZQBCO.js.map → chunk-SI7DJWBT.js.map} +1 -1
  49. package/dist/{chunk-3QK4VVPG.cjs → chunk-TGSEQGM3.cjs} +3 -3
  50. package/dist/{chunk-3QK4VVPG.cjs.map → chunk-TGSEQGM3.cjs.map} +1 -1
  51. package/dist/{chunk-LCSUCZVX.cjs → chunk-ZNQPUPX6.cjs} +118 -41
  52. package/dist/chunk-ZNQPUPX6.cjs.map +1 -0
  53. package/dist/{chunk-CMNZI4WQ.js → chunk-ZTPJNKF2.js} +4 -4
  54. package/dist/{chunk-CMNZI4WQ.js.map → chunk-ZTPJNKF2.js.map} +1 -1
  55. package/dist/document-tools/core.cjs +408 -0
  56. package/dist/document-tools/core.cjs.map +1 -0
  57. package/dist/document-tools/core.d.cts +957 -0
  58. package/dist/document-tools/core.d.ts +957 -0
  59. package/dist/document-tools/core.js +15 -0
  60. package/dist/document-tools/core.js.map +1 -0
  61. package/dist/document-tools/index.cjs +347 -1130
  62. package/dist/document-tools/index.cjs.map +1 -1
  63. package/dist/document-tools/index.d.cts +12 -950
  64. package/dist/document-tools/index.d.ts +12 -950
  65. package/dist/document-tools/index.js +13 -1034
  66. package/dist/document-tools/index.js.map +1 -1
  67. package/dist/index.cjs +1510 -1255
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/{index.d-BLw5AN0H.d.cts → index.d-AT7wdTWC.d.cts} +50 -2
  70. package/dist/{index.d-BLw5AN0H.d.ts → index.d-AT7wdTWC.d.ts} +50 -2
  71. package/dist/{index.d-DPVj21h1.d.ts → index.d-B0dosFZc.d.cts} +6 -6
  72. package/dist/{index.d-DPVj21h1.d.cts → index.d-B0dosFZc.d.ts} +6 -6
  73. package/dist/index.d.cts +145 -69
  74. package/dist/index.d.ts +145 -69
  75. package/dist/index.js +346 -121
  76. package/dist/index.js.map +1 -1
  77. package/dist/{query-keys.d-DEEMzkLz.d.cts → query-keys.d-BFKQVevT.d.cts} +21 -12
  78. package/dist/{query-keys.d-DEEMzkLz.d.ts → query-keys.d-BFKQVevT.d.ts} +21 -12
  79. package/dist/shell/index.cjs +68 -40
  80. package/dist/shell/index.d.cts +1 -1
  81. package/dist/shell/index.d.ts +1 -1
  82. package/dist/shell/index.js +3 -3
  83. package/dist/store.d-DkFXbWDk.d.ts +35 -0
  84. package/dist/store.d-GADDvC7w.d.cts +35 -0
  85. package/dist/ui/index.cjs +149 -149
  86. package/dist/ui/index.d.cts +1 -1
  87. package/dist/ui/index.d.ts +1 -1
  88. package/dist/ui/index.js +2 -2
  89. package/package.json +11 -3
  90. package/dist/ProductionDialog.d-BDJwBSzj.d.ts +0 -84
  91. package/dist/ProductionDialog.d-DjRQFmQw.d.cts +0 -84
  92. package/dist/bundle-DCWPYNGD.cjs +0 -14
  93. package/dist/bundle-JCKKGEJE.js +0 -5
  94. package/dist/chunk-4E737GNX.cjs.map +0 -1
  95. package/dist/chunk-5HDC43MF.js.map +0 -1
  96. package/dist/chunk-G76ASVVH.cjs.map +0 -1
  97. package/dist/chunk-KRH55LXW.js.map +0 -1
  98. package/dist/chunk-LCSUCZVX.cjs.map +0 -1
  99. package/dist/chunk-OSWKXZTJ.js.map +0 -1
  100. package/dist/chunk-S2W3ZOWG.js.map +0 -1
  101. package/dist/chunk-U64WCQP3.js.map +0 -1
  102. package/dist/chunk-VAMPYLQ4.cjs.map +0 -1
  103. package/dist/chunk-X7JXQT6F.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,21 +1,24 @@
1
- import { useUserSettings, invalidateConversationLists, patchConversation, invalidateConversationDetails, removeConversationFromLists, addConversationToList, findConversation, isConversationShared, isKnownSoloConversation, patchConversationList, useFeature, useAccountClient, useUpdateUserSettings, myChatId, upsertChat, appendToThread, dropFromThread, deleteChatMessage, removeChat, getOpenChat, cachedChat, applyChatEvent, applyCallEvent } from './chunk-KRH55LXW.js';
2
- export { AUDIENCE_CHOICES, CALL_CAPTION_TOPIC, CALL_CHAT_MAX_CHARS, CALL_CHAT_TOPIC, CALL_MODERATION_TOPIC, CALL_RECORDING_TOPIC, CALL_TRANSCRIPTION_TOPIC, CALL_WEBINAR_TOPIC, CAPTION_MAX_CHARS, COMPOSITE_AUDIO_BITS_PER_SECOND, COMPOSITE_VIDEO_BITS_PER_SECOND, DEFAULT_JOIN_CHOICES, EMPTY_CALL_SESSION, EXPORT_SAMPLE_RATE, HISTORY_LIMIT, LIVE_SEGMENTER, MAX_AVATAR_FILE_BYTES, MUTED_DEDUPE_MS, PLAYBACK_LOOKAHEAD_MS, READ_ONLY_MEETING_TEXT, RECORDING_CHUNK_MS, RECORDING_SEGMENTER, SEGMENT_FRAME_MS, SEGMENT_ID_PATTERN, SEGMENT_PRE_ROLL_MS, SHORT_PIECE_MERGE_GAP_MS, SPEAKER_AUDIO_BITS_PER_SECOND, TrackUploader, UPLOAD_ATTEMPTS, UPLOAD_BACKOFF_MS, acceptRing, addConversationToList, appendToThread, applyAgentDmStatus, applyCallEvent, applyChatEvent, applyChatMessage, applyChatRead, applyChatUpdated, arbiAccountClient, buildMeetingChatBody, cachedChat, cachedChats, callLink, callMemberKeys, callSession, chatByExtId, chatHasLiveCall, chatLiveCallId, chatTranscriptRef, clearMeetingChatCache, clearTrackUploaders, clockTime, compositeFiles, compositeTrack, conversationKeyForCall, createLocalFeatureStore, createMutedNotifier, createTrackCutter, cutAtPauses, declineRing, decodeCallChatPacket, decodeCaptionPacket, decodeMono16k, decryptPart, encodeCallChatPacket, encodeCaptionPacket, encodeWav, encryptPart, ensureMeetingChat, entitlementRefusal, extensionFor, fetchPart, fileSafe, findConversation, floatToWav, formatTranscriptMarkdown, getOpenChat, hasRecordingTranscript, invalidateCall, invalidateConversationDetails, invalidateConversationLists, isConversationListKey, isConversationShared, isKnownSoloConversation, isRecordingOver, isRecordingSegmentId, isRetryable, isWorkspaceGuestOf, joinFromPreJoin, knownMeetingChat, loadMeetingHistory, markRejoining, meetingChatRefFrom, meetingRefForCall, mergeChatLines, mutedNoticeFromEvent, mutedNoticeFromPacket, mutedNoticeText, myChatId, newPacketId, newSegmentId, newTrackKey, nextSeqAfter, onCallEvent, openCall, openQuestion, openRecording, parseWebinarPacket, partKey, partOffsetMs, partsDue, patchConversation, patchConversationList, persistMeetingMessage, persistTranscriptSegment, playheadAt, postRecordingDocsToThread, postTranscriptToThread, readLocalFeature, recordingFiles, recordingWindowsOf, rejoinAsAudience, removeChat, removeConversationFromLists, resetCallSession, resolveMeetingChat, saveRecordingFilesToThread, schedulePart, sealQuestionText, serverCallsExperimental, setOpenChat, sortTranscriptMessages, sortedParts, speakerTracks, speakerWav, splitIntoFiles, standalone, startChatCall, startContactsCall, startDmCall, startThreadCall, startsMediaFile, storeTranscriptSegment, stripSpeakerPrefix, supersedeLiveTranscript, supersededTranscriptLines, threadHasLiveCall, threadLiveCallId, threadTranscriptLines, threadTranscriptRef, threadTranscriptText, timelineDurationMs, timelineOf, toProfileView, trackUploaderFor, transcribeRecording, transcriptPersistRole, transcriptSegmentOf, unwrapTrackKey, upsertChat, useAccountClient, useAvatarCrop, useCall, useCallInviteLinks, useCallRecording, useCallRecordings, useCallSession, useCallTranscriptionAvailable, useCallsConfig, useCallsEnabled, useCanHostCalls, useEntitlements, useFeature, useFeatureSwitch, useIsEntitled, useMeetingReadOnly, useNameEditor, useOpenCallMeetingChat, useProfile, useRecordingActions, useRecordingWindows, useRevokeCallInviteLink, useSaveToThread, useServerCallsEnabled, useServerCallsExperimental, useUpdateProfile, useUpdateUserSettings, useUserSettings, wrapTrackKey, writeSamples } from './chunk-KRH55LXW.js';
3
- import { replayableTagMutations, patchDocuments, setCachedDocument, adjustTagCounts, patchCachedDocument, FINISHED_DOCUMENT_STATUSES, refreshDocuments, getCachedDocuments, useArbiWsStore, IN_FLIGHT_DOCUMENT_STATUSES, forgetDocuments, useSimilarDocuments, SIMILARITY_THRESHOLD, useDocuments, finishEntityExtraction } from './chunk-S2W3ZOWG.js';
4
- export { DISMISSED_TASK_TTL_MS, DOCUMENTS_FIRST_PAGE_MEASURE, DOCUMENTS_FIRST_PAGE_SIZE, DOCUMENTS_PAGE_SIZE, FINISHED_DOCUMENT_STATUSES, IN_FLIGHT_DOCUMENT_STATUSES, SIMILARITY_THRESHOLD, adjustTagCounts, dropTagFromCachedDocuments, finishEntityExtraction, forgetDocuments, getCachedDocuments, invalidateTagData, invalidateTagTables, isDocumentsLoading, isRowNewer, isStaleTaskUpdate, patchCachedDocument, patchDocuments, patchWorkspaceTags, refreshDocuments, resolveDocumentStatus, setCachedDocument, settledByRows, startEntityExtraction, stopDocumentsLoading, subscribeDocumentRows, upsertDocuments, useArbiWsStore, useCreateTag, useDeleteTag, useDocument, useDocuments, useDocumentsById, useDocumentsLoading, useEntityExtractionDocIds, useExtractEntities, useInvalidateTagData, useIsCreatingTag, useRefreshDocuments, useSetTagValues, useSimilarDocuments, useTagKindSchema, useUpdateTag, useUpdateTagKindSchema } from './chunk-S2W3ZOWG.js';
5
- import { useArbiSessionState, useArbiSession, useWorkspaces, useConversations, useConfig, useArbiSessionStore, useAvailableModels, useParsedDocument, useTags, selectDraft, useConversationThreads, createArbiSessionStore, useProjects, useAgents, useAssistantQuery, useActivity, queuedMessages, MIN_QUEUED_MESSAGE_VISIBILITY_MS } from './chunk-OSWKXZTJ.js';
6
- export { DEFAULT_DOCUMENT_VIEWER_STATE, EMPTY_SESSION_STATE, MAX_THREAD_TABS, MIN_QUEUED_MESSAGE_VISIBILITY_MS, PROJECT_CREATION_DENIED_REASON, WORKSPACE_LAST_OPENED_KEY, WORKSPACE_STORAGE_KEY, agentControl, browserWorkspaceStorage, clearSealedDrafts, closePanelIn, conversationKey, createArbiLayoutStore, createArbiSessionStore, createArbiWorkspaceStore, createDebouncedWriter, createSealedDraftStorage, createStoragePersist, defaultLayoutState, dmTabId, flushOnPageExit, isPanelOpen, isUsageMetered, layoutActionsOf, nextViewingDocument, openPanelIn, panelPlace, parseSavedLayout, queuedMessages, readWorkspaceLastOpened, restoreLayout, savedLayoutOf, selectDraft, selectIsGenerating, selectViewingDocumentId, threadTabId, useActivity, useAgents, useArbiSession, useArbiSessionState, useArbiSessionStore, useAssistantQuery, useAvailableModels, useBoxRole, useBuiltinCommands, useCanCreateProjects, useConfig, useConfigs, useConversationThreads, useConversations, useCurrentUser, useDeleteAgents, useDocumentVersionList, useFirmPool, useHealth, useMessageDetails, useParsedDocument, useProjectInvoices, useProjectUsage, useProjects, useProjectsUsage, useSessionPageTab, useSessionView, useSignedInSession, useTags, useThumbnails, useTopUpFirmPool, useTransientView, useUserUsageToday, useWorkspaceActivity, useWorkspaces } from './chunk-OSWKXZTJ.js';
7
- import { fetchDocumentFile, downloadBlob, fetchMarkupPdf, fetchDocumentPdf } from './chunk-M2SZQBCO.js';
8
- import { arbiMutationKeys, arbiQueryKeys, mailQueryKeys, connectorQueryKeys, calendarQueryKeys } from './chunk-U64WCQP3.js';
9
- export { arbiMutationKeys, arbiQueryKeys, calendarQueryKeys, callQueryKeys, connectorQueryKeys, isUnderQueryKey, mailQueryKeys } from './chunk-U64WCQP3.js';
10
- import { ArbiHost, extractMentions, UNBOUND, bindingOfRow, readLegacyThreadDocuments, forgetLegacyThreadDocuments, toMessageMentions, takeDocumentForTurn, hasMessageBody, createSearchSession, clearSearchSession } from './chunk-CMNZI4WQ.js';
11
- export { LEGACY_THREAD_DOCUMENTS_KEY, MENTION_HREF_PREFIX, NotificationBell, Toaster, UNBOUND, bindingOfRow, clearSearchSession, createSearchSession, extractMentions, filterMentionCandidates, findMentionQuery, forgetLegacyThreadDocuments, hasMessageBody, insertMention, latestThreadOfDocument, linkMentions, mentionFromHref, openDocumentId, opensInWord, persistSearchSession, readLegacyThreadDocuments, requestSearch, savedDocumentIdFor, sharedSearchSession, takeDocumentForTurn, takePendingSearch, toMessageMentions, useOpenDocumentId, useRegisterOpenDocument, useTurnDocumentId } from './chunk-CMNZI4WQ.js';
12
- import { notify } from './chunk-5HDC43MF.js';
13
- export { DEFAULT_NOTIFY_TONE, MAX_SESSION_NOTIFICATIONS, configureNotify, notify, persistNotifyHistory, seedNotifications, selectUnread, toast, useNotify } from './chunk-5HDC43MF.js';
1
+ import { AudioViewer, ImageViewer, VideoViewer } from './chunk-HDCRPPBW.js';
2
+ import { useUserSettings, invalidateConversationLists, patchConversation, invalidateConversationDetails, removeConversationFromLists, addConversationToList, findConversation, isConversationShared, isKnownSoloConversation, patchConversationList, useFeature, useAccountClient, useUpdateUserSettings, myChatId, upsertChat, appendToThread, dropFromThread, deleteChatMessage, removeChat, getOpenChat, cachedChat, applyChatEvent, applyCallEvent } from './chunk-NCMSQACC.js';
3
+ export { AUDIENCE_CHOICES, CALL_CAPTION_TOPIC, CALL_CHAT_MAX_CHARS, CALL_CHAT_TOPIC, CALL_MODERATION_TOPIC, CALL_RECORDING_TOPIC, CALL_TRANSCRIPTION_TOPIC, CALL_WEBINAR_TOPIC, CAPTION_MAX_CHARS, COMPOSITE_AUDIO_BITS_PER_SECOND, COMPOSITE_VIDEO_BITS_PER_SECOND, DEFAULT_JOIN_CHOICES, EMPTY_CALL_SESSION, EXPORT_SAMPLE_RATE, HISTORY_LIMIT, LIVE_SEGMENTER, MAX_AVATAR_FILE_BYTES, MUTED_DEDUPE_MS, PLAYBACK_LOOKAHEAD_MS, READ_ONLY_MEETING_TEXT, RECORDING_CHUNK_MS, RECORDING_SEGMENTER, SEGMENT_FRAME_MS, SEGMENT_ID_PATTERN, SEGMENT_PRE_ROLL_MS, SHORT_PIECE_MERGE_GAP_MS, SPEAKER_AUDIO_BITS_PER_SECOND, TrackUploader, UPLOAD_ATTEMPTS, UPLOAD_BACKOFF_MS, acceptRing, addConversationToList, appendToThread, applyAgentDmStatus, applyCallEvent, applyChatEvent, applyChatMessage, applyChatRead, applyChatUpdated, arbiAccountClient, buildMeetingChatBody, cachedChat, cachedChats, callLink, callMemberKeys, callSession, chatByExtId, chatHasLiveCall, chatLiveCallId, chatTranscriptRef, clearMeetingChatCache, clearTrackUploaders, clockTime, compositeFiles, compositeTrack, conversationKeyForCall, createLocalFeatureStore, createMutedNotifier, createTrackCutter, cutAtPauses, declineRing, decodeCallChatPacket, decodeCaptionPacket, decodeMono16k, decryptPart, encodeCallChatPacket, encodeCaptionPacket, encodeWav, encryptPart, ensureMeetingChat, entitlementRefusal, extensionFor, fetchPart, fileSafe, findConversation, floatToWav, formatTranscriptMarkdown, getOpenChat, hasRecordingTranscript, invalidateCall, invalidateConversationDetails, invalidateConversationLists, isConversationListKey, isConversationShared, isKnownSoloConversation, isRecordingOver, isRecordingSegmentId, isRetryable, isWorkspaceGuestOf, joinFromPreJoin, knownMeetingChat, loadMeetingHistory, markRejoining, meetingChatRefFrom, meetingRefForCall, mergeChatLines, mutedNoticeFromEvent, mutedNoticeFromPacket, mutedNoticeText, myChatId, newPacketId, newSegmentId, newTrackKey, nextSeqAfter, onCallEvent, openCall, openQuestion, openRecording, parseWebinarPacket, partKey, partOffsetMs, partsDue, patchConversation, patchConversationList, persistMeetingMessage, persistTranscriptSegment, playheadAt, postRecordingDocsToThread, postTranscriptToThread, readLocalFeature, recordingFiles, recordingWindowsOf, rejoinAsAudience, removeChat, removeConversationFromLists, resetCallSession, resolveMeetingChat, saveRecordingFilesToThread, schedulePart, sealQuestionText, serverCallsExperimental, setOpenChat, sortTranscriptMessages, sortedParts, speakerTracks, speakerWav, splitIntoFiles, standalone, startChatCall, startContactsCall, startDmCall, startThreadCall, startsMediaFile, storeTranscriptSegment, stripSpeakerPrefix, supersedeLiveTranscript, supersededTranscriptLines, threadHasLiveCall, threadLiveCallId, threadTranscriptLines, threadTranscriptRef, threadTranscriptText, timelineDurationMs, timelineOf, toProfileView, trackUploaderFor, transcribeRecording, transcriptPersistRole, transcriptSegmentOf, unwrapTrackKey, upsertChat, useAccountClient, useAvatarCrop, useCall, useCallInviteLinks, useCallRecording, useCallRecordings, useCallSession, useCallTranscriptionAvailable, useCallsConfig, useCallsEnabled, useCanHostCalls, useEntitlements, useFeature, useFeatureSwitch, useIsEntitled, useMeetingReadOnly, useNameEditor, useOpenCallMeetingChat, useProfile, useRecordingActions, useRecordingWindows, useRevokeCallInviteLink, useSaveToThread, useServerCallsEnabled, useServerCallsExperimental, useUpdateProfile, useUpdateUserSettings, useUserSettings, wrapTrackKey, writeSamples } from './chunk-NCMSQACC.js';
4
+ import { replayableTagMutations, inWorkspace, primeOnClient, patchDocuments, setCachedDocument, adjustTagCounts, patchCachedDocument, FINISHED_DOCUMENT_STATUSES, refreshDocuments, getCachedDocuments, useArbiWsStore, IN_FLIGHT_DOCUMENT_STATUSES, useCapturingWorkspace, QUEUED_WRITE_RETRY, isWorkspaceUnavailable, primeOnArbi, forgetDocuments, useSimilarDocuments, SIMILARITY_THRESHOLD, QUEUED_WRITE_BLOCKED_MESSAGE, isBlockedOnWorkspace, useDocuments, finishEntityExtraction } from './chunk-2LV53J46.js';
5
+ export { DISMISSED_TASK_TTL_MS, DOCUMENTS_FIRST_PAGE_MEASURE, DOCUMENTS_FIRST_PAGE_SIZE, DOCUMENTS_PAGE_SIZE, FINISHED_DOCUMENT_STATUSES, IN_FLIGHT_DOCUMENT_STATUSES, SIMILARITY_THRESHOLD, adjustTagCounts, dropTagFromCachedDocuments, finishEntityExtraction, forgetDocuments, getCachedDocuments, invalidateTagData, invalidateTagTables, isDocumentsLoading, isRowNewer, isStaleTaskUpdate, patchCachedDocument, patchDocuments, patchWorkspaceTags, refreshDocuments, resolveDocumentStatus, setCachedDocument, settledByRows, startEntityExtraction, stopDocumentsLoading, subscribeDocumentRows, upsertDocuments, useArbiWsStore, useCreateTag, useDeleteTag, useDocument, useDocuments, useDocumentsById, useDocumentsLoading, useEntityExtractionDocIds, useExtractEntities, useInvalidateTagData, useIsCreatingTag, useRefreshDocuments, useSetTagValues, useSimilarDocuments, useTagKindSchema, useUpdateTag, useUpdateTagKindSchema } from './chunk-2LV53J46.js';
6
+ import { useArbiSessionState, useArbiSession, useWorkspaces, useConversations, useConfig, useArbiSessionStore, useAvailableModels, useParsedDocument, useTags, selectDraft, useConversationThreads, createArbiSessionStore, useProjects, useAgents, useAssistantQuery, useActivity, queuedMessages, MIN_QUEUED_MESSAGE_VISIBILITY_MS } from './chunk-ER4LFZG3.js';
7
+ export { DEFAULT_DOCUMENT_VIEWER_STATE, EMPTY_SESSION_STATE, MAX_THREAD_TABS, MIN_QUEUED_MESSAGE_VISIBILITY_MS, PROJECT_CREATION_DENIED_REASON, WORKSPACE_LAST_OPENED_KEY, WORKSPACE_STORAGE_KEY, agentControl, browserWorkspaceStorage, clearSealedDrafts, closePanelIn, conversationKey, createArbiLayoutStore, createArbiSessionStore, createArbiWorkspaceStore, createDebouncedWriter, createSealedDraftStorage, createStoragePersist, defaultLayoutState, dmTabId, flushOnPageExit, isPanelOpen, isUsageMetered, layoutActionsOf, nextViewingDocument, openPanelIn, panelPlace, parseSavedLayout, queuedMessages, readWorkspaceLastOpened, restoreLayout, savedLayoutOf, selectDraft, selectIsGenerating, selectViewingDocumentId, threadTabId, useActivity, useAgents, useArbiSession, useArbiSessionState, useArbiSessionStore, useAssistantQuery, useAvailableModels, useBoxRole, useBuiltinCommands, useCanCreateProjects, useConfig, useConfigs, useConversationThreads, useConversations, useCurrentUser, useDeleteAgents, useDocumentVersionList, useFirmPool, useHealth, useMessageDetails, useParsedDocument, useProjectInvoices, useProjectUsage, useProjects, useProjectsUsage, useSessionPageTab, useSessionView, useSignedInSession, useTags, useThumbnails, useTopUpFirmPool, useTransientView, useUserUsageToday, useWorkspaceActivity, useWorkspaces } from './chunk-ER4LFZG3.js';
8
+ import { fetchDocumentFile, downloadBlob, fetchMarkupPdf, fetchDocumentPdf } from './chunk-SI7DJWBT.js';
9
+ import { arbiMutationKeys, arbiQueryKeys, mailQueryKeys, connectorQueryKeys, calendarQueryKeys } from './chunk-AOEJ744V.js';
10
+ export { arbiMutationKeys, arbiQueryKeys, calendarQueryKeys, callQueryKeys, connectorQueryKeys, isUnderQueryKey, mailQueryKeys } from './chunk-AOEJ744V.js';
11
+ import { useArbi, useArbiHost } from './chunk-R7YNABZY.js';
12
+ export { useArbi, useArbiHost, useDeploymentDomain } from './chunk-R7YNABZY.js';
13
+ import { ArbiHost, extractMentions, UNBOUND, bindingOfRow, readLegacyThreadDocuments, forgetLegacyThreadDocuments, toMessageMentions, takeDocumentForTurn, hasMessageBody, createSearchSession, clearSearchSession } from './chunk-ZTPJNKF2.js';
14
+ export { LEGACY_THREAD_DOCUMENTS_KEY, MENTION_HREF_PREFIX, NotificationBell, Toaster, UNBOUND, bindingOfRow, clearSearchSession, createSearchSession, extractMentions, filterMentionCandidates, findMentionQuery, forgetLegacyThreadDocuments, hasMessageBody, insertMention, latestThreadOfDocument, linkMentions, mentionFromHref, openDocumentId, opensInWord, persistSearchSession, readLegacyThreadDocuments, requestSearch, savedDocumentIdFor, sharedSearchSession, takeDocumentForTurn, takePendingSearch, toMessageMentions, useOpenDocumentId, useRegisterOpenDocument, useTurnDocumentId } from './chunk-ZTPJNKF2.js';
15
+ import { notify, recordChatArtifact } from './chunk-G4Z3IP4J.js';
16
+ export { DEFAULT_NOTIFY_TONE, MAX_SESSION_NOTIFICATIONS, clearChatArtifacts, configureNotify, getChatArtifact, getChatArtifacts, notify, persistNotifyHistory, recordChatArtifact, seedNotifications, selectUnread, toast, useChatArtifact, useConversationChatArtifact, useMessageChatArtifact, useNotify } from './chunk-G4Z3IP4J.js';
14
17
  export { mergeHostConfig } from './chunk-DPYBZDJB.js';
15
18
  export { cleanDraftMarkdown, cleanDraftWithReport, promoteBoldTitle, repairParsedStructure, repairParsedTitle, stripAgentPreamble, unescapeMarkdown, unwrapCitationLinks } from './chunk-NNWMHMEC.js';
16
19
  import './chunk-WUTL62MC.js';
17
- import { returnFocusToMark, MarkMenu, getDocumentTitle, Badge, TagEntity, useAudioRecorder, MicWaveformIndicator, IconToggle, classifyMediaError, formatElapsed, friendlyFileType, AiMarkdown, Card, Input, FILE_TYPE_COLORS, getEntityIcon, UserEntity, getEntityColorStyles, AgentBadge, Textarea, Slider, getEntityLabel, getDocumentDate, usesOriginalBytesForViewer } from './chunk-2NFUEC5O.js';
18
- export { ARBI_MARK_SRC, AUDIO_MIME_PREFERENCE, AgentBadge, AiMarkdown, ArbiBotHeadIcon, ArbiIcon, AudIcon, BASE_COLORS, Badge, COLUMN_LABEL_FALLBACKS, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, ClaudeIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, DEFAULT_METADATA_TAGS, DebouncedInput, DocIcon, DocumentCard, DocumentEntity, ENTITY_MAPPINGS, EmlIcon, EntityIcon, EntityPill, FILE_TYPE_COLORS, FireworksIcon, GeminiIcon, GoogleIcon, HoverCard, HoverCardContent, HoverCardTrigger, HtmlIcon, IconToggle, ImgIcon, InlineMicButton, Input, Label, MarkMenu, MicRecordingOverlay, MicWaveformIndicator, NEUTRAL_GRAY, OpenAIIcon, PLACEHOLDER_COLOR, PassageCard, PdfIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, PresenceLabel, Progress, ProjectEntity, ProviderIcon, RadioGroup, RadioGroupItem, RagDot, RelevanceDot, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, ShieldIcon, Slider, StatusPill, Switch, TAG_TYPE_ICONS, TAG_TYPE_LABELS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagEntity, Textarea, ThreadVisibilityIcon, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TxtIcon, UserEntity, UserMenu, VIDEO_MIME_PREFERENCE, VISIBILITY_ICONS, VerifiedBadge, VerifiedToggle, VidIcon, VisibilityIcon, VisibilityToggle, XlsIcon, agentAvatarColors, badgeVariants, buildFolderTree, canonicalFolderPath, cardVariants, classifyMediaError, configureEntityRegistry, configureRagLabels, configureStatusRegistry, createChunkedRecorder, entityNoun, extensionFromMime, formatCompactLastSeen, formatDocDate, formatElapsed, formatFolderLabel, formatFriendlyDate, friendlyFileType, getDocIcon, getDocumentAuthor, getDocumentDate, getDocumentNature, getDocumentSubject, getDocumentTitle, getEntityColor, getEntityColorStyles, getEntityIcon, getEntityLabel, getFileExtension, getFileTypeIcon, getStatusVariant, getTagTypeIcon, getTagTypeLabel, getWorkspaceColor, isAudioFile, isDocumentAddableToConversation, isDownloadOnlyFile, isImageDocument, isImageFile, isMediaFile, isVideoFile, markdownToPlainText, markdownToPlainTextBlocks, pickRecorderMimeType, tagKindNouns, tagKindTitle, toggleVariants, useAudioRecorder, useDictateContext, usesOriginalBytesForViewer } from './chunk-2NFUEC5O.js';
20
+ import { returnFocusToMark, MarkMenu, getDocumentTitle, Badge, TagEntity, useAudioRecorder, MicWaveformIndicator, IconToggle, classifyMediaError, formatElapsed, friendlyFileType, AiMarkdown, Card, Input, FILE_TYPE_COLORS, getEntityIcon, UserEntity, getEntityColorStyles, AgentBadge, Textarea, Slider, getEntityLabel, getDocumentDate, usesOriginalBytesForViewer } from './chunk-3NBPMR3X.js';
21
+ export { ARBI_MARK_SRC, AUDIO_MIME_PREFERENCE, AgentBadge, AiMarkdown, ArbiBotHeadIcon, ArbiIcon, AudIcon, BASE_COLORS, Badge, COLUMN_LABEL_FALLBACKS, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, ClaudeIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, DEFAULT_METADATA_TAGS, DebouncedInput, DocIcon, DocumentCard, DocumentEntity, ENTITY_MAPPINGS, EmlIcon, EntityIcon, EntityPill, FILE_TYPE_COLORS, FireworksIcon, GeminiIcon, GoogleIcon, HoverCard, HoverCardContent, HoverCardTrigger, HtmlIcon, IconToggle, ImgIcon, InlineMicButton, Input, Label, MarkMenu, MicRecordingOverlay, MicWaveformIndicator, NEUTRAL_GRAY, OpenAIIcon, PLACEHOLDER_COLOR, PassageCard, PdfIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, PresenceLabel, Progress, ProjectEntity, ProviderIcon, RadioGroup, RadioGroupItem, RagDot, RelevanceDot, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, ShieldIcon, Slider, StatusPill, Switch, TAG_TYPE_ICONS, TAG_TYPE_LABELS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagEntity, Textarea, ThreadVisibilityIcon, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TxtIcon, UserEntity, UserMenu, VIDEO_MIME_PREFERENCE, VISIBILITY_ICONS, VerifiedBadge, VerifiedToggle, VidIcon, VisibilityIcon, VisibilityToggle, XlsIcon, agentAvatarColors, badgeVariants, buildFolderTree, canonicalFolderPath, cardVariants, classifyMediaError, configureEntityRegistry, configureRagLabels, configureStatusRegistry, createChunkedRecorder, entityNoun, extensionFromMime, formatCompactLastSeen, formatDocDate, formatElapsed, formatFolderLabel, formatFriendlyDate, friendlyFileType, getDocIcon, getDocumentAuthor, getDocumentDate, getDocumentNature, getDocumentSubject, getDocumentTitle, getEntityColor, getEntityColorStyles, getEntityIcon, getEntityLabel, getFileExtension, getFileTypeIcon, getStatusVariant, getTagTypeIcon, getTagTypeLabel, getWorkspaceColor, isAudioFile, isDocumentAddableToConversation, isDownloadOnlyFile, isImageDocument, isImageFile, isMediaFile, isVideoFile, markdownToPlainText, markdownToPlainTextBlocks, pickRecorderMimeType, tagKindNouns, tagKindTitle, toggleVariants, useAudioRecorder, useDictateContext, usesOriginalBytesForViewer } from './chunk-3NBPMR3X.js';
19
22
  import { getUserDisplayName, isAgent } from './chunk-APZZQZ6P.js';
20
23
  export { Avatar, AvatarFallback, AvatarImage, DEFAULT_SEGMENTER_CONFIG, INITIAL_SEGMENTER_STATE, createUserAvatarIcon, flushSegmenter, getUserAvatarColor, getUserDisplayName, getUserInitials, isAgent, levelFromRms, stepSegmenter } from './chunk-APZZQZ6P.js';
21
24
  import { MarkdownRenderer } from './chunk-C44GO33B.js';
@@ -28,15 +31,12 @@ import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuIte
28
31
  export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, PortalContainerProvider, usePortalContainer } from './chunk-47CCGUWR.js';
29
32
  import { normalizeCitationMarkup } from './chunk-QRCMKEE6.js';
30
33
  export { closeOpenEmphasis, normalizeCitationMarkup, trimOpenCitation } from './chunk-QRCMKEE6.js';
34
+ export { useHostConfigRecord } from './chunk-CPZ36AQS.js';
31
35
  import { cn } from './chunk-SN5YV6FF.js';
32
36
  export { cn } from './chunk-SN5YV6FF.js';
33
- import { AudioViewer, ImageViewer, VideoViewer } from './chunk-HDCRPPBW.js';
34
- import { useArbi, useArbiHost } from './chunk-R7YNABZY.js';
35
- export { useArbi, useArbiHost, useDeploymentDomain } from './chunk-R7YNABZY.js';
36
- export { useHostConfigRecord } from './chunk-CPZ36AQS.js';
37
37
  import React, { memo, useState, createContext, useMemo, useCallback, useEffect, useRef, useLayoutEffect, useSyncExternalStore, useContext, useId } from 'react';
38
- import { useQuery, useQueryClient, useMutation, onlineManager, partialMatchKey, useMutationState, keepPreviousData, useQueries } from '@tanstack/react-query';
39
- import { documents, doctags, houseTemplates, STOP_ID_WAIT_MS, resolveCitations, summarizeCitations, createIndexAssigner, reduceOutputItem, findReplyTarget, ArbiApiError, quotaFromStreamError, STOP_REPEAT_WINDOW_MS, getRunToCancel, pickMainThread, extractDocumentIdsFromMessages, extractFactIdsFromMessages, hydrateAgentSteps, getSubagentBranchRecord, getRunToAttach, settings, isConnectorVendorVisible, ACCOUNT_VENDOR, searchChunks, formatFileSize, chats, connectWithReconnect, ArbiWorkspaceSupersededError, identityErrorCode } from '@arbidocs/sdk/browser';
38
+ import { useQuery, useQueryClient, useMutation, onlineManager, partialMatchKey, useMutationState, useQueries } from '@tanstack/react-query';
39
+ import { documents, houseTemplates, doctags, STOP_ID_WAIT_MS, resolveCitations, summarizeCitations, createIndexAssigner, reduceOutputItem, findReplyTarget, ArbiApiError, quotaFromStreamError, STOP_REPEAT_WINDOW_MS, getRunToCancel, pickMainThread, extractDocumentIdsFromMessages, extractFactIdsFromMessages, hydrateAgentSteps, getSubagentBranchRecord, getRunToAttach, settings, isConnectorVendorVisible, ACCOUNT_VENDOR, searchChunks, formatFileSize, chats, connectWithReconnect, ArbiWorkspaceSupersededError, identityErrorCode } from '@arbidocs/sdk/browser';
40
40
  export { ACCOUNT_VENDOR, Arbi, ArbiError, DEFAULT_AI_USD_PER_GBP, DRIVE_SYNC_VENDORS, GOOGLE_VENDORS, IMANAGE_VENDORS, MAILBOX_SYNC_VENDORS, MAX_RETRIEVE_DOC_IDS, MICROSOFT_VENDORS, PublicBookingError, SHAREPOINT_VENDORS, bookPublicSlot, cancelPublicBooking, connectErrorMessage, formatGbp, formatGbpPerMillionTokens, getPublicBookingPage, isConnectorVendorVisible, isDriveSyncVendor, isMailboxSyncVendor, isSharePointVendor, usdToGbp } from '@arbidocs/sdk/browser';
41
41
  import { Link, Trash2, CheckCheck, Check, MoreHorizontal, SquarePen, Pencil, Download, X, Mic, Pause, Play, Square, Loader2, RotateCcw, Sparkles, Camera, Circle, AlertTriangle, ShieldCheck, Copy, FileText, GitCompareArrows, Search, CornerDownLeft, Send, Tags, Info, Activity, HardDrive, Gauge, Gift, PartyPopper, UserPlus, UserCheck, Reply, PenLine, AtSign, MessageCircleMore, FileX2, FileCheck2, FolderPlus, SquareArrowOutUpRight, Paperclip, ArrowRight, Image as Image$1, AppWindow } from 'lucide-react';
42
42
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -165,6 +165,7 @@ function useStartTaskQuery() {
165
165
  mutationFn: (query) => {
166
166
  const selectedConfig = chatModel || queryClient.getQueriesData({ queryKey: arbiQueryKeys.userSettings() }).map(([, settings]) => settings?.last_config).find(Boolean);
167
167
  return arbi.assistant.submit(query.input, {
168
+ workspaceId: query.workspaceId,
168
169
  docIds: query.docIds,
169
170
  fullContext: false,
170
171
  ...selectedConfig ? { model: selectedConfig } : {},
@@ -246,7 +247,10 @@ function useCreateWork() {
246
247
  const qc = useQueryClient();
247
248
  return useMutation({
248
249
  mutationFn: (body) => arbi.conversations.createWork(body),
249
- onSuccess: (created) => addConversationToList(qc, arbi.hasWorkspace ? arbi.getWorkspaceId() : null, created)
250
+ // The workspace it was created from, read when it is sent: one switched to while the request
251
+ // ran must not receive it in its list.
252
+ onMutate: () => ({ workspaceId: arbi.hasWorkspace ? arbi.getWorkspaceId() : null }),
253
+ onSuccess: (created, _body, context) => addConversationToList(qc, context?.workspaceId ?? null, created)
250
254
  });
251
255
  }
252
256
  function useRunConversation() {
@@ -488,9 +492,11 @@ function useRevokeAgentAccess() {
488
492
  }
489
493
  function useSkills(options) {
490
494
  const arbi = useArbi();
495
+ const workspaceId = arbi.hasWorkspace ? arbi.getWorkspaceId() : "";
496
+ const list = () => arbi.assistant.listSkills({ includeHidden: options?.includeHidden });
491
497
  return useQuery({
492
- queryKey: [...arbiQueryKeys.skills(), options?.includeHidden ?? false],
493
- queryFn: () => arbi.assistant.listSkills({ includeHidden: options?.includeHidden }),
498
+ queryKey: arbiQueryKeys.skillList(workspaceId, options?.includeHidden ?? false),
499
+ queryFn: () => workspaceId ? arbi.readInWorkspace(workspaceId, list) : list(),
494
500
  refetchInterval: options?.live ? 5e3 : false,
495
501
  enabled: (options?.enabled ?? true) && arbi.isLoggedIn,
496
502
  staleTime: 3e4
@@ -1316,12 +1322,12 @@ function useAddWorkspaceMembers() {
1316
1322
  ])
1317
1323
  });
1318
1324
  }
1319
- function useRemoveWorkspaceMembers() {
1325
+ function useRemoveWorkspaceMembers(workspaceId) {
1320
1326
  const arbi = useArbi();
1321
1327
  const qc = useQueryClient();
1322
1328
  return useMutation({
1323
1329
  mutationKey: arbiMutationKeys.workspaceMembership(),
1324
- mutationFn: (userIds) => arbi.workspaces.removeUsers(userIds),
1330
+ mutationFn: (userIds) => workspaceId ? arbi.workspaces.removeUsers(userIds, { workspaceId }) : arbi.workspaces.removeUsers(userIds),
1325
1331
  onSuccess: () => settleMembership(qc)
1326
1332
  });
1327
1333
  }
@@ -1628,6 +1634,58 @@ function resolveReplyTarget(queryClient, conversationId, parentId) {
1628
1634
  return findReplyTarget(data.threads, parentId);
1629
1635
  }
1630
1636
 
1637
+ // src/chat/conversation-workspace.ts
1638
+ var byClient = /* @__PURE__ */ new WeakMap();
1639
+ function bindingsOf(queryClient) {
1640
+ let bindings = byClient.get(queryClient);
1641
+ if (!bindings) {
1642
+ bindings = { confirmed: /* @__PURE__ */ new Map(), observed: /* @__PURE__ */ new Map() };
1643
+ byClient.set(queryClient, bindings);
1644
+ }
1645
+ return bindings;
1646
+ }
1647
+ function confirmConversationWorkspace(queryClient, conversationId, workspaceId) {
1648
+ if (conversationId === "new") return;
1649
+ bindingsOf(queryClient).confirmed.set(conversationId, workspaceId);
1650
+ }
1651
+ function observeConversationWorkspace(queryClient, conversationId, workspaceId) {
1652
+ const { observed } = bindingsOf(queryClient);
1653
+ if (conversationId !== "new" && !observed.has(conversationId))
1654
+ observed.set(conversationId, workspaceId);
1655
+ }
1656
+ function listedWorkspaceOf(queryClient, conversationId) {
1657
+ for (const [key, data] of queryClient.getQueriesData({
1658
+ queryKey: arbiQueryKeys.allConversations()
1659
+ })) {
1660
+ const workspaceId = key[2];
1661
+ if (key.length !== 3 || typeof workspaceId !== "string" || !Array.isArray(data)) continue;
1662
+ if (data.some((row) => row?.external_id === conversationId)) return workspaceId;
1663
+ }
1664
+ return null;
1665
+ }
1666
+ function conversationWorkspaceOf(queryClient, conversationId) {
1667
+ if (!conversationId || conversationId === "new") return null;
1668
+ const { confirmed, observed } = bindingsOf(queryClient);
1669
+ return confirmed.get(conversationId) ?? listedWorkspaceOf(queryClient, conversationId) ?? observed.get(conversationId) ?? null;
1670
+ }
1671
+ var watchedSessions = /* @__PURE__ */ new WeakMap();
1672
+ function watchConversationWorkspaces(queryClient, session) {
1673
+ const clients = watchedSessions.get(session) ?? /* @__PURE__ */ new WeakSet();
1674
+ if (clients.has(queryClient)) return;
1675
+ clients.add(queryClient);
1676
+ watchedSessions.set(session, clients);
1677
+ let last = null;
1678
+ const record = () => {
1679
+ const { conversationId, workspaceId } = session.getState();
1680
+ if (conversationId === last) return;
1681
+ last = conversationId;
1682
+ if (conversationId && workspaceId)
1683
+ observeConversationWorkspace(queryClient, conversationId, workspaceId);
1684
+ };
1685
+ record();
1686
+ session.subscribe(record);
1687
+ }
1688
+
1631
1689
  // src/documents/processing-settle.ts
1632
1690
  function startsWith(key, prefix) {
1633
1691
  return prefix.every((part, i) => key[i] === part);
@@ -1861,31 +1919,61 @@ function settleUpdatedDocTag(qc, updated) {
1861
1919
  doctags: (doc.doctags ?? []).map((dt) => dt.tag_ext_id === updated.tag_ext_id ? updated : dt)
1862
1920
  }));
1863
1921
  }
1922
+ var sendUpdateDocuments = (client, input) => inWorkspace(
1923
+ primeOnClient(client),
1924
+ input.workspaceId,
1925
+ () => documents.updateDocuments(client, input.documents)
1926
+ );
1927
+ var sendAssignDocTags = (client, input) => inWorkspace(
1928
+ primeOnClient(client),
1929
+ input.workspaceId,
1930
+ () => doctags.assignDocTags(client, input.tagId, input.docIds, input.note, input.citations)
1931
+ );
1932
+ var sendRemoveDocTags = (client, input) => inWorkspace(
1933
+ primeOnClient(client),
1934
+ input.workspaceId,
1935
+ () => doctags.removeDocTags(client, input.tagId, input.docIds)
1936
+ );
1937
+ var sendUpdateDocTag = (client, input) => inWorkspace(
1938
+ primeOnClient(client),
1939
+ input.workspaceId,
1940
+ () => doctags.updateDocTag(client, input.tagId, input.docId, {
1941
+ note: input.note,
1942
+ citations: input.citations
1943
+ })
1944
+ );
1864
1945
  var replayableDocumentMutations = [
1865
1946
  {
1866
1947
  mutationKey: arbiMutationKeys.updateDocuments(),
1867
- run: (client, input) => documents.updateDocuments(client, input.documents),
1948
+ run: sendUpdateDocuments,
1868
1949
  settle: (qc, updated) => settleUpdatedDocuments(qc, updated)
1869
1950
  },
1870
1951
  {
1871
1952
  mutationKey: arbiMutationKeys.assignDocTags(),
1872
- run: (client, input) => doctags.assignDocTags(client, input.tagId, input.docIds, input.note, input.citations),
1953
+ run: sendAssignDocTags,
1873
1954
  settle: (qc, created) => settleAssignedDocTags(qc, created)
1874
1955
  },
1875
1956
  {
1876
1957
  mutationKey: arbiMutationKeys.removeDocTags(),
1877
- run: (client, input) => doctags.removeDocTags(client, input.tagId, input.docIds),
1958
+ run: sendRemoveDocTags,
1878
1959
  settle: (qc, _data, input) => settleRemovedDocTags(qc, input)
1879
1960
  },
1880
1961
  {
1881
1962
  mutationKey: arbiMutationKeys.updateDocTag(),
1882
- run: (client, input) => doctags.updateDocTag(client, input.tagId, input.docId, {
1883
- note: input.note,
1884
- citations: input.citations
1885
- }),
1963
+ run: sendUpdateDocTag,
1886
1964
  settle: (qc, updated) => settleUpdatedDocTag(qc, updated)
1887
1965
  }
1888
1966
  ];
1967
+ function useDocumentWriteWorkspace(docIdOf) {
1968
+ const arbi = useArbi();
1969
+ const qc = useQueryClient();
1970
+ return (variables) => {
1971
+ if (variables.workspaceId) return variables;
1972
+ const docId = docIdOf(variables);
1973
+ const workspaceId = (docId ? workspaceOf(qc, docId) : void 0) ?? (arbi.hasWorkspace ? arbi.getWorkspaceId() : void 0);
1974
+ return workspaceId ? { ...variables, workspaceId } : variables;
1975
+ };
1976
+ }
1889
1977
  function resolvingOffline(mutation) {
1890
1978
  const mutateAsync = ((variables, options) => {
1891
1979
  if (!onlineManager.isOnline()) {
@@ -1912,14 +2000,28 @@ function useMarkDocumentShared() {
1912
2000
  function useUpdateDocuments() {
1913
2001
  const arbi = useArbi();
1914
2002
  const qc = useQueryClient();
2003
+ const capture = useDocumentWriteWorkspace(
2004
+ (input) => input.documents[0]?.external_id
2005
+ );
1915
2006
  return resolvingOffline(
1916
- useMutation({
1917
- mutationKey: arbiMutationKeys.updateDocuments(),
1918
- mutationFn: ({ documents: documents2 }) => arbi.documents.update(documents2),
1919
- onMutate: ({ documents: documents2 }) => onlineManager.isOnline() || !documents2.length ? void 0 : applyOptimisticDocumentEdit(qc, documents2),
1920
- onError: (_error, _input, context) => rollbackOptimisticDocumentEdit(qc, context),
1921
- onSuccess: (updated) => settleUpdatedDocuments(qc, updated)
1922
- })
2007
+ useCapturingWorkspace(
2008
+ useMutation({
2009
+ mutationKey: arbiMutationKeys.updateDocuments(),
2010
+ mutationFn: (input) => inWorkspace(
2011
+ primeOnArbi(arbi),
2012
+ input.workspaceId,
2013
+ () => arbi.documents.update(input.documents)
2014
+ ),
2015
+ onMutate: ({ documents: documents2 }) => onlineManager.isOnline() || !documents2.length ? void 0 : applyOptimisticDocumentEdit(qc, documents2),
2016
+ // Not sent because its workspace can't be opened: the edit stays, listed as not sent.
2017
+ onError: (error, _input, context) => {
2018
+ if (!isWorkspaceUnavailable(error)) rollbackOptimisticDocumentEdit(qc, context);
2019
+ },
2020
+ onSuccess: (updated) => settleUpdatedDocuments(qc, updated),
2021
+ ...QUEUED_WRITE_RETRY
2022
+ }),
2023
+ capture
2024
+ )
1923
2025
  );
1924
2026
  }
1925
2027
  function folderSegments(folder) {
@@ -2001,34 +2103,57 @@ function useUploadUrls() {
2001
2103
  function useAssignDocTags() {
2002
2104
  const arbi = useArbi();
2003
2105
  const qc = useQueryClient();
2106
+ const capture = useDocumentWriteWorkspace((input) => input.docIds[0]);
2004
2107
  return resolvingOffline(
2005
- useMutation({
2006
- mutationKey: arbiMutationKeys.assignDocTags(),
2007
- mutationFn: ({ tagId, docIds, note, citations }) => arbi.doctags.assign(tagId, docIds, note, citations),
2008
- onSuccess: (created) => settleAssignedDocTags(qc, created)
2009
- })
2108
+ useCapturingWorkspace(
2109
+ useMutation({
2110
+ mutationKey: arbiMutationKeys.assignDocTags(),
2111
+ mutationFn: ({ workspaceId, tagId, docIds, note, citations }) => inWorkspace(
2112
+ primeOnArbi(arbi),
2113
+ workspaceId,
2114
+ () => arbi.doctags.assign(tagId, docIds, note, citations)
2115
+ ),
2116
+ onSuccess: (created) => settleAssignedDocTags(qc, created),
2117
+ ...QUEUED_WRITE_RETRY
2118
+ }),
2119
+ capture
2120
+ )
2010
2121
  );
2011
2122
  }
2012
2123
  function useRemoveDocTags() {
2013
2124
  const arbi = useArbi();
2014
2125
  const qc = useQueryClient();
2126
+ const capture = useDocumentWriteWorkspace((input) => input.docIds[0]);
2015
2127
  return resolvingOffline(
2016
- useMutation({
2017
- mutationKey: arbiMutationKeys.removeDocTags(),
2018
- mutationFn: ({ tagId, docIds }) => arbi.doctags.remove(tagId, docIds),
2019
- onSuccess: (_data, input) => settleRemovedDocTags(qc, input)
2020
- })
2128
+ useCapturingWorkspace(
2129
+ useMutation({
2130
+ mutationKey: arbiMutationKeys.removeDocTags(),
2131
+ mutationFn: ({ workspaceId, tagId, docIds }) => inWorkspace(primeOnArbi(arbi), workspaceId, () => arbi.doctags.remove(tagId, docIds)),
2132
+ onSuccess: (_data, input) => settleRemovedDocTags(qc, input),
2133
+ ...QUEUED_WRITE_RETRY
2134
+ }),
2135
+ capture
2136
+ )
2021
2137
  );
2022
2138
  }
2023
2139
  function useUpdateDocTag() {
2024
2140
  const arbi = useArbi();
2025
2141
  const qc = useQueryClient();
2142
+ const capture = useDocumentWriteWorkspace((input) => input.docId);
2026
2143
  return resolvingOffline(
2027
- useMutation({
2028
- mutationKey: arbiMutationKeys.updateDocTag(),
2029
- mutationFn: ({ tagId, docId, note, citations }) => arbi.doctags.update(tagId, docId, { note, citations }),
2030
- onSuccess: (updated) => settleUpdatedDocTag(qc, updated)
2031
- })
2144
+ useCapturingWorkspace(
2145
+ useMutation({
2146
+ mutationKey: arbiMutationKeys.updateDocTag(),
2147
+ mutationFn: ({ workspaceId, tagId, docId, note, citations }) => inWorkspace(
2148
+ primeOnArbi(arbi),
2149
+ workspaceId,
2150
+ () => arbi.doctags.update(tagId, docId, { note, citations })
2151
+ ),
2152
+ onSuccess: (updated) => settleUpdatedDocTag(qc, updated),
2153
+ ...QUEUED_WRITE_RETRY
2154
+ }),
2155
+ capture
2156
+ )
2032
2157
  );
2033
2158
  }
2034
2159
  function queueProcessing(documents2) {
@@ -3256,7 +3381,7 @@ function uploadFolderOf(file, base) {
3256
3381
  const own = slash > 0 ? relative.slice(0, slash) : "";
3257
3382
  return sanitizeFolderPath([base, own].filter(Boolean).join("/")) || null;
3258
3383
  }
3259
- var { uploadDocumentsDirect, mimeFromName: mimeFromName2 } = documents;
3384
+ var { mimeFromName: mimeFromName2 } = documents;
3260
3385
  var BATCH_SIZE2 = 100;
3261
3386
  var CONCURRENT_BATCHES = 4;
3262
3387
  var uploadedFolders = /* @__PURE__ */ new Map();
@@ -3288,8 +3413,8 @@ function useUploadFiles() {
3288
3413
  const direct = settings?.use_s3_direct_upload === true;
3289
3414
  return useCallback(
3290
3415
  async (input, onProgress) => {
3291
- const openWorkspaceId2 = arbi.getWorkspaceId();
3292
- const workspaceId = input.workspaceExtId ?? openWorkspaceId2;
3416
+ const openWorkspaceId3 = arbi.getWorkspaceId();
3417
+ const workspaceId = input.workspaceExtId ?? openWorkspaceId3;
3293
3418
  const groups = /* @__PURE__ */ new Map();
3294
3419
  for (const file of input.files) {
3295
3420
  const folder = uploadFolderOf(file, input.folder);
@@ -3300,7 +3425,7 @@ function useUploadFiles() {
3300
3425
  for (let i = 0; i < files.length; i += BATCH_SIZE2)
3301
3426
  batches.push({ folder, files: files.slice(i, i + BATCH_SIZE2) });
3302
3427
  let workspaceKey = null;
3303
- if (direct && workspaceId === openWorkspaceId2 && resolveWorkspaceKey) {
3428
+ if (direct && workspaceId === openWorkspaceId3 && resolveWorkspaceKey) {
3304
3429
  try {
3305
3430
  workspaceKey = await resolveWorkspaceKey(workspaceId);
3306
3431
  } catch {
@@ -3323,9 +3448,20 @@ function useUploadFiles() {
3323
3448
  const results = await runLimited(
3324
3449
  batches.map(({ folder, files }, index) => async () => {
3325
3450
  const bytes = files.reduce((sum, file) => sum + file.size, 0);
3326
- const result = workspaceKey ? await uploadDocumentsDirect(
3327
- arbi.getClient(),
3328
- workspaceKey,
3451
+ const throughServer = () => arbi.documents.upload(files, {
3452
+ shared: input.shared,
3453
+ folder: folder ?? void 0,
3454
+ configExtId: input.configExtId ?? void 0,
3455
+ // Named even when it is the open one: batches sent after a switch stay in this workspace.
3456
+ workspaceExtId: workspaceId,
3457
+ onProgress: (loaded) => {
3458
+ loadedByBatch[index] = Math.min(loaded, bytes);
3459
+ report();
3460
+ }
3461
+ });
3462
+ const directly = async (key) => arbi.documents.uploadDirect(
3463
+ workspaceId,
3464
+ key,
3329
3465
  await Promise.all(
3330
3466
  files.map(async (file) => ({
3331
3467
  name: file.name,
@@ -3343,17 +3479,8 @@ function useUploadFiles() {
3343
3479
  report();
3344
3480
  }
3345
3481
  }
3346
- ) : await arbi.documents.upload(files, {
3347
- shared: input.shared,
3348
- folder: folder ?? void 0,
3349
- configExtId: input.configExtId ?? void 0,
3350
- // Named even when it is the open one: batches sent after a switch stay in this workspace.
3351
- workspaceExtId: workspaceId,
3352
- onProgress: (loaded) => {
3353
- loadedByBatch[index] = Math.min(loaded, bytes);
3354
- report();
3355
- }
3356
- });
3482
+ );
3483
+ const result = workspaceKey && arbi.hasWorkspace && arbi.getWorkspaceId() === workspaceId ? await directly(workspaceKey) : await throughServer();
3357
3484
  const docIds2 = result.doc_ext_ids ?? [];
3358
3485
  if (docIds2.length > 0) {
3359
3486
  for (const docId of docIds2) uploadedFolders.set(docId, { workspaceId, folder });
@@ -3570,8 +3697,12 @@ function isReplayableArbiMutation(mutationKey) {
3570
3697
  function registerArbiMutationDefaults(queryClient, client) {
3571
3698
  for (const m of REPLAYABLE) {
3572
3699
  queryClient.setMutationDefaults(m.mutationKey, {
3700
+ // Each write is sent in the workspace it was made in (kept in its variables), never in the
3701
+ // one open when it is replayed; one whose workspace can't be opened is tried again, then
3702
+ // kept as not sent.
3573
3703
  mutationFn: (variables) => m.run(client(), variables),
3574
- onSuccess: (data, variables) => m.settle(queryClient, data, variables)
3704
+ onSuccess: (data, variables) => m.settle(queryClient, data, variables),
3705
+ ...QUEUED_WRITE_RETRY
3575
3706
  });
3576
3707
  }
3577
3708
  }
@@ -3615,9 +3746,9 @@ var KIND_BY_KEY = [
3615
3746
  function kindOf(mutationKey) {
3616
3747
  return mutationKey ? KIND_BY_KEY.find(([key]) => partialMatchKey(mutationKey, key))?.[1] : void 0;
3617
3748
  }
3618
- function statusOf(isPaused, status) {
3749
+ function statusOf(isPaused, status, blocked = false) {
3619
3750
  if (status === "error") return "error";
3620
- return isPaused ? "queued" : "syncing";
3751
+ return isPaused || blocked ? "queued" : "syncing";
3621
3752
  }
3622
3753
  function docIdsFromVariables(kind, variables) {
3623
3754
  if (kind === "fields")
@@ -3691,7 +3822,8 @@ function buildPendingSyncItem(raw, docNameById, tagNameById) {
3691
3822
  change: describeChange(raw, tagNameById),
3692
3823
  status: raw.status,
3693
3824
  at: raw.at,
3694
- docIds
3825
+ docIds,
3826
+ ...raw.blocked ? { notice: QUEUED_WRITE_BLOCKED_MESSAGE } : {}
3695
3827
  };
3696
3828
  }
3697
3829
  var PENDING_SYNC_PREDICATE = (m) => (
@@ -3705,7 +3837,8 @@ var PENDING_SYNC_PREDICATE = (m) => (
3705
3837
  // that's just a normal ONLINE save mid-request, and counting it made rows
3706
3838
  // flash "pending/syncing" while fully online. `error` is kept so a failed
3707
3839
  // sync stays visible to review/undo.
3708
- isReplayableArbiMutation(m.options.mutationKey) && (m.state.isPaused || m.state.status === "error")
3840
+ // A write held back because its workspace can't be opened (tried again meanwhile) is waiting too.
3841
+ isReplayableArbiMutation(m.options.mutationKey) && (m.state.isPaused || m.state.status === "error" || isBlockedOnWorkspace(m))
3709
3842
  );
3710
3843
  function usePendingSyncItems() {
3711
3844
  const { data: documents2 } = useDocuments();
@@ -3717,8 +3850,9 @@ function usePendingSyncItems() {
3717
3850
  kind: kindOf(m.options.mutationKey) ?? "fields",
3718
3851
  variables: m.state.variables,
3719
3852
  context: m.state.context,
3720
- status: statusOf(m.state.isPaused, m.state.status),
3721
- at: m.state.submittedAt
3853
+ status: statusOf(m.state.isPaused, m.state.status, isBlockedOnWorkspace(m)),
3854
+ at: m.state.submittedAt,
3855
+ blocked: isBlockedOnWorkspace(m)
3722
3856
  })
3723
3857
  });
3724
3858
  return useMemo(() => {
@@ -3950,7 +4084,7 @@ function createStreamHandlers(ctx, params) {
3950
4084
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
3951
4085
  patchConversationList(
3952
4086
  queryClient,
3953
- session.getState().workspaceId,
4087
+ streamState.workspaceId ?? session.getState().workspaceId,
3954
4088
  (old) => old.some((c) => c.external_id === serverConversationId) ? old : [
3955
4089
  {
3956
4090
  external_id: serverConversationId,
@@ -4189,6 +4323,7 @@ function createStreamHandlers(ctx, params) {
4189
4323
  title: artifact.title,
4190
4324
  is_complete: artifact.is_complete
4191
4325
  });
4326
+ recordChatArtifact(artifact, streamState.conversationId);
4192
4327
  host.onArtifact?.(artifact, streamState.conversationId);
4193
4328
  if (artifact.is_complete) {
4194
4329
  const documents2 = session.getState().conversationDocuments[streamState.conversationId] ?? [];
@@ -4402,6 +4537,7 @@ function useConversationActions({
4402
4537
  [queryClient]
4403
4538
  );
4404
4539
  const arbi = useArbi();
4540
+ useState(() => watchConversationWorkspaces(queryClient, session));
4405
4541
  const createHandlers = useStreamHandlers();
4406
4542
  const chatHost = useArbiHost().chat;
4407
4543
  const mentionCandidates = useCallback(
@@ -4414,8 +4550,10 @@ function useConversationActions({
4414
4550
  const retryInFlightRef = useRef(false);
4415
4551
  const sendMessageRef = useRef(null);
4416
4552
  const routeMessage = useCallback(
4417
- (content) => {
4418
- const { conversationId: convId, newConversationAssistantMode } = session.getState();
4553
+ (content, conversationId) => {
4554
+ const state = session.getState();
4555
+ const convId = conversationId === void 0 ? state.conversationId : conversationId;
4556
+ const { newConversationAssistantMode } = state;
4419
4557
  const candidates = mentionCandidates();
4420
4558
  const mentioned = extractMentions(content, candidates);
4421
4559
  const assistantMode = cachedAssistantMode(queryClient, convId, newConversationAssistantMode);
@@ -4495,23 +4633,25 @@ function useConversationActions({
4495
4633
  );
4496
4634
  const sendMessage = useCallback(
4497
4635
  async (content, requestedParentId, options) => {
4636
+ const target = options?.target;
4498
4637
  const parentId = options?.queuedContinuation || !requestedParentId ? requestedParentId : resolveReplyTarget(
4499
4638
  queryClient,
4500
- session.getState().conversationId || "new",
4639
+ (target ? target.conversationId : session.getState().conversationId) || "new",
4501
4640
  requestedParentId
4502
4641
  ) ?? requestedParentId;
4503
- const route = routeMessage(content);
4504
- if (route.isComment && !options?.queuedContinuation) {
4642
+ const route = routeMessage(content, target?.conversationId);
4643
+ if (route.isComment && !options?.queuedContinuation && !target) {
4505
4644
  await postComment(content, parentId ?? null, route.mentions, options?.branch);
4506
4645
  return;
4507
4646
  }
4508
4647
  const modelSave = pendingChatModelSave(session);
4509
4648
  if (modelSave) await modelSave.catch(() => void 0);
4510
4649
  const state = session.getState();
4511
- const convId = state.conversationId;
4650
+ const convId = target ? target.conversationId : state.conversationId;
4512
4651
  const convKey = convId || "new";
4652
+ const turnWorkspaceId = target?.workspaceId ?? conversationWorkspaceOf(queryClient, convId) ?? selectedWorkspaceId;
4513
4653
  const agentChat = state.newAgentChat;
4514
- const agentExtId = convId ? state.agentChatOwners[convId] : agentChat?.workspaceId === selectedWorkspaceId ? agentChat.agentId : void 0;
4654
+ const agentExtId = convId ? state.agentChatOwners[convId] : agentChat?.workspaceId === turnWorkspaceId ? agentChat.agentId : void 0;
4515
4655
  const queuedContinuation = options?.queuedContinuation === true;
4516
4656
  const isNewConversation = !convId;
4517
4657
  const documentIds = (state.conversationDocuments[convKey] || []).map((doc) => doc.docId);
@@ -4521,18 +4661,18 @@ function useConversationActions({
4521
4661
  const lastConfigId = cachedSettings?.last_config;
4522
4662
  const resolvedConfigId = newConfigId || (agentExtId ? void 0 : lastConfigId);
4523
4663
  const isPaMode = !agentExtId && state.paMode;
4524
- const threadDocumentId = boundDocumentOf(queryClient, state);
4664
+ const threadDocumentId = boundDocumentOf(queryClient, { ...state, conversationId: convId });
4525
4665
  const activeArtifactExtId = isPaMode ? null : takeDocumentForTurn({
4526
4666
  boundDocumentId: threadDocumentId,
4527
4667
  conversationId: convId,
4528
- workspaceId: selectedWorkspaceId
4668
+ workspaceId: turnWorkspaceId
4529
4669
  });
4530
4670
  const pendingTools = state.pendingTools;
4531
4671
  if (pendingTools) session.setPendingTools(null);
4532
4672
  const toolsOverride = options?.toolsOverride ?? pendingTools ?? void 0;
4533
4673
  const request = {
4534
4674
  question: content,
4535
- workspaceId: selectedWorkspaceId,
4675
+ workspaceId: turnWorkspaceId,
4536
4676
  docIds: documentIds,
4537
4677
  pinnedDocumentId: state.pinnedDocumentId,
4538
4678
  factIds,
@@ -4557,6 +4697,7 @@ function useConversationActions({
4557
4697
  }
4558
4698
  const streamState = {
4559
4699
  conversationId: convKey,
4700
+ workspaceId: turnWorkspaceId,
4560
4701
  assistantId: null,
4561
4702
  // 0 = nothing narrated yet, so nothing is owed a reading window.
4562
4703
  lastNarrationSettledAt: 0,
@@ -4585,7 +4726,24 @@ function useConversationActions({
4585
4726
  userMessageId: null,
4586
4727
  serverError: null
4587
4728
  };
4588
- const handlers = createHandlers({ streamState, parentMessageId, parentId });
4729
+ const handlers = createHandlers({
4730
+ streamState,
4731
+ parentMessageId: target ? parentId ?? null : parentMessageId,
4732
+ parentId
4733
+ });
4734
+ const confirmTurnWorkspace = () => {
4735
+ if (streamState.workspaceId)
4736
+ confirmConversationWorkspace(
4737
+ queryClient,
4738
+ streamState.conversationId,
4739
+ streamState.workspaceId
4740
+ );
4741
+ };
4742
+ const onUserMessageInWorkspace = handlers.onUserMessage;
4743
+ handlers.onUserMessage = (message) => {
4744
+ onUserMessageInWorkspace(message);
4745
+ confirmTurnWorkspace();
4746
+ };
4589
4747
  if (agentExtId) {
4590
4748
  const onUserMessage = handlers.onUserMessage;
4591
4749
  handlers.onUserMessage = (message) => {
@@ -4625,7 +4783,11 @@ function useConversationActions({
4625
4783
  onMailDraft: handlers.onMailDraft,
4626
4784
  onElapsedTime: handlers.onElapsedTime,
4627
4785
  onContextUpdate: handlers.onContextUpdate,
4628
- onQuotaExceeded: (quota) => chatHost?.onQuotaExceeded?.(quota)
4786
+ onQuotaExceeded: (quota) => chatHost?.onQuotaExceeded?.(quota),
4787
+ onWorkspace: (workspaceId) => {
4788
+ streamState.workspaceId = workspaceId;
4789
+ confirmTurnWorkspace();
4790
+ }
4629
4791
  });
4630
4792
  flushStreamingTokens(queryClient);
4631
4793
  if (queuedContinuation && !streamState.hasStreamStarted) {
@@ -4657,7 +4819,16 @@ function useConversationActions({
4657
4819
  if (threadParent) {
4658
4820
  session.clearQueuedMessages(threadParent);
4659
4821
  }
4660
- void sendMessageRef.current?.(followUp, threadParent);
4822
+ void sendMessageRef.current?.(
4823
+ followUp,
4824
+ threadParent,
4825
+ streamState.workspaceId && streamState.conversationId !== "new" ? {
4826
+ target: {
4827
+ workspaceId: streamState.workspaceId,
4828
+ conversationId: streamState.conversationId
4829
+ }
4830
+ } : void 0
4831
+ );
4661
4832
  }
4662
4833
  if (ownsGeneration) {
4663
4834
  const lastStatus = streamState.serverError ? "failed" : "completed";
@@ -5621,8 +5792,12 @@ function useConversation(options = {}) {
5621
5792
  ...all.filter((existing) => existing.id !== staged.path),
5622
5793
  { id: staged.path, name: staged.name }
5623
5794
  ]);
5624
- } else
5625
- uploaded.push(...(await arbi.documents.uploadFile(file, file.name)).doc_ext_ids ?? []);
5795
+ } else {
5796
+ const result = await arbi.documents.upload([file], {
5797
+ ...workspaceId ? { workspaceExtId: workspaceId } : {}
5798
+ });
5799
+ uploaded.push(...result.doc_ext_ids ?? []);
5800
+ }
5626
5801
  }
5627
5802
  if (uploaded.length) await refreshDocuments(queryClient, arbi, uploaded);
5628
5803
  } catch (e) {
@@ -5631,7 +5806,7 @@ function useConversation(options = {}) {
5631
5806
  setIsUploading(false);
5632
5807
  }
5633
5808
  },
5634
- [arbi, queryClient, agentId]
5809
+ [arbi, queryClient, agentId, workspaceId]
5635
5810
  );
5636
5811
  const runningAnswer = generation?.streamingAssistantId;
5637
5812
  const queue = runningAnswer && queuedMessages2[runningAnswer] || [];
@@ -6322,6 +6497,19 @@ var ChatBubble = memo(function ChatBubble2({
6322
6497
  }
6323
6498
  );
6324
6499
  });
6500
+ var BOOT_GATE_TIMEOUT_MS = 1e4;
6501
+ function useBootTimeout(isWaiting, label, ms = BOOT_GATE_TIMEOUT_MS) {
6502
+ const [timedOut, setTimedOut] = useState(false);
6503
+ useEffect(() => {
6504
+ if (!isWaiting || timedOut) return;
6505
+ const timer = setTimeout(() => {
6506
+ console.warn(`[boot] ${label} did not finish within ${ms / 1e3}s; continuing without it`);
6507
+ setTimedOut(true);
6508
+ }, ms);
6509
+ return () => clearTimeout(timer);
6510
+ }, [isWaiting, timedOut]);
6511
+ return timedOut;
6512
+ }
6325
6513
  function hashText(text2) {
6326
6514
  let h = 5381;
6327
6515
  for (let i = 0; i < text2.length; i++) h = h * 33 ^ text2.charCodeAt(i);
@@ -7508,10 +7696,16 @@ function usePlanWorkspaceTransfer(scope, mode, options = {}) {
7508
7696
  const workspaceId = openWorkspaceId(arbi);
7509
7697
  return useQuery({
7510
7698
  queryKey: arbiQueryKeys.workspaceTransferPlan(workspaceId, JSON.stringify(scope), mode),
7511
- queryFn: () => arbi.workspaces.transfer.plan(scope, mode),
7699
+ // The plan is of the workspace open on the server: kept only if it stayed `workspaceId`.
7700
+ queryFn: () => arbi.readInWorkspace(
7701
+ workspaceId,
7702
+ () => arbi.workspaces.transfer.plan(scope, mode)
7703
+ ),
7512
7704
  enabled: !!workspaceId && (options.enabled ?? true),
7513
7705
  staleTime: 1e4,
7514
- placeholderData: keepPreviousData
7706
+ // The previous plan stays while the next loads, never another workspace's.
7707
+ // ['arbi', 'workspaceTransfers', 'plan', workspaceId, scope, mode]
7708
+ placeholderData: (previous, previousQuery) => previousQuery?.queryKey[3] === workspaceId ? previous : void 0
7515
7709
  });
7516
7710
  }
7517
7711
  function useStartWorkspaceTransfer() {
@@ -7550,7 +7744,10 @@ function useWorkspaceTransfers(options = {}) {
7550
7744
  const workspaceId = openWorkspaceId(arbi);
7551
7745
  return useQuery({
7552
7746
  queryKey: arbiQueryKeys.workspaceTransfers(workspaceId),
7553
- queryFn: () => arbi.workspaces.transfer.list(),
7747
+ queryFn: () => arbi.readInWorkspace(
7748
+ workspaceId,
7749
+ () => arbi.workspaces.transfer.list()
7750
+ ),
7554
7751
  enabled: !!workspaceId && (options.enabled ?? true)
7555
7752
  });
7556
7753
  }
@@ -7752,10 +7949,13 @@ var DATABASE_RELATION_PICK_LIMIT = 50;
7752
7949
  function invalidateRelatedRows(queryClient, databaseId, includeSelf) {
7753
7950
  return queryClient.invalidateQueries({
7754
7951
  queryKey: arbiQueryKeys.databaseRows(),
7755
- // ['arbi', 'databases', 'rows', databaseId, params]
7756
- predicate: (query) => includeSelf || query.queryKey[3] !== databaseId
7952
+ // ['arbi', 'databases', 'rows', workspaceId, databaseId, params]
7953
+ predicate: (query) => includeSelf || query.queryKey[4] !== databaseId
7757
7954
  });
7758
7955
  }
7956
+ function sameWorkspace(queryKey, workspaceId) {
7957
+ return !!queryKey && queryKey[3] === workspaceId;
7958
+ }
7759
7959
  function useInvalidate() {
7760
7960
  const queryClient = useQueryClient();
7761
7961
  return {
@@ -7767,43 +7967,51 @@ function useInvalidate() {
7767
7967
  all: () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.databases() })
7768
7968
  };
7769
7969
  }
7970
+ function openWorkspaceId2(arbi) {
7971
+ return arbi.hasWorkspace ? arbi.getWorkspaceId() : "";
7972
+ }
7770
7973
  function useDatabases() {
7771
7974
  const arbi = useArbi();
7975
+ const workspaceId = openWorkspaceId2(arbi);
7772
7976
  return useQuery({
7773
- queryKey: arbiQueryKeys.databaseList(),
7774
- queryFn: () => arbi.databases.list(),
7775
- enabled: arbi.hasWorkspace,
7977
+ queryKey: arbiQueryKeys.databaseList(workspaceId),
7978
+ queryFn: () => arbi.readInWorkspace(workspaceId, () => arbi.databases.list()),
7979
+ enabled: !!workspaceId,
7776
7980
  staleTime: 1e3 * 30
7777
7981
  });
7778
7982
  }
7779
7983
  function useDatabase(databaseId) {
7780
7984
  const arbi = useArbi();
7985
+ const workspaceId = openWorkspaceId2(arbi);
7781
7986
  return useQuery({
7782
- queryKey: arbiQueryKeys.database(databaseId ?? ""),
7987
+ queryKey: arbiQueryKeys.database(workspaceId, databaseId ?? ""),
7783
7988
  queryFn: () => arbi.databases.get(databaseId),
7784
- enabled: arbi.hasWorkspace && Boolean(databaseId),
7989
+ enabled: !!workspaceId && Boolean(databaseId),
7785
7990
  staleTime: 1e3 * 30
7786
7991
  });
7787
7992
  }
7788
7993
  function useDatabaseRows(databaseId, q) {
7789
7994
  const arbi = useArbi();
7995
+ const workspaceId = openWorkspaceId2(arbi);
7790
7996
  const query = { q: q.trim() || void 0, limit: DATABASE_ROWS_PAGE };
7791
7997
  return useQuery({
7792
- queryKey: arbiQueryKeys.databaseRows(databaseId ?? "", query),
7998
+ queryKey: arbiQueryKeys.databaseRows(workspaceId, databaseId ?? "", query),
7793
7999
  queryFn: () => arbi.databases.rows(databaseId, query),
7794
- enabled: arbi.hasWorkspace && Boolean(databaseId),
8000
+ enabled: !!workspaceId && Boolean(databaseId),
7795
8001
  staleTime: 1e3 * 15,
7796
- placeholderData: (previous) => previous
8002
+ // What was shown stays while the next search loads, never another workspace's rows.
8003
+ placeholderData: (previous, previousQuery) => sameWorkspace(previousQuery?.queryKey, workspaceId) ? previous : void 0
7797
8004
  });
7798
8005
  }
7799
8006
  function useDatabaseAggregate(databaseId, request, options) {
7800
8007
  const arbi = useArbi();
8008
+ const workspaceId = openWorkspaceId2(arbi);
7801
8009
  return useQuery({
7802
- queryKey: arbiQueryKeys.databaseAggregate(databaseId ?? "", request),
8010
+ queryKey: arbiQueryKeys.databaseAggregate(workspaceId, databaseId ?? "", request),
7803
8011
  queryFn: () => arbi.databases.aggregate(databaseId, request),
7804
- enabled: (options?.enabled ?? true) && arbi.hasWorkspace && Boolean(databaseId),
8012
+ enabled: (options?.enabled ?? true) && !!workspaceId && Boolean(databaseId),
7805
8013
  staleTime: 1e3 * 15,
7806
- placeholderData: (previous) => previous
8014
+ placeholderData: (previous, previousQuery) => sameWorkspace(previousQuery?.queryKey, workspaceId) ? previous : void 0
7807
8015
  });
7808
8016
  }
7809
8017
  function useSearchDatabaseRows() {
@@ -7851,6 +8059,7 @@ function useAddDatabaseRows() {
7851
8059
  function useUpdateDatabaseRow() {
7852
8060
  const arbi = useArbi();
7853
8061
  const queryClient = useQueryClient();
8062
+ const workspaceId = openWorkspaceId2(arbi);
7854
8063
  return useMutation({
7855
8064
  mutationFn: ({
7856
8065
  databaseId,
@@ -7862,7 +8071,9 @@ function useUpdateDatabaseRow() {
7862
8071
  { queryKey: arbiQueryKeys.databaseRows() },
7863
8072
  (page) => page && { ...page, rows: page.rows.map((row) => row.id === saved.id ? saved : row) }
7864
8073
  );
7865
- const database = queryClient.getQueryData(arbiQueryKeys.database(databaseId));
8074
+ const database = queryClient.getQueryData(
8075
+ arbiQueryKeys.database(workspaceId, databaseId)
8076
+ );
7866
8077
  const selfLinked = !database?.columns || database.columns.some(
7867
8078
  (column) => column.id in (values ?? {}) && column.type === "relation" && column.relation?.database_id === databaseId
7868
8079
  );
@@ -8926,7 +9137,13 @@ function useDatabaseDashboardStore(options = {}) {
8926
9137
  (d) => d.editable && d.workspace_id === workspaceId && d.name === name && (d.columns ?? []).some((c) => c.name === SPEC_COLUMN)
8927
9138
  );
8928
9139
  }
9140
+ function inWorkspace2(read) {
9141
+ return workspaceId ? arbi.readInWorkspace(workspaceId, read) : read();
9142
+ }
8929
9143
  async function ensure() {
9144
+ return inWorkspace2(ensureHere);
9145
+ }
9146
+ async function ensureHere() {
8930
9147
  const found = await find();
8931
9148
  if (found) return found;
8932
9149
  const created = await arbi.databases.create({
@@ -8937,12 +9154,14 @@ function useDatabaseDashboardStore(options = {}) {
8937
9154
  { name: SPEC_COLUMN, type: "text" }
8938
9155
  ]
8939
9156
  });
8940
- void queryClient.invalidateQueries({ queryKey: arbiQueryKeys.databaseList() });
9157
+ void queryClient.invalidateQueries({
9158
+ queryKey: arbiQueryKeys.databaseList(workspaceId ?? void 0)
9159
+ });
8941
9160
  return created;
8942
9161
  }
8943
9162
  return {
8944
9163
  scope: workspaceId,
8945
- async list() {
9164
+ list: () => inWorkspace2(async () => {
8946
9165
  const database = await find();
8947
9166
  if (!database) return [];
8948
9167
  const spec = database.columns?.find((c) => c.name === SPEC_COLUMN)?.id ?? SPEC_COLUMN;
@@ -8951,7 +9170,7 @@ function useDatabaseDashboardStore(options = {}) {
8951
9170
  const parsed = parseDashboardSpec(row.values[spec]);
8952
9171
  return parsed ? [{ id: row.id, spec: parsed, updatedAt: row.updated_at }] : [];
8953
9172
  });
8954
- },
9173
+ }),
8955
9174
  async save({ id, spec }) {
8956
9175
  const values = { [NAME_COLUMN]: spec.title, [SPEC_COLUMN]: serializeDashboardSpec(spec) };
8957
9176
  const database = await ensure();
@@ -10753,10 +10972,14 @@ function useCalendarOverlays(range, layers) {
10753
10972
  const workspaceId = arbi.hasWorkspace ? arbi.getWorkspaceId() : null;
10754
10973
  return useQuery({
10755
10974
  queryKey: calendarQueryKeys.overlays(workspaceId, range ?? void 0, layers),
10756
- queryFn: () => arbi.calendar.listOverlays(range, layers),
10975
+ queryFn: () => arbi.readInWorkspace(
10976
+ workspaceId,
10977
+ () => arbi.calendar.listOverlays(range, layers)
10978
+ ),
10757
10979
  enabled: !!workspaceId && !!range && layers.length > 0,
10758
10980
  staleTime: 6e4,
10759
- placeholderData: (previous) => previous,
10981
+ // ['arbi', 'calendar', 'overlays', workspaceId, window]
10982
+ placeholderData: (previous, previousQuery) => previousQuery?.queryKey[3] === workspaceId ? previous : void 0,
10760
10983
  retry: false
10761
10984
  });
10762
10985
  }
@@ -11735,6 +11958,7 @@ function useSemanticSearch(docIds = [], options = {}) {
11735
11958
  return;
11736
11959
  }
11737
11960
  const run = session.getState().run + 1;
11961
+ const searched = workspaceId ?? session.getState().workspaceId ?? void 0;
11738
11962
  session.setState((s) => ({
11739
11963
  query: trimmed,
11740
11964
  status: "running",
@@ -11746,7 +11970,8 @@ function useSemanticSearch(docIds = [], options = {}) {
11746
11970
  const result = await arbi.assistant.retrieve(trimmed, docIds, {
11747
11971
  searchMode: mode,
11748
11972
  store: false,
11749
- ...model ? { model } : {}
11973
+ ...model ? { model } : {},
11974
+ ...searched ? { workspaceId: searched } : {}
11750
11975
  });
11751
11976
  if (session.getState().run !== run) return;
11752
11977
  session.setState({ results: searchChunks(result), searched: true, status: "done" });
@@ -14266,6 +14491,6 @@ function CommandPaletteProvider({
14266
14491
  ] });
14267
14492
  }
14268
14493
 
14269
- export { AGENT_CONTROL_COMMANDS, AGGREGATE_FIELDS, ALLOWED_PORTAL_ORIGINS, ARCHIVE_POLL_MS, ASSISTANT_MENTION_LABEL, AUTO_CHAT_MODEL, ActivityFeed, AiActionCard, AiAnswer, AppleIcon, ArbiBotIcon, ArbiHost2 as ArbiHost, ArbiWebSocketProvider, ArtifactCanvas, BOX_SEAT_REFUSED, BOX_SEAT_REFUSED_ACTION, BOX_SEAT_REFUSED_TITLE, BUILTIN_DATA_SOURCES, CONVERSATION_SWITCH_MEASURE, ChatBubble, CitationRenderer, CommandPalette, CommandPaletteProvider, ConversationList, ConversationScope, DATABASE_RELATION_PICK_LIMIT, DATABASE_ROWS_PAGE, DEFAULT_ASPECT_OPTIONS, DEFAULT_CONVERSATIONS_SOURCE_LABELS, DEFAULT_DATABASE_SOURCE_LABELS, DEFAULT_DOCUMENTS_SOURCE_LABELS, DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES, DEFAULT_PROJECTS_SOURCE_LABELS, DEFAULT_USAGE_SOURCE_LABELS, DEFAULT_WORKSPACES_SOURCE_LABELS, DateSeparator, DmAvatar, DmComposer, DocQaPanel, DocSearch, DocumentCardMenu, DocumentReview, DraftTitleControls, EMPTY_GROUP_LABEL, FIRST_TOKEN_MEASURE, FileIcon, GitHubIcon, ImageCropModal, ImageCropper, LIVE_UPDATE_TYPES, LinkedInIcon, MAIL_DRAFT_REPLACED_EVENT, MAX_DASHBOARD_SPEC_CHARS, MAX_SERIES, MIN_NARRATION_DWELL_MS, MODEL_GROUP_LABELS, MailOfflineUnavailableError, MessageArtifactCard, PENDING_SYNC_PREDICATE, POLL_EVERY_MS, PhotoCapture, RUN_WINDOW_MS, SIGNATURE_NOTIFICATION_TYPES, SLOW_AFTER_MS, STILL_WORKING, StorageActionError, TRANSFER_POLL_MS, TaskThreadPendingError, TypingIndicator, UPLOAD_ACCEPT, UPLOAD_MAX_FILE_SIZE, VideoCapture, VoiceNoteRecorder, WORK_NOTIFICATION_LABELS, __resetPendingFinalCommitsForTests, __resetStreamingTokenBufferForTests, accountPath, addAssistantMessageToCache, addUserMessageToCache, adoptNewChatDocument, aggregateDataset, aliasTakenMessage, allConversationThreads, annotateThread, announceMailDraftReplaced, appendTokenToMessage, applyConversationEvent, applyFinalContextToMessage, applyLiveUpdate, applyNotificationRow, applyOptimisticDocumentEdit, applyOutputItemToMessage, applyTaskEvent, arbiMailClient, archiveName, archivedWorkspaceMessage, bindThreadDocument, boundDocumentOf, bucketOf, bucketRange, buildDocumentMetadataRows, buildMentionCandidates, buildPendingFirstTurn, buildPendingSyncItem, buildWorkspaceArchive, cacheThreadBinding, cachedAssistantMode, cachedMentionCandidates, cachedQuotaUsedUp, calendarNotificationMeta, callNotificationMeta, captureFrameAsBlob, clearLoadingState, clearUserInputRequest, commitFinalMessage, completeQueuedUserMessageByContent, connectOAuthCalendarAccount, connectorErrorStatus, connectorReturnTo, createConversationsSource, createDataSourceRegistry, createDatabaseSource, createDocumentsSource, createMailClient, createMemoryDashboardStore, createProjectsSource, createSkillPack, createStreamHandlers, createUsageSource, createWorkspaceSwitch, createWorkspacesSource, cropImage, dayKey, defaultMailAlias, defineRowsSource, deploymentUserMeta, describeActivity, describeCalendarNotification, describeServerNotification, discardStreamingTokensForMessage, disconnectAttachedRun, documentActivityMeta, documentActivityPhrase, documentDisplayName, docxMentionMeta, downloadRecoveryFile, ensureAssistantMessageLoading, extractZipFile, fallbackFileName, fileAttachment, filesFromDrop, fillTimeGaps, filterRows, flushStreamingTokens, forgetUploadedDocumentFolder, formatConfigValidationError, formatIdentityPrice, getInterjectionText, getNotificationTypeMeta, getOfflineDocument, getOrphanedLastMessage, getRelatedLabels, getRelatedTotal, getRunStartedAt, getThreadsQueryKey, getWorkspaceActionText, getWorkspaceKind, getWorkspaceSentPhrase, hasPendingFinalCommit, hasVideoTrack, identityStepFor, inputRequestTitle, invalidateCalendarEvents, invalidateCalendars, invalidateConversationActivity, isActivityKey, isAliasTakenError, isArchiveMoving, isCommentToPeople, isDeploymentAdmin, isDeploymentUserNotification, isFullConfig, isMessageRunning, isNotificationRow, isOfflineReadableArbiQuery, isOrphanedUserMessage, isQueuedCalendarWrite, isReplayableArbiMutation, isRestorableArbiQueryOnline, isSignatureNotificationType, isTableViewOf, isTransferFinished, isTransferResumable, isWorkspaceArchivedError, isWorkspaceNotificationType, isZipFile, loadOfflineDocument, mailDraftIdFromContent, mailJson, markMessageAsFailed, markNarrationSettled, migrateLegacyThreadDocuments, mountDiditVerification, nextAliasSuggestion, notificationUserName, openAccessRequest, parseActivityContent, parseDashboardSpec, parseDeleteAccountBlockers, pendingChatModelSave, peopleDirectory, personOfUser, pickRecentWorkspaces, prepareUploadFiles, queryOfChart, recordsOf, redlineStats, refuseChatWhenOffline, registerArbiMutationDefaults, registerAttachedRun, removeSettledNarration, requestPersistentStorage, resetCalendarAccountSyncState, resetMessageContent, resolveActiveWorkspace, resolveConfigModel, resolveReplyTarget, rollbackOptimisticDocumentEdit, safePortalUrl, serializeDashboardSpec, serverNotificationBellEntry, setMessageContent, setUserInputRequest, signatureNotificationPhrase, signatureRequestMeta, subscribeDocumentReads, supportsHouseTemplates, textToArtifact, threadBinding, threadEndingAtContains, titleFromQuestion, toChatCitations, toNotificationPreferences, toRedlineMarkdown, toShellWorkspace, updateMessageWithMetadata, updateUserMessageInCache, updateUserMessageStateInCache, uploadFolderOf, uploadedDocumentFolder, useActOnStep, useActiveConfigId, useAddChatMembers, useAddDatabaseRows, useAddHolidayCalendar, useAddProjectAddonBlock, useAddWorkspaceMembers, useAddonQuote, useAgentChats, useAgentConfig, useAgentDmStatus, useAgentModels, useAgentRunControl, useAgentSession, useAgentWorkspaces, useAiTask, useAnswerAgentQuestion, useApplyChatModel, useArbiConnected, useArbiShellWorkspaces, useArbiWebSocket, useArbiWsContext, useArbiWsMessage, useArbiWsStatus, useArchiveProgressPolling, useArchiveWorkspace, useAskAgain, useAssignDocTags, useAuthorizeLimits, useAutoSendDraft, useBookingPages, useBranchNavigation, useCalDavProfiles, useCalendarAccounts, useCalendarEvent, useCalendarEventByUid, useCalendarEvents, useCalendarInvitations, useCalendarOutbox, useCalendarOverlays, useCalendarSettings, useCalendarShares, useCalendarSupport, useCalendars, useCameraStream, useCanEditShared, useCancelDriveSync, useCancelMailboxSync, useCancelManyPendingSync, useCancelProjectSubscription, useCancelWorkspaceTransfer, useChangeProjectPlan, useChargeWatch, useChatArrivals, useChatPost, useChatSummaries, useChatThread, useChatUnreadTotal, useChats, useClaimNativeAlias, useCloseAgentSession, useCommandPalette, useConfigSchema, useConfirmEmailChange, useConnectCalDavAccount, useConnectMailAccount, useConnectOAuthAccount, useConnectRunStream, useConnectorAutoSync, useConnectorCatalog, useConnectorVendorVisibility, useContacts, useConversation, useConversationActions, useConversationActivity, useConversationData, useConversationDocuments, useConversationIsShared, useConversationItems, useConversationPendingAuth, useConversationSearch, useConversationTurn, useConversationUsage, useCreateAgent, useCreateCalendar, useCreateContact, useCreateDatabase, useCreateEvent, useCreateFact, useCreateFacts, useCreateGroupChat, useCreateProject, useCreateProjectCheckout, useCreateRoom, useCreateWork, useCreateWorkflow, useCreateWorkspace, useCurrentSessionId, useCurrentWorkspace, useDashboardStore, useDataSources, useDatabase, useDatabaseAggregate, useDatabaseDashboardStore, useDatabaseRows, useDatabases, useDecideCounter, useDeleteAccount, useDeleteAccountFlow, useDeleteBookingPage, useDeleteCalendar, useDeleteChatMessage, useDeleteConfig, useDeleteContact, useDeleteConversation, useDeleteDashboard, useDeleteDatabase, useDeleteDatabaseRows, useDeleteDocuments, useDeleteEvent, useDeleteFact, useDeleteMessage, useDeleteNotifications, useDeleteProject, useDeleteSkill, useDeleteWorkflow, useDeleteWorkspaces, useDisconnectCalendarAccount, useDisconnectConnector, useDisconnectMailAccount, useDisconnectSlack, useDismissedTips, useDocumentAutoAdd, useDocumentHostActions, useDocumentPendingSync, useDocumentThumbnails, useDocumentsSupport, useDownloadDocuments, useDriveFolderChildren, useDriveFolderDocCount, useDriveFolders, useDriveSyncEstimate, useDriveSyncProgress, useEmailChange, useEnableDriveSync, useEnableMailboxSync, useExportDatabase, useFacts, useFetchCalendarEvent, useFilteredProjects, useFinaliseTranslation, useFindTime, useFollowThread, useFreeBusy, useGenerateAgentAvatar, useGenerateDocTags, useGrantAgentAccess, useHolidayCountries, useHouseTemplateCandidates, useIdentityVerification, useIdentityVerificationFlow, useImportCalendar, useImportContacts, useImportDatabase, useImportDatabaseRows, useInstallSkillPack, useInvalidateAfterTransfer, useInvalidateProjects, useInvalidateStorage, useInviteContacts, useIsSlow, useIsWorkspaceOwner, useKeepDocumentsOffline, useLinkContact, useMailAccounts, useMailAttachmentText, useMailCache, useMailClient, useMailDraftCompose, useMailDraftEditor, useMailDraftReplaced, useMailFolders, useMailMessage, useMailMessages, useMailOnline, useMailPolicy, useMailProjects, useMailUnlock, useMailboxFolders, useMailboxSyncProgress, useMarkChatRead, useMarkDocumentShared, useMarkNotificationsRead, useMcpTools, useMentionCandidates, useMessageTimer, useMoveEvent, useMoveWorkspaceToProject, useMyConnectors, useNotificationPreferences, useNotifications, useNotifyConversation, useOfflineDocumentIds, useOpenSelectedWorkspace, useOpenViewerDocumentId, usePanelDataset, usePassageQuotes, usePasswordChange, usePasswordChangeForm, usePendingContacts, usePendingSyncCounts, usePendingSyncItems, usePeople, usePeopleSearch, usePlanQuote, usePlanWork, usePlanWorkspaceTransfer, usePreviewProjectPlanChange, useProcessingTask, useProcessingTasks, useProducts, useProjectBillingPortal, useProjectConversationUsage, useProjectEvents, usePublishCalendar, useRefreshCalendar, useRefreshConnectorsOnRunEnd, useRefreshProject, useRelatedDocuments, useRemoveChatMember, useRemoveDocTags, useRemoveDocumentsOffline, useRemoveWorkspaceMembers, useRenameChat, useRenameFolder, useRequestEmailChange, useRequestWorkspaceAccess, useRespondToEvent, useResumeCalendarAccountConnect, useResumeWorkspaceTransfer, useRevokeAgentAccess, useRooms, useRunConversation, useRunWorkflow, useSaveAgentConfig, useSaveBookingPage, useSaveCalendarSettings, useSaveConfig, useSaveConfigField, useSaveDashboard, useSaveMailDraft, useSaveSkill, useSavedDashboards, useSearchContacts, useSearchDatabaseRows, useSearchFacts, useSemanticSearch, useSendBackStep, useSendMail, useSessions, useSetDeploymentHouseTemplate, useSetSkillVisibility, useSetWorkspaceHouseTemplate, useSetWorkspaceMemberRoles, useShareCalendar, useShellWorkspaces, useSignOut, useSkillSource, useSkills, useSlackConnection, useStartAgentSession, useStartCalendarAccountOAuth, useStartTaskQuery, useStartWorkspaceTransfer, useStorageActions, useStorageItemNames, useStorageItems, useStorageProjects, useStorageSnapshots, useStreamHandlers, useSubscribeCalendar, useSwitchWorkspace, useSyncAccountsOnOpen, useSyncCalendarAccount, useTerminateSession, useThinkingContent, useThreadDocument, useTriggerDriveSync, useTriggerMailboxSync, useUnarchiveWorkspace, useUnreadByPeer, useUnshareCalendar, useUpdateCalendar, useUpdateCalendarAccount, useUpdateContact, useUpdateConversation, useUpdateDatabase, useUpdateDatabaseRow, useUpdateDocTag, useUpdateDocuments, useUpdateEvent, useUpdateFact, useUpdateMailMessage, useUpdateProjectAddonSettings, useUpdateProjectFields, useUpdateProjectNextPeriodAddons, useUpdateWorkflow, useUpdateWorkspace, useUploadDocuments, useUploadFiles, useUploadFromUrls, useUploadSkillFiles, useUploadUrls, useVideoRecorder, useWorkItems, useWorkNotifications, useWorkflowRuns, useWorkflows, useWorkspaceArchive, useWorkspaceDocs, useWorkspaceExportDownload, useWorkspaceNotificationLevel, useWorkspaceProcessing, useWorkspaceRole, useWorkspaceTransfer, useWorkspaceTransfers, useWorkspaceTrash, useWorkspaceUsers, userDisplayName, userInitials, viewsOfTable, waitForResponseId, wipeOfflineDocuments, withRelativePath, workflowStepOf, workspaceHouseTemplateId };
14494
+ export { AGENT_CONTROL_COMMANDS, AGGREGATE_FIELDS, ALLOWED_PORTAL_ORIGINS, ARCHIVE_POLL_MS, ASSISTANT_MENTION_LABEL, AUTO_CHAT_MODEL, ActivityFeed, AiActionCard, AiAnswer, AppleIcon, ArbiBotIcon, ArbiHost2 as ArbiHost, ArbiWebSocketProvider, ArtifactCanvas, BOOT_GATE_TIMEOUT_MS, BOX_SEAT_REFUSED, BOX_SEAT_REFUSED_ACTION, BOX_SEAT_REFUSED_TITLE, BUILTIN_DATA_SOURCES, CONVERSATION_SWITCH_MEASURE, ChatBubble, CitationRenderer, CommandPalette, CommandPaletteProvider, ConversationList, ConversationScope, DATABASE_RELATION_PICK_LIMIT, DATABASE_ROWS_PAGE, DEFAULT_ASPECT_OPTIONS, DEFAULT_CONVERSATIONS_SOURCE_LABELS, DEFAULT_DATABASE_SOURCE_LABELS, DEFAULT_DOCUMENTS_SOURCE_LABELS, DEFAULT_PASSWORD_CHANGE_FORM_MESSAGES, DEFAULT_PROJECTS_SOURCE_LABELS, DEFAULT_USAGE_SOURCE_LABELS, DEFAULT_WORKSPACES_SOURCE_LABELS, DateSeparator, DmAvatar, DmComposer, DocQaPanel, DocSearch, DocumentCardMenu, DocumentReview, DraftTitleControls, EMPTY_GROUP_LABEL, FIRST_TOKEN_MEASURE, FileIcon, GitHubIcon, ImageCropModal, ImageCropper, LIVE_UPDATE_TYPES, LinkedInIcon, MAIL_DRAFT_REPLACED_EVENT, MAX_DASHBOARD_SPEC_CHARS, MAX_SERIES, MIN_NARRATION_DWELL_MS, MODEL_GROUP_LABELS, MailOfflineUnavailableError, MessageArtifactCard, PENDING_SYNC_PREDICATE, POLL_EVERY_MS, PhotoCapture, RUN_WINDOW_MS, SIGNATURE_NOTIFICATION_TYPES, SLOW_AFTER_MS, STILL_WORKING, StorageActionError, TRANSFER_POLL_MS, TaskThreadPendingError, TypingIndicator, UPLOAD_ACCEPT, UPLOAD_MAX_FILE_SIZE, VideoCapture, VoiceNoteRecorder, WORK_NOTIFICATION_LABELS, __resetPendingFinalCommitsForTests, __resetStreamingTokenBufferForTests, accountPath, addAssistantMessageToCache, addUserMessageToCache, adoptNewChatDocument, aggregateDataset, aliasTakenMessage, allConversationThreads, annotateThread, announceMailDraftReplaced, appendTokenToMessage, applyConversationEvent, applyFinalContextToMessage, applyLiveUpdate, applyNotificationRow, applyOptimisticDocumentEdit, applyOutputItemToMessage, applyTaskEvent, arbiMailClient, archiveName, archivedWorkspaceMessage, bindThreadDocument, boundDocumentOf, bucketOf, bucketRange, buildDocumentMetadataRows, buildMentionCandidates, buildPendingFirstTurn, buildPendingSyncItem, buildWorkspaceArchive, cacheThreadBinding, cachedAssistantMode, cachedMentionCandidates, cachedQuotaUsedUp, calendarNotificationMeta, callNotificationMeta, captureFrameAsBlob, clearLoadingState, clearUserInputRequest, commitFinalMessage, completeQueuedUserMessageByContent, connectOAuthCalendarAccount, connectorErrorStatus, connectorReturnTo, createConversationsSource, createDataSourceRegistry, createDatabaseSource, createDocumentsSource, createMailClient, createMemoryDashboardStore, createProjectsSource, createSkillPack, createStreamHandlers, createUsageSource, createWorkspaceSwitch, createWorkspacesSource, cropImage, dayKey, defaultMailAlias, defineRowsSource, deploymentUserMeta, describeActivity, describeCalendarNotification, describeServerNotification, discardStreamingTokensForMessage, disconnectAttachedRun, documentActivityMeta, documentActivityPhrase, documentDisplayName, docxMentionMeta, downloadRecoveryFile, ensureAssistantMessageLoading, extractZipFile, fallbackFileName, fileAttachment, filesFromDrop, fillTimeGaps, filterRows, flushStreamingTokens, forgetUploadedDocumentFolder, formatConfigValidationError, formatIdentityPrice, getInterjectionText, getNotificationTypeMeta, getOfflineDocument, getOrphanedLastMessage, getRelatedLabels, getRelatedTotal, getRunStartedAt, getThreadsQueryKey, getWorkspaceActionText, getWorkspaceKind, getWorkspaceSentPhrase, hasPendingFinalCommit, hasVideoTrack, identityStepFor, inputRequestTitle, invalidateCalendarEvents, invalidateCalendars, invalidateConversationActivity, isActivityKey, isAliasTakenError, isArchiveMoving, isCommentToPeople, isDeploymentAdmin, isDeploymentUserNotification, isFullConfig, isMessageRunning, isNotificationRow, isOfflineReadableArbiQuery, isOrphanedUserMessage, isQueuedCalendarWrite, isReplayableArbiMutation, isRestorableArbiQueryOnline, isSignatureNotificationType, isTableViewOf, isTransferFinished, isTransferResumable, isWorkspaceArchivedError, isWorkspaceNotificationType, isZipFile, loadOfflineDocument, mailDraftIdFromContent, mailJson, markMessageAsFailed, markNarrationSettled, migrateLegacyThreadDocuments, mountDiditVerification, nextAliasSuggestion, notificationUserName, openAccessRequest, parseActivityContent, parseDashboardSpec, parseDeleteAccountBlockers, pendingChatModelSave, peopleDirectory, personOfUser, pickRecentWorkspaces, prepareUploadFiles, queryOfChart, recordsOf, redlineStats, refuseChatWhenOffline, registerArbiMutationDefaults, registerAttachedRun, removeSettledNarration, requestPersistentStorage, resetCalendarAccountSyncState, resetMessageContent, resolveActiveWorkspace, resolveConfigModel, resolveReplyTarget, rollbackOptimisticDocumentEdit, safePortalUrl, serializeDashboardSpec, serverNotificationBellEntry, setMessageContent, setUserInputRequest, signatureNotificationPhrase, signatureRequestMeta, subscribeDocumentReads, supportsHouseTemplates, textToArtifact, threadBinding, threadEndingAtContains, titleFromQuestion, toChatCitations, toNotificationPreferences, toRedlineMarkdown, toShellWorkspace, updateMessageWithMetadata, updateUserMessageInCache, updateUserMessageStateInCache, uploadFolderOf, uploadedDocumentFolder, useActOnStep, useActiveConfigId, useAddChatMembers, useAddDatabaseRows, useAddHolidayCalendar, useAddProjectAddonBlock, useAddWorkspaceMembers, useAddonQuote, useAgentChats, useAgentConfig, useAgentDmStatus, useAgentModels, useAgentRunControl, useAgentSession, useAgentWorkspaces, useAiTask, useAnswerAgentQuestion, useApplyChatModel, useArbiConnected, useArbiShellWorkspaces, useArbiWebSocket, useArbiWsContext, useArbiWsMessage, useArbiWsStatus, useArchiveProgressPolling, useArchiveWorkspace, useAskAgain, useAssignDocTags, useAuthorizeLimits, useAutoSendDraft, useBookingPages, useBootTimeout, useBranchNavigation, useCalDavProfiles, useCalendarAccounts, useCalendarEvent, useCalendarEventByUid, useCalendarEvents, useCalendarInvitations, useCalendarOutbox, useCalendarOverlays, useCalendarSettings, useCalendarShares, useCalendarSupport, useCalendars, useCameraStream, useCanEditShared, useCancelDriveSync, useCancelMailboxSync, useCancelManyPendingSync, useCancelProjectSubscription, useCancelWorkspaceTransfer, useChangeProjectPlan, useChargeWatch, useChatArrivals, useChatPost, useChatSummaries, useChatThread, useChatUnreadTotal, useChats, useClaimNativeAlias, useCloseAgentSession, useCommandPalette, useConfigSchema, useConfirmEmailChange, useConnectCalDavAccount, useConnectMailAccount, useConnectOAuthAccount, useConnectRunStream, useConnectorAutoSync, useConnectorCatalog, useConnectorVendorVisibility, useContacts, useConversation, useConversationActions, useConversationActivity, useConversationData, useConversationDocuments, useConversationIsShared, useConversationItems, useConversationPendingAuth, useConversationSearch, useConversationTurn, useConversationUsage, useCreateAgent, useCreateCalendar, useCreateContact, useCreateDatabase, useCreateEvent, useCreateFact, useCreateFacts, useCreateGroupChat, useCreateProject, useCreateProjectCheckout, useCreateRoom, useCreateWork, useCreateWorkflow, useCreateWorkspace, useCurrentSessionId, useCurrentWorkspace, useDashboardStore, useDataSources, useDatabase, useDatabaseAggregate, useDatabaseDashboardStore, useDatabaseRows, useDatabases, useDecideCounter, useDeleteAccount, useDeleteAccountFlow, useDeleteBookingPage, useDeleteCalendar, useDeleteChatMessage, useDeleteConfig, useDeleteContact, useDeleteConversation, useDeleteDashboard, useDeleteDatabase, useDeleteDatabaseRows, useDeleteDocuments, useDeleteEvent, useDeleteFact, useDeleteMessage, useDeleteNotifications, useDeleteProject, useDeleteSkill, useDeleteWorkflow, useDeleteWorkspaces, useDisconnectCalendarAccount, useDisconnectConnector, useDisconnectMailAccount, useDisconnectSlack, useDismissedTips, useDocumentAutoAdd, useDocumentHostActions, useDocumentPendingSync, useDocumentThumbnails, useDocumentsSupport, useDownloadDocuments, useDriveFolderChildren, useDriveFolderDocCount, useDriveFolders, useDriveSyncEstimate, useDriveSyncProgress, useEmailChange, useEnableDriveSync, useEnableMailboxSync, useExportDatabase, useFacts, useFetchCalendarEvent, useFilteredProjects, useFinaliseTranslation, useFindTime, useFollowThread, useFreeBusy, useGenerateAgentAvatar, useGenerateDocTags, useGrantAgentAccess, useHolidayCountries, useHouseTemplateCandidates, useIdentityVerification, useIdentityVerificationFlow, useImportCalendar, useImportContacts, useImportDatabase, useImportDatabaseRows, useInstallSkillPack, useInvalidateAfterTransfer, useInvalidateProjects, useInvalidateStorage, useInviteContacts, useIsSlow, useIsWorkspaceOwner, useKeepDocumentsOffline, useLinkContact, useMailAccounts, useMailAttachmentText, useMailCache, useMailClient, useMailDraftCompose, useMailDraftEditor, useMailDraftReplaced, useMailFolders, useMailMessage, useMailMessages, useMailOnline, useMailPolicy, useMailProjects, useMailUnlock, useMailboxFolders, useMailboxSyncProgress, useMarkChatRead, useMarkDocumentShared, useMarkNotificationsRead, useMcpTools, useMentionCandidates, useMessageTimer, useMoveEvent, useMoveWorkspaceToProject, useMyConnectors, useNotificationPreferences, useNotifications, useNotifyConversation, useOfflineDocumentIds, useOpenSelectedWorkspace, useOpenViewerDocumentId, usePanelDataset, usePassageQuotes, usePasswordChange, usePasswordChangeForm, usePendingContacts, usePendingSyncCounts, usePendingSyncItems, usePeople, usePeopleSearch, usePlanQuote, usePlanWork, usePlanWorkspaceTransfer, usePreviewProjectPlanChange, useProcessingTask, useProcessingTasks, useProducts, useProjectBillingPortal, useProjectConversationUsage, useProjectEvents, usePublishCalendar, useRefreshCalendar, useRefreshConnectorsOnRunEnd, useRefreshProject, useRelatedDocuments, useRemoveChatMember, useRemoveDocTags, useRemoveDocumentsOffline, useRemoveWorkspaceMembers, useRenameChat, useRenameFolder, useRequestEmailChange, useRequestWorkspaceAccess, useRespondToEvent, useResumeCalendarAccountConnect, useResumeWorkspaceTransfer, useRevokeAgentAccess, useRooms, useRunConversation, useRunWorkflow, useSaveAgentConfig, useSaveBookingPage, useSaveCalendarSettings, useSaveConfig, useSaveConfigField, useSaveDashboard, useSaveMailDraft, useSaveSkill, useSavedDashboards, useSearchContacts, useSearchDatabaseRows, useSearchFacts, useSemanticSearch, useSendBackStep, useSendMail, useSessions, useSetDeploymentHouseTemplate, useSetSkillVisibility, useSetWorkspaceHouseTemplate, useSetWorkspaceMemberRoles, useShareCalendar, useShellWorkspaces, useSignOut, useSkillSource, useSkills, useSlackConnection, useStartAgentSession, useStartCalendarAccountOAuth, useStartTaskQuery, useStartWorkspaceTransfer, useStorageActions, useStorageItemNames, useStorageItems, useStorageProjects, useStorageSnapshots, useStreamHandlers, useSubscribeCalendar, useSwitchWorkspace, useSyncAccountsOnOpen, useSyncCalendarAccount, useTerminateSession, useThinkingContent, useThreadDocument, useTriggerDriveSync, useTriggerMailboxSync, useUnarchiveWorkspace, useUnreadByPeer, useUnshareCalendar, useUpdateCalendar, useUpdateCalendarAccount, useUpdateContact, useUpdateConversation, useUpdateDatabase, useUpdateDatabaseRow, useUpdateDocTag, useUpdateDocuments, useUpdateEvent, useUpdateFact, useUpdateMailMessage, useUpdateProjectAddonSettings, useUpdateProjectFields, useUpdateProjectNextPeriodAddons, useUpdateWorkflow, useUpdateWorkspace, useUploadDocuments, useUploadFiles, useUploadFromUrls, useUploadSkillFiles, useUploadUrls, useVideoRecorder, useWorkItems, useWorkNotifications, useWorkflowRuns, useWorkflows, useWorkspaceArchive, useWorkspaceDocs, useWorkspaceExportDownload, useWorkspaceNotificationLevel, useWorkspaceProcessing, useWorkspaceRole, useWorkspaceTransfer, useWorkspaceTransfers, useWorkspaceTrash, useWorkspaceUsers, userDisplayName, userInitials, viewsOfTable, waitForResponseId, wipeOfflineDocuments, withRelativePath, workflowStepOf, workspaceHouseTemplateId };
14270
14495
  //# sourceMappingURL=index.js.map
14271
14496
  //# sourceMappingURL=index.js.map