@arbidocs/react 0.5.110 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
- package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.cjs +13 -13
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.cjs +48 -48
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
- package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
- package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
- package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
- package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
- package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
- package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
- package/dist/chunk-PWGSIM3F.cjs +291 -0
- package/dist/chunk-PWGSIM3F.cjs.map +1 -0
- package/dist/chunk-QP3WQSAA.cjs +23 -0
- package/dist/chunk-QP3WQSAA.cjs.map +1 -0
- package/dist/chunk-T5FZICXN.cjs +50 -0
- package/dist/chunk-T5FZICXN.cjs.map +1 -0
- package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
- package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
- package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +99 -99
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +101 -101
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +1689 -1619
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +702 -17060
- package/dist/index.js.map +7 -1
- package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
- package/dist/lazy-chunk.js +46 -0
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
- package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +167 -154
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +290 -9
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.cjs +17 -0
- package/dist/viewers/PdfViewer.cjs.map +1 -0
- package/dist/viewers/PdfViewer.d.ts +9 -0
- package/dist/viewers/PdfViewer.js +20 -0
- package/dist/viewers/PdfViewer.js.map +7 -0
- package/dist/viewers/PdfViewerImpl.js +384 -0
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.cjs +79 -653
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +3 -1
- package/dist/viewers/index.js +60 -903
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +12 -4
- package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-6H3O63TQ.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-CPQ3CU4B.js +0 -246
- package/dist/chunk-CPQ3CU4B.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DQALOQPI.js +0 -2766
- package/dist/chunk-DQALOQPI.js.map +0 -1
- package/dist/chunk-FZJMA32S.js +0 -1011
- package/dist/chunk-FZJMA32S.js.map +0 -1
- package/dist/chunk-H5M7FXLB.js +0 -2057
- package/dist/chunk-H5M7FXLB.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-P6WLV5UY.js +0 -644
- package/dist/chunk-P6WLV5UY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-BMhTH98a.d.cts +0 -2035
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15893
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -25
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/index.d.cts +0 -260
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { DocumentFetchError, fetchDocumentFile, fetchDocumentPdf } from "./document-pdf.js";
|
|
2
|
+
const PRODUCTIONS_FOLDER = "Productions";
|
|
3
|
+
const extensionOf = (fileName) => {
|
|
4
|
+
const name = (fileName ?? "").toLowerCase();
|
|
5
|
+
const dot = name.lastIndexOf(".");
|
|
6
|
+
return dot < 0 ? "" : name.slice(dot + 1);
|
|
7
|
+
};
|
|
8
|
+
const NO_RENDITION_EXTENSIONS = new Set(
|
|
9
|
+
[
|
|
10
|
+
// images
|
|
11
|
+
"jpg jpeg png gif bmp tiff tif webp heic",
|
|
12
|
+
// video and audio
|
|
13
|
+
"mp4 mpeg mpg webm mov avi mkv mp3 wav m4a aac ogg flac",
|
|
14
|
+
// archives, binaries, design files
|
|
15
|
+
"zip rar 7z tar gz exe bin dmg iso apk msi dll so psd ai sketch"
|
|
16
|
+
].join(" ").split(" ")
|
|
17
|
+
);
|
|
18
|
+
const isPdfDocument = (doc) => /pdf/i.test(doc.file_type ?? "") || extensionOf(doc.file_name) === "pdf";
|
|
19
|
+
const hasNoRendition = (doc) => !isPdfDocument(doc) && NO_RENDITION_EXTENSIONS.has(extensionOf(doc.file_name));
|
|
20
|
+
const productionDocumentName = (doc) => doc.doc_metadata?.title || doc.file_name || doc.external_id;
|
|
21
|
+
const isPdfBytes = (bytes) => bytes.length > 4 && String.fromCharCode(...bytes.subarray(0, 5)) === "%PDF-";
|
|
22
|
+
async function fetchProductionPdf(client, doc) {
|
|
23
|
+
const pdf = isPdfDocument(doc);
|
|
24
|
+
let blob;
|
|
25
|
+
try {
|
|
26
|
+
blob = await (pdf ? fetchDocumentFile : fetchDocumentPdf)(client, doc.external_id);
|
|
27
|
+
} catch (e) {
|
|
28
|
+
if (!pdf && e instanceof DocumentFetchError) return null;
|
|
29
|
+
throw e;
|
|
30
|
+
}
|
|
31
|
+
const bytes = new Uint8Array(await blob.arrayBuffer());
|
|
32
|
+
return pdf || isPdfBytes(bytes) ? bytes : null;
|
|
33
|
+
}
|
|
34
|
+
const safeName = (name) => name.replace(/[\\/:*?"<>|]+/g, "_").trim();
|
|
35
|
+
function productionTitle(firstLabel, lastLabel) {
|
|
36
|
+
return safeName(`Production ${firstLabel}-${lastLabel}`);
|
|
37
|
+
}
|
|
38
|
+
function productionFolder(title, merged) {
|
|
39
|
+
return merged ? PRODUCTIONS_FOLDER : `${PRODUCTIONS_FOLDER}/${title}`;
|
|
40
|
+
}
|
|
41
|
+
function productionFileName(file, title) {
|
|
42
|
+
if (!file.firstLabel) return `${title} index.pdf`;
|
|
43
|
+
return `${file.name.replace(/\.pdf$/i, "")} (${file.firstLabel}-${file.lastLabel}).pdf`;
|
|
44
|
+
}
|
|
45
|
+
const csvCell = (value) => `"${String(value).replace(/"/g, '""')}"`;
|
|
46
|
+
function productionIndexCsv(index) {
|
|
47
|
+
const rows = index.map(
|
|
48
|
+
(e) => [e.documentId, e.name, e.file, e.pages, e.firstLabel, e.lastLabel].map(csvCell).join(",")
|
|
49
|
+
);
|
|
50
|
+
return ["document_id,name,file,pages,first_label,last_label", ...rows].join("\n");
|
|
51
|
+
}
|
|
52
|
+
async function saveProductionFiles(upload, files, folder) {
|
|
53
|
+
const ids = [];
|
|
54
|
+
for (const file of files) {
|
|
55
|
+
const query = {
|
|
56
|
+
derived_from: file.sources.map((doc) => doc.external_id),
|
|
57
|
+
derived_role: "production",
|
|
58
|
+
shared: file.sources.every((doc) => doc.shared),
|
|
59
|
+
folder
|
|
60
|
+
};
|
|
61
|
+
const workspaces = new Set(file.sources.map((doc) => doc.workspace_ext_id).filter(Boolean));
|
|
62
|
+
if (workspaces.size === 1) query.workspace_ext_id = [...workspaces][0];
|
|
63
|
+
const response = await upload({
|
|
64
|
+
file: new File([file.bytes], file.name, { type: "application/pdf" }),
|
|
65
|
+
query
|
|
66
|
+
});
|
|
67
|
+
ids.push(...response?.doc_ext_ids ?? []);
|
|
68
|
+
}
|
|
69
|
+
return ids;
|
|
70
|
+
}
|
|
71
|
+
async function buildProduction(client, documents, choices, options) {
|
|
72
|
+
const byId = new Map(documents.map((doc) => [doc.external_id, doc]));
|
|
73
|
+
const included = [];
|
|
74
|
+
const noRendition = [];
|
|
75
|
+
const items = [];
|
|
76
|
+
for (const doc of choices.order.flatMap((id) => byId.get(id) ?? [])) {
|
|
77
|
+
const bytes = await fetchProductionPdf(client, doc);
|
|
78
|
+
if (!bytes) {
|
|
79
|
+
noRendition.push(doc);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
included.push(doc);
|
|
83
|
+
items.push({
|
|
84
|
+
name: productionDocumentName(doc),
|
|
85
|
+
documentId: doc.external_id,
|
|
86
|
+
bytes,
|
|
87
|
+
qrUrl: options.documentUrl(doc.external_id)
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (items.length === 0) {
|
|
91
|
+
throw new Error("None of these documents has a PDF version to number yet.");
|
|
92
|
+
}
|
|
93
|
+
const { buildBundle } = await import("../annotations/freeze/bundle.js");
|
|
94
|
+
const result = await buildBundle(items, {
|
|
95
|
+
layout: choices.layout,
|
|
96
|
+
bates: {
|
|
97
|
+
prefix: choices.prefix,
|
|
98
|
+
start: choices.start,
|
|
99
|
+
digits: choices.digits,
|
|
100
|
+
corner: choices.corner
|
|
101
|
+
},
|
|
102
|
+
qr: choices.qr,
|
|
103
|
+
// The QR code sits in the bottom corner the label is not in.
|
|
104
|
+
qrCorner: choices.corner.endsWith("left") ? "bottom-right" : "bottom-left",
|
|
105
|
+
indexPage: choices.indexPage,
|
|
106
|
+
author: options.author,
|
|
107
|
+
onProgress: options.onProgress
|
|
108
|
+
});
|
|
109
|
+
const title = productionTitle(
|
|
110
|
+
result.index[0].firstLabel,
|
|
111
|
+
result.index[result.index.length - 1].lastLabel
|
|
112
|
+
);
|
|
113
|
+
const merged = choices.layout === "merged";
|
|
114
|
+
const files = merged ? [{ ...result.files[0], name: `${title}.pdf` }] : result.files;
|
|
115
|
+
const sourceOf = new Map(result.index.map((e) => [e.file, byId.get(e.documentId)]));
|
|
116
|
+
const uploads = files.map((file) => ({
|
|
117
|
+
name: merged ? file.name : productionFileName(file, title),
|
|
118
|
+
bytes: file.bytes,
|
|
119
|
+
// The merged file (and a separate index) is made from every document; each per-document
|
|
120
|
+
// file from its own.
|
|
121
|
+
sources: merged || !sourceOf.has(file.name) ? included : [sourceOf.get(file.name)]
|
|
122
|
+
}));
|
|
123
|
+
return {
|
|
124
|
+
title,
|
|
125
|
+
merged,
|
|
126
|
+
files,
|
|
127
|
+
index: result.index,
|
|
128
|
+
included,
|
|
129
|
+
noRendition,
|
|
130
|
+
uploads,
|
|
131
|
+
folder: productionFolder(title, merged)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export {
|
|
135
|
+
PRODUCTIONS_FOLDER,
|
|
136
|
+
buildProduction,
|
|
137
|
+
fetchProductionPdf,
|
|
138
|
+
hasNoRendition,
|
|
139
|
+
isPdfDocument,
|
|
140
|
+
productionDocumentName,
|
|
141
|
+
productionFileName,
|
|
142
|
+
productionFolder,
|
|
143
|
+
productionIndexCsv,
|
|
144
|
+
productionTitle,
|
|
145
|
+
saveProductionFiles
|
|
146
|
+
};
|
|
147
|
+
//# sourceMappingURL=production.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/document-tools/production.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Production sets: number the selected documents with Bates labels (optionally a QR code back to\n * each document and an index page) and save the result back to the workspace. The dialog is\n * `ProductionSetDialog` in `@arbidocs/blocks/document-tools`; this is its data side.\n *\n * A PDF is numbered as stored (`/download`). Any other document is numbered through its PDF\n * rendition (`/view`, what the viewer shows for a Word or text file); one without a rendition is\n * left out. Saved results are new documents derived from their sources (role `production`) in a\n * Productions folder, shared with the workspace only if every source is. The originals never\n * change.\n *\n * pdf-lib (the numbering) is loaded only when a production is built, so importing this module\n * stays as light as the rest of the document tools.\n */\n\nimport type { components } from '@arbidocs/client'\nimport type { ProductionChoices } from '../annotations/ProductionDialog'\nimport type { BundleFile, BundleIndexEntry, BundleItem } from '../annotations/freeze/bundle'\nimport { DocumentFetchError, fetchDocumentFile, fetchDocumentPdf } from './document-pdf'\nimport type {\n DocumentToolsClient,\n DocumentToolsEnvironment,\n DocumentUploadQuery,\n} from './environment'\n\n/** The fields of a document record (`DocResponse`) a production uses. */\nexport type ProductionSource = Pick<\n components['schemas']['DocResponse'],\n 'external_id' | 'file_name' | 'file_type' | 'shared'\n> & {\n doc_metadata?: { title?: string | null } | null\n /** The document's workspace: the produced files are saved there, named on the upload. */\n workspace_ext_id?: string | null\n}\n\nexport const PRODUCTIONS_FOLDER = 'Productions'\n\nconst extensionOf = (fileName: string | null | undefined) => {\n const name = (fileName ?? '').toLowerCase()\n const dot = name.lastIndexOf('.')\n return dot < 0 ? '' : name.slice(dot + 1)\n}\n\n/** Media, archives and design files: no PDF version to number. */\nconst NO_RENDITION_EXTENSIONS = new Set(\n [\n // images\n 'jpg jpeg png gif bmp tiff tif webp heic',\n // video and audio\n 'mp4 mpeg mpg webm mov avi mkv mp3 wav m4a aac ogg flac',\n // archives, binaries, design files\n 'zip rar 7z tar gz exe bin dmg iso apk msi dll so psd ai sketch',\n ]\n .join(' ')\n .split(' ')\n)\n\nexport const isPdfDocument = (doc: ProductionSource) =>\n /pdf/i.test(doc.file_type ?? '') || extensionOf(doc.file_name) === 'pdf'\n\n/** True for a document with no PDF version to number (media, archives and the like). */\nexport const hasNoRendition = (doc: ProductionSource) =>\n !isPdfDocument(doc) && NO_RENDITION_EXTENSIONS.has(extensionOf(doc.file_name))\n\n/** The name a document goes by in the dialog and the index: its title, else its file name. */\nexport const productionDocumentName = (doc: ProductionSource) =>\n doc.doc_metadata?.title || doc.file_name || doc.external_id\n\nconst isPdfBytes = (bytes: Uint8Array) =>\n bytes.length > 4 && String.fromCharCode(...bytes.subarray(0, 5)) === '%PDF-'\n\n/**\n * The PDF to number for `doc`: the file itself, or the PDF version of anything else. `null` when a\n * non-PDF has no PDF version (yet), so it is left out; a PDF that cannot be downloaded throws.\n */\nexport async function fetchProductionPdf(\n client: DocumentToolsClient,\n doc: ProductionSource\n): Promise<Uint8Array | null> {\n const pdf = isPdfDocument(doc)\n let blob: Blob\n try {\n blob = await (pdf ? fetchDocumentFile : fetchDocumentPdf)(client, doc.external_id)\n } catch (e) {\n if (!pdf && e instanceof DocumentFetchError) return null\n throw e\n }\n const bytes = new Uint8Array(await blob.arrayBuffer())\n return pdf || isPdfBytes(bytes) ? bytes : null\n}\n\nconst safeName = (name: string) => name.replace(/[\\\\/:*?\"<>|]+/g, '_').trim()\n\n/** \"Production ACME-000001-ACME-000042\": names the files and folder of one production. */\nexport function productionTitle(firstLabel: string, lastLabel: string): string {\n return safeName(`Production ${firstLabel}-${lastLabel}`)\n}\n\n/** Where a production is saved: the Productions folder, or a folder of its own per document. */\nexport function productionFolder(title: string, merged: boolean): string {\n return merged ? PRODUCTIONS_FOLDER : `${PRODUCTIONS_FOLDER}/${title}`\n}\n\n/** In the workspace a per-document file says which range it holds, beside its original. */\nexport function productionFileName(file: BundleFile, title: string): string {\n if (!file.firstLabel) return `${title} index.pdf`\n return `${file.name.replace(/\\.pdf$/i, '')} (${file.firstLabel}-${file.lastLabel}).pdf`\n}\n\nconst csvCell = (value: string | number) => `\"${String(value).replace(/\"/g, '\"\"')}\"`\n\n/** The `index.csv` of a per-document production: every document with its file and range. */\nexport function productionIndexCsv(index: readonly BundleIndexEntry[]): string {\n const rows = index.map((e) =>\n [e.documentId, e.name, e.file, e.pages, e.firstLabel, e.lastLabel].map(csvCell).join(',')\n )\n return ['document_id,name,file,pages,first_label,last_label', ...rows].join('\\n')\n}\n\nexport interface ProductionUpload {\n name: string\n bytes: Uint8Array\n /** The documents this file was made from. */\n sources: ProductionSource[]\n}\n\n/** Save each file as a new workspace document derived from its sources; returns the new ids. */\nexport async function saveProductionFiles(\n upload: NonNullable<DocumentToolsEnvironment['uploadDocument']>,\n files: readonly ProductionUpload[],\n folder: string\n): Promise<string[]> {\n const ids: string[] = []\n for (const file of files) {\n const query: DocumentUploadQuery = {\n derived_from: file.sources.map((doc) => doc.external_id),\n derived_role: 'production',\n shared: file.sources.every((doc) => doc.shared),\n folder,\n }\n // Saved in the sources' workspace, named on the upload (never whichever one is open now).\n const workspaces = new Set(file.sources.map((doc) => doc.workspace_ext_id).filter(Boolean))\n if (workspaces.size === 1) query.workspace_ext_id = [...workspaces][0]\n const response = await upload({\n file: new File([file.bytes as BlobPart], file.name, { type: 'application/pdf' }),\n query,\n })\n ids.push(...(response?.doc_ext_ids ?? []))\n }\n return ids\n}\n\nexport interface BuildProductionOptions {\n /** The link a document's QR code opens (the document in the host app). */\n documentUrl: (documentId: string) => string\n /** Who produced the set; recorded in a merged file's metadata. */\n author?: string\n onProgress?: (done: number, total: number) => void\n}\n\nexport interface BuiltProduction {\n title: string\n merged: boolean\n /** The numbered files: one merged PDF (named after its range), or one per document (+ index). */\n files: BundleFile[]\n index: BundleIndexEntry[]\n /** The documents numbered, in order. */\n included: ProductionSource[]\n /** Documents left out because they have no PDF version yet. */\n noRendition: ProductionSource[]\n /** The files as they are saved to the workspace, each with the documents it was made from. */\n uploads: ProductionUpload[]\n folder: string\n}\n\n/**\n * Fetch each document's PDF (in `choices.order`) and number the set. Throws when none of the\n * documents has a PDF version, or when a PDF cannot be fetched.\n */\nexport async function buildProduction(\n client: DocumentToolsClient,\n documents: readonly ProductionSource[],\n choices: ProductionChoices,\n options: BuildProductionOptions\n): Promise<BuiltProduction> {\n const byId = new Map(documents.map((doc) => [doc.external_id, doc]))\n const included: ProductionSource[] = []\n const noRendition: ProductionSource[] = []\n const items: BundleItem[] = []\n for (const doc of choices.order.flatMap((id) => byId.get(id) ?? [])) {\n const bytes = await fetchProductionPdf(client, doc)\n if (!bytes) {\n noRendition.push(doc)\n continue\n }\n included.push(doc)\n items.push({\n name: productionDocumentName(doc),\n documentId: doc.external_id,\n bytes,\n qrUrl: options.documentUrl(doc.external_id),\n })\n }\n if (items.length === 0) {\n throw new Error('None of these documents has a PDF version to number yet.')\n }\n\n const { buildBundle } = await import('../annotations/freeze/bundle')\n const result = await buildBundle(items, {\n layout: choices.layout,\n bates: {\n prefix: choices.prefix,\n start: choices.start,\n digits: choices.digits,\n corner: choices.corner,\n },\n qr: choices.qr,\n // The QR code sits in the bottom corner the label is not in.\n qrCorner: choices.corner.endsWith('left') ? 'bottom-right' : 'bottom-left',\n indexPage: choices.indexPage,\n author: options.author,\n onProgress: options.onProgress,\n })\n\n const title = productionTitle(\n result.index[0].firstLabel,\n result.index[result.index.length - 1].lastLabel\n )\n const merged = choices.layout === 'merged'\n // A merged file is named after its range; per-document files keep their document names.\n const files = merged ? [{ ...result.files[0], name: `${title}.pdf` }] : result.files\n const sourceOf = new Map(result.index.map((e) => [e.file, byId.get(e.documentId)!]))\n const uploads = files.map((file) => ({\n name: merged ? file.name : productionFileName(file, title),\n bytes: file.bytes,\n // The merged file (and a separate index) is made from every document; each per-document\n // file from its own.\n sources: merged || !sourceOf.has(file.name) ? included : [sourceOf.get(file.name)!],\n }))\n return {\n title,\n merged,\n files,\n index: result.index,\n included,\n noRendition,\n uploads,\n folder: productionFolder(title, merged),\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getUserEncryptionKeypair,
|
|
3
|
+
initSodium,
|
|
4
|
+
sealedBoxDecrypt,
|
|
5
|
+
sealedBoxEncrypt
|
|
6
|
+
} from "@arbidocs/client";
|
|
7
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
8
|
+
import { useDocumentTools } from "./environment.js";
|
|
9
|
+
import { arbiQueryKeys } from "../query-keys.js";
|
|
10
|
+
const INFORMAL_SIGNATURE_NOTE = "Your saved signature or initials are placed as an image on the document.";
|
|
11
|
+
async function keypair(source = getUserEncryptionKeypair) {
|
|
12
|
+
await initSodium();
|
|
13
|
+
const pair = await source();
|
|
14
|
+
if (!pair) throw new Error("Sign in again to use your saved signature.");
|
|
15
|
+
return pair;
|
|
16
|
+
}
|
|
17
|
+
function detail(error, fallback) {
|
|
18
|
+
const d = error?.detail;
|
|
19
|
+
return typeof d === "string" ? d : fallback;
|
|
20
|
+
}
|
|
21
|
+
async function fetchSavedSignature(client, source) {
|
|
22
|
+
const { data, error } = await client.GET("/v1/user/signature");
|
|
23
|
+
if (!data) throw new Error(detail(error, "Your saved signature could not be read"));
|
|
24
|
+
if (!data.sealed) return null;
|
|
25
|
+
const pair = await keypair(source);
|
|
26
|
+
const json = new TextDecoder().decode(sealedBoxDecrypt(data.sealed, pair.secretKey));
|
|
27
|
+
return JSON.parse(json);
|
|
28
|
+
}
|
|
29
|
+
async function storeSavedSignature(client, signature, source) {
|
|
30
|
+
const pair = await keypair(source);
|
|
31
|
+
const sealed = sealedBoxEncrypt(
|
|
32
|
+
Uint8Array.from(new TextEncoder().encode(JSON.stringify(signature))),
|
|
33
|
+
pair.publicKey
|
|
34
|
+
);
|
|
35
|
+
const { error, response } = await client.PUT("/v1/user/signature", { body: { sealed } });
|
|
36
|
+
if (!response.ok) throw new Error(detail(error, "Your signature could not be saved"));
|
|
37
|
+
}
|
|
38
|
+
async function deleteSavedSignature(client) {
|
|
39
|
+
const { error, response } = await client.DELETE("/v1/user/signature");
|
|
40
|
+
if (!response.ok) throw new Error(detail(error, "Your saved signature could not be deleted"));
|
|
41
|
+
}
|
|
42
|
+
function useSavedSignature(enabled = true) {
|
|
43
|
+
const { client } = useDocumentTools();
|
|
44
|
+
return useQuery({
|
|
45
|
+
queryKey: arbiQueryKeys.savedSignature(),
|
|
46
|
+
queryFn: () => fetchSavedSignature(client),
|
|
47
|
+
enabled,
|
|
48
|
+
staleTime: 6e4,
|
|
49
|
+
retry: false
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function useStoreSavedSignature() {
|
|
53
|
+
const { client } = useDocumentTools();
|
|
54
|
+
const queryClient = useQueryClient();
|
|
55
|
+
return useMutation({
|
|
56
|
+
mutationFn: (signature) => storeSavedSignature(client, signature),
|
|
57
|
+
onSuccess: (_, signature) => queryClient.setQueryData(arbiQueryKeys.savedSignature(), signature)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function useDeleteSavedSignature() {
|
|
61
|
+
const { client } = useDocumentTools();
|
|
62
|
+
const queryClient = useQueryClient();
|
|
63
|
+
return useMutation({
|
|
64
|
+
mutationFn: () => deleteSavedSignature(client),
|
|
65
|
+
onSuccess: () => queryClient.setQueryData(arbiQueryKeys.savedSignature(), null)
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function pngBytes(base64) {
|
|
69
|
+
const raw = atob(base64);
|
|
70
|
+
const out = new Uint8Array(raw.length);
|
|
71
|
+
for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i);
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function pngSize(base64) {
|
|
75
|
+
const bytes = pngBytes(base64.slice(0, 64));
|
|
76
|
+
const view = new DataView(bytes.buffer);
|
|
77
|
+
return { width: view.getUint32(16), height: view.getUint32(20) };
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
INFORMAL_SIGNATURE_NOTE,
|
|
81
|
+
deleteSavedSignature,
|
|
82
|
+
fetchSavedSignature,
|
|
83
|
+
pngBytes,
|
|
84
|
+
pngSize,
|
|
85
|
+
storeSavedSignature,
|
|
86
|
+
useDeleteSavedSignature,
|
|
87
|
+
useSavedSignature,
|
|
88
|
+
useStoreSavedSignature
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=saved-signature.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/document-tools/saved-signature.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * A signature saved to one's account, for informal use: inserted into a Word document as a picture,\n * or placed on a PDF as a stamp, and offered again the next time one adopts a signature to sign.\n *\n * It is sealed HERE, in the browser, to the user's own X25519 key (a SealedBox to the public half of\n * the keypair their signing key derives): the server keeps the sealed bytes (`/v1/user/signature`)\n * and can never read them. Only with the user's explicit consent (\"Save to my account for future\n * use\"); Delete removes it from the account completely. A typed mark is saved as its picture too,\n * so every use has an image to place.\n */\n\nimport {\n getUserEncryptionKeypair,\n initSodium,\n sealedBoxDecrypt,\n sealedBoxEncrypt,\n type KeyPair,\n} from '@arbidocs/client'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { arbiQueryKeys } from '../query-keys'\n\nexport interface SavedSignature {\n name: string\n initials: string\n /** How the signature was adopted (a typed one is saved as its picture as well). */\n style: 'typed' | 'drawn' | 'uploaded'\n initials_style: 'typed' | 'drawn'\n /** Base64 PNGs, transparent around the ink. */\n signature_png: string\n initials_png: string\n}\n\n/** The one line shown wherever a saved signature is placed by hand. */\nexport const INFORMAL_SIGNATURE_NOTE =\n 'Your saved signature or initials are placed as an image on the document.'\n\n/** The user's own keypair (the session's); a host or a test may pass another. */\nexport type KeypairSource = () => Promise<KeyPair | null>\n\nasync function keypair(source: KeypairSource = getUserEncryptionKeypair): Promise<KeyPair> {\n await initSodium()\n const pair = await source()\n if (!pair) throw new Error('Sign in again to use your saved signature.')\n return pair\n}\n\nfunction detail(error: unknown, fallback: string): string {\n const d = (error as { detail?: unknown } | undefined)?.detail\n return typeof d === 'string' ? d : fallback\n}\n\n/** The saved signature, opened with the user's own key; null when none is saved. */\nexport async function fetchSavedSignature(\n client: DocumentToolsClient,\n source?: KeypairSource\n): Promise<SavedSignature | null> {\n const { data, error } = await client.GET('/v1/user/signature')\n if (!data) throw new Error(detail(error, 'Your saved signature could not be read'))\n if (!data.sealed) return null\n const pair = await keypair(source)\n const json = new TextDecoder().decode(sealedBoxDecrypt(data.sealed, pair.secretKey))\n return JSON.parse(json) as SavedSignature\n}\n\n/** Seal it to the user's own key and save it (replacing any saved before). */\nexport async function storeSavedSignature(\n client: DocumentToolsClient,\n signature: SavedSignature,\n source?: KeypairSource\n): Promise<void> {\n const pair = await keypair(source)\n const sealed = sealedBoxEncrypt(\n Uint8Array.from(new TextEncoder().encode(JSON.stringify(signature))),\n pair.publicKey\n )\n const { error, response } = await client.PUT('/v1/user/signature', { body: { sealed } })\n if (!response.ok) throw new Error(detail(error, 'Your signature could not be saved'))\n}\n\n/** Remove it from the account completely. */\nexport async function deleteSavedSignature(client: DocumentToolsClient): Promise<void> {\n const { error, response } = await client.DELETE('/v1/user/signature')\n if (!response.ok) throw new Error(detail(error, 'Your saved signature could not be deleted'))\n}\n\nexport function useSavedSignature(enabled = true) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.savedSignature(),\n queryFn: () => fetchSavedSignature(client),\n enabled,\n staleTime: 60_000,\n retry: false,\n })\n}\n\nexport function useStoreSavedSignature() {\n const { client } = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (signature: SavedSignature) => storeSavedSignature(client, signature),\n onSuccess: (_, signature) =>\n queryClient.setQueryData(arbiQueryKeys.savedSignature(), signature),\n })\n}\n\nexport function useDeleteSavedSignature() {\n const { client } = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: () => deleteSavedSignature(client),\n onSuccess: () => queryClient.setQueryData(arbiQueryKeys.savedSignature(), null),\n })\n}\n\n/** Base64 PNG bytes, decoded (for an inline picture or an upload). */\nexport function pngBytes(base64: string): Uint8Array {\n const raw = atob(base64)\n const out = new Uint8Array(raw.length)\n for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i)\n return out\n}\n\n/** A PNG's pixel size, read from its header (IHDR). */\nexport function pngSize(base64: string): { width: number; height: number } {\n const bytes = pngBytes(base64.slice(0, 64))\n const view = new DataView(bytes.buffer)\n return { width: view.getUint32(16), height: view.getUint32(20) }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { signMessage, unlockIdentityWithPassword } from "@arbidocs/client";
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { workspaces } from "@arbidocs/sdk/browser";
|
|
4
|
+
import { useDocumentTools } from "./environment.js";
|
|
5
|
+
import { intentText, sha256Hex, SigningError } from "./signing.js";
|
|
6
|
+
import { arbiQueryKeys } from "../query-keys.js";
|
|
7
|
+
import { useArbiHost } from "../host/config.js";
|
|
8
|
+
function useOpenWorkspaceRead() {
|
|
9
|
+
const arbi = useArbiHost().arbi;
|
|
10
|
+
const workspaceId = arbi?.hasWorkspace ? arbi.getWorkspaceId() : void 0;
|
|
11
|
+
const read = (run) => arbi && workspaceId ? arbi.readInWorkspace(workspaceId, run) : run();
|
|
12
|
+
return { workspaceId, read };
|
|
13
|
+
}
|
|
14
|
+
const SIGNATURE_FIELD_TYPES = [
|
|
15
|
+
"signature",
|
|
16
|
+
"initials",
|
|
17
|
+
"date",
|
|
18
|
+
"name"
|
|
19
|
+
];
|
|
20
|
+
const FIELD_TYPE_LABELS = {
|
|
21
|
+
signature: "Signature",
|
|
22
|
+
initials: "Initials",
|
|
23
|
+
date: "Date signed",
|
|
24
|
+
name: "Name"
|
|
25
|
+
};
|
|
26
|
+
const DEFAULT_FIELD_SIZE = {
|
|
27
|
+
signature: { width: 0.28, height: 0.05 },
|
|
28
|
+
initials: { width: 0.1, height: 0.04 },
|
|
29
|
+
date: { width: 0.22, height: 0.028 },
|
|
30
|
+
name: { width: 0.28, height: 0.028 }
|
|
31
|
+
};
|
|
32
|
+
const SIGNER_PROGRESS_LABELS = {
|
|
33
|
+
invited: "Invited",
|
|
34
|
+
registered: "Not opened yet",
|
|
35
|
+
viewed: "Viewed",
|
|
36
|
+
signed: "Signed",
|
|
37
|
+
declined: "Declined"
|
|
38
|
+
};
|
|
39
|
+
const EMAIL = /^[^@\s<>,;]{1,64}@[^@\s<>,;]{1,255}\.[^@\s<>,;]{1,63}$/;
|
|
40
|
+
const isEmailSigner = (signer) => EMAIL.test(signer.trim());
|
|
41
|
+
const MARK_FIELD_TYPES = ["signature", "initials"];
|
|
42
|
+
function detail(error, fallback) {
|
|
43
|
+
const d = error?.detail;
|
|
44
|
+
if (typeof d === "string") return d;
|
|
45
|
+
if (Array.isArray(d) && d[0] && typeof d[0] === "object" && "msg" in d[0]) {
|
|
46
|
+
return String(d[0].msg);
|
|
47
|
+
}
|
|
48
|
+
return fallback;
|
|
49
|
+
}
|
|
50
|
+
function newFieldId() {
|
|
51
|
+
return `f${Math.random().toString(36).slice(2, 10)}`;
|
|
52
|
+
}
|
|
53
|
+
function initialsOf(name) {
|
|
54
|
+
return name.split(/\s+/).filter(Boolean).map((part) => part[0].toUpperCase()).join("").slice(0, 4);
|
|
55
|
+
}
|
|
56
|
+
function fieldsInSigningOrder(fields, signer) {
|
|
57
|
+
return fields.filter((f) => f.signer === signer).sort((a, b) => a.page - b.page || a.y - b.y || a.x - b.x);
|
|
58
|
+
}
|
|
59
|
+
function sendBlocker(fields) {
|
|
60
|
+
if (fields.length === 0) return "Place at least one field.";
|
|
61
|
+
const signers = [...new Set(fields.map((f) => f.signer))];
|
|
62
|
+
for (const signer of signers) {
|
|
63
|
+
if (!fields.some((f) => f.signer === signer && MARK_FIELD_TYPES.includes(f.type))) {
|
|
64
|
+
return "Every signer needs a signature or initials field.";
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
function fieldsFromSuggestions(suggestions, assign, members = /* @__PURE__ */ new Map()) {
|
|
70
|
+
return suggestions.flatMap((s) => {
|
|
71
|
+
const email = s.signer_email?.toLowerCase();
|
|
72
|
+
const signer = email ? members.get(email) ?? email : assign[s.group];
|
|
73
|
+
if (!signer) return [];
|
|
74
|
+
return [
|
|
75
|
+
{
|
|
76
|
+
id: newFieldId(),
|
|
77
|
+
type: s.type,
|
|
78
|
+
page: s.page,
|
|
79
|
+
x: s.x,
|
|
80
|
+
y: s.y,
|
|
81
|
+
width: s.width,
|
|
82
|
+
height: s.height,
|
|
83
|
+
signer,
|
|
84
|
+
required: s.required ?? true
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function splitSuggestions(suggestions) {
|
|
90
|
+
return {
|
|
91
|
+
placed: suggestions.filter((s) => s.source === "anchor"),
|
|
92
|
+
extras: suggestions.filter((s) => s.source !== "anchor")
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async function fetchDocumentSignatureRequests(client, documentId) {
|
|
96
|
+
const { data, error } = await client.GET("/v1/document/{document_ext_id}/signature-requests", {
|
|
97
|
+
params: { path: { document_ext_id: documentId } }
|
|
98
|
+
});
|
|
99
|
+
if (!data) throw new Error(detail(error, "The signature requests could not be read"));
|
|
100
|
+
return data;
|
|
101
|
+
}
|
|
102
|
+
function useDocumentSignatureRequests(documentId, enabled = true) {
|
|
103
|
+
const { client } = useDocumentTools();
|
|
104
|
+
return useQuery({
|
|
105
|
+
queryKey: arbiQueryKeys.signatureRequestsForDocument(documentId ?? ""),
|
|
106
|
+
queryFn: () => fetchDocumentSignatureRequests(client, documentId),
|
|
107
|
+
enabled: enabled && !!documentId,
|
|
108
|
+
staleTime: 15e3
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async function signatureFieldSuggestions(client, documentId, version) {
|
|
112
|
+
const { data, error } = await client.GET(
|
|
113
|
+
"/v1/document/{document_ext_id}/signature-fields/suggest",
|
|
114
|
+
{
|
|
115
|
+
params: { path: { document_ext_id: documentId }, ...version ? { query: { version } } : {} }
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
if (!data) throw new Error(detail(error, "Signature blocks could not be read"));
|
|
119
|
+
return { fields: data.fields, signers: data.signers ?? [] };
|
|
120
|
+
}
|
|
121
|
+
async function suggestSignatureFields(client, documentId, version) {
|
|
122
|
+
return (await signatureFieldSuggestions(client, documentId, version)).fields;
|
|
123
|
+
}
|
|
124
|
+
async function saveSignatureRequest(client, { documentId, version, fields, message, requestId, send }) {
|
|
125
|
+
if (!requestId) {
|
|
126
|
+
const { data, error } = await client.POST("/v1/document/{document_ext_id}/signature-requests", {
|
|
127
|
+
params: { path: { document_ext_id: documentId } },
|
|
128
|
+
body: { fields, message: message || null, send, ...version ? { version } : {} }
|
|
129
|
+
});
|
|
130
|
+
if (!data) throw new Error(detail(error, "The signature request could not be saved"));
|
|
131
|
+
return data;
|
|
132
|
+
}
|
|
133
|
+
const path = { request_ext_id: requestId };
|
|
134
|
+
const updated = await client.PATCH("/v1/signature-requests/{request_ext_id}", {
|
|
135
|
+
params: { path },
|
|
136
|
+
body: { fields, message: message ?? null }
|
|
137
|
+
});
|
|
138
|
+
if (!updated.data) throw new Error(detail(updated.error, "The draft could not be saved"));
|
|
139
|
+
if (!send) return updated.data;
|
|
140
|
+
const sent = await client.POST("/v1/signature-requests/{request_ext_id}/send", {
|
|
141
|
+
params: { path }
|
|
142
|
+
});
|
|
143
|
+
if (!sent.data) throw new Error(detail(sent.error, "The request could not be sent"));
|
|
144
|
+
return sent.data;
|
|
145
|
+
}
|
|
146
|
+
function useInvalidateRequests() {
|
|
147
|
+
const queryClient = useQueryClient();
|
|
148
|
+
return () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.signatureRequests() });
|
|
149
|
+
}
|
|
150
|
+
function useSaveSignatureRequest() {
|
|
151
|
+
const { client } = useDocumentTools();
|
|
152
|
+
const invalidate = useInvalidateRequests();
|
|
153
|
+
return useMutation({
|
|
154
|
+
mutationFn: (vars) => saveSignatureRequest(client, vars),
|
|
155
|
+
onSuccess: invalidate
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function useVoidSignatureRequest() {
|
|
159
|
+
const { client } = useDocumentTools();
|
|
160
|
+
const invalidate = useInvalidateRequests();
|
|
161
|
+
return useMutation({
|
|
162
|
+
mutationFn: async (requestId) => {
|
|
163
|
+
const { data, error } = await client.POST("/v1/signature-requests/{request_ext_id}/void", {
|
|
164
|
+
params: { path: { request_ext_id: requestId } }
|
|
165
|
+
});
|
|
166
|
+
if (!data) throw new Error(detail(error, "The request could not be voided"));
|
|
167
|
+
return data;
|
|
168
|
+
},
|
|
169
|
+
onSuccess: invalidate
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function useDeclineSignatureRequest() {
|
|
173
|
+
const { client } = useDocumentTools();
|
|
174
|
+
const invalidate = useInvalidateRequests();
|
|
175
|
+
return useMutation({
|
|
176
|
+
mutationFn: async ({ requestId, reason }) => {
|
|
177
|
+
const { data, error } = await client.POST("/v1/signature-requests/{request_ext_id}/decline", {
|
|
178
|
+
params: { path: { request_ext_id: requestId } },
|
|
179
|
+
body: { reason: reason || null }
|
|
180
|
+
});
|
|
181
|
+
if (!data) throw new Error(detail(error, "Could not decline"));
|
|
182
|
+
return data;
|
|
183
|
+
},
|
|
184
|
+
onSuccess: invalidate
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async function signSignatureRequest(client, deploymentDomain, { request, pdfBlob, email, password, adopted, fields }) {
|
|
188
|
+
const path = { request_ext_id: request.external_id };
|
|
189
|
+
const body = { adopted, fields };
|
|
190
|
+
const prepared = await client.POST("/v1/signature-requests/{request_ext_id}/sign/prepare", {
|
|
191
|
+
params: { path },
|
|
192
|
+
body
|
|
193
|
+
});
|
|
194
|
+
if (!prepared.data) {
|
|
195
|
+
throw new SigningError(detail(prepared.error, "Could not prepare signing"), "failed");
|
|
196
|
+
}
|
|
197
|
+
const { statement, intent, source_sha256, timestamp } = prepared.data;
|
|
198
|
+
if (source_sha256 !== request.source_sha256 || await sha256Hex(pdfBlob) !== source_sha256) {
|
|
199
|
+
throw new SigningError("The document changed since it was sent. Ask for it again.", "stale");
|
|
200
|
+
}
|
|
201
|
+
if (intent !== intentText({ name: adopted.name })) {
|
|
202
|
+
throw new Error("Signing statement mismatch; not signed.");
|
|
203
|
+
}
|
|
204
|
+
const identity = await unlockIdentityWithPassword(email, password, deploymentDomain);
|
|
205
|
+
const signed = await client.POST("/v1/signature-requests/{request_ext_id}/sign", {
|
|
206
|
+
params: { path },
|
|
207
|
+
body: { ...body, timestamp, signature: signMessage(statement, identity) }
|
|
208
|
+
});
|
|
209
|
+
if (!signed.data) throw new SigningError(detail(signed.error, "Signing failed"), "failed");
|
|
210
|
+
return signed.data;
|
|
211
|
+
}
|
|
212
|
+
function useSignSignatureRequest() {
|
|
213
|
+
const env = useDocumentTools();
|
|
214
|
+
const invalidate = useInvalidateRequests();
|
|
215
|
+
const queryClient = useQueryClient();
|
|
216
|
+
return useMutation({
|
|
217
|
+
mutationFn: (vars) => {
|
|
218
|
+
if (!env.deploymentDomain) throw new Error("Signing is not set up: no deployment domain");
|
|
219
|
+
return signSignatureRequest(env.client, env.deploymentDomain, vars);
|
|
220
|
+
},
|
|
221
|
+
onSuccess: async (result) => {
|
|
222
|
+
await invalidate();
|
|
223
|
+
if (result.completed && result.request.doc_ext_id) {
|
|
224
|
+
await env.onDocumentsChanged?.([result.request.doc_ext_id], "signed");
|
|
225
|
+
await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documentSignatures() });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
function useSignerCandidates(enabled = true) {
|
|
231
|
+
const { client, user } = useDocumentTools();
|
|
232
|
+
const { workspaceId, read } = useOpenWorkspaceRead();
|
|
233
|
+
return useQuery({
|
|
234
|
+
queryKey: arbiQueryKeys.signatureCandidates(workspaceId ?? ""),
|
|
235
|
+
queryFn: async () => {
|
|
236
|
+
const { data, error } = await read(() => client.GET("/v1/workspace/users"));
|
|
237
|
+
if (!data) throw new Error(detail(error, "The workspace members could not be read"));
|
|
238
|
+
const people = data.filter((m) => m.user.external_id.startsWith("usr-")).map((m) => ({
|
|
239
|
+
externalId: m.user.external_id,
|
|
240
|
+
name: [m.user.given_name, m.user.family_name].filter(Boolean).join(" ") || m.user.email,
|
|
241
|
+
email: m.user.email,
|
|
242
|
+
role: String(m.role)
|
|
243
|
+
}));
|
|
244
|
+
const me = user?.email?.toLowerCase();
|
|
245
|
+
return [...people].sort(
|
|
246
|
+
(a, b) => Number(b.email.toLowerCase() === me) - Number(a.email.toLowerCase() === me)
|
|
247
|
+
);
|
|
248
|
+
},
|
|
249
|
+
enabled,
|
|
250
|
+
staleTime: 6e4
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
async function inviteSigners(client, documentId, emails) {
|
|
254
|
+
if (!emails.length) return;
|
|
255
|
+
const { error, response } = await client.POST("/v1/workspace/users", {
|
|
256
|
+
body: workspaces.addWorkspaceMembersBody({
|
|
257
|
+
emails,
|
|
258
|
+
role: "guest",
|
|
259
|
+
confirm_invite: true,
|
|
260
|
+
resource_type: "document",
|
|
261
|
+
resource_ext_id: documentId
|
|
262
|
+
})
|
|
263
|
+
});
|
|
264
|
+
if (response.status === 409) {
|
|
265
|
+
throw new Error("Share the document with the workspace before asking others to sign it.");
|
|
266
|
+
}
|
|
267
|
+
if (error && response.status !== 404) {
|
|
268
|
+
throw new Error(detail(error, "The signers could not be invited"));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function useInviteSigners() {
|
|
272
|
+
const { client } = useDocumentTools();
|
|
273
|
+
const invalidate = useInvalidateRequests();
|
|
274
|
+
const queryClient = useQueryClient();
|
|
275
|
+
return useMutation({
|
|
276
|
+
mutationFn: ({ documentId, emails }) => inviteSigners(client, documentId, emails),
|
|
277
|
+
onSuccess: async () => {
|
|
278
|
+
await invalidate();
|
|
279
|
+
await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.signatureCandidates() });
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
export {
|
|
284
|
+
DEFAULT_FIELD_SIZE,
|
|
285
|
+
FIELD_TYPE_LABELS,
|
|
286
|
+
MARK_FIELD_TYPES,
|
|
287
|
+
SIGNATURE_FIELD_TYPES,
|
|
288
|
+
SIGNER_PROGRESS_LABELS,
|
|
289
|
+
fetchDocumentSignatureRequests,
|
|
290
|
+
fieldsFromSuggestions,
|
|
291
|
+
fieldsInSigningOrder,
|
|
292
|
+
initialsOf,
|
|
293
|
+
inviteSigners,
|
|
294
|
+
isEmailSigner,
|
|
295
|
+
newFieldId,
|
|
296
|
+
saveSignatureRequest,
|
|
297
|
+
sendBlocker,
|
|
298
|
+
signSignatureRequest,
|
|
299
|
+
signatureFieldSuggestions,
|
|
300
|
+
splitSuggestions,
|
|
301
|
+
suggestSignatureFields,
|
|
302
|
+
useDeclineSignatureRequest,
|
|
303
|
+
useDocumentSignatureRequests,
|
|
304
|
+
useInviteSigners,
|
|
305
|
+
useSaveSignatureRequest,
|
|
306
|
+
useSignSignatureRequest,
|
|
307
|
+
useSignerCandidates,
|
|
308
|
+
useVoidSignatureRequest
|
|
309
|
+
};
|
|
310
|
+
//# sourceMappingURL=signature-requests.js.map
|