@arbidocs/react 0.5.111 → 0.5.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.js +702 -17116
- package/dist/index.js.map +7 -1
- package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.js +290 -10
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.js +61 -271
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/chunk-ZM6N7YZH.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { useArbiHost } from "../host/config.js";
|
|
4
|
+
import { useArbi } from "../useArbi.js";
|
|
5
|
+
import { arbiQueryKeys } from "../query-keys.js";
|
|
6
|
+
const ANALYTICS_CHART_VIEW = "analytics.chartDatabase";
|
|
7
|
+
const MAX_DASHBOARD_SPEC_CHARS = 1e4;
|
|
8
|
+
const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
9
|
+
function isPanel(v) {
|
|
10
|
+
return isObject(v) && typeof v.id === "string" && typeof v.title === "string" && isObject(v.source) && typeof v.source.id === "string" && isObject(v.chart) && typeof v.chart.type === "string";
|
|
11
|
+
}
|
|
12
|
+
function parseDashboardSpec(value) {
|
|
13
|
+
let parsed = value;
|
|
14
|
+
if (typeof value === "string") {
|
|
15
|
+
try {
|
|
16
|
+
parsed = JSON.parse(value);
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (!isObject(parsed) || parsed.version !== 1 || typeof parsed.title !== "string") return null;
|
|
22
|
+
const panels = Array.isArray(parsed.panels) ? parsed.panels.filter(isPanel) : [];
|
|
23
|
+
return {
|
|
24
|
+
version: 1,
|
|
25
|
+
title: parsed.title,
|
|
26
|
+
...typeof parsed.description === "string" ? { description: parsed.description } : {},
|
|
27
|
+
panels
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function serializeDashboardSpec(spec, max = MAX_DASHBOARD_SPEC_CHARS) {
|
|
31
|
+
const json = JSON.stringify(spec);
|
|
32
|
+
if (json.length > max) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
`This dashboard is too large to save (${json.length.toLocaleString("en-GB")} characters, at most ${max.toLocaleString("en-GB")}). Remove a panel or split it into two dashboards.`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
return json;
|
|
38
|
+
}
|
|
39
|
+
function useUserDashboardStore() {
|
|
40
|
+
const arbi = useArbi();
|
|
41
|
+
const scope = arbi.isLoggedIn ? arbi.user.identity()?.externalId ?? null : null;
|
|
42
|
+
return useMemo(
|
|
43
|
+
() => ({
|
|
44
|
+
scope: scope && `user:${scope}`,
|
|
45
|
+
list: async () => (await arbi.dashboards.list()).map(({ id, json, updatedAt }) => {
|
|
46
|
+
const spec = json === null ? null : parseDashboardSpec(json);
|
|
47
|
+
return spec ? { id, spec, updatedAt } : {
|
|
48
|
+
id,
|
|
49
|
+
spec: { version: 1, title: "", panels: [] },
|
|
50
|
+
updatedAt,
|
|
51
|
+
unreadable: true
|
|
52
|
+
};
|
|
53
|
+
}),
|
|
54
|
+
async save({ id, spec }) {
|
|
55
|
+
const saved = await arbi.dashboards.save({ id, json: serializeDashboardSpec(spec) });
|
|
56
|
+
return { id: saved.id, spec, updatedAt: saved.updatedAt };
|
|
57
|
+
},
|
|
58
|
+
remove: (id) => arbi.dashboards.remove(id)
|
|
59
|
+
}),
|
|
60
|
+
[arbi, scope]
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
function createMemoryDashboardStore(initial = [], scope = "memory") {
|
|
64
|
+
let items = [...initial];
|
|
65
|
+
let next = items.length + 1;
|
|
66
|
+
return {
|
|
67
|
+
scope,
|
|
68
|
+
list: async () => items.map((d) => ({ ...d })),
|
|
69
|
+
save: async ({ id, spec }) => {
|
|
70
|
+
const saved = { id: id ?? `dash-${next++}`, spec, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
71
|
+
items = id ? items.map((d) => d.id === id ? saved : d) : [...items, saved];
|
|
72
|
+
return saved;
|
|
73
|
+
},
|
|
74
|
+
remove: async (id) => {
|
|
75
|
+
items = items.filter((d) => d.id !== id);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const NAME_COLUMN = "Name";
|
|
80
|
+
const SPEC_COLUMN = "Spec";
|
|
81
|
+
function useDatabaseDashboardStore(options = {}) {
|
|
82
|
+
const arbi = useArbi();
|
|
83
|
+
const queryClient = useQueryClient();
|
|
84
|
+
const name = options.name ?? "Dashboards";
|
|
85
|
+
const workspaceId = arbi.hasWorkspace ? arbi.getWorkspaceId() : null;
|
|
86
|
+
return useMemo(() => {
|
|
87
|
+
async function find() {
|
|
88
|
+
const all = await arbi.databases.list();
|
|
89
|
+
return all.find(
|
|
90
|
+
(d) => d.editable && d.workspace_id === workspaceId && d.name === name && (d.columns ?? []).some((c) => c.name === SPEC_COLUMN)
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
function inWorkspace(read) {
|
|
94
|
+
return workspaceId ? arbi.readInWorkspace(workspaceId, read) : read();
|
|
95
|
+
}
|
|
96
|
+
async function ensure() {
|
|
97
|
+
return inWorkspace(ensureHere);
|
|
98
|
+
}
|
|
99
|
+
async function ensureHere() {
|
|
100
|
+
const found = await find();
|
|
101
|
+
if (found) return found;
|
|
102
|
+
const created = await arbi.databases.create({
|
|
103
|
+
name,
|
|
104
|
+
description: "Saved dashboards (written by the Dashboards page).",
|
|
105
|
+
columns: [
|
|
106
|
+
{ name: NAME_COLUMN, type: "text" },
|
|
107
|
+
{ name: SPEC_COLUMN, type: "text" }
|
|
108
|
+
]
|
|
109
|
+
});
|
|
110
|
+
void queryClient.invalidateQueries({
|
|
111
|
+
queryKey: arbiQueryKeys.databaseList(workspaceId ?? void 0)
|
|
112
|
+
});
|
|
113
|
+
return created;
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
scope: workspaceId,
|
|
117
|
+
list: () => inWorkspace(async () => {
|
|
118
|
+
const database = await find();
|
|
119
|
+
if (!database) return [];
|
|
120
|
+
const spec = database.columns?.find((c) => c.name === SPEC_COLUMN)?.id ?? SPEC_COLUMN;
|
|
121
|
+
const page = await arbi.databases.rows(database.id, { limit: 1e3 });
|
|
122
|
+
return page.rows.flatMap((row) => {
|
|
123
|
+
const parsed = parseDashboardSpec(row.values[spec]);
|
|
124
|
+
return parsed ? [{ id: row.id, spec: parsed, updatedAt: row.updated_at }] : [];
|
|
125
|
+
});
|
|
126
|
+
}),
|
|
127
|
+
async save({ id, spec }) {
|
|
128
|
+
const values = { [NAME_COLUMN]: spec.title, [SPEC_COLUMN]: serializeDashboardSpec(spec) };
|
|
129
|
+
const database = await ensure();
|
|
130
|
+
const row = id ? await arbi.databases.updateRow(database.id, id, values) : (await arbi.databases.addRows(database.id, [{ values }]))[0];
|
|
131
|
+
void queryClient.invalidateQueries({
|
|
132
|
+
queryKey: arbiQueryKeys.databaseRows(workspaceId ?? "", database.id)
|
|
133
|
+
});
|
|
134
|
+
return { id: row.id, spec, updatedAt: row.updated_at };
|
|
135
|
+
},
|
|
136
|
+
async remove(id) {
|
|
137
|
+
const database = await find();
|
|
138
|
+
if (!database) return;
|
|
139
|
+
await arbi.databases.deleteRows(database.id, [id]);
|
|
140
|
+
void queryClient.invalidateQueries({
|
|
141
|
+
queryKey: arbiQueryKeys.databaseRows(workspaceId ?? "", database.id)
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}, [arbi, queryClient, name, workspaceId]);
|
|
146
|
+
}
|
|
147
|
+
function useDashboardStore() {
|
|
148
|
+
const { dashboards } = useArbiHost();
|
|
149
|
+
return (dashboards?.useStore ?? useUserDashboardStore)();
|
|
150
|
+
}
|
|
151
|
+
function useSavedDashboards(store) {
|
|
152
|
+
return useQuery({
|
|
153
|
+
queryKey: arbiQueryKeys.dashboards(store.scope ?? ""),
|
|
154
|
+
queryFn: () => store.list(),
|
|
155
|
+
enabled: store.scope !== null
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function useSaveDashboard(store) {
|
|
159
|
+
const queryClient = useQueryClient();
|
|
160
|
+
const key = arbiQueryKeys.dashboards(store.scope ?? "");
|
|
161
|
+
return useMutation({
|
|
162
|
+
mutationFn: (dashboard) => store.save(dashboard),
|
|
163
|
+
onSuccess: (saved) => {
|
|
164
|
+
queryClient.setQueryData(
|
|
165
|
+
key,
|
|
166
|
+
(old = []) => old.some((d) => d.id === saved.id) ? old.map((d) => d.id === saved.id ? saved : d) : [...old, saved]
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function useDeleteDashboard(store) {
|
|
172
|
+
const queryClient = useQueryClient();
|
|
173
|
+
const key = arbiQueryKeys.dashboards(store.scope ?? "");
|
|
174
|
+
return useMutation({
|
|
175
|
+
mutationFn: (id) => store.remove(id),
|
|
176
|
+
onSuccess: (_void, id) => {
|
|
177
|
+
queryClient.setQueryData(key, (old = []) => old.filter((d) => d.id !== id));
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
export {
|
|
182
|
+
ANALYTICS_CHART_VIEW,
|
|
183
|
+
MAX_DASHBOARD_SPEC_CHARS,
|
|
184
|
+
createMemoryDashboardStore,
|
|
185
|
+
parseDashboardSpec,
|
|
186
|
+
serializeDashboardSpec,
|
|
187
|
+
useDashboardStore,
|
|
188
|
+
useDatabaseDashboardStore,
|
|
189
|
+
useDeleteDashboard,
|
|
190
|
+
useSaveDashboard,
|
|
191
|
+
useSavedDashboards,
|
|
192
|
+
useUserDashboardStore
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/datasets/store.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Saved dashboards: where `DashboardSpec`s are kept, and the hooks that read and write them.\n *\n * Default store: the person's own (`useUserDashboardStore`, `/v1/user/dashboards`), each spec sealed\n * in the browser to their own key, so Analytics is theirs across workspaces. A host keeps them\n * elsewhere with `<ArbiHost config={{ dashboards: { useStore } }}>`, e.g. in a database of the open\n * workspace, shared with its members (`useDatabaseDashboardStore`).\n */\nimport { useMemo } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbiHost } from '../host/config'\nimport { useArbi } from '../useArbi'\nimport { arbiQueryKeys } from '../query-keys'\nimport type { DashboardSpec, PanelSpec } from './types'\n\n/**\n * The transient view through which a host asks Analytics to chart a database (\"Chart this\"): set it to\n * `{ id, name, workspaceId }` and open the page, which makes a dashboard on that database and clears it.\n */\nexport const ANALYTICS_CHART_VIEW = 'analytics.chartDatabase'\n\n/** A database Analytics is asked to chart. */\nexport interface AnalyticsChartRequest {\n id: string\n name: string\n /** The database's workspace, so the new panels read it from anywhere. */\n workspaceId?: string\n}\n\n/** A dashboard as stored. */\nexport interface SavedDashboard {\n id: string\n spec: DashboardSpec\n updatedAt?: string\n /** It could not be opened (sealed under another key, or not a dashboard): it can only be deleted. */\n unreadable?: boolean\n}\n\n/** Where dashboards are kept. */\nexport interface DashboardStore {\n /** What the saved list is cached under (the workspace it belongs to). `null`: not available. */\n scope: string | null\n list: () => Promise<SavedDashboard[]>\n /** Create (no `id`) or replace a dashboard; resolves with it as stored. */\n save: (dashboard: { id?: string; spec: DashboardSpec }) => Promise<SavedDashboard>\n remove: (id: string) => Promise<void>\n}\n\n/** The longest spec a database text cell holds (the server's limit). */\nexport const MAX_DASHBOARD_SPEC_CHARS = 10_000\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\nfunction isPanel(v: unknown): v is PanelSpec {\n return (\n isObject(v) &&\n typeof v.id === 'string' &&\n typeof v.title === 'string' &&\n isObject(v.source) &&\n typeof v.source.id === 'string' &&\n isObject(v.chart) &&\n typeof v.chart.type === 'string'\n )\n}\n\n/** A stored spec, checked: `null` when it is not a dashboard (malformed panels are dropped). */\nexport function parseDashboardSpec(value: unknown): DashboardSpec | null {\n let parsed = value\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value)\n } catch {\n return null\n }\n }\n if (!isObject(parsed) || parsed.version !== 1 || typeof parsed.title !== 'string') return null\n const panels = Array.isArray(parsed.panels) ? parsed.panels.filter(isPanel) : []\n return {\n version: 1,\n title: parsed.title,\n ...(typeof parsed.description === 'string' ? { description: parsed.description } : {}),\n panels,\n }\n}\n\n/** A spec as JSON for storage; throws when it is longer than the store holds. */\nexport function serializeDashboardSpec(spec: DashboardSpec, max = MAX_DASHBOARD_SPEC_CHARS) {\n const json = JSON.stringify(spec)\n if (json.length > max) {\n throw new Error(\n `This dashboard is too large to save (${json.length.toLocaleString('en-GB')} characters, at most ${max.toLocaleString('en-GB')}). Remove a panel or split it into two dashboards.`\n )\n }\n return json\n}\n\n/** The person's own dashboards (`arbi.dashboards`: sealed to their key); unavailable signed out. */\nexport function useUserDashboardStore(): DashboardStore {\n const arbi = useArbi()\n const scope = arbi.isLoggedIn ? (arbi.user.identity()?.externalId ?? null) : null\n return useMemo(\n () => ({\n scope: scope && `user:${scope}`,\n list: async () =>\n (await arbi.dashboards.list()).map(({ id, json, updatedAt }) => {\n const spec = json === null ? null : parseDashboardSpec(json)\n return spec\n ? { id, spec, updatedAt }\n : {\n id,\n spec: { version: 1 as const, title: '', panels: [] },\n updatedAt,\n unreadable: true,\n }\n }),\n async save({ id, spec }) {\n const saved = await arbi.dashboards.save({ id, json: serializeDashboardSpec(spec) })\n return { id: saved.id, spec, updatedAt: saved.updatedAt }\n },\n remove: (id) => arbi.dashboards.remove(id),\n }),\n [arbi, scope]\n )\n}\n\n/** A store kept in memory (a demo, a test, a page without a workspace). */\nexport function createMemoryDashboardStore(\n initial: readonly SavedDashboard[] = [],\n scope = 'memory'\n): DashboardStore {\n let items = [...initial]\n let next = items.length + 1\n return {\n scope,\n list: async () => items.map((d) => ({ ...d })),\n save: async ({ id, spec }) => {\n const saved = { id: id ?? `dash-${next++}`, spec, updatedAt: new Date().toISOString() }\n items = id ? items.map((d) => (d.id === id ? saved : d)) : [...items, saved]\n return saved\n },\n remove: async (id) => {\n items = items.filter((d) => d.id !== id)\n },\n }\n}\n\nexport interface DatabaseDashboardStoreOptions {\n /** The database's name. Default \"Dashboards\". */\n name?: string\n}\n\nconst NAME_COLUMN = 'Name'\nconst SPEC_COLUMN = 'Spec'\n\n/** Dashboards kept as rows of a database of the open workspace (made on the first save). */\nexport function useDatabaseDashboardStore(\n options: DatabaseDashboardStoreOptions = {}\n): DashboardStore {\n const arbi = useArbi()\n const queryClient = useQueryClient()\n const name = options.name ?? 'Dashboards'\n const workspaceId = arbi.hasWorkspace ? arbi.getWorkspaceId() : null\n return useMemo(() => {\n /** The workspace's own dashboards database, if there is one. */\n async function find() {\n const all = await arbi.databases.list()\n return all.find(\n (d) =>\n d.editable &&\n d.workspace_id === workspaceId &&\n d.name === name &&\n (d.columns ?? []).some((c) => c.name === SPEC_COLUMN)\n )\n }\n /**\n * Run `read` only while this store's workspace is the one open on the server (databases are\n * listed and created there): a switch meanwhile drops it, so nothing is cached, or created,\n * as another workspace's.\n */\n function inWorkspace<T>(read: () => Promise<T>): Promise<T> {\n return workspaceId ? arbi.readInWorkspace(workspaceId, read) : read()\n }\n async function ensure() {\n return inWorkspace(ensureHere)\n }\n async function ensureHere() {\n const found = await find()\n if (found) return found\n const created = await arbi.databases.create({\n name,\n description: 'Saved dashboards (written by the Dashboards page).',\n columns: [\n { name: NAME_COLUMN, type: 'text' },\n { name: SPEC_COLUMN, type: 'text' },\n ],\n })\n void queryClient.invalidateQueries({\n queryKey: arbiQueryKeys.databaseList(workspaceId ?? undefined),\n })\n return created\n }\n return {\n scope: workspaceId,\n list: () =>\n inWorkspace(async () => {\n const database = await find()\n if (!database) return []\n const spec = database.columns?.find((c) => c.name === SPEC_COLUMN)?.id ?? SPEC_COLUMN\n const page = await arbi.databases.rows(database.id, { limit: 1000 })\n return page.rows.flatMap((row) => {\n const parsed = parseDashboardSpec(row.values[spec])\n return parsed ? [{ id: row.id, spec: parsed, updatedAt: row.updated_at }] : []\n })\n }),\n async save({ id, spec }) {\n const values = { [NAME_COLUMN]: spec.title, [SPEC_COLUMN]: serializeDashboardSpec(spec) }\n const database = await ensure()\n const row = id\n ? await arbi.databases.updateRow(database.id, id, values)\n : (await arbi.databases.addRows(database.id, [{ values }]))[0]\n // The database's own rows changed (it shows in Databases like any other).\n void queryClient.invalidateQueries({\n queryKey: arbiQueryKeys.databaseRows(workspaceId ?? '', database.id),\n })\n return { id: row.id, spec, updatedAt: row.updated_at }\n },\n async remove(id) {\n const database = await find()\n if (!database) return\n await arbi.databases.deleteRows(database.id, [id])\n void queryClient.invalidateQueries({\n queryKey: arbiQueryKeys.databaseRows(workspaceId ?? '', database.id),\n })\n },\n }\n }, [arbi, queryClient, name, workspaceId])\n}\n\n/** The store dashboards are kept in here: the host's (`dashboards.useStore`) or a database. */\nexport function useDashboardStore(): DashboardStore {\n const { dashboards } = useArbiHost()\n // The host's configuration is one object for its life: the same hook runs every render.\n return (dashboards?.useStore ?? useUserDashboardStore)()\n}\n\n/** The saved dashboards, oldest first. */\nexport function useSavedDashboards(store: DashboardStore) {\n return useQuery({\n queryKey: arbiQueryKeys.dashboards(store.scope ?? ''),\n queryFn: () => store.list(),\n enabled: store.scope !== null,\n })\n}\n\n/** Save a dashboard (create without `id`); the saved list takes it straight away. */\nexport function useSaveDashboard(store: DashboardStore) {\n const queryClient = useQueryClient()\n const key = arbiQueryKeys.dashboards(store.scope ?? '')\n return useMutation({\n mutationFn: (dashboard: { id?: string; spec: DashboardSpec }) => store.save(dashboard),\n onSuccess: (saved) => {\n queryClient.setQueryData<SavedDashboard[]>(key, (old = []) =>\n old.some((d) => d.id === saved.id)\n ? old.map((d) => (d.id === saved.id ? saved : d))\n : [...old, saved]\n )\n },\n })\n}\n\nexport function useDeleteDashboard(store: DashboardStore) {\n const queryClient = useQueryClient()\n const key = arbiQueryKeys.dashboards(store.scope ?? '')\n return useMutation({\n mutationFn: (id: string) => store.remove(id),\n onSuccess: (_void, id) => {\n queryClient.setQueryData<SavedDashboard[]>(key, (old = []) => old.filter((d) => d.id !== id))\n },\n })\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const AGGREGATE_FIELDS = {
|
|
2
|
+
/** The group's label ("Open", "2026-06"). */
|
|
3
|
+
group: "group",
|
|
4
|
+
/** The group's key as grouped (a date bucket, an id), for ordering and links. */
|
|
5
|
+
key: "key",
|
|
6
|
+
/** The series' label (only with `splitBy`). */
|
|
7
|
+
series: "series",
|
|
8
|
+
/** The measured value; `null` when the group has no value to measure. */
|
|
9
|
+
value: "value"
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
AGGREGATE_FIELDS
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/datasets/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Datasets: the one shape every chart and dashboard reads, whatever the data comes from.\n *\n * Three layers, each knowing only the one below it:\n * 1. A `DataSource` adapter (AI usage, documents, threads, projects, a database, later an external\n * feed) exposes its data as a normalized `Dataset`: typed fields and plain rows. Filtering,\n * grouping and aggregation happen here (`aggregateDataset`, or on the server where the backend\n * can, as a database does), never in a chart.\n * 2. A `ChartSpec` (inside a `PanelSpec`, inside a `DashboardSpec`) says what to show in terms of\n * field ids only: the chart type, x / series / y fields, the aggregate, sort and limit. It is\n * plain JSON, saved in dashboards and studio pages.\n * 3. A renderer (`@arbidocs/blocks/dashboards`) maps a spec plus the aggregated dataset onto the\n * drawing component. No renderer type appears here, so the renderer stays swappable.\n */\n\n/** A field's value type. Dates are ISO strings (`2026-06-12` or a full timestamp). */\nexport type DatasetFieldType = 'string' | 'number' | 'date' | 'boolean'\n\n/** One column of a dataset. */\nexport interface DatasetField {\n /** Stable id: what specs and rows use. */\n id: string\n /** What people read (a column name, \"Status\"). */\n label: string\n type: DatasetFieldType\n /**\n * The unit of a number field, which picks its formatting: `gbp` (\u00A3), `bytes`, `tokens`, or any\n * suffix (`\"MB\"`, `\"%\"`).\n */\n unit?: string\n /** The values a string field takes, when known (a select column's options), for a filter picker. */\n options?: readonly string[]\n /** A string field whose cell holds several values (tags, linked rows): a row counts in each. */\n multiple?: boolean\n}\n\n/** A cell: a scalar, `null` when empty, or a list for a `multiple` field. */\nexport type DatasetValue = string | number | boolean | null | readonly string[]\n\n/** One row, keyed by field id. */\nexport type DatasetRow = Readonly<Record<string, DatasetValue | undefined>>\n\n/** A normalized dataset: typed fields and the rows. */\nexport interface Dataset {\n fields: readonly DatasetField[]\n rows: readonly DatasetRow[]\n /** Rows matched before grouping (after filters). */\n totalRows?: number\n /** More groups existed than the query's `limit`. */\n truncated?: boolean\n}\n\n/** How a date field is grouped. Keys: `2026-06-12`, `2026-W24`, `2026-06`, `2026-Q2`, `2026`. */\nexport type TimeBucket = 'day' | 'week' | 'month' | 'quarter' | 'year'\n\nexport type AggregateOp = 'count' | 'sum' | 'avg' | 'min' | 'max'\n\nexport type FilterOp =\n 'eq' | 'neq' | 'contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'empty' | 'not_empty'\n\n/** Keep rows whose `field` satisfies `op value` (compared in the field's type). */\nexport interface DatasetFilter {\n field: string\n op: FilterOp\n value?: string | number | boolean | null\n}\n\n/** How the groups are ordered: by label (dates: chronological), or by value. */\nexport type DatasetSort = 'label' | 'value-desc' | 'value-asc'\n\n/** How records are ordered: by a field (empty cells last). */\nexport interface DatasetOrder {\n field: string\n /** Default `asc`. */\n direction?: 'asc' | 'desc'\n}\n\n/**\n * What to read of a source. Grouped (the default): the (filtered) rows grouped and each group\n * measured, a dataset in long form with the fields {@link AGGREGATE_FIELDS}, one row per group (and\n * series). With `records`: the matching rows themselves, ordered by `orderBy` and cut at `limit`.\n */\nexport interface DatasetQuery {\n /** List the matching records instead of grouping them (`groupBy`, `splitBy`, `measure` unused). */\n records?: boolean\n /** The order of the records. */\n orderBy?: DatasetOrder\n filters?: readonly DatasetFilter[]\n /** The field whose values (or date buckets) are the groups. Absent: one group, \"All\". */\n groupBy?: string\n /** The bucket of a date `groupBy` / `splitBy`. Default `month`. */\n bucket?: TimeBucket\n /** A second field: one series per value (a stacked or multi-line chart). */\n splitBy?: string\n /** Default: count rows. `count` with a `field` counts the rows where it is not empty. */\n measure?: { op: AggregateOp; field?: string }\n /** Default: dates chronological, others by value, largest first. */\n sort?: DatasetSort\n /** Most groups kept (by value), or records listed. Default 50 groups; every record. */\n limit?: number\n}\n\n/** The field ids of an aggregated dataset. */\nexport const AGGREGATE_FIELDS = {\n /** The group's label (\"Open\", \"2026-06\"). */\n group: 'group',\n /** The group's key as grouped (a date bucket, an id), for ordering and links. */\n key: 'key',\n /** The series' label (only with `splitBy`). */\n series: 'series',\n /** The measured value; `null` when the group has no value to measure. */\n value: 'value',\n} as const\n\n/** A dataset (or a source's fields) as a hook reads it. */\nexport interface DatasetState {\n dataset: Dataset | undefined\n isLoading: boolean\n error: unknown\n}\n\nexport interface DataSourceFieldsState {\n fields: readonly DatasetField[]\n isLoading: boolean\n error: unknown\n}\n\n/** A source's parameters as saved in a panel (a database id, a period). */\nexport type DataSourceParams = Readonly<\n Record<string, string | number | boolean | null | undefined>\n>\n\n/** A choice for a parameter (an option of a select). */\nexport interface DataSourceOption {\n value: string\n label: string\n /** Other parameters set with this choice (a database's workspace, so a panel reads it anywhere). */\n params?: DataSourceParams\n}\n\n/** A parameter the panel editor asks for, before the source's fields are known. */\nexport interface DataSourceParam {\n id: string\n label: string\n /** Absent: the parameter may be left empty. */\n required?: boolean\n /** Shown when nothing is chosen (\"All columns\"). */\n placeholder?: string\n /** The choices, read live (databases of the open workspace; a database's saved views). */\n useOptions: (params: DataSourceParams) => {\n options: readonly DataSourceOption[]\n isLoading: boolean\n }\n}\n\n/**\n * A data source adapter: where a dataset comes from.\n *\n * `useFields` and `useDataset` are hooks. A caller renders them from a component keyed by the\n * source id, so switching source mounts afresh (the hooks differ between sources).\n *\n * Extension point: an external source (an HTTP/JSON API, a CSV feed, a warehouse) is one more\n * adapter. It reads its rows however it likes (its own `useQuery`) and returns them as a `Dataset`;\n * `defineRowsSource` aggregates them for it. A host lists it in `<ArbiHost config={{ dashboards:\n * { sources } }}>` and every editor, panel and studio block offers it. Fetching third-party URLs\n * from the browser is the host's decision (CORS, credentials, what a shared dashboard may reach),\n * so none is built in; data to chart today is imported into a database (CSV / spreadsheet import).\n */\nexport interface DataSource {\n id: string\n label: string\n description?: string\n /** `workspace`: it reads the open workspace's data (documents, threads\u2026), so it shows nothing until\n * one is open; a function decides from the panel's parameters (a database panel that does not name\n * its workspace). Absent: it is the person's own or names what it reads (AI usage). */\n scope?: 'workspace' | ((params: DataSourceParams) => 'workspace' | undefined)\n params?: readonly DataSourceParam[]\n /** The fields a panel can use, given the parameters. */\n useFields: (params: DataSourceParams) => DataSourceFieldsState\n /**\n * The dataset: grouped and measured (long form with {@link AGGREGATE_FIELDS}), or the records\n * (`query.records`), filtered either way.\n */\n useDataset: (\n params: DataSourceParams,\n query: DatasetQuery,\n options?: { enabled?: boolean }\n ) => DatasetState\n}\n\n// \u2500\u2500 Specs: what a panel shows (plain JSON) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** How a panel draws its data. `metric` is one number; `table` a table of rows or groups. */\nexport type ChartType = 'metric' | 'bar' | 'line' | 'area' | 'pie' | 'donut' | 'table'\n\n/** What to show, in terms of the dataset's field ids. Serialisable. */\nexport interface ChartSpec {\n type: ChartType\n /** The category or date field along the x axis (pie slices; table groups). */\n x?: string\n /** The bucket of a date `x`. Default `month`. */\n bucket?: TimeBucket\n /** A field whose values become the series (stacked bars or areas, several lines). */\n series?: string\n /** The number field the aggregate reads (absent: rows are counted). */\n y?: string\n /** Default `count`. */\n aggregate?: AggregateOp\n sort?: DatasetSort\n limit?: number\n /** Stack the series (bar, area). */\n stacked?: boolean\n filters?: readonly DatasetFilter[]\n /** A table of records (no aggregate): the fields shown, in order. Absent: every field. */\n columns?: readonly string[]\n /** A table of records: their order. */\n orderBy?: DatasetOrder\n}\n\n/** The source a panel reads, by registry id, with its parameters. */\nexport interface DataSourceRef {\n id: string\n params?: DataSourceParams\n}\n\n/** One panel of a dashboard. */\nexport interface PanelSpec {\n id: string\n title: string\n description?: string\n source: DataSourceRef\n chart: ChartSpec\n /** Columns of the 12-column grid it spans on a wide screen (it is full width on a phone). */\n width?: number\n}\n\n/** A dashboard: a titled grid of panels. Plain JSON (`version` for later migrations). */\nexport interface DashboardSpec {\n version: 1\n title: string\n description?: string\n panels: readonly PanelSpec[]\n}\n"],
|
|
5
|
+
"mappings": "AAuGO,MAAM,mBAAmB;AAAA;AAAA,EAE9B,OAAO;AAAA;AAAA,EAEP,KAAK;AAAA;AAAA,EAEL,QAAQ;AAAA;AAAA,EAER,OAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Check, CheckCheck } from "lucide-react";
|
|
3
|
+
import { Badge } from "../ui/badge.js";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { formatRelativeTime, userDisplayName, isAgentUser } from "./utils.js";
|
|
6
|
+
import { DmAvatar } from "./DmAvatar.js";
|
|
7
|
+
import { AgentBadge } from "../entities/AgentMarkers.js";
|
|
8
|
+
function ConversationList({
|
|
9
|
+
conversations,
|
|
10
|
+
selectedPeerId,
|
|
11
|
+
onSelect,
|
|
12
|
+
classNames,
|
|
13
|
+
emptyState,
|
|
14
|
+
header,
|
|
15
|
+
className
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ jsxs(
|
|
18
|
+
"aside",
|
|
19
|
+
{
|
|
20
|
+
className: cn(
|
|
21
|
+
"flex min-h-0 flex-col border-b border-border md:w-80 md:shrink-0 md:border-b-0 md:border-r",
|
|
22
|
+
className
|
|
23
|
+
),
|
|
24
|
+
"data-testid": "arbi-dm-list",
|
|
25
|
+
children: [
|
|
26
|
+
header === void 0 ? /* @__PURE__ */ jsxs("div", { className: "border-b border-border px-4 py-3", children: [
|
|
27
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-foreground", children: "Conversations" }),
|
|
28
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
29
|
+
conversations.length,
|
|
30
|
+
" ",
|
|
31
|
+
conversations.length === 1 ? "colleague" : "colleagues"
|
|
32
|
+
] })
|
|
33
|
+
] }) : header,
|
|
34
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: conversations.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-4 py-6 text-xs text-muted-foreground", children: emptyState ?? "No conversations yet." }) : /* @__PURE__ */ jsx("ul", { className: "w-full", children: conversations.map((c, i) => {
|
|
35
|
+
const { peer, lastMessage, unreadCount } = c;
|
|
36
|
+
const rowId = c.id ?? peer.external_id;
|
|
37
|
+
const newSection = c.sectionLabel && c.sectionLabel !== conversations[i - 1]?.sectionLabel;
|
|
38
|
+
const active = rowId === selectedPeerId;
|
|
39
|
+
const preview = lastMessage?.body ?? "No messages yet \u2014 say hello";
|
|
40
|
+
const unread = unreadCount > 0;
|
|
41
|
+
const body = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
42
|
+
c.leading ?? /* @__PURE__ */ jsx(DmAvatar, { user: peer }),
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
44
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
|
|
46
|
+
/* @__PURE__ */ jsx(
|
|
47
|
+
"span",
|
|
48
|
+
{
|
|
49
|
+
className: cn(
|
|
50
|
+
"truncate text-sm text-foreground",
|
|
51
|
+
unread ? "font-bold" : "font-semibold"
|
|
52
|
+
),
|
|
53
|
+
children: c.title ?? userDisplayName(peer)
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
c.badge ?? (isAgentUser(peer) ? /* @__PURE__ */ jsx(AgentBadge, {}) : null)
|
|
57
|
+
] }),
|
|
58
|
+
c.statusLabel ? /* @__PURE__ */ jsx(
|
|
59
|
+
Badge,
|
|
60
|
+
{
|
|
61
|
+
variant: "outline",
|
|
62
|
+
className: "shrink-0 rounded-full px-2 py-0 text-xs font-medium text-muted-foreground",
|
|
63
|
+
children: c.statusLabel
|
|
64
|
+
}
|
|
65
|
+
) : unreadCount > 0 ? (
|
|
66
|
+
// Quiet by default: a filled brand pill with a shadow
|
|
67
|
+
// shouted louder than the message it was counting.
|
|
68
|
+
// Enough to catch the eye scanning the list, no more.
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
Badge,
|
|
71
|
+
{
|
|
72
|
+
variant: "accent",
|
|
73
|
+
className: cn(
|
|
74
|
+
"min-w-[1.125rem] justify-center rounded-full px-1 py-0 text-xs font-medium leading-[1.125rem] shadow-none",
|
|
75
|
+
classNames?.unreadBadge
|
|
76
|
+
),
|
|
77
|
+
children: unreadCount
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
) : null
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-1 flex items-center gap-1.5", children: [
|
|
83
|
+
lastMessage?.isMine ? lastMessage.read ? /* @__PURE__ */ jsx(
|
|
84
|
+
CheckCheck,
|
|
85
|
+
{
|
|
86
|
+
className: "size-3.5 shrink-0 text-ai-accent",
|
|
87
|
+
"aria-label": "Read"
|
|
88
|
+
}
|
|
89
|
+
) : /* @__PURE__ */ jsx(
|
|
90
|
+
Check,
|
|
91
|
+
{
|
|
92
|
+
className: "size-3.5 shrink-0 text-muted-foreground",
|
|
93
|
+
"aria-label": "Sent"
|
|
94
|
+
}
|
|
95
|
+
) : null,
|
|
96
|
+
/* @__PURE__ */ jsx(
|
|
97
|
+
"p",
|
|
98
|
+
{
|
|
99
|
+
className: cn(
|
|
100
|
+
"min-w-0 flex-1 truncate text-xs",
|
|
101
|
+
unread ? "font-medium text-foreground" : "text-muted-foreground"
|
|
102
|
+
),
|
|
103
|
+
children: c.subtitle ?? preview
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: lastMessage ? formatRelativeTime(lastMessage.createdAt) : "" })
|
|
107
|
+
] })
|
|
108
|
+
] })
|
|
109
|
+
] });
|
|
110
|
+
const rowClass = cn(
|
|
111
|
+
// Each row is its own opaque surface. Left transparent it takes
|
|
112
|
+
// the panel's colour, and the chips stop reading as cards at all
|
|
113
|
+
// — which is the whole point of them.
|
|
114
|
+
"flex w-full items-start gap-3 border-b border-border/60 bg-card px-4 py-3 text-left transition-colors",
|
|
115
|
+
c.disabled ? "cursor-default" : active ? "bg-ai-accent-soft" : "hover:bg-accent/40"
|
|
116
|
+
);
|
|
117
|
+
return /* @__PURE__ */ jsxs("li", { children: [
|
|
118
|
+
newSection && /* @__PURE__ */ jsx(
|
|
119
|
+
"p",
|
|
120
|
+
{
|
|
121
|
+
className: "bg-muted/40 px-4 py-1.5 text-xs font-medium uppercase tracking-wide text-muted-foreground",
|
|
122
|
+
"data-testid": "arbi-dm-section",
|
|
123
|
+
children: c.sectionLabel
|
|
124
|
+
}
|
|
125
|
+
),
|
|
126
|
+
c.disabled ? /* @__PURE__ */ jsxs("div", { "data-testid": `arbi-dm-conversation-${rowId}`, className: rowClass, children: [
|
|
127
|
+
body,
|
|
128
|
+
c.trailing
|
|
129
|
+
] }) : /* @__PURE__ */ jsx(
|
|
130
|
+
"button",
|
|
131
|
+
{
|
|
132
|
+
type: "button",
|
|
133
|
+
onClick: () => onSelect(rowId),
|
|
134
|
+
"data-testid": `arbi-dm-conversation-${rowId}`,
|
|
135
|
+
className: rowClass,
|
|
136
|
+
children: body
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
] }, rowId);
|
|
140
|
+
}) }) })
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
ConversationList
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=ConversationList.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/directmessages/ConversationList.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * The left rail: a scrollable list of conversations (1:1 or group), each showing\n * an avatar, name or title, last-message preview, relative time, and an unread pill.\n */\n\nimport { Check, CheckCheck } from 'lucide-react'\nimport { Badge } from '../ui/badge'\nimport { cn } from '../lib/utils'\nimport type { DmClassNames, DmConversation } from './types'\nimport { formatRelativeTime, userDisplayName, isAgentUser } from './utils'\nimport { DmAvatar } from './DmAvatar'\nimport { AgentBadge } from '../entities/AgentMarkers'\n\nexport interface ConversationListProps {\n conversations: DmConversation[]\n /** The selected row's id (`id ?? peer.external_id`). */\n selectedPeerId: string | null\n /** Receives the row's id (`id ?? peer.external_id`). */\n onSelect: (id: string) => void\n classNames?: Pick<DmClassNames, 'unreadBadge'>\n /** Rendered when there are no conversations. */\n emptyState?: React.ReactNode\n /**\n * Replaces the default \"Conversations / N colleagues\" heading \u2014 e.g. with a\n * call to action. Pass `null` for no heading at all.\n */\n header?: React.ReactNode\n /**\n * Overrides the rail's own sizing. The default is a fixed-width column beside\n * a thread; a consumer showing the list on its own needs it to fill instead,\n * and cannot get there by wrapping (a narrower wrapper clips rather than\n * shrinks).\n */\n className?: string\n}\n\nexport function ConversationList({\n conversations,\n selectedPeerId,\n onSelect,\n classNames,\n emptyState,\n header,\n className,\n}: ConversationListProps) {\n return (\n <aside\n className={cn(\n 'flex min-h-0 flex-col border-b border-border md:w-80 md:shrink-0 md:border-b-0 md:border-r',\n className\n )}\n data-testid=\"arbi-dm-list\"\n >\n {header === undefined ? (\n <div className=\"border-b border-border px-4 py-3\">\n <p className=\"text-sm font-semibold text-foreground\">Conversations</p>\n <p className=\"text-xs text-muted-foreground\">\n {conversations.length} {conversations.length === 1 ? 'colleague' : 'colleagues'}\n </p>\n </div>\n ) : (\n header\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {conversations.length === 0 ? (\n <div className=\"px-4 py-6 text-xs text-muted-foreground\">\n {emptyState ?? 'No conversations yet.'}\n </div>\n ) : (\n <ul className=\"w-full\">\n {conversations.map((c, i) => {\n const { peer, lastMessage, unreadCount } = c\n const rowId = c.id ?? peer.external_id\n // The heading renders once, above the first row of its group.\n const newSection =\n c.sectionLabel && c.sectionLabel !== conversations[i - 1]?.sectionLabel\n const active = rowId === selectedPeerId\n const preview = lastMessage?.body ?? 'No messages yet \u2014 say hello'\n // Unread rows carry weight, which is the signal you catch scanning\n // a list \u2014 the count alone is a detail you have to go looking for.\n const unread = unreadCount > 0\n const body = (\n <>\n {c.leading ?? <DmAvatar user={peer} />}\n <div className=\"min-w-0 flex-1\">\n {/* Count sits with the name; the time sits with the message\n it belongs to. They were the other way round, which put\n \"just now\" beside a name it said nothing about. */}\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn(\n 'truncate text-sm text-foreground',\n unread ? 'font-bold' : 'font-semibold'\n )}\n >\n {c.title ?? userDisplayName(peer)}\n </span>\n {/* An agent is marked by default \u2014 a consumer only\n supplies `badge` to say something else. */}\n {c.badge ?? (isAgentUser(peer) ? <AgentBadge /> : null)}\n </span>\n {c.statusLabel ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 rounded-full px-2 py-0 text-xs font-medium text-muted-foreground\"\n >\n {c.statusLabel}\n </Badge>\n ) : unreadCount > 0 ? (\n // Quiet by default: a filled brand pill with a shadow\n // shouted louder than the message it was counting.\n // Enough to catch the eye scanning the list, no more.\n <Badge\n variant=\"accent\"\n className={cn(\n 'min-w-[1.125rem] justify-center rounded-full px-1 py-0 text-xs font-medium leading-[1.125rem] shadow-none',\n classNames?.unreadBadge\n )}\n >\n {unreadCount}\n </Badge>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-1.5\">\n {/* Your own last message is marked with the same tick the\n bubble carries \u2014 one delivered, two read. It says who\n spoke last AND whether it landed, which a \"You:\" prefix\n cannot, and costs no preview width. */}\n {lastMessage?.isMine ? (\n lastMessage.read ? (\n <CheckCheck\n className=\"size-3.5 shrink-0 text-ai-accent\"\n aria-label=\"Read\"\n />\n ) : (\n <Check\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n aria-label=\"Sent\"\n />\n )\n ) : null}\n <p\n className={cn(\n 'min-w-0 flex-1 truncate text-xs',\n unread ? 'font-medium text-foreground' : 'text-muted-foreground'\n )}\n >\n {c.subtitle ?? preview}\n </p>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {lastMessage ? formatRelativeTime(lastMessage.createdAt) : ''}\n </span>\n </div>\n </div>\n </>\n )\n\n // An invitation that nobody has accepted has no thread to open, so\n // it is listed but not offered as something to click.\n const rowClass = cn(\n // Each row is its own opaque surface. Left transparent it takes\n // the panel's colour, and the chips stop reading as cards at all\n // \u2014 which is the whole point of them.\n 'flex w-full items-start gap-3 border-b border-border/60 bg-card px-4 py-3 text-left transition-colors',\n c.disabled ? 'cursor-default' : active ? 'bg-ai-accent-soft' : 'hover:bg-accent/40'\n )\n\n return (\n <li key={rowId}>\n {newSection && (\n <p\n className=\"bg-muted/40 px-4 py-1.5 text-xs font-medium uppercase tracking-wide text-muted-foreground\"\n data-testid=\"arbi-dm-section\"\n >\n {c.sectionLabel}\n </p>\n )}\n {c.disabled ? (\n <div data-testid={`arbi-dm-conversation-${rowId}`} className={rowClass}>\n {body}\n {c.trailing}\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => onSelect(rowId)}\n data-testid={`arbi-dm-conversation-${rowId}`}\n className={rowClass}\n >\n {body}\n </button>\n )}\n </li>\n )\n })}\n </ul>\n )}\n </div>\n </aside>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
function DateSeparator({ children }) {
|
|
3
|
+
return /* @__PURE__ */ jsx("div", { className: "my-3 flex justify-center", "data-testid": "dm-date-separator", children: /* @__PURE__ */ jsx("span", { className: "rounded-full bg-background/80 px-2 py-0.5 text-xs text-muted-foreground", children }) });
|
|
4
|
+
}
|
|
5
|
+
export {
|
|
6
|
+
DateSeparator
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=DateSeparator.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/directmessages/DateSeparator.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * The day divider between message runs in a thread.\n *\n * The label is supplied by the caller rather than formatted here: the ARBI app\n * has a friendly formatter that already says \"Today\" / \"Yesterday\" in the user's\n * locale, and a second date-formatting opinion in the kit would drift from it.\n */\n\nimport type { ReactNode } from 'react'\n\nexport interface DateSeparatorProps {\n children: ReactNode\n}\n\nexport function DateSeparator({ children }: DateSeparatorProps) {\n return (\n <div className=\"my-3 flex justify-center\" data-testid=\"dm-date-separator\">\n <span className=\"rounded-full bg-background/80 px-2 py-0.5 text-xs text-muted-foreground\">\n {children}\n </span>\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAiBM;AAHC,SAAS,cAAc,EAAE,SAAS,GAAuB;AAC9D,SACE,oBAAC,SAAI,WAAU,4BAA2B,eAAY,qBACpD,8BAAC,UAAK,WAAU,2EACb,UACH,GACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { UserEntity } from "../entities/UserEntity.js";
|
|
3
|
+
import { getEntityColorStyles } from "../entities/colors.js";
|
|
4
|
+
import { useArbiWsStore } from "../websocket/store.js";
|
|
5
|
+
import { userDisplayName, userInitials, isAgentUser } from "./utils.js";
|
|
6
|
+
function DmAvatar({ user, className, size = "lg" }) {
|
|
7
|
+
const presence = useArbiWsStore((s) => s.presence[user.external_id]);
|
|
8
|
+
const displayStatus = presence === void 0 ? void 0 : presence === "online" ? "connected" : "disconnected";
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
UserEntity,
|
|
11
|
+
{
|
|
12
|
+
variant: "icon",
|
|
13
|
+
size,
|
|
14
|
+
className,
|
|
15
|
+
interactive: false,
|
|
16
|
+
showTooltip: false,
|
|
17
|
+
initials: userInitials(user),
|
|
18
|
+
displayName: userDisplayName(user),
|
|
19
|
+
picture: user.picture,
|
|
20
|
+
avatarStyle: getEntityColorStyles(user.external_id),
|
|
21
|
+
isAgent: isAgentUser(user),
|
|
22
|
+
displayStatus
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
DmAvatar
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=DmAvatar.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/directmessages/DmAvatar.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * A peer avatar in a DM surface.\n *\n * This used to be its own small avatar that knew nothing about agents or\n * presence, which is why the ARBI app replaced it on every row with a\n * hand-rolled variant of its own. It is now a thin adapter over\n * {@link UserEntity} \u2014 the one presentational person component \u2014 so a DM row, a\n * members table and a document owner all draw a person the same way.\n *\n * The name and props are unchanged: it is exported from the package, and\n * consumers should not have to care that the implementation collapsed.\n */\n\nimport { UserEntity, type PresenceDisplayStatus } from '../entities/UserEntity'\nimport { getEntityColorStyles } from '../entities/colors'\nimport type { EntitySize } from '../entities/EntityPill'\nimport { useArbiWsStore } from '../websocket/store'\nimport type { DmUser } from './types'\nimport { userDisplayName, userInitials, isAgentUser } from './utils'\n\nexport interface DmAvatarProps {\n user: DmUser\n className?: string\n /** Defaults to the 40px row avatar this component has always drawn. */\n size?: EntitySize\n}\n\nexport function DmAvatar({ user, className, size = 'lg' }: DmAvatarProps) {\n // Presence comes from the shared WS store, which stays empty until an app\n // mounts ArbiWebSocketProvider. That is deliberate: with no socket we know\n // nothing about who is online, and `undefined` hides the dot rather than\n // asserting that everyone is offline.\n const presence = useArbiWsStore((s) => s.presence[user.external_id])\n const displayStatus: PresenceDisplayStatus | undefined =\n presence === undefined ? undefined : presence === 'online' ? 'connected' : 'disconnected'\n\n return (\n <UserEntity\n variant=\"icon\"\n size={size}\n className={className}\n interactive={false}\n showTooltip={false}\n initials={userInitials(user)}\n displayName={userDisplayName(user)}\n picture={user.picture}\n // Deterministic tint from the user's id so the fallback is stable + distinct.\n avatarStyle={getEntityColorStyles(user.external_id)}\n isAgent={isAgentUser(user)}\n displayStatus={displayStatus}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "AAqCI;AAxBJ,SAAS,kBAA8C;AACvD,SAAS,4BAA4B;AAErC,SAAS,sBAAsB;AAE/B,SAAS,iBAAiB,cAAc,mBAAmB;AASpD,SAAS,SAAS,EAAE,MAAM,WAAW,OAAO,KAAK,GAAkB;AAKxE,QAAM,WAAW,eAAe,CAAC,MAAM,EAAE,SAAS,KAAK,WAAW,CAAC;AACnE,QAAM,gBACJ,aAAa,SAAY,SAAY,aAAa,WAAW,cAAc;AAE7E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,aAAa;AAAA,MACb,UAAU,aAAa,IAAI;AAAA,MAC3B,aAAa,gBAAgB,IAAI;AAAA,MACjC,SAAS,KAAK;AAAA,MAEd,aAAa,qBAAqB,KAAK,WAAW;AAAA,MAClD,SAAS,YAAY,IAAI;AAAA,MACzB;AAAA;AAAA,EACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|