@arbidocs/react 0.5.110 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
- package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.cjs +13 -13
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.cjs +48 -48
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
- package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
- package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
- package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
- package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
- package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
- package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
- package/dist/chunk-PWGSIM3F.cjs +291 -0
- package/dist/chunk-PWGSIM3F.cjs.map +1 -0
- package/dist/chunk-QP3WQSAA.cjs +23 -0
- package/dist/chunk-QP3WQSAA.cjs.map +1 -0
- package/dist/chunk-T5FZICXN.cjs +50 -0
- package/dist/chunk-T5FZICXN.cjs.map +1 -0
- package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
- package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
- package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +99 -99
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +101 -101
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +1689 -1619
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +702 -17060
- package/dist/index.js.map +7 -1
- package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
- package/dist/lazy-chunk.js +46 -0
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
- package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +167 -154
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +290 -9
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.cjs +17 -0
- package/dist/viewers/PdfViewer.cjs.map +1 -0
- package/dist/viewers/PdfViewer.d.ts +9 -0
- package/dist/viewers/PdfViewer.js +20 -0
- package/dist/viewers/PdfViewer.js.map +7 -0
- package/dist/viewers/PdfViewerImpl.js +384 -0
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.cjs +79 -653
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +3 -1
- package/dist/viewers/index.js +60 -903
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +12 -4
- package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-6H3O63TQ.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-CPQ3CU4B.js +0 -246
- package/dist/chunk-CPQ3CU4B.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DQALOQPI.js +0 -2766
- package/dist/chunk-DQALOQPI.js.map +0 -1
- package/dist/chunk-FZJMA32S.js +0 -1011
- package/dist/chunk-FZJMA32S.js.map +0 -1
- package/dist/chunk-H5M7FXLB.js +0 -2057
- package/dist/chunk-H5M7FXLB.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-P6WLV5UY.js +0 -644
- package/dist/chunk-P6WLV5UY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-BMhTH98a.d.cts +0 -2035
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15893
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -25
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/index.d.cts +0 -260
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useMemo, useSyncExternalStore } from "react";
|
|
2
|
+
import { useArbiHost } from "../host/config.js";
|
|
3
|
+
const SIGNED_OUT = {
|
|
4
|
+
status: "signed-out",
|
|
5
|
+
user: null,
|
|
6
|
+
isSso: false,
|
|
7
|
+
hasToken: false,
|
|
8
|
+
serverSessionKey: null
|
|
9
|
+
};
|
|
10
|
+
const noSubscription = () => () => {
|
|
11
|
+
};
|
|
12
|
+
function useArbiSession() {
|
|
13
|
+
return useSignedInSession(useArbiHost().arbi?.session ?? null);
|
|
14
|
+
}
|
|
15
|
+
function useSignedInSession(session) {
|
|
16
|
+
const state = useSyncExternalStore(
|
|
17
|
+
session ? session.subscribe : noSubscription,
|
|
18
|
+
() => session?.getState() ?? null,
|
|
19
|
+
() => session?.getState() ?? null
|
|
20
|
+
);
|
|
21
|
+
return useMemo(
|
|
22
|
+
() => state?.signedIn ? {
|
|
23
|
+
status: "signed-in",
|
|
24
|
+
user: state.user,
|
|
25
|
+
isSso: state.isSsoMode,
|
|
26
|
+
hasToken: !!state.accessToken,
|
|
27
|
+
serverSessionKey: state.serverSessionKey
|
|
28
|
+
} : { ...SIGNED_OUT, isSso: state?.isSsoMode ?? false },
|
|
29
|
+
[state]
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
useArbiSession,
|
|
34
|
+
useSignedInSession
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=signed-in.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/signed-in.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Who is signed in: the host `Arbi`'s session (`arbi.session`, the client's session state), the\n * one source for the user, the sign-in status and the SSO mode. Re-renders when it changes.\n */\n\nimport { useMemo, useSyncExternalStore } from 'react'\nimport type { SessionManager, SessionState, SessionUser } from '@arbidocs/client'\nimport { useArbiHost } from '../host/config'\n\nexport type ArbiSessionStatus = 'signed-out' | 'signed-in'\n\nexport interface ArbiSignedInSession {\n /** `signed-in` once a login finished on this device (also before this tab has a token). */\n status: ArbiSessionStatus\n /** The signed-in user; `null` signed out. */\n user: SessionUser | null\n /** The account signs in through SSO. */\n isSso: boolean\n /** This tab holds a server session (a token). A new tab or an offline unlock does not, yet. */\n hasToken: boolean\n /** The server session key workspace keys are sealed to; `null` until known. */\n serverSessionKey: Uint8Array | null\n}\n\nconst SIGNED_OUT: ArbiSignedInSession = {\n status: 'signed-out',\n user: null,\n isSso: false,\n hasToken: false,\n serverSessionKey: null,\n}\n\nconst noSubscription = () => () => {}\n\n/** The signed-in session of the host's `Arbi`; signed out without one. */\nexport function useArbiSession(): ArbiSignedInSession {\n return useSignedInSession(useArbiHost().arbi?.session ?? null)\n}\n\n/** The same for a session the caller holds (the host building its `Arbi` on it). */\nexport function useSignedInSession(session: SessionManager | null): ArbiSignedInSession {\n const state = useSyncExternalStore<SessionState | null>(\n session ? session.subscribe : noSubscription,\n () => session?.getState() ?? null,\n () => session?.getState() ?? null\n )\n return useMemo(\n () =>\n state?.signedIn\n ? {\n status: 'signed-in',\n user: state.user,\n isSso: state.isSsoMode,\n hasToken: !!state.accessToken,\n serverSessionKey: state.serverSessionKey,\n }\n : { ...SIGNED_OUT, isSso: state?.isSsoMode ?? false },\n [state]\n )\n}\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,SAAS,4BAA4B;AAE9C,SAAS,mBAAmB;AAiB5B,MAAM,aAAkC;AAAA,EACtC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,kBAAkB;AACpB;AAEA,MAAM,iBAAiB,MAAM,MAAM;AAAC;AAG7B,SAAS,iBAAsC;AACpD,SAAO,mBAAmB,YAAY,EAAE,MAAM,WAAW,IAAI;AAC/D;AAGO,SAAS,mBAAmB,SAAqD;AACtF,QAAM,QAAQ;AAAA,IACZ,UAAU,QAAQ,YAAY;AAAA,IAC9B,MAAM,SAAS,SAAS,KAAK;AAAA,IAC7B,MAAM,SAAS,SAAS,KAAK;AAAA,EAC/B;AACA,SAAO;AAAA,IACL,MACE,OAAO,WACH;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,UAAU,CAAC,CAAC,MAAM;AAAA,MAClB,kBAAkB,MAAM;AAAA,IAC1B,IACA,EAAE,GAAG,YAAY,OAAO,OAAO,aAAa,MAAM;AAAA,IACxD,CAAC,KAAK;AAAA,EACR;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { parseVersionRef } from "../artifacts/versions.js";
|
|
2
|
+
import {
|
|
3
|
+
createArbiChatStore,
|
|
4
|
+
EMPTY_CHAT_STATE
|
|
5
|
+
} from "./chat.js";
|
|
6
|
+
import {
|
|
7
|
+
createArbiDocumentSessionStore,
|
|
8
|
+
EMPTY_DOCUMENT_STATE
|
|
9
|
+
} from "./documents.js";
|
|
10
|
+
import {
|
|
11
|
+
createArbiLayoutStore,
|
|
12
|
+
defaultLayoutState
|
|
13
|
+
} from "./layout.js";
|
|
14
|
+
import {
|
|
15
|
+
createArbiWorkspaceStore
|
|
16
|
+
} from "./workspace.js";
|
|
17
|
+
const EMPTY_SESSION_STATE = {
|
|
18
|
+
workspaceId: null,
|
|
19
|
+
workspaceStatus: "closed",
|
|
20
|
+
...EMPTY_CHAT_STATE,
|
|
21
|
+
...EMPTY_DOCUMENT_STATE,
|
|
22
|
+
...defaultLayoutState()
|
|
23
|
+
};
|
|
24
|
+
const selectViewingDocumentId = (state) => state.viewingDocument ? parseVersionRef(state.viewingDocument.id).docId : null;
|
|
25
|
+
const conversationKey = (state) => state.conversationId ?? "new";
|
|
26
|
+
const selectDraft = (state) => state.drafts[conversationKey(state)] ?? "";
|
|
27
|
+
const selectIsGenerating = (conversationId) => (state) => !!conversationId && !!state.generating[conversationId]?.isGenerating;
|
|
28
|
+
function layoutActionsOf(layout) {
|
|
29
|
+
const actions = { ...layout };
|
|
30
|
+
delete actions.getLayout;
|
|
31
|
+
delete actions.subscribe;
|
|
32
|
+
delete actions.hydrated;
|
|
33
|
+
delete actions.isHydrated;
|
|
34
|
+
delete actions.reset;
|
|
35
|
+
delete actions.threads;
|
|
36
|
+
return actions;
|
|
37
|
+
}
|
|
38
|
+
function chatActionsOf(chat) {
|
|
39
|
+
const actions = { ...chat };
|
|
40
|
+
delete actions.getState;
|
|
41
|
+
delete actions.subscribe;
|
|
42
|
+
delete actions.settled;
|
|
43
|
+
delete actions.forget;
|
|
44
|
+
delete actions.batch;
|
|
45
|
+
delete actions.hydrated;
|
|
46
|
+
delete actions.isHydrated;
|
|
47
|
+
delete actions.restoreDrafts;
|
|
48
|
+
delete actions.leave;
|
|
49
|
+
delete actions.reset;
|
|
50
|
+
return actions;
|
|
51
|
+
}
|
|
52
|
+
function documentActionsOf(documents) {
|
|
53
|
+
const actions = { ...documents };
|
|
54
|
+
delete actions.getState;
|
|
55
|
+
delete actions.subscribe;
|
|
56
|
+
delete actions.leave;
|
|
57
|
+
delete actions.reset;
|
|
58
|
+
return actions;
|
|
59
|
+
}
|
|
60
|
+
function composeArbiSessionStore({
|
|
61
|
+
layout,
|
|
62
|
+
workspace,
|
|
63
|
+
chat,
|
|
64
|
+
documents
|
|
65
|
+
}) {
|
|
66
|
+
let last = null;
|
|
67
|
+
const getState = () => {
|
|
68
|
+
const parts = [
|
|
69
|
+
layout.getLayout(),
|
|
70
|
+
workspace.getState(),
|
|
71
|
+
documents.getState(),
|
|
72
|
+
chat.getState()
|
|
73
|
+
];
|
|
74
|
+
if (last && parts.every((part, i) => part === last.parts[i])) return last.state;
|
|
75
|
+
const [l, w, d, c] = parts;
|
|
76
|
+
last = { parts, state: { ...l, ...w, ...d, ...c } };
|
|
77
|
+
return last.state;
|
|
78
|
+
};
|
|
79
|
+
chat.restoreDrafts();
|
|
80
|
+
workspace.subscribe(() => chat.restoreDrafts());
|
|
81
|
+
return {
|
|
82
|
+
...layoutActionsOf(layout),
|
|
83
|
+
...chatActionsOf(chat),
|
|
84
|
+
...documentActionsOf(documents),
|
|
85
|
+
getState,
|
|
86
|
+
layoutHydrated: () => layout.hydrated(),
|
|
87
|
+
isLayoutHydrated: () => layout.isHydrated(),
|
|
88
|
+
subscribe: (onChange) => {
|
|
89
|
+
const told = chat.settled(onChange);
|
|
90
|
+
const unsubscribe = [
|
|
91
|
+
chat.subscribe(onChange),
|
|
92
|
+
layout.subscribe(told),
|
|
93
|
+
workspace.subscribe(told),
|
|
94
|
+
documents.subscribe(told)
|
|
95
|
+
];
|
|
96
|
+
return () => {
|
|
97
|
+
chat.forget(onChange);
|
|
98
|
+
unsubscribe.forEach((stop) => stop());
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
setWorkspaceId: (id) => workspace.setWorkspaceId(id),
|
|
102
|
+
setWorkspaceStatus: (status) => workspace.setWorkspaceStatus(status),
|
|
103
|
+
leaveWorkspace: () => chat.batch(() => {
|
|
104
|
+
workspace.setWorkspaceStatus("closed");
|
|
105
|
+
chat.leave();
|
|
106
|
+
documents.leave();
|
|
107
|
+
})
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function createArbiSessionStore(initial = {}, {
|
|
111
|
+
draftStorage,
|
|
112
|
+
persist,
|
|
113
|
+
workspace = createArbiWorkspaceStore({ workspaceId: initial.workspaceId ?? null })
|
|
114
|
+
} = {}) {
|
|
115
|
+
const {
|
|
116
|
+
shell,
|
|
117
|
+
tabs,
|
|
118
|
+
views,
|
|
119
|
+
grid,
|
|
120
|
+
workspaceStatus,
|
|
121
|
+
viewingDocument,
|
|
122
|
+
documentViewer,
|
|
123
|
+
selectedDocumentIds,
|
|
124
|
+
documentsToSelect,
|
|
125
|
+
pinnedDocumentId,
|
|
126
|
+
relatedDocuments,
|
|
127
|
+
draftDocuments,
|
|
128
|
+
passageCitation,
|
|
129
|
+
...chatInitial
|
|
130
|
+
} = initial;
|
|
131
|
+
delete chatInitial.workspaceId;
|
|
132
|
+
const defined = (parts) => Object.fromEntries(Object.entries(parts).filter(([, part]) => part !== void 0));
|
|
133
|
+
const layout = createArbiLayoutStore({ persist, initial: defined({ shell, tabs, views, grid }) });
|
|
134
|
+
if (workspaceStatus) workspace.setWorkspaceStatus(workspaceStatus);
|
|
135
|
+
return composeArbiSessionStore({
|
|
136
|
+
layout,
|
|
137
|
+
workspace,
|
|
138
|
+
chat: createArbiChatStore({ layout, draftStorage, initial: chatInitial }),
|
|
139
|
+
documents: createArbiDocumentSessionStore({
|
|
140
|
+
initial: defined({
|
|
141
|
+
viewingDocument,
|
|
142
|
+
documentViewer: documentViewer && {
|
|
143
|
+
...EMPTY_DOCUMENT_STATE.documentViewer,
|
|
144
|
+
...documentViewer
|
|
145
|
+
},
|
|
146
|
+
selectedDocumentIds,
|
|
147
|
+
documentsToSelect,
|
|
148
|
+
pinnedDocumentId,
|
|
149
|
+
relatedDocuments,
|
|
150
|
+
draftDocuments,
|
|
151
|
+
passageCitation
|
|
152
|
+
})
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
export {
|
|
157
|
+
EMPTY_SESSION_STATE,
|
|
158
|
+
composeArbiSessionStore,
|
|
159
|
+
conversationKey,
|
|
160
|
+
createArbiSessionStore,
|
|
161
|
+
layoutActionsOf,
|
|
162
|
+
selectDraft,
|
|
163
|
+
selectIsGenerating,
|
|
164
|
+
selectViewingDocumentId
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/store.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The session state every block reads and writes: the selected workspace, the layout, the chat (the\n * open conversation and its composer, generation per conversation, the context documents and facts)\n * and the documents being viewed and selected.\n *\n * An {@link ArbiSessionStore} is the adapter a host gives as its configuration's `session`. It is\n * made of parts ({@link composeArbiSessionStore}): the layout (`createArbiLayoutStore`), the\n * workspace (`createArbiWorkspaceStore`), the chat (`createArbiChatStore`) and the documents\n * ({@link createArbiDocumentSessionStore}). Hosts without state of\n * their own use {@link createArbiSessionStore}, every part in memory.\n */\n\nimport { parseVersionRef } from '../artifacts/versions'\nimport {\n createArbiChatStore,\n EMPTY_CHAT_STATE,\n type ArbiChatActions,\n type ArbiChatState,\n type ArbiChatStore,\n} from './chat'\nimport type { ArbiDraftStorage } from './drafts'\nimport {\n createArbiDocumentSessionStore,\n EMPTY_DOCUMENT_STATE,\n type ArbiDocumentSessionActions,\n type ArbiDocumentSessionState,\n type ArbiDocumentSessionStore,\n} from './documents'\nimport {\n createArbiLayoutStore,\n defaultLayoutState,\n type ArbiLayoutActions,\n type ArbiLayoutState,\n type ArbiLayoutStore,\n type ArbiSavedLayout,\n} from './layout'\nimport type { ArbiSessionPersist } from './persist'\nimport {\n createArbiWorkspaceStore,\n type ArbiWorkspaceState,\n type ArbiWorkspaceStore,\n} from './workspace'\n\nexport type {\n ArbiConversationDocument,\n ArbiConversationGeneration,\n ArbiMessageTimer,\n TurnTools,\n} from './chat'\n\n/**\n * Where the selected workspace stands on the server session: `opening` while a switch waits for\n * `/open` (the host may cover the page), `open` once workspace-scoped requests may run.\n */\nexport type ArbiWorkspaceStatus = 'closed' | 'opening' | 'open'\n\nexport interface ArbiSessionState\n extends ArbiChatState, ArbiDocumentSessionState, ArbiLayoutState, ArbiWorkspaceState {}\n\nexport interface ArbiSessionStore\n extends ArbiLayoutActions, ArbiChatActions, ArbiDocumentSessionActions {\n /** The current state. The same object until something in it changes. */\n getState(): ArbiSessionState\n /** Resolves once the saved layout has been read (at once when none is kept). */\n layoutHydrated(): Promise<void>\n /** Whether the saved layout has been read. */\n isLayoutHydrated(): boolean\n /** Be told when the state may have changed. Returns the unsubscribe. */\n subscribe(listener: () => void): () => void\n setWorkspaceId(id: string | null): void\n setWorkspaceStatus(status: ArbiWorkspaceStatus): void\n /**\n * Drop everything scoped to the workspace being left (the open conversation and its generation,\n * the thread tabs, the viewed document, the selection, the context documents and facts), before a\n * switch. A host with workspace-scoped state of its own clears that too.\n */\n leaveWorkspace(): void\n}\n\nexport const EMPTY_SESSION_STATE: ArbiSessionState = {\n workspaceId: null,\n workspaceStatus: 'closed',\n ...EMPTY_CHAT_STATE,\n ...EMPTY_DOCUMENT_STATE,\n ...defaultLayoutState(),\n}\n\n/** The viewed document itself (`doc-\u2026`), also while one of its earlier versions is on screen. */\nexport const selectViewingDocumentId = (state: ArbiSessionState): string | null =>\n state.viewingDocument ? parseVersionRef(state.viewingDocument.id).docId : null\n\n/** The conversation key drafts and context are kept under: its id, or `new` for a new chat. */\nexport const conversationKey = (state: Pick<ArbiChatState, 'conversationId'>): string =>\n state.conversationId ?? 'new'\n\n/** What is typed in the open conversation's composer. */\nexport const selectDraft = (state: Pick<ArbiChatState, 'conversationId' | 'drafts'>): string =>\n state.drafts[conversationKey(state)] ?? ''\n\n/** Whether `conversationId` is generating. */\nexport const selectIsGenerating =\n (conversationId: string | null | undefined) =>\n (state: Pick<ArbiChatState, 'generating'>): boolean =>\n !!conversationId && !!state.generating[conversationId]?.isGenerating\n\n/** The layout actions of a session store, on its layout store. */\nexport function layoutActionsOf(layout: ArbiLayoutStore): ArbiLayoutActions {\n const actions = { ...layout } as Partial<ArbiLayoutStore>\n delete actions.getLayout\n delete actions.subscribe\n delete actions.hydrated\n delete actions.isHydrated\n delete actions.reset\n delete actions.threads\n return actions as ArbiLayoutActions\n}\n\n/** The chat actions of a session store, on its chat store. */\nfunction chatActionsOf(chat: ArbiChatStore): ArbiChatActions {\n const actions = { ...chat } as Partial<ArbiChatStore>\n delete actions.getState\n delete actions.subscribe\n delete actions.settled\n delete actions.forget\n delete actions.batch\n delete actions.hydrated\n delete actions.isHydrated\n delete actions.restoreDrafts\n delete actions.leave\n delete actions.reset\n return actions as ArbiChatActions\n}\n\n/** The document actions of a session store, on its documents store. */\nfunction documentActionsOf(documents: ArbiDocumentSessionStore): ArbiDocumentSessionActions {\n const actions = { ...documents } as Partial<ArbiDocumentSessionStore>\n delete actions.getState\n delete actions.subscribe\n delete actions.leave\n delete actions.reset\n return actions as ArbiDocumentSessionActions\n}\n\n/** The parts a session store is made of. */\nexport interface ArbiSessionParts {\n layout: ArbiLayoutStore\n workspace: ArbiWorkspaceStore\n chat: ArbiChatStore\n documents: ArbiDocumentSessionStore\n}\n\n/**\n * A session store made of its parts: its state is theirs, and readers are told once per change (a\n * thread tab change moves the layout and the chat: once, after both).\n */\nexport function composeArbiSessionStore({\n layout,\n workspace,\n chat,\n documents,\n}: ArbiSessionParts): ArbiSessionStore {\n let last: { parts: readonly unknown[]; state: ArbiSessionState } | null = null\n const getState = (): ArbiSessionState => {\n const parts = [\n layout.getLayout(),\n workspace.getState(),\n documents.getState(),\n chat.getState(),\n ] as const\n // The same object while no part has changed (useSyncExternalStore).\n if (last && parts.every((part, i) => part === last!.parts[i])) return last.state\n const [l, w, d, c] = parts\n last = { parts, state: { ...l, ...w, ...d, ...c } }\n return last.state\n }\n // A workspace opens once signed in: the key that opens the saved drafts is there then.\n chat.restoreDrafts()\n workspace.subscribe(() => chat.restoreDrafts())\n return {\n ...layoutActionsOf(layout),\n ...chatActionsOf(chat),\n ...documentActionsOf(documents),\n getState,\n layoutHydrated: () => layout.hydrated(),\n isLayoutHydrated: () => layout.isHydrated(),\n subscribe: (onChange) => {\n const told = chat.settled(onChange)\n const unsubscribe = [\n chat.subscribe(onChange),\n layout.subscribe(told),\n workspace.subscribe(told),\n documents.subscribe(told),\n ]\n return () => {\n chat.forget(onChange)\n unsubscribe.forEach((stop) => stop())\n }\n },\n setWorkspaceId: (id) => workspace.setWorkspaceId(id),\n setWorkspaceStatus: (status) => workspace.setWorkspaceStatus(status),\n leaveWorkspace: () =>\n chat.batch(() => {\n workspace.setWorkspaceStatus('closed')\n chat.leave()\n documents.leave()\n }),\n }\n}\n\n/** Options of {@link createArbiSessionStore}. */\nexport interface ArbiSessionStoreOptions {\n /** Keep the composers' drafts across reloads (see {@link createSealedDraftStorage}). */\n draftStorage?: ArbiDraftStorage\n /** Keep the layout across reloads (see {@link createStoragePersist}). */\n persist?: ArbiSessionPersist<ArbiSavedLayout>\n /**\n * The selected workspace and its status (default: in memory, from `initial.workspaceId`). Give\n * one kept per tab (`createArbiWorkspaceStore({ storage: browserWorkspaceStorage() })`) for a\n * reload to stay in the workspace.\n */\n workspace?: ArbiWorkspaceStore\n}\n\n/** An in-memory session store: the default for hosts without state of their own. */\nexport function createArbiSessionStore(\n initial: Partial<ArbiSessionState> = {},\n {\n draftStorage,\n persist,\n workspace = createArbiWorkspaceStore({ workspaceId: initial.workspaceId ?? null }),\n }: ArbiSessionStoreOptions = {}\n): ArbiSessionStore {\n const {\n shell,\n tabs,\n views,\n grid,\n workspaceStatus,\n viewingDocument,\n documentViewer,\n selectedDocumentIds,\n documentsToSelect,\n pinnedDocumentId,\n relatedDocuments,\n draftDocuments,\n passageCitation,\n ...chatInitial\n } = initial\n // The workspace is the workspace store's.\n delete (chatInitial as Partial<ArbiSessionState>).workspaceId\n const defined = <T extends object>(parts: T): Partial<T> =>\n Object.fromEntries(Object.entries(parts).filter(([, part]) => part !== undefined)) as Partial<T>\n const layout = createArbiLayoutStore({ persist, initial: defined({ shell, tabs, views, grid }) })\n if (workspaceStatus) workspace.setWorkspaceStatus(workspaceStatus)\n return composeArbiSessionStore({\n layout,\n workspace,\n chat: createArbiChatStore({ layout, draftStorage, initial: chatInitial }),\n documents: createArbiDocumentSessionStore({\n initial: defined({\n viewingDocument,\n documentViewer: documentViewer && {\n ...EMPTY_DOCUMENT_STATE.documentViewer,\n ...documentViewer,\n },\n selectedDocumentIds,\n documentsToSelect,\n pinnedDocumentId,\n relatedDocuments,\n draftDocuments,\n passageCitation,\n }),\n }),\n })\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
const threadTabId = (tab) => tab.conversationId ?? "new";
|
|
2
|
+
const MAX_THREAD_TABS = 12;
|
|
3
|
+
const withView = (threads, tabId, view) => threads.map((tab) => tabId !== null && threadTabId(tab) === tabId ? { ...tab, view } : tab);
|
|
4
|
+
function selectThreadTabIn(tabs, tabId, leaving) {
|
|
5
|
+
const target = tabs.threads.find((tab) => threadTabId(tab) === tabId);
|
|
6
|
+
if (!target) return { tabs, show: null };
|
|
7
|
+
const isActive = tabs.activeThread === tabId;
|
|
8
|
+
if (isActive && leaving.conversationId === target.conversationId) return { tabs, show: null };
|
|
9
|
+
return {
|
|
10
|
+
tabs: {
|
|
11
|
+
...tabs,
|
|
12
|
+
// Re-opening the active tab saves nothing: its live composer is the cleared one.
|
|
13
|
+
threads: isActive ? tabs.threads : withView(tabs.threads, tabs.activeThread, leaving.view),
|
|
14
|
+
activeThread: tabId,
|
|
15
|
+
threadScrollRestore: target.view?.scrollTop ?? null
|
|
16
|
+
},
|
|
17
|
+
show: { conversationId: target.conversationId, view: target.view }
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function openThreadTabIn(tabs, conversationId, leaving) {
|
|
21
|
+
const tabId = conversationId ?? "new";
|
|
22
|
+
const existing = tabs.threads.find((tab) => threadTabId(tab) === tabId);
|
|
23
|
+
if (existing) {
|
|
24
|
+
const threads2 = tabs.threads.map(
|
|
25
|
+
(tab) => threadTabId(tab) === tabId && tab.view ? { ...tab, view: { ...tab.view, scrollTop: null, cursor: null } } : tab
|
|
26
|
+
);
|
|
27
|
+
return { tabId, ...selectThreadTabIn({ ...tabs, threads: threads2 }, tabId, leaving) };
|
|
28
|
+
}
|
|
29
|
+
const fresh = { conversationId, view: void 0 };
|
|
30
|
+
const onlyNewChat = tabs.threads.length === 1 && tabs.threads[0].conversationId === null;
|
|
31
|
+
if (conversationId && onlyNewChat)
|
|
32
|
+
return {
|
|
33
|
+
tabId,
|
|
34
|
+
tabs: { ...tabs, threads: [{ conversationId }], activeThread: tabId },
|
|
35
|
+
show: fresh
|
|
36
|
+
};
|
|
37
|
+
let threads = [...withView(tabs.threads, tabs.activeThread, leaving.view), { conversationId }];
|
|
38
|
+
if (threads.length > MAX_THREAD_TABS) {
|
|
39
|
+
const evict = threads.findIndex(
|
|
40
|
+
(tab, i) => i < threads.length - 1 && threadTabId(tab) !== tabs.activeThread
|
|
41
|
+
);
|
|
42
|
+
if (evict !== -1) threads = threads.filter((_, i) => i !== evict);
|
|
43
|
+
}
|
|
44
|
+
return { tabId, tabs: { ...tabs, threads, activeThread: tabId }, show: fresh };
|
|
45
|
+
}
|
|
46
|
+
function closeThreadTabIn(tabs, tabId) {
|
|
47
|
+
const threads = tabs.threads.filter((tab) => threadTabId(tab) !== tabId);
|
|
48
|
+
if (threads.length === 0)
|
|
49
|
+
return { tabs: { ...tabs, threads: [], activeThread: null }, show: "list" };
|
|
50
|
+
if (tabs.activeThread !== tabId) return { tabs: { ...tabs, threads }, show: null };
|
|
51
|
+
const index = tabs.threads.findIndex((tab) => threadTabId(tab) === tabId);
|
|
52
|
+
const next = threads[Math.min(index, threads.length - 1)];
|
|
53
|
+
return {
|
|
54
|
+
tabs: { ...tabs, threads, activeThread: threadTabId(next) },
|
|
55
|
+
show: { conversationId: next.conversationId, view: next.view }
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function showThreadListIn(tabs, leaving) {
|
|
59
|
+
return {
|
|
60
|
+
...tabs,
|
|
61
|
+
activeThread: null,
|
|
62
|
+
threads: tabs.threads.map(
|
|
63
|
+
(tab) => threadTabId(tab) === tabs.activeThread ? { ...tab, view: { ...leaving.view, scrollTop: null } } : tab.view ? { ...tab, view: { ...tab.view, scrollTop: null } } : tab
|
|
64
|
+
)
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function renameThreadTabIn(tabs, fromId, toId) {
|
|
68
|
+
if (fromId === toId || !tabs.threads.some((tab) => threadTabId(tab) === fromId)) return tabs;
|
|
69
|
+
const taken = tabs.threads.some((tab) => threadTabId(tab) === toId);
|
|
70
|
+
return {
|
|
71
|
+
...tabs,
|
|
72
|
+
activeThread: tabs.activeThread === fromId ? toId : tabs.activeThread,
|
|
73
|
+
threads: taken ? tabs.threads.filter((tab) => threadTabId(tab) !== fromId) : tabs.threads.map(
|
|
74
|
+
(tab) => threadTabId(tab) === fromId ? { ...tab, conversationId: toId } : tab
|
|
75
|
+
)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
79
|
+
const stringOrNull = (v) => typeof v === "string" ? v : null;
|
|
80
|
+
const stringOrUndefined = (v) => typeof v === "string" ? v : void 0;
|
|
81
|
+
function parseView(value) {
|
|
82
|
+
if (!isRecord(value)) return void 0;
|
|
83
|
+
return {
|
|
84
|
+
cursor: stringOrNull(value.cursor),
|
|
85
|
+
editingMessageId: stringOrNull(value.editingMessageId),
|
|
86
|
+
preEditDraft: null,
|
|
87
|
+
preEditCursor: stringOrNull(value.preEditCursor),
|
|
88
|
+
chatModel: stringOrUndefined(value.chatModel),
|
|
89
|
+
chatModelName: stringOrUndefined(value.chatModelName),
|
|
90
|
+
scrollTop: typeof value.scrollTop === "number" && Number.isFinite(value.scrollTop) ? value.scrollTop : null
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function parseSavedThreadTabs(threads, activeThread) {
|
|
94
|
+
const tabs = [];
|
|
95
|
+
for (const entry of Array.isArray(threads) ? threads : []) {
|
|
96
|
+
if (!isRecord(entry)) continue;
|
|
97
|
+
const { conversationId } = entry;
|
|
98
|
+
if (conversationId !== null && typeof conversationId !== "string") continue;
|
|
99
|
+
const view = parseView(entry.view);
|
|
100
|
+
const tab = view ? { conversationId, view } : { conversationId };
|
|
101
|
+
if (!tabs.some((t) => threadTabId(t) === threadTabId(tab))) tabs.push(tab);
|
|
102
|
+
}
|
|
103
|
+
const active = typeof activeThread === "string" ? activeThread : null;
|
|
104
|
+
return {
|
|
105
|
+
threads: tabs,
|
|
106
|
+
activeThread: active && tabs.some((tab) => threadTabId(tab) === active) ? active : null
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const savedThreadTabs = (threads) => threads.map((tab) => tab.view ? { ...tab, view: { ...tab.view, preEditDraft: null } } : tab);
|
|
110
|
+
export {
|
|
111
|
+
MAX_THREAD_TABS,
|
|
112
|
+
closeThreadTabIn,
|
|
113
|
+
openThreadTabIn,
|
|
114
|
+
parseSavedThreadTabs,
|
|
115
|
+
renameThreadTabIn,
|
|
116
|
+
savedThreadTabs,
|
|
117
|
+
selectThreadTabIn,
|
|
118
|
+
showThreadListIn,
|
|
119
|
+
threadTabId
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=thread-tabs.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/thread-tabs.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The thread tabs: the conversations open in the Threads page (`ConnectedThreadTabs` shows them),\n * each with the composer it was left with, so switching back finds its line, its edit, its model and\n * its scroll position (its draft is the chat state's, kept per conversation: `ArbiChatState.drafts`).\n * They are part of the layout's `tabs` and kept across reloads (without what was typed: a host keeps\n * drafts sealed, `ArbiDraftStorage`).\n *\n * The changes here are pure: each takes the tabs and the composer being left, and says what the\n * composer shows next, so a session store (the in-memory one, or a host's adapter over its own\n * composer state) applies them to whatever holds the composer.\n */\n\n/** The composer a thread tab was left with. */\nexport interface ArbiThreadTabView {\n /** The message the conversation continued from (its line). */\n cursor: string | null\n /** The question being edited, or null. */\n editingMessageId: string | null\n /** The draft the edit put aside (in memory only; never in the saved layout). */\n preEditDraft: string | null\n /** The line the edit put aside. */\n preEditCursor: string | null\n /** The config (model) chosen for the conversation. */\n chatModel: string | undefined\n /** The model name its picker showed. */\n chatModelName: string | undefined\n /** Where its messages were scrolled to (null: at the latest). */\n scrollTop: number | null\n}\n\n/** A thread tab: a conversation's, or a new chat's (`conversationId` null). */\nexport interface ArbiThreadTab {\n conversationId: string | null\n /** The composer it was left with; absent until it is left. */\n view?: ArbiThreadTabView\n}\n\n/** A thread tab's id: its conversation's id, or `new` for a new chat. */\nexport const threadTabId = (tab: ArbiThreadTab): string => tab.conversationId ?? 'new'\n\n/** The most thread tabs kept (opening one more closes the oldest one not on screen). */\nexport const MAX_THREAD_TABS = 12\n\nexport interface ArbiThreadTabsState {\n /** The open thread tabs, in the order they were opened. */\n threads: readonly ArbiThreadTab[]\n /** The tab on screen (`threadTabId`), or null while the thread list is. */\n activeThread: string | null\n /** The scroll position a tab switch brought back, until the thread view takes it. */\n threadScrollRestore: number | null\n}\n\n/** The open conversation and the composer it had (what a tab left is saved with). */\nexport interface ArbiThreadComposer {\n conversationId: string | null\n view: ArbiThreadTabView\n}\n\n/**\n * What a change shows: a conversation in its tab, with the composer it comes back with (undefined:\n * a fresh one, at its latest message); `list`: the thread list, no conversation open; null: the\n * composer stays as it is.\n */\nexport type ArbiThreadTabShow =\n { conversationId: string | null; view: ArbiThreadTabView | undefined } | 'list' | null\n\nexport interface ArbiThreadTabsChange {\n tabs: ArbiThreadTabsState\n show: ArbiThreadTabShow\n}\n\nconst withView = (\n threads: readonly ArbiThreadTab[],\n tabId: string | null,\n view: ArbiThreadTabView\n): ArbiThreadTab[] =>\n threads.map((tab) => (tabId !== null && threadTabId(tab) === tabId ? { ...tab, view } : tab))\n\n/** Show an open tab, saving the composer being left into the tab on screen. */\nexport function selectThreadTabIn(\n tabs: ArbiThreadTabsState,\n tabId: string,\n leaving: ArbiThreadComposer\n): ArbiThreadTabsChange {\n const target = tabs.threads.find((tab) => threadTabId(tab) === tabId)\n if (!target) return { tabs, show: null }\n const isActive = tabs.activeThread === tabId\n // An active tab showing its own conversation is already there. One whose conversation was cleared\n // under it (an earlier build saved that) is opened again, not left as a title over an empty chat.\n if (isActive && leaving.conversationId === target.conversationId) return { tabs, show: null }\n return {\n tabs: {\n ...tabs,\n // Re-opening the active tab saves nothing: its live composer is the cleared one.\n threads: isActive ? tabs.threads : withView(tabs.threads, tabs.activeThread, leaving.view),\n activeThread: tabId,\n threadScrollRestore: target.view?.scrollTop ?? null,\n },\n show: { conversationId: target.conversationId, view: target.view },\n }\n}\n\n/**\n * Open a conversation in its tab (null: a new chat). An open tab is shown at its latest message; a\n * new chat's lone tab is replaced by a conversation's; otherwise a tab is added at the end (the\n * oldest one not on screen closes past {@link MAX_THREAD_TABS}).\n */\nexport function openThreadTabIn(\n tabs: ArbiThreadTabsState,\n conversationId: string | null,\n leaving: ArbiThreadComposer\n): ArbiThreadTabsChange & { tabId: string } {\n const tabId = conversationId ?? 'new'\n const existing = tabs.threads.find((tab) => threadTabId(tab) === tabId)\n if (existing) {\n // Opening a thread lands on its latest message, as from the list, not where it was left.\n const threads = tabs.threads.map((tab) =>\n threadTabId(tab) === tabId && tab.view\n ? { ...tab, view: { ...tab.view, scrollTop: null, cursor: null } }\n : tab\n )\n return { tabId, ...selectThreadTabIn({ ...tabs, threads }, tabId, leaving) }\n }\n const fresh = { conversationId, view: undefined }\n const onlyNewChat = tabs.threads.length === 1 && tabs.threads[0].conversationId === null\n if (conversationId && onlyNewChat)\n return {\n tabId,\n tabs: { ...tabs, threads: [{ conversationId }], activeThread: tabId },\n show: fresh,\n }\n let threads = [...withView(tabs.threads, tabs.activeThread, leaving.view), { conversationId }]\n if (threads.length > MAX_THREAD_TABS) {\n // The new tab (last) stays; the first other one not on screen closes.\n const evict = threads.findIndex(\n (tab, i) => i < threads.length - 1 && threadTabId(tab) !== tabs.activeThread\n )\n if (evict !== -1) threads = threads.filter((_, i) => i !== evict)\n }\n return { tabId, tabs: { ...tabs, threads, activeThread: tabId }, show: fresh }\n}\n\n/** Close a tab; closing the one on screen shows the one beside it, the last one the list. */\nexport function closeThreadTabIn(tabs: ArbiThreadTabsState, tabId: string): ArbiThreadTabsChange {\n const threads = tabs.threads.filter((tab) => threadTabId(tab) !== tabId)\n if (threads.length === 0)\n return { tabs: { ...tabs, threads: [], activeThread: null }, show: 'list' }\n if (tabs.activeThread !== tabId) return { tabs: { ...tabs, threads }, show: null }\n const index = tabs.threads.findIndex((tab) => threadTabId(tab) === tabId)\n const next = threads[Math.min(index, threads.length - 1)]\n return {\n tabs: { ...tabs, threads, activeThread: threadTabId(next) },\n show: { conversationId: next.conversationId, view: next.view },\n }\n}\n\n/**\n * Show the thread list; the tabs stay open (the one left keeps its composer). A thread opened from\n * the list is a fresh start: it opens at its latest message, not at a stale scroll position.\n */\nexport function showThreadListIn(\n tabs: ArbiThreadTabsState,\n leaving: ArbiThreadComposer\n): ArbiThreadTabsState {\n return {\n ...tabs,\n activeThread: null,\n threads: tabs.threads.map((tab) =>\n threadTabId(tab) === tabs.activeThread\n ? { ...tab, view: { ...leaving.view, scrollTop: null } }\n : tab.view\n ? { ...tab, view: { ...tab.view, scrollTop: null } }\n : tab\n ),\n }\n}\n\n/**\n * A conversation's tab is now `toId`'s (a new chat got its id): the tab named `fromId`, wherever it\n * is and whether or not it is on screen. When `toId` already has a tab, that one stays.\n */\nexport function renameThreadTabIn(\n tabs: ArbiThreadTabsState,\n fromId: string,\n toId: string\n): ArbiThreadTabsState {\n if (fromId === toId || !tabs.threads.some((tab) => threadTabId(tab) === fromId)) return tabs\n const taken = tabs.threads.some((tab) => threadTabId(tab) === toId)\n return {\n ...tabs,\n activeThread: tabs.activeThread === fromId ? toId : tabs.activeThread,\n threads: taken\n ? tabs.threads.filter((tab) => threadTabId(tab) !== fromId)\n : tabs.threads.map((tab) =>\n threadTabId(tab) === fromId ? { ...tab, conversationId: toId } : tab\n ),\n }\n}\n\n// \u2500\u2500 Saving \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\nconst stringOrNull = (v: unknown): string | null => (typeof v === 'string' ? v : null)\nconst stringOrUndefined = (v: unknown): string | undefined =>\n typeof v === 'string' ? v : undefined\n\n/** A saved tab's composer as this build reads it (never with typed text). */\nfunction parseView(value: unknown): ArbiThreadTabView | undefined {\n if (!isRecord(value)) return undefined\n return {\n cursor: stringOrNull(value.cursor),\n editingMessageId: stringOrNull(value.editingMessageId),\n preEditDraft: null,\n preEditCursor: stringOrNull(value.preEditCursor),\n chatModel: stringOrUndefined(value.chatModel),\n chatModelName: stringOrUndefined(value.chatModelName),\n scrollTop:\n typeof value.scrollTop === 'number' && Number.isFinite(value.scrollTop)\n ? value.scrollTop\n : null,\n }\n}\n\n/**\n * Saved thread tabs as this build reads them: unreadable entries are dropped, and no tab is on\n * screen when the one named is not open. Never throws.\n */\nexport function parseSavedThreadTabs(\n threads: unknown,\n activeThread: unknown\n): Pick<ArbiThreadTabsState, 'threads' | 'activeThread'> {\n const tabs: ArbiThreadTab[] = []\n for (const entry of Array.isArray(threads) ? threads : []) {\n if (!isRecord(entry)) continue\n const { conversationId } = entry\n if (conversationId !== null && typeof conversationId !== 'string') continue\n const view = parseView(entry.view)\n const tab: ArbiThreadTab = view ? { conversationId, view } : { conversationId }\n // One tab per conversation.\n if (!tabs.some((t) => threadTabId(t) === threadTabId(tab))) tabs.push(tab)\n }\n const active = typeof activeThread === 'string' ? activeThread : null\n return {\n threads: tabs,\n activeThread: active && tabs.some((tab) => threadTabId(tab) === active) ? active : null,\n }\n}\n\n/** The tabs as saved: without what was typed. */\nexport const savedThreadTabs = (threads: readonly ArbiThreadTab[]): ArbiThreadTab[] =>\n threads.map((tab) => (tab.view ? { ...tab, view: { ...tab.view, preEditDraft: null } } : tab))\n"],
|
|
5
|
+
"mappings": "AAsCO,MAAM,cAAc,CAAC,QAA+B,IAAI,kBAAkB;AAG1E,MAAM,kBAAkB;AA8B/B,MAAM,WAAW,CACf,SACA,OACA,SAEA,QAAQ,IAAI,CAAC,QAAS,UAAU,QAAQ,YAAY,GAAG,MAAM,QAAQ,EAAE,GAAG,KAAK,KAAK,IAAI,GAAI;AAGvF,SAAS,kBACd,MACA,OACA,SACsB;AACtB,QAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,QAAQ,YAAY,GAAG,MAAM,KAAK;AACpE,MAAI,CAAC,OAAQ,QAAO,EAAE,MAAM,MAAM,KAAK;AACvC,QAAM,WAAW,KAAK,iBAAiB;AAGvC,MAAI,YAAY,QAAQ,mBAAmB,OAAO,eAAgB,QAAO,EAAE,MAAM,MAAM,KAAK;AAC5F,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,GAAG;AAAA;AAAA,MAEH,SAAS,WAAW,KAAK,UAAU,SAAS,KAAK,SAAS,KAAK,cAAc,QAAQ,IAAI;AAAA,MACzF,cAAc;AAAA,MACd,qBAAqB,OAAO,MAAM,aAAa;AAAA,IACjD;AAAA,IACA,MAAM,EAAE,gBAAgB,OAAO,gBAAgB,MAAM,OAAO,KAAK;AAAA,EACnE;AACF;AAOO,SAAS,gBACd,MACA,gBACA,SAC0C;AAC1C,QAAM,QAAQ,kBAAkB;AAChC,QAAM,WAAW,KAAK,QAAQ,KAAK,CAAC,QAAQ,YAAY,GAAG,MAAM,KAAK;AACtE,MAAI,UAAU;AAEZ,UAAMA,WAAU,KAAK,QAAQ;AAAA,MAAI,CAAC,QAChC,YAAY,GAAG,MAAM,SAAS,IAAI,OAC9B,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,IAAI,MAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,IAC/D;AAAA,IACN;AACA,WAAO,EAAE,OAAO,GAAG,kBAAkB,EAAE,GAAG,MAAM,SAAAA,SAAQ,GAAG,OAAO,OAAO,EAAE;AAAA,EAC7E;AACA,QAAM,QAAQ,EAAE,gBAAgB,MAAM,OAAU;AAChD,QAAM,cAAc,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,CAAC,EAAE,mBAAmB;AACpF,MAAI,kBAAkB;AACpB,WAAO;AAAA,MACL;AAAA,MACA,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,eAAe,CAAC,GAAG,cAAc,MAAM;AAAA,MACpE,MAAM;AAAA,IACR;AACF,MAAI,UAAU,CAAC,GAAG,SAAS,KAAK,SAAS,KAAK,cAAc,QAAQ,IAAI,GAAG,EAAE,eAAe,CAAC;AAC7F,MAAI,QAAQ,SAAS,iBAAiB;AAEpC,UAAM,QAAQ,QAAQ;AAAA,MACpB,CAAC,KAAK,MAAM,IAAI,QAAQ,SAAS,KAAK,YAAY,GAAG,MAAM,KAAK;AAAA,IAClE;AACA,QAAI,UAAU,GAAI,WAAU,QAAQ,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAAA,EAClE;AACA,SAAO,EAAE,OAAO,MAAM,EAAE,GAAG,MAAM,SAAS,cAAc,MAAM,GAAG,MAAM,MAAM;AAC/E;AAGO,SAAS,iBAAiB,MAA2B,OAAqC;AAC/F,QAAM,UAAU,KAAK,QAAQ,OAAO,CAAC,QAAQ,YAAY,GAAG,MAAM,KAAK;AACvE,MAAI,QAAQ,WAAW;AACrB,WAAO,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,cAAc,KAAK,GAAG,MAAM,OAAO;AAC5E,MAAI,KAAK,iBAAiB,MAAO,QAAO,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAM,KAAK;AACjF,QAAM,QAAQ,KAAK,QAAQ,UAAU,CAAC,QAAQ,YAAY,GAAG,MAAM,KAAK;AACxE,QAAM,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,SAAS,CAAC,CAAC;AACxD,SAAO;AAAA,IACL,MAAM,EAAE,GAAG,MAAM,SAAS,cAAc,YAAY,IAAI,EAAE;AAAA,IAC1D,MAAM,EAAE,gBAAgB,KAAK,gBAAgB,MAAM,KAAK,KAAK;AAAA,EAC/D;AACF;AAMO,SAAS,iBACd,MACA,SACqB;AACrB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,IACd,SAAS,KAAK,QAAQ;AAAA,MAAI,CAAC,QACzB,YAAY,GAAG,MAAM,KAAK,eACtB,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,QAAQ,MAAM,WAAW,KAAK,EAAE,IACrD,IAAI,OACF,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,IAAI,MAAM,WAAW,KAAK,EAAE,IACjD;AAAA,IACR;AAAA,EACF;AACF;AAMO,SAAS,kBACd,MACA,QACA,MACqB;AACrB,MAAI,WAAW,QAAQ,CAAC,KAAK,QAAQ,KAAK,CAAC,QAAQ,YAAY,GAAG,MAAM,MAAM,EAAG,QAAO;AACxF,QAAM,QAAQ,KAAK,QAAQ,KAAK,CAAC,QAAQ,YAAY,GAAG,MAAM,IAAI;AAClE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,KAAK,iBAAiB,SAAS,OAAO,KAAK;AAAA,IACzD,SAAS,QACL,KAAK,QAAQ,OAAO,CAAC,QAAQ,YAAY,GAAG,MAAM,MAAM,IACxD,KAAK,QAAQ;AAAA,MAAI,CAAC,QAChB,YAAY,GAAG,MAAM,SAAS,EAAE,GAAG,KAAK,gBAAgB,KAAK,IAAI;AAAA,IACnE;AAAA,EACN;AACF;AAIA,MAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AACrE,MAAM,eAAe,CAAC,MAA+B,OAAO,MAAM,WAAW,IAAI;AACjF,MAAM,oBAAoB,CAAC,MACzB,OAAO,MAAM,WAAW,IAAI;AAG9B,SAAS,UAAU,OAA+C;AAChE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,SAAO;AAAA,IACL,QAAQ,aAAa,MAAM,MAAM;AAAA,IACjC,kBAAkB,aAAa,MAAM,gBAAgB;AAAA,IACrD,cAAc;AAAA,IACd,eAAe,aAAa,MAAM,aAAa;AAAA,IAC/C,WAAW,kBAAkB,MAAM,SAAS;AAAA,IAC5C,eAAe,kBAAkB,MAAM,aAAa;AAAA,IACpD,WACE,OAAO,MAAM,cAAc,YAAY,OAAO,SAAS,MAAM,SAAS,IAClE,MAAM,YACN;AAAA,EACR;AACF;AAMO,SAAS,qBACd,SACA,cACuD;AACvD,QAAM,OAAwB,CAAC;AAC/B,aAAW,SAAS,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,GAAG;AACzD,QAAI,CAAC,SAAS,KAAK,EAAG;AACtB,UAAM,EAAE,eAAe,IAAI;AAC3B,QAAI,mBAAmB,QAAQ,OAAO,mBAAmB,SAAU;AACnE,UAAM,OAAO,UAAU,MAAM,IAAI;AACjC,UAAM,MAAqB,OAAO,EAAE,gBAAgB,KAAK,IAAI,EAAE,eAAe;AAE9E,QAAI,CAAC,KAAK,KAAK,CAAC,MAAM,YAAY,CAAC,MAAM,YAAY,GAAG,CAAC,EAAG,MAAK,KAAK,GAAG;AAAA,EAC3E;AACA,QAAM,SAAS,OAAO,iBAAiB,WAAW,eAAe;AACjE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,UAAU,KAAK,KAAK,CAAC,QAAQ,YAAY,GAAG,MAAM,MAAM,IAAI,SAAS;AAAA,EACrF;AACF;AAGO,MAAM,kBAAkB,CAAC,YAC9B,QAAQ,IAAI,CAAC,QAAS,IAAI,OAAO,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,IAAI,MAAM,cAAc,KAAK,EAAE,IAAI,GAAI;",
|
|
6
|
+
"names": ["threads"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
function createUiStateStorage(options = {}) {
|
|
2
|
+
const debounceMs = options.debounceMs ?? 250;
|
|
3
|
+
const maxWaitMs = options.maxWaitMs ?? 1e3;
|
|
4
|
+
const backing = options.backing ?? (() => {
|
|
5
|
+
try {
|
|
6
|
+
return typeof localStorage === "undefined" ? void 0 : localStorage;
|
|
7
|
+
} catch {
|
|
8
|
+
return void 0;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const pending = /* @__PURE__ */ new Map();
|
|
12
|
+
let timer = null;
|
|
13
|
+
let firstQueuedAt = null;
|
|
14
|
+
const write = (name, value) => {
|
|
15
|
+
try {
|
|
16
|
+
backing()?.setItem(name, JSON.stringify(value));
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.warn("[ui-state] Could not save UI state; keeping it in memory", error);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const flush = () => {
|
|
22
|
+
if (timer) clearTimeout(timer);
|
|
23
|
+
timer = null;
|
|
24
|
+
firstQueuedAt = null;
|
|
25
|
+
const due = Array.from(pending.entries());
|
|
26
|
+
pending.clear();
|
|
27
|
+
for (const [name, value] of due) write(name, value);
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
getItem: (name) => {
|
|
31
|
+
const unsaved = pending.get(name);
|
|
32
|
+
if (unsaved) return unsaved;
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = backing()?.getItem(name);
|
|
36
|
+
return raw ? JSON.parse(raw) : null;
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.warn("[ui-state] Saved UI state is unreadable; starting from defaults", error);
|
|
39
|
+
if (raw !== void 0) {
|
|
40
|
+
try {
|
|
41
|
+
backing()?.removeItem(name);
|
|
42
|
+
} catch {
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
setItem: (name, value) => {
|
|
49
|
+
pending.set(name, value);
|
|
50
|
+
if (timer) clearTimeout(timer);
|
|
51
|
+
firstQueuedAt ??= Date.now();
|
|
52
|
+
timer = setTimeout(
|
|
53
|
+
flush,
|
|
54
|
+
Math.max(0, Math.min(debounceMs, firstQueuedAt + maxWaitMs - Date.now()))
|
|
55
|
+
);
|
|
56
|
+
},
|
|
57
|
+
removeItem: (name) => {
|
|
58
|
+
pending.delete(name);
|
|
59
|
+
if (pending.size === 0) {
|
|
60
|
+
if (timer) clearTimeout(timer);
|
|
61
|
+
timer = null;
|
|
62
|
+
firstQueuedAt = null;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
backing()?.removeItem(name);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.warn("[ui-state] Could not remove saved UI state", error);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
flush
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
createUiStateStorage
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=ui-state-storage.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/ui-state-storage.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Storage for the saved UI state: synchronous reads, debounced writes, never throws.\n *\n * Reads are synchronous (localStorage) so the store is fully restored inside `create()`, before\n * React renders anything. There is no \"still restoring\" phase for the app to wait on, so boot\n * cannot stall on storage and nothing has to time out.\n *\n * Writes are coalesced: zustand calls setItem on every state change, so the value is held and\n * serialised once, `debounceMs` after the last change (and immediately when the page is hidden,\n * so a reload or tab close keeps the last change). Every storage failure (quota, disabled\n * storage, unreadable JSON) is logged and absorbed; the app keeps working from memory.\n */\n\nimport type { PersistStorage, StorageValue } from 'zustand/middleware'\n\nexport interface UiStateStorage<S> extends PersistStorage<S> {\n /** Write every pending value now (page hide, logout). */\n flush: () => void\n}\n\nexport function createUiStateStorage<S>(\n options: {\n debounceMs?: number\n maxWaitMs?: number\n /** The backing store; resolved lazily so environments without localStorage just get none. */\n backing?: () => Storage | undefined\n } = {}\n): UiStateStorage<S> {\n const debounceMs = options.debounceMs ?? 250\n const maxWaitMs = options.maxWaitMs ?? 1000\n const backing =\n options.backing ??\n (() => {\n try {\n return typeof localStorage === 'undefined' ? undefined : localStorage\n } catch {\n return undefined // Access itself throws when storage is blocked.\n }\n })\n const pending = new Map<string, StorageValue<S>>()\n let timer: ReturnType<typeof setTimeout> | null = null\n let firstQueuedAt: number | null = null\n\n const write = (name: string, value: StorageValue<S>) => {\n try {\n backing()?.setItem(name, JSON.stringify(value))\n } catch (error) {\n console.warn('[ui-state] Could not save UI state; keeping it in memory', error)\n }\n }\n\n const flush = () => {\n if (timer) clearTimeout(timer)\n timer = null\n firstQueuedAt = null\n const due = Array.from(pending.entries())\n pending.clear()\n for (const [name, value] of due) write(name, value)\n }\n\n return {\n getItem: (name) => {\n // A value not yet written is the newest one.\n const unsaved = pending.get(name)\n if (unsaved) return unsaved\n let raw: string | null | undefined\n try {\n raw = backing()?.getItem(name)\n return raw ? (JSON.parse(raw) as StorageValue<S>) : null\n } catch (error) {\n console.warn('[ui-state] Saved UI state is unreadable; starting from defaults', error)\n if (raw !== undefined) {\n try {\n backing()?.removeItem(name)\n } catch {\n // Nothing more to do; the next save replaces it.\n }\n }\n return null\n }\n },\n setItem: (name, value) => {\n pending.set(name, value)\n if (timer) clearTimeout(timer)\n firstQueuedAt ??= Date.now()\n timer = setTimeout(\n flush,\n Math.max(0, Math.min(debounceMs, firstQueuedAt + maxWaitMs - Date.now()))\n )\n },\n removeItem: (name) => {\n pending.delete(name)\n if (pending.size === 0) {\n if (timer) clearTimeout(timer)\n timer = null\n firstQueuedAt = null\n }\n try {\n backing()?.removeItem(name)\n } catch (error) {\n console.warn('[ui-state] Could not remove saved UI state', error)\n }\n },\n flush,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAoBO,SAAS,qBACd,UAKI,CAAC,GACc;AACnB,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,UACJ,QAAQ,YACP,MAAM;AACL,QAAI;AACF,aAAO,OAAO,iBAAiB,cAAc,SAAY;AAAA,IAC3D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF,QAAM,UAAU,oBAAI,IAA6B;AACjD,MAAI,QAA8C;AAClD,MAAI,gBAA+B;AAEnC,QAAM,QAAQ,CAAC,MAAc,UAA2B;AACtD,QAAI;AACF,cAAQ,GAAG,QAAQ,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,IAChD,SAAS,OAAO;AACd,cAAQ,KAAK,4DAA4D,KAAK;AAAA,IAChF;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,MAAO,cAAa,KAAK;AAC7B,YAAQ;AACR,oBAAgB;AAChB,UAAM,MAAM,MAAM,KAAK,QAAQ,QAAQ,CAAC;AACxC,YAAQ,MAAM;AACd,eAAW,CAAC,MAAM,KAAK,KAAK,IAAK,OAAM,MAAM,KAAK;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,SAAS,CAAC,SAAS;AAEjB,YAAM,UAAU,QAAQ,IAAI,IAAI;AAChC,UAAI,QAAS,QAAO;AACpB,UAAI;AACJ,UAAI;AACF,cAAM,QAAQ,GAAG,QAAQ,IAAI;AAC7B,eAAO,MAAO,KAAK,MAAM,GAAG,IAAwB;AAAA,MACtD,SAAS,OAAO;AACd,gBAAQ,KAAK,mEAAmE,KAAK;AACrF,YAAI,QAAQ,QAAW;AACrB,cAAI;AACF,oBAAQ,GAAG,WAAW,IAAI;AAAA,UAC5B,QAAQ;AAAA,UAER;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,cAAQ,IAAI,MAAM,KAAK;AACvB,UAAI,MAAO,cAAa,KAAK;AAC7B,wBAAkB,KAAK,IAAI;AAC3B,cAAQ;AAAA,QACN;AAAA,QACA,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,gBAAgB,YAAY,KAAK,IAAI,CAAC,CAAC;AAAA,MAC1E;AAAA,IACF;AAAA,IACA,YAAY,CAAC,SAAS;AACpB,cAAQ,OAAO,IAAI;AACnB,UAAI,QAAQ,SAAS,GAAG;AACtB,YAAI,MAAO,cAAa,KAAK;AAC7B,gBAAQ;AACR,wBAAgB;AAAA,MAClB;AACA,UAAI;AACF,gBAAQ,GAAG,WAAW,IAAI;AAAA,MAC5B,SAAS,OAAO;AACd,gBAAQ,KAAK,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
function createArbiWorkspaceStore({
|
|
2
|
+
storage,
|
|
3
|
+
workspaceId = storage?.load() ?? null
|
|
4
|
+
} = {}) {
|
|
5
|
+
let state = { workspaceId, workspaceStatus: "closed" };
|
|
6
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
7
|
+
const update = (patch) => {
|
|
8
|
+
state = { ...state, ...patch };
|
|
9
|
+
listeners.forEach((listener) => listener());
|
|
10
|
+
};
|
|
11
|
+
const setWorkspaceId = (id) => {
|
|
12
|
+
storage?.save(id);
|
|
13
|
+
if (state.workspaceId !== id) update({ workspaceId: id });
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
getState: () => state,
|
|
17
|
+
subscribe: (listener) => {
|
|
18
|
+
listeners.add(listener);
|
|
19
|
+
return () => listeners.delete(listener);
|
|
20
|
+
},
|
|
21
|
+
setWorkspaceId,
|
|
22
|
+
setWorkspaceStatus: (workspaceStatus) => {
|
|
23
|
+
if (state.workspaceStatus !== workspaceStatus) update({ workspaceStatus });
|
|
24
|
+
},
|
|
25
|
+
reset: () => {
|
|
26
|
+
storage?.save(null);
|
|
27
|
+
if (state.workspaceId !== null || state.workspaceStatus !== "closed")
|
|
28
|
+
update({ workspaceId: null, workspaceStatus: "closed" });
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const WORKSPACE_STORAGE_KEY = "arbi_workspace_id";
|
|
33
|
+
const WORKSPACE_LAST_OPENED_KEY = "arbi_workspace_last_opened";
|
|
34
|
+
function browserWorkspaceStorage({
|
|
35
|
+
key = WORKSPACE_STORAGE_KEY,
|
|
36
|
+
lastOpenedKey = WORKSPACE_LAST_OPENED_KEY
|
|
37
|
+
} = {}) {
|
|
38
|
+
return {
|
|
39
|
+
load() {
|
|
40
|
+
try {
|
|
41
|
+
return window.sessionStorage.getItem(key);
|
|
42
|
+
} catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
save(workspaceId) {
|
|
47
|
+
try {
|
|
48
|
+
if (!workspaceId) {
|
|
49
|
+
window.sessionStorage.removeItem(key);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
window.sessionStorage.setItem(key, workspaceId);
|
|
53
|
+
const lastOpened = readWorkspaceLastOpened(lastOpenedKey);
|
|
54
|
+
lastOpened[workspaceId] = Date.now();
|
|
55
|
+
window.localStorage.setItem(lastOpenedKey, JSON.stringify(lastOpened));
|
|
56
|
+
} catch {
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function readWorkspaceLastOpened(lastOpenedKey = WORKSPACE_LAST_OPENED_KEY) {
|
|
62
|
+
try {
|
|
63
|
+
const raw = window.localStorage.getItem(lastOpenedKey);
|
|
64
|
+
const parsed = raw ? JSON.parse(raw) : null;
|
|
65
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
66
|
+
} catch {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
WORKSPACE_LAST_OPENED_KEY,
|
|
72
|
+
WORKSPACE_STORAGE_KEY,
|
|
73
|
+
browserWorkspaceStorage,
|
|
74
|
+
createArbiWorkspaceStore,
|
|
75
|
+
readWorkspaceLastOpened
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/workspace.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The session's selected workspace (`workspaceId`) and where it stands on the server session\n * (`workspaceStatus`). `useSwitchWorkspace` moves both; a session store reads them from here.\n *\n * The selection is kept per tab (sessionStorage), so a reload stays in the workspace and each tab\n * can be in a different one; a new sign-in starts with none ({@link ArbiWorkspaceStore.reset}).\n * The status is never kept: after a reload the server session is new, and\n * `useOpenSelectedWorkspace` opens the kept selection again.\n */\n\nimport type { ArbiWorkspaceStatus } from './store'\n\n/** Where the selection is kept across reloads. */\nexport interface ArbiWorkspaceStorage {\n load(): string | null\n save(workspaceId: string | null): void\n}\n\n/** The selection and its status. */\nexport interface ArbiWorkspaceState {\n workspaceId: string | null\n workspaceStatus: ArbiWorkspaceStatus\n}\n\nexport interface ArbiWorkspaceStore {\n getState(): ArbiWorkspaceState\n subscribe(listener: () => void): () => void\n setWorkspaceId(workspaceId: string | null): void\n setWorkspaceStatus(status: ArbiWorkspaceStatus): void\n /** No workspace, closed (a sign-in or sign-out: the next person starts on the workspace list). */\n reset(): void\n}\n\nexport interface ArbiWorkspaceStoreOptions {\n storage?: ArbiWorkspaceStorage\n /** The selection to start with instead of the kept one. */\n workspaceId?: string | null\n}\n\nexport function createArbiWorkspaceStore({\n storage,\n workspaceId = storage?.load() ?? null,\n}: ArbiWorkspaceStoreOptions = {}): ArbiWorkspaceStore {\n let state: ArbiWorkspaceState = { workspaceId, workspaceStatus: 'closed' }\n const listeners = new Set<() => void>()\n const update = (patch: Partial<ArbiWorkspaceState>) => {\n state = { ...state, ...patch }\n listeners.forEach((listener) => listener())\n }\n const setWorkspaceId = (id: string | null) => {\n storage?.save(id)\n if (state.workspaceId !== id) update({ workspaceId: id })\n }\n return {\n getState: () => state,\n subscribe: (listener) => {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n setWorkspaceId,\n setWorkspaceStatus: (workspaceStatus) => {\n if (state.workspaceStatus !== workspaceStatus) update({ workspaceStatus })\n },\n reset: () => {\n storage?.save(null)\n if (state.workspaceId !== null || state.workspaceStatus !== 'closed')\n update({ workspaceId: null, workspaceStatus: 'closed' })\n },\n }\n}\n\n/** The sessionStorage key of the selection (per tab). */\nexport const WORKSPACE_STORAGE_KEY = 'arbi_workspace_id'\n/** The localStorage key of when each workspace was last opened (per browser). */\nexport const WORKSPACE_LAST_OPENED_KEY = 'arbi_workspace_last_opened'\n\nexport interface BrowserWorkspaceStorageOptions {\n /** Default {@link WORKSPACE_STORAGE_KEY}. */\n key?: string\n /** Default {@link WORKSPACE_LAST_OPENED_KEY}. */\n lastOpenedKey?: string\n}\n\n/**\n * The browser's: the selection per tab (sessionStorage), and when each workspace was last opened\n * per browser (localStorage, read with {@link readWorkspaceLastOpened}: \"recently opened\" is a\n * history that outlives a tab, the selection deliberately does not).\n */\nexport function browserWorkspaceStorage({\n key = WORKSPACE_STORAGE_KEY,\n lastOpenedKey = WORKSPACE_LAST_OPENED_KEY,\n}: BrowserWorkspaceStorageOptions = {}): ArbiWorkspaceStorage {\n return {\n load() {\n try {\n return window.sessionStorage.getItem(key)\n } catch {\n return null\n }\n },\n save(workspaceId) {\n try {\n if (!workspaceId) {\n window.sessionStorage.removeItem(key)\n return\n }\n window.sessionStorage.setItem(key, workspaceId)\n const lastOpened = readWorkspaceLastOpened(lastOpenedKey)\n lastOpened[workspaceId] = Date.now()\n window.localStorage.setItem(lastOpenedKey, JSON.stringify(lastOpened))\n } catch {\n // Storage unavailable (private mode, quota): the selection lives in memory only.\n }\n },\n }\n}\n\n/** When each workspace was last opened in this browser (`external_id` \u2192 epoch ms). */\nexport function readWorkspaceLastOpened(\n lastOpenedKey = WORKSPACE_LAST_OPENED_KEY\n): Record<string, number> {\n try {\n const raw = window.localStorage.getItem(lastOpenedKey)\n const parsed: unknown = raw ? JSON.parse(raw) : null\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, number>)\n : {}\n } catch {\n return {}\n }\n}\n"],
|
|
5
|
+
"mappings": "AAuCO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,cAAc,SAAS,KAAK,KAAK;AACnC,IAA+B,CAAC,GAAuB;AACrD,MAAI,QAA4B,EAAE,aAAa,iBAAiB,SAAS;AACzE,QAAM,YAAY,oBAAI,IAAgB;AACtC,QAAM,SAAS,CAAC,UAAuC;AACrD,YAAQ,EAAE,GAAG,OAAO,GAAG,MAAM;AAC7B,cAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,EAC5C;AACA,QAAM,iBAAiB,CAAC,OAAsB;AAC5C,aAAS,KAAK,EAAE;AAChB,QAAI,MAAM,gBAAgB,GAAI,QAAO,EAAE,aAAa,GAAG,CAAC;AAAA,EAC1D;AACA,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,IAChB,WAAW,CAAC,aAAa;AACvB,gBAAU,IAAI,QAAQ;AACtB,aAAO,MAAM,UAAU,OAAO,QAAQ;AAAA,IACxC;AAAA,IACA;AAAA,IACA,oBAAoB,CAAC,oBAAoB;AACvC,UAAI,MAAM,oBAAoB,gBAAiB,QAAO,EAAE,gBAAgB,CAAC;AAAA,IAC3E;AAAA,IACA,OAAO,MAAM;AACX,eAAS,KAAK,IAAI;AAClB,UAAI,MAAM,gBAAgB,QAAQ,MAAM,oBAAoB;AAC1D,eAAO,EAAE,aAAa,MAAM,iBAAiB,SAAS,CAAC;AAAA,IAC3D;AAAA,EACF;AACF;AAGO,MAAM,wBAAwB;AAE9B,MAAM,4BAA4B;AAclC,SAAS,wBAAwB;AAAA,EACtC,MAAM;AAAA,EACN,gBAAgB;AAClB,IAAoC,CAAC,GAAyB;AAC5D,SAAO;AAAA,IACL,OAAO;AACL,UAAI;AACF,eAAO,OAAO,eAAe,QAAQ,GAAG;AAAA,MAC1C,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,UAAI;AACF,YAAI,CAAC,aAAa;AAChB,iBAAO,eAAe,WAAW,GAAG;AACpC;AAAA,QACF;AACA,eAAO,eAAe,QAAQ,KAAK,WAAW;AAC9C,cAAM,aAAa,wBAAwB,aAAa;AACxD,mBAAW,WAAW,IAAI,KAAK,IAAI;AACnC,eAAO,aAAa,QAAQ,eAAe,KAAK,UAAU,UAAU,CAAC;AAAA,MACvE,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,wBACd,gBAAgB,2BACQ;AACxB,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,aAAa;AACrD,UAAM,SAAkB,MAAM,KAAK,MAAM,GAAG,IAAI;AAChD,WAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAC/D,SACD,CAAC;AAAA,EACP,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|