@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.
Files changed (1011) hide show
  1. package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
  2. package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
  3. package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
  4. package/dist/account/client.js +96 -0
  5. package/dist/account/client.js.map +7 -0
  6. package/dist/account/delete.js +70 -0
  7. package/dist/account/delete.js.map +7 -0
  8. package/dist/account/didit.js +34 -0
  9. package/dist/account/didit.js.map +7 -0
  10. package/dist/account/dismissed-tips.js +33 -0
  11. package/dist/account/dismissed-tips.js.map +7 -0
  12. package/dist/account/email.js +84 -0
  13. package/dist/account/email.js.map +7 -0
  14. package/dist/account/entitlements.js +47 -0
  15. package/dist/account/entitlements.js.map +7 -0
  16. package/dist/account/identity.js +270 -0
  17. package/dist/account/identity.js.map +7 -0
  18. package/dist/account/index.js +93 -0
  19. package/dist/account/index.js.map +7 -0
  20. package/dist/account/notifications.js +59 -0
  21. package/dist/account/notifications.js.map +7 -0
  22. package/dist/account/password.js +103 -0
  23. package/dist/account/password.js.map +7 -0
  24. package/dist/account/profile.js +116 -0
  25. package/dist/account/profile.js.map +7 -0
  26. package/dist/account/recovery.js +13 -0
  27. package/dist/account/recovery.js.map +7 -0
  28. package/dist/account/relevance.js +82 -0
  29. package/dist/account/relevance.js.map +7 -0
  30. package/dist/account/sessions.js +37 -0
  31. package/dist/account/sessions.js.map +7 -0
  32. package/dist/account/settings.js +39 -0
  33. package/dist/account/settings.js.map +7 -0
  34. package/dist/account/table-views.js +16 -0
  35. package/dist/account/table-views.js.map +7 -0
  36. package/dist/ai/AiAnswer.js +83 -0
  37. package/dist/ai/AiAnswer.js.map +7 -0
  38. package/dist/ai/AiMarkdown.js +40 -0
  39. package/dist/ai/AiMarkdown.js.map +7 -0
  40. package/dist/ai/ArtifactCanvas.js +193 -0
  41. package/dist/ai/ArtifactCanvas.js.map +7 -0
  42. package/dist/ai/CitationRenderer.js +413 -0
  43. package/dist/ai/CitationRenderer.js.map +7 -0
  44. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  45. package/dist/ai/MarkdownRenderer.js.map +7 -0
  46. package/dist/ai/MessageArtifactCard.js +75 -0
  47. package/dist/ai/MessageArtifactCard.js.map +7 -0
  48. package/dist/ai/PassageCard.js +79 -0
  49. package/dist/ai/PassageCard.js.map +7 -0
  50. package/dist/ai/engine.js +110 -0
  51. package/dist/ai/engine.js.map +7 -0
  52. package/dist/ai/index.js +63 -0
  53. package/dist/ai/index.js.map +7 -0
  54. package/dist/ai/markdown-base-components.js +37 -0
  55. package/dist/ai/markdown-base-components.js.map +7 -0
  56. package/dist/ai/markdown-streaming-context.js +6 -0
  57. package/dist/ai/markdown-streaming-context.js.map +7 -0
  58. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  59. package/dist/ai/normalize-citations.js.map +7 -0
  60. package/dist/ai/redline.js +41 -0
  61. package/dist/ai/redline.js.map +7 -0
  62. package/dist/ai/split-markdown-blocks.js +40 -0
  63. package/dist/ai/split-markdown-blocks.js.map +7 -0
  64. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  65. package/dist/ai/stored-markdown.js.map +7 -0
  66. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  67. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  68. package/dist/annotations/AnnotationToolbar.js +398 -0
  69. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  70. package/dist/annotations/FreezeDialog.js +170 -0
  71. package/dist/annotations/FreezeDialog.js.map +7 -0
  72. package/dist/annotations/ProductionDialog.js +354 -0
  73. package/dist/annotations/ProductionDialog.js.map +7 -0
  74. package/dist/annotations/controller.js +49 -0
  75. package/dist/annotations/controller.js.map +7 -0
  76. package/dist/annotations/freeze/browser.js +21 -0
  77. package/dist/annotations/freeze/browser.js.map +7 -0
  78. package/dist/annotations/freeze/bundle.js +201 -0
  79. package/dist/annotations/freeze/bundle.js.map +7 -0
  80. package/dist/annotations/freeze/coords.js +37 -0
  81. package/dist/annotations/freeze/coords.js.map +7 -0
  82. package/dist/annotations/freeze/freeze.js +261 -0
  83. package/dist/annotations/freeze/freeze.js.map +7 -0
  84. package/dist/annotations/freeze/hash.js +28 -0
  85. package/dist/annotations/freeze/hash.js.map +7 -0
  86. package/dist/annotations/freeze/index-page.js +78 -0
  87. package/dist/annotations/freeze/index-page.js.map +7 -0
  88. package/dist/annotations/freeze/index.d.ts +1 -1
  89. package/dist/annotations/freeze/index.js +28 -22
  90. package/dist/annotations/freeze/index.js.map +7 -1
  91. package/dist/annotations/freeze/raster.js +208 -0
  92. package/dist/annotations/freeze/raster.js.map +7 -0
  93. package/dist/annotations/freeze/stamp.js +117 -0
  94. package/dist/annotations/freeze/stamp.js.map +7 -0
  95. package/dist/annotations/freeze/types.js +14 -0
  96. package/dist/annotations/freeze/types.js.map +7 -0
  97. package/dist/annotations/freeze/vector.js +283 -0
  98. package/dist/annotations/freeze/vector.js.map +7 -0
  99. package/dist/annotations/geometry.js +81 -0
  100. package/dist/annotations/geometry.js.map +7 -0
  101. package/dist/annotations/index.js +125 -6
  102. package/dist/annotations/index.js.map +7 -1
  103. package/dist/annotations/merge.js +53 -0
  104. package/dist/annotations/merge.js.map +7 -0
  105. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  106. package/dist/annotations/model.js.map +7 -0
  107. package/dist/annotations/overlay-geometry.js +41 -0
  108. package/dist/annotations/overlay-geometry.js.map +7 -0
  109. package/dist/annotations/redaction-log.js +33 -0
  110. package/dist/annotations/redaction-log.js.map +7 -0
  111. package/dist/annotations/selection-marks.js +122 -0
  112. package/dist/annotations/selection-marks.js.map +7 -0
  113. package/dist/annotations/state.js +140 -0
  114. package/dist/annotations/state.js.map +7 -0
  115. package/dist/annotations/store.js +49 -0
  116. package/dist/annotations/store.js.map +7 -0
  117. package/dist/annotations/useAnnotationLayer.js +306 -0
  118. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  119. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  120. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  121. package/dist/annotations/useTextSelectionMarks.js +100 -0
  122. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  123. package/dist/artifacts/artifact-kind.js +19 -0
  124. package/dist/artifacts/artifact-kind.js.map +7 -0
  125. package/dist/artifacts/index.cjs +13 -13
  126. package/dist/artifacts/index.js +89 -571
  127. package/dist/artifacts/index.js.map +7 -1
  128. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  129. package/dist/artifacts/normalize-markdown.js.map +7 -0
  130. package/dist/artifacts/redline-core.js +12 -3
  131. package/dist/artifacts/redline-core.js.map +7 -1
  132. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  133. package/dist/artifacts/redline-diff.js.map +7 -0
  134. package/dist/artifacts/redline-engine.js +14 -0
  135. package/dist/artifacts/redline-engine.js.map +7 -0
  136. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  137. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  138. package/dist/artifacts/useArtifactEditSession.js +183 -0
  139. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  140. package/dist/artifacts/useArtifactSession.js +173 -0
  141. package/dist/artifacts/useArtifactSession.js.map +7 -0
  142. package/dist/artifacts/useArtifactSource.js +16 -0
  143. package/dist/artifacts/useArtifactSource.js.map +7 -0
  144. package/dist/artifacts/useArtifactText.js +78 -0
  145. package/dist/artifacts/useArtifactText.js.map +7 -0
  146. package/dist/artifacts/useRedline.js +65 -0
  147. package/dist/artifacts/useRedline.js.map +7 -0
  148. package/dist/artifacts/useStreamedArtifact.js +74 -0
  149. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  150. package/dist/artifacts/versions.js +68 -0
  151. package/dist/artifacts/versions.js.map +7 -0
  152. package/dist/billing.js +200 -0
  153. package/dist/billing.js.map +7 -0
  154. package/dist/boot-timeout.js +19 -0
  155. package/dist/boot-timeout.js.map +7 -0
  156. package/dist/calendar/accounts.js +213 -0
  157. package/dist/calendar/accounts.js.map +7 -0
  158. package/dist/calendar/hooks.js +409 -0
  159. package/dist/calendar/hooks.js.map +7 -0
  160. package/dist/calendar/index.js +31 -0
  161. package/dist/calendar/index.js.map +7 -0
  162. package/dist/calendar/keys.js +5 -0
  163. package/dist/calendar/keys.js.map +7 -0
  164. package/dist/calendar/offline/outbox.js +231 -0
  165. package/dist/calendar/offline/outbox.js.map +7 -0
  166. package/dist/calendar/offline/runtime.js +109 -0
  167. package/dist/calendar/offline/runtime.js.map +7 -0
  168. package/dist/calendar/offline/support.js +41 -0
  169. package/dist/calendar/offline/support.js.map +7 -0
  170. package/dist/calendar/support.js +34 -0
  171. package/dist/calendar/support.js.map +7 -0
  172. package/dist/calls/actions.js +226 -0
  173. package/dist/calls/actions.js.map +7 -0
  174. package/dist/calls/events.js +138 -0
  175. package/dist/calls/events.js.map +7 -0
  176. package/dist/calls/gate.js +19 -0
  177. package/dist/calls/gate.js.map +7 -0
  178. package/dist/calls/hooks.js +115 -0
  179. package/dist/calls/hooks.js.map +7 -0
  180. package/dist/calls/in-call-chat.js +132 -0
  181. package/dist/calls/in-call-chat.js.map +7 -0
  182. package/dist/calls/index.js +24 -0
  183. package/dist/calls/index.js.map +7 -0
  184. package/dist/calls/keys.js +17 -0
  185. package/dist/calls/keys.js.map +7 -0
  186. package/dist/calls/livekit/index.cjs +48 -48
  187. package/dist/calls/livekit/index.js +6 -958
  188. package/dist/calls/livekit/index.js.map +7 -1
  189. package/dist/calls/livekit/room.js +98 -0
  190. package/dist/calls/livekit/room.js.map +7 -0
  191. package/dist/calls/livekit/useCallRecorder.js +219 -0
  192. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  193. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  194. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  195. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  196. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  197. package/dist/calls/livekit/useInCallChat.js +161 -0
  198. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  199. package/dist/calls/livekit/useWebinar.js +239 -0
  200. package/dist/calls/livekit/useWebinar.js.map +7 -0
  201. package/dist/calls/meeting-chat.js +149 -0
  202. package/dist/calls/meeting-chat.js.map +7 -0
  203. package/dist/calls/moderation.js +50 -0
  204. package/dist/calls/moderation.js.map +7 -0
  205. package/dist/calls/open-meeting-chat.js +29 -0
  206. package/dist/calls/open-meeting-chat.js.map +7 -0
  207. package/dist/calls/read-only.js +24 -0
  208. package/dist/calls/read-only.js.map +7 -0
  209. package/dist/calls/recording-media.js +218 -0
  210. package/dist/calls/recording-media.js.map +7 -0
  211. package/dist/calls/recording-playback.js +260 -0
  212. package/dist/calls/recording-playback.js.map +7 -0
  213. package/dist/calls/recording.js +268 -0
  214. package/dist/calls/recording.js.map +7 -0
  215. package/dist/calls/save-to-thread.js +80 -0
  216. package/dist/calls/save-to-thread.js.map +7 -0
  217. package/dist/calls/session.js +134 -0
  218. package/dist/calls/session.js.map +7 -0
  219. package/dist/calls/transcript-format.js +147 -0
  220. package/dist/calls/transcript-format.js.map +7 -0
  221. package/dist/calls/transcription.js +101 -0
  222. package/dist/calls/transcription.js.map +7 -0
  223. package/dist/calls/webinar.js +71 -0
  224. package/dist/calls/webinar.js.map +7 -0
  225. package/dist/charge-watch.js +71 -0
  226. package/dist/charge-watch.js.map +7 -0
  227. package/dist/chat/ChatBubble.js +146 -0
  228. package/dist/chat/ChatBubble.js.map +7 -0
  229. package/dist/chat/ConversationScope.js +30 -0
  230. package/dist/chat/ConversationScope.js.map +7 -0
  231. package/dist/chat/active-config.js +20 -0
  232. package/dist/chat/active-config.js.map +7 -0
  233. package/dist/chat/agent-chat-owner.js +25 -0
  234. package/dist/chat/agent-chat-owner.js.map +7 -0
  235. package/dist/chat/chat-artifacts.js +64 -0
  236. package/dist/chat/chat-artifacts.js.map +7 -0
  237. package/dist/chat/citations.js +32 -0
  238. package/dist/chat/citations.js.map +7 -0
  239. package/dist/chat/config-model.js +10 -0
  240. package/dist/chat/config-model.js.map +7 -0
  241. package/dist/chat/conversation-cache.js +676 -0
  242. package/dist/chat/conversation-cache.js.map +7 -0
  243. package/dist/chat/conversation-events.js +57 -0
  244. package/dist/chat/conversation-events.js.map +7 -0
  245. package/dist/chat/conversation-mentions.js +58 -0
  246. package/dist/chat/conversation-mentions.js.map +7 -0
  247. package/dist/chat/conversation-workspace.js +58 -0
  248. package/dist/chat/conversation-workspace.js.map +7 -0
  249. package/dist/chat/mentions.js +116 -0
  250. package/dist/chat/mentions.js.map +7 -0
  251. package/dist/chat/open-document.js +106 -0
  252. package/dist/chat/open-document.js.map +7 -0
  253. package/dist/chat/orphaned.js +44 -0
  254. package/dist/chat/orphaned.js.map +7 -0
  255. package/dist/chat/pendingFirstTurn.js +30 -0
  256. package/dist/chat/pendingFirstTurn.js.map +7 -0
  257. package/dist/chat/reply-target.js +12 -0
  258. package/dist/chat/reply-target.js.map +7 -0
  259. package/dist/chat/run-finished.js +28 -0
  260. package/dist/chat/run-finished.js.map +7 -0
  261. package/dist/chat/run-state.js +91 -0
  262. package/dist/chat/run-state.js.map +7 -0
  263. package/dist/chat/stream-handlers.js +419 -0
  264. package/dist/chat/stream-handlers.js.map +7 -0
  265. package/dist/chat/thread-binding.js +76 -0
  266. package/dist/chat/thread-binding.js.map +7 -0
  267. package/dist/chat/thread-document.js +53 -0
  268. package/dist/chat/thread-document.js.map +7 -0
  269. package/dist/chat/turn-control.js +79 -0
  270. package/dist/chat/turn-control.js.map +7 -0
  271. package/dist/chat/useAgentRunControl.js +36 -0
  272. package/dist/chat/useAgentRunControl.js.map +7 -0
  273. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  274. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  275. package/dist/chat/useAskAgain.js +32 -0
  276. package/dist/chat/useAskAgain.js.map +7 -0
  277. package/dist/chat/useAutoSendDraft.js +17 -0
  278. package/dist/chat/useAutoSendDraft.js.map +7 -0
  279. package/dist/chat/useBranchNavigation.js +97 -0
  280. package/dist/chat/useBranchNavigation.js.map +7 -0
  281. package/dist/chat/useConnectRunStream.js +169 -0
  282. package/dist/chat/useConnectRunStream.js.map +7 -0
  283. package/dist/chat/useConversation.js +431 -0
  284. package/dist/chat/useConversation.js.map +7 -0
  285. package/dist/chat/useConversationActions.js +662 -0
  286. package/dist/chat/useConversationActions.js.map +7 -0
  287. package/dist/chat/useConversationData.js +143 -0
  288. package/dist/chat/useConversationData.js.map +7 -0
  289. package/dist/chat/useConversationDocuments.js +41 -0
  290. package/dist/chat/useConversationDocuments.js.map +7 -0
  291. package/dist/chat/useConversationSettings.js +78 -0
  292. package/dist/chat/useConversationSettings.js.map +7 -0
  293. package/dist/chat/useConversationTurn.js +31 -0
  294. package/dist/chat/useConversationTurn.js.map +7 -0
  295. package/dist/chat/useConversationWorkspace.js +12 -0
  296. package/dist/chat/useConversationWorkspace.js.map +7 -0
  297. package/dist/chat/useDeleteMessage.js +15 -0
  298. package/dist/chat/useDeleteMessage.js.map +7 -0
  299. package/dist/chat/useDocumentAutoAdd.js +73 -0
  300. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  301. package/dist/chat/useMessageTimer.js +39 -0
  302. package/dist/chat/useMessageTimer.js.map +7 -0
  303. package/dist/chat/useThinkingContent.js +67 -0
  304. package/dist/chat/useThinkingContent.js.map +7 -0
  305. package/dist/chat/useThreadDocument.js +61 -0
  306. package/dist/chat/useThreadDocument.js.map +7 -0
  307. package/dist/chat/workflow-run-titles.js +50 -0
  308. package/dist/chat/workflow-run-titles.js.map +7 -0
  309. package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
  310. package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
  311. package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
  312. package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
  313. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  314. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  315. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  316. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  317. package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
  318. package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
  319. package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
  320. package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
  321. package/dist/chunk-PWGSIM3F.cjs +291 -0
  322. package/dist/chunk-PWGSIM3F.cjs.map +1 -0
  323. package/dist/chunk-QP3WQSAA.cjs +23 -0
  324. package/dist/chunk-QP3WQSAA.cjs.map +1 -0
  325. package/dist/chunk-T5FZICXN.cjs +50 -0
  326. package/dist/chunk-T5FZICXN.cjs.map +1 -0
  327. package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
  328. package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  329. package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
  330. package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
  331. package/dist/config/config-hooks.js +209 -0
  332. package/dist/config/config-hooks.js.map +7 -0
  333. package/dist/connectivity.js +72 -0
  334. package/dist/connectivity.js.map +7 -0
  335. package/dist/connectors/hooks.js +263 -0
  336. package/dist/connectors/hooks.js.map +7 -0
  337. package/dist/connectors/index.js +28 -0
  338. package/dist/connectors/index.js.map +7 -0
  339. package/dist/contacts.js +100 -0
  340. package/dist/contacts.js.map +7 -0
  341. package/dist/conversation-list.js +65 -0
  342. package/dist/conversation-list.js.map +7 -0
  343. package/dist/databases.js +195 -0
  344. package/dist/databases.js.map +7 -0
  345. package/dist/datasets/aggregate.js +281 -0
  346. package/dist/datasets/aggregate.js.map +7 -0
  347. package/dist/datasets/index.js +122 -0
  348. package/dist/datasets/index.js.map +7 -0
  349. package/dist/datasets/members.js +27 -0
  350. package/dist/datasets/members.js.map +7 -0
  351. package/dist/datasets/panel.js +44 -0
  352. package/dist/datasets/panel.js.map +7 -0
  353. package/dist/datasets/registry.js +47 -0
  354. package/dist/datasets/registry.js.map +7 -0
  355. package/dist/datasets/rows-source.js +44 -0
  356. package/dist/datasets/rows-source.js.map +7 -0
  357. package/dist/datasets/sources/activity.js +83 -0
  358. package/dist/datasets/sources/activity.js.map +7 -0
  359. package/dist/datasets/sources/conversations.js +74 -0
  360. package/dist/datasets/sources/conversations.js.map +7 -0
  361. package/dist/datasets/sources/database.js +209 -0
  362. package/dist/datasets/sources/database.js.map +7 -0
  363. package/dist/datasets/sources/documents.js +93 -0
  364. package/dist/datasets/sources/documents.js.map +7 -0
  365. package/dist/datasets/sources/facts.js +56 -0
  366. package/dist/datasets/sources/facts.js.map +7 -0
  367. package/dist/datasets/sources/projects.js +117 -0
  368. package/dist/datasets/sources/projects.js.map +7 -0
  369. package/dist/datasets/sources/tags.js +67 -0
  370. package/dist/datasets/sources/tags.js.map +7 -0
  371. package/dist/datasets/sources/usage.js +268 -0
  372. package/dist/datasets/sources/usage.js.map +7 -0
  373. package/dist/datasets/sources/workflows.js +91 -0
  374. package/dist/datasets/sources/workflows.js.map +7 -0
  375. package/dist/datasets/sources/workspaces.js +67 -0
  376. package/dist/datasets/sources/workspaces.js.map +7 -0
  377. package/dist/datasets/store.js +194 -0
  378. package/dist/datasets/store.js.map +7 -0
  379. package/dist/datasets/types.js +14 -0
  380. package/dist/datasets/types.js.map +7 -0
  381. package/dist/directmessages/ConversationList.js +148 -0
  382. package/dist/directmessages/ConversationList.js.map +7 -0
  383. package/dist/directmessages/DateSeparator.js +8 -0
  384. package/dist/directmessages/DateSeparator.js.map +7 -0
  385. package/dist/directmessages/DmAvatar.js +29 -0
  386. package/dist/directmessages/DmAvatar.js.map +7 -0
  387. package/dist/directmessages/DmComposer.js +201 -0
  388. package/dist/directmessages/DmComposer.js.map +7 -0
  389. package/dist/directmessages/arrivals.js +29 -0
  390. package/dist/directmessages/arrivals.js.map +7 -0
  391. package/dist/directmessages/chat-cache.js +192 -0
  392. package/dist/directmessages/chat-cache.js.map +7 -0
  393. package/dist/directmessages/grouping.js +26 -0
  394. package/dist/directmessages/grouping.js.map +7 -0
  395. package/dist/directmessages/index.js +81 -0
  396. package/dist/directmessages/index.js.map +7 -0
  397. package/dist/directmessages/useChats.js +266 -0
  398. package/dist/directmessages/useChats.js.map +7 -0
  399. package/dist/directmessages/utils.js +23 -0
  400. package/dist/directmessages/utils.js.map +7 -0
  401. package/dist/document-tools/can-annotate.js +7 -0
  402. package/dist/document-tools/can-annotate.js.map +7 -0
  403. package/dist/document-tools/core.cjs +99 -99
  404. package/dist/document-tools/core.d.ts +2 -2
  405. package/dist/document-tools/core.js +218 -12
  406. package/dist/document-tools/core.js.map +7 -1
  407. package/dist/document-tools/document-pdf.js +76 -0
  408. package/dist/document-tools/document-pdf.js.map +7 -0
  409. package/dist/document-tools/environment.js +136 -0
  410. package/dist/document-tools/environment.js.map +7 -0
  411. package/dist/document-tools/file-shares.js +112 -0
  412. package/dist/document-tools/file-shares.js.map +7 -0
  413. package/dist/document-tools/frozen-copy.js +27 -0
  414. package/dist/document-tools/frozen-copy.js.map +7 -0
  415. package/dist/document-tools/index.cjs +101 -101
  416. package/dist/document-tools/index.d.ts +1 -1
  417. package/dist/document-tools/index.js +26 -148
  418. package/dist/document-tools/index.js.map +7 -1
  419. package/dist/document-tools/markup-download.js +51 -0
  420. package/dist/document-tools/markup-download.js.map +7 -0
  421. package/dist/document-tools/markup-store.js +138 -0
  422. package/dist/document-tools/markup-store.js.map +7 -0
  423. package/dist/document-tools/markup-transfer.js +88 -0
  424. package/dist/document-tools/markup-transfer.js.map +7 -0
  425. package/dist/document-tools/production.js +147 -0
  426. package/dist/document-tools/production.js.map +7 -0
  427. package/dist/document-tools/saved-signature.js +90 -0
  428. package/dist/document-tools/saved-signature.js.map +7 -0
  429. package/dist/document-tools/signature-requests.js +310 -0
  430. package/dist/document-tools/signature-requests.js.map +7 -0
  431. package/dist/document-tools/signing.js +127 -0
  432. package/dist/document-tools/signing.js.map +7 -0
  433. package/dist/document-tools/useDocumentBytes.js +38 -0
  434. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  435. package/dist/document-tools/useDocumentMarkup.js +154 -0
  436. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  437. package/dist/document-tools/useIsOnline.js +13 -0
  438. package/dist/document-tools/useIsOnline.js.map +7 -0
  439. package/dist/document-tools/verification.js +60 -0
  440. package/dist/document-tools/verification.js.map +7 -0
  441. package/dist/documents/DocumentReview.js +220 -0
  442. package/dist/documents/DocumentReview.js.map +7 -0
  443. package/dist/documents/DraftTitleControls.js +41 -0
  444. package/dist/documents/DraftTitleControls.js.map +7 -0
  445. package/dist/documents/InlineMicButton.js +90 -0
  446. package/dist/documents/InlineMicButton.js.map +7 -0
  447. package/dist/documents/MicRecordingOverlay.js +29 -0
  448. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  449. package/dist/documents/MicWaveformIndicator.js +68 -0
  450. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  451. package/dist/documents/PhotoCapture.js +120 -0
  452. package/dist/documents/PhotoCapture.js.map +7 -0
  453. package/dist/documents/VideoCapture.js +129 -0
  454. package/dist/documents/VideoCapture.js.map +7 -0
  455. package/dist/documents/VoiceNoteRecorder.js +166 -0
  456. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  457. package/dist/documents/audio-segmenter.js +63 -0
  458. package/dist/documents/audio-segmenter.js.map +7 -0
  459. package/dist/documents/capture-frame.js +21 -0
  460. package/dist/documents/capture-frame.js.map +7 -0
  461. package/dist/documents/chunked-recorder.js +190 -0
  462. package/dist/documents/chunked-recorder.js.map +7 -0
  463. package/dist/documents/document-download.js +53 -0
  464. package/dist/documents/document-download.js.map +7 -0
  465. package/dist/documents/document-fields.js +109 -0
  466. package/dist/documents/document-fields.js.map +7 -0
  467. package/dist/documents/documents-cache.js +110 -0
  468. package/dist/documents/documents-cache.js.map +7 -0
  469. package/dist/documents/documents-data.js +128 -0
  470. package/dist/documents/documents-data.js.map +7 -0
  471. package/dist/documents/documents-loader.js +113 -0
  472. package/dist/documents/documents-loader.js.map +7 -0
  473. package/dist/documents/documents-writes.js +448 -0
  474. package/dist/documents/documents-writes.js.map +7 -0
  475. package/dist/documents/format-elapsed.js +10 -0
  476. package/dist/documents/format-elapsed.js.map +7 -0
  477. package/dist/documents/has-video-track.js +26 -0
  478. package/dist/documents/has-video-track.js.map +7 -0
  479. package/dist/documents/index.js +266 -0
  480. package/dist/documents/index.js.map +7 -0
  481. package/dist/documents/media-error.js +18 -0
  482. package/dist/documents/media-error.js.map +7 -0
  483. package/dist/documents/offline-documents.js +160 -0
  484. package/dist/documents/offline-documents.js.map +7 -0
  485. package/dist/documents/pending-sync.js +210 -0
  486. package/dist/documents/pending-sync.js.map +7 -0
  487. package/dist/documents/processing-live.js +122 -0
  488. package/dist/documents/processing-live.js.map +7 -0
  489. package/dist/documents/processing-order.js +59 -0
  490. package/dist/documents/processing-order.js.map +7 -0
  491. package/dist/documents/processing-settle.js +21 -0
  492. package/dist/documents/processing-settle.js.map +7 -0
  493. package/dist/documents/related-documents.js +133 -0
  494. package/dist/documents/related-documents.js.map +7 -0
  495. package/dist/documents/support.js +29 -0
  496. package/dist/documents/support.js.map +7 -0
  497. package/dist/documents/upload-files.js +169 -0
  498. package/dist/documents/upload-files.js.map +7 -0
  499. package/dist/documents/useAudioRecorder.js +315 -0
  500. package/dist/documents/useAudioRecorder.js.map +7 -0
  501. package/dist/documents/useCameraStream.js +35 -0
  502. package/dist/documents/useCameraStream.js.map +7 -0
  503. package/dist/documents/useDocumentThumbnails.js +71 -0
  504. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  505. package/dist/documents/useDownloadDocuments.js +90 -0
  506. package/dist/documents/useDownloadDocuments.js.map +7 -0
  507. package/dist/documents/usePassageQuotes.js +37 -0
  508. package/dist/documents/usePassageQuotes.js.map +7 -0
  509. package/dist/documents/useUploadFiles.js +165 -0
  510. package/dist/documents/useUploadFiles.js.map +7 -0
  511. package/dist/documents/useUploadFromUrls.js +63 -0
  512. package/dist/documents/useUploadFromUrls.js.map +7 -0
  513. package/dist/documents/useVideoRecorder.js +62 -0
  514. package/dist/documents/useVideoRecorder.js.map +7 -0
  515. package/dist/entities/AgentMarkers.js +61 -0
  516. package/dist/entities/AgentMarkers.js.map +7 -0
  517. package/dist/entities/DocumentEntity.js +125 -0
  518. package/dist/entities/DocumentEntity.js.map +7 -0
  519. package/dist/entities/EntityPill.js +250 -0
  520. package/dist/entities/EntityPill.js.map +7 -0
  521. package/dist/entities/ProjectEntity.js +61 -0
  522. package/dist/entities/ProjectEntity.js.map +7 -0
  523. package/dist/entities/ShieldIcon.js +49 -0
  524. package/dist/entities/ShieldIcon.js.map +7 -0
  525. package/dist/entities/TagEntity.js +79 -0
  526. package/dist/entities/TagEntity.js.map +7 -0
  527. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  528. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  529. package/dist/entities/UserEntity.js +211 -0
  530. package/dist/entities/UserEntity.js.map +7 -0
  531. package/dist/entities/VerifiedBadge.js +19 -0
  532. package/dist/entities/VerifiedBadge.js.map +7 -0
  533. package/dist/entities/agent-avatar-colors.js +26 -0
  534. package/dist/entities/agent-avatar-colors.js.map +7 -0
  535. package/dist/entities/colors.js +64 -0
  536. package/dist/entities/colors.js.map +7 -0
  537. package/dist/entities/file-type.js +151 -0
  538. package/dist/entities/file-type.js.map +7 -0
  539. package/dist/entities/index.js +100 -0
  540. package/dist/entities/index.js.map +7 -0
  541. package/dist/entities/media-type.js +61 -0
  542. package/dist/entities/media-type.js.map +7 -0
  543. package/dist/entities/registry.js +385 -0
  544. package/dist/entities/registry.js.map +7 -0
  545. package/dist/entities/status.js +43 -0
  546. package/dist/entities/status.js.map +7 -0
  547. package/dist/entities/tag-kinds.js +23 -0
  548. package/dist/entities/tag-kinds.js.map +7 -0
  549. package/dist/entities/tag-types.js +44 -0
  550. package/dist/entities/tag-types.js.map +7 -0
  551. package/dist/entities/vocabulary.js +12 -0
  552. package/dist/entities/vocabulary.js.map +7 -0
  553. package/dist/entity-extraction.js +25 -0
  554. package/dist/entity-extraction.js.map +7 -0
  555. package/dist/facts-search.js +57 -0
  556. package/dist/facts-search.js.map +7 -0
  557. package/dist/facts.js +69 -0
  558. package/dist/facts.js.map +7 -0
  559. package/dist/hooks.js +320 -0
  560. package/dist/hooks.js.map +7 -0
  561. package/dist/host/ArbiHost.js +24 -0
  562. package/dist/host/ArbiHost.js.map +7 -0
  563. package/dist/host/assistant-copy.js +54 -0
  564. package/dist/host/assistant-copy.js.map +7 -0
  565. package/dist/host/config.js +9 -0
  566. package/dist/host/config.js.map +7 -0
  567. package/dist/host/context.js +10 -0
  568. package/dist/host/context.js.map +7 -0
  569. package/dist/host/features.js +144 -0
  570. package/dist/host/features.js.map +7 -0
  571. package/dist/host/index.js +12 -0
  572. package/dist/host/index.js.map +7 -0
  573. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  574. package/dist/host/merge.js.map +7 -0
  575. package/dist/house-template.js +40 -0
  576. package/dist/house-template.js.map +7 -0
  577. package/dist/icons/AppleIcon.js +25 -0
  578. package/dist/icons/AppleIcon.js.map +7 -0
  579. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  580. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  581. package/dist/icons/ArbiIcon.js +24 -0
  582. package/dist/icons/ArbiIcon.js.map +7 -0
  583. package/dist/icons/AudIcon.js +56 -0
  584. package/dist/icons/AudIcon.js.map +7 -0
  585. package/dist/icons/ClaudeIcon.js +28 -0
  586. package/dist/icons/ClaudeIcon.js.map +7 -0
  587. package/dist/icons/DocIcon.js +56 -0
  588. package/dist/icons/DocIcon.js.map +7 -0
  589. package/dist/icons/EmlIcon.js +57 -0
  590. package/dist/icons/EmlIcon.js.map +7 -0
  591. package/dist/icons/FireworksIcon.js +47 -0
  592. package/dist/icons/FireworksIcon.js.map +7 -0
  593. package/dist/icons/GeminiIcon.js +37 -0
  594. package/dist/icons/GeminiIcon.js.map +7 -0
  595. package/dist/icons/GitHubIcon.js +32 -0
  596. package/dist/icons/GitHubIcon.js.map +7 -0
  597. package/dist/icons/GoogleIcon.js +53 -0
  598. package/dist/icons/GoogleIcon.js.map +7 -0
  599. package/dist/icons/HtmlIcon.js +56 -0
  600. package/dist/icons/HtmlIcon.js.map +7 -0
  601. package/dist/icons/ImgIcon.js +56 -0
  602. package/dist/icons/ImgIcon.js.map +7 -0
  603. package/dist/icons/LinkedInIcon.js +25 -0
  604. package/dist/icons/LinkedInIcon.js.map +7 -0
  605. package/dist/icons/OpenAIIcon.js +28 -0
  606. package/dist/icons/OpenAIIcon.js.map +7 -0
  607. package/dist/icons/PdfIcon.js +56 -0
  608. package/dist/icons/PdfIcon.js.map +7 -0
  609. package/dist/icons/ProviderIcon.js +42 -0
  610. package/dist/icons/ProviderIcon.js.map +7 -0
  611. package/dist/icons/TxtIcon.js +56 -0
  612. package/dist/icons/TxtIcon.js.map +7 -0
  613. package/dist/icons/VidIcon.js +56 -0
  614. package/dist/icons/VidIcon.js.map +7 -0
  615. package/dist/icons/XlsIcon.js +56 -0
  616. package/dist/icons/XlsIcon.js.map +7 -0
  617. package/dist/icons/arbi-mark.js +5 -0
  618. package/dist/icons/arbi-mark.js.map +7 -0
  619. package/dist/icons/colors.js +31 -0
  620. package/dist/icons/colors.js.map +7 -0
  621. package/dist/icons/file-type.js +105 -0
  622. package/dist/icons/file-type.js.map +7 -0
  623. package/dist/icons/index.js +55 -0
  624. package/dist/icons/index.js.map +7 -0
  625. package/dist/imagecrop/ImageCropModal.js +56 -0
  626. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  627. package/dist/imagecrop/ImageCropper.js +100 -0
  628. package/dist/imagecrop/ImageCropper.js.map +7 -0
  629. package/dist/imagecrop/cropImage.js +43 -0
  630. package/dist/imagecrop/cropImage.js.map +7 -0
  631. package/dist/imagecrop/index.js +13 -0
  632. package/dist/imagecrop/index.js.map +7 -0
  633. package/dist/index.cjs +1689 -1619
  634. package/dist/index.cjs.map +1 -1
  635. package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
  636. package/dist/index.d.ts +38 -8
  637. package/dist/index.js +702 -17060
  638. package/dist/index.js.map +7 -1
  639. package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
  640. package/dist/lazy-chunk.js +46 -0
  641. package/dist/lazy-chunk.js.map +7 -0
  642. package/dist/lib/collision-padding.js +13 -0
  643. package/dist/lib/collision-padding.js.map +7 -0
  644. package/dist/lib/format-friendly-date.js +55 -0
  645. package/dist/lib/format-friendly-date.js.map +7 -0
  646. package/dist/lib/format-relative-time.js +52 -0
  647. package/dist/lib/format-relative-time.js.map +7 -0
  648. package/dist/lib/markdown-to-text.js +35 -0
  649. package/dist/lib/markdown-to-text.js.map +7 -0
  650. package/dist/lib/toast-interaction.js +9 -0
  651. package/dist/lib/toast-interaction.js.map +7 -0
  652. package/dist/lib/utils.js +9 -0
  653. package/dist/lib/utils.js.map +7 -0
  654. package/dist/mail/client.js +103 -0
  655. package/dist/mail/client.js.map +7 -0
  656. package/dist/mail/document-attachment.js +38 -0
  657. package/dist/mail/document-attachment.js.map +7 -0
  658. package/dist/mail/filing.js +132 -0
  659. package/dist/mail/filing.js.map +7 -0
  660. package/dist/mail/hooks.js +393 -0
  661. package/dist/mail/hooks.js.map +7 -0
  662. package/dist/mail/index.js +120 -0
  663. package/dist/mail/index.js.map +7 -0
  664. package/dist/mail/offline/changes.js +258 -0
  665. package/dist/mail/offline/changes.js.map +7 -0
  666. package/dist/mail/offline/confirm-sign-out.js +37 -0
  667. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  668. package/dist/mail/offline/crypto.js +26 -0
  669. package/dist/mail/offline/crypto.js.map +7 -0
  670. package/dist/mail/offline/drafts.js +69 -0
  671. package/dist/mail/offline/drafts.js.map +7 -0
  672. package/dist/mail/offline/hooks.js +104 -0
  673. package/dist/mail/offline/hooks.js.map +7 -0
  674. package/dist/mail/offline/index.js +48 -0
  675. package/dist/mail/offline/index.js.map +7 -0
  676. package/dist/mail/offline/live.js +233 -0
  677. package/dist/mail/offline/live.js.map +7 -0
  678. package/dist/mail/offline/mailbox.js +191 -0
  679. package/dist/mail/offline/mailbox.js.map +7 -0
  680. package/dist/mail/offline/outbox.js +167 -0
  681. package/dist/mail/offline/outbox.js.map +7 -0
  682. package/dist/mail/offline/reads.js +159 -0
  683. package/dist/mail/offline/reads.js.map +7 -0
  684. package/dist/mail/offline/runtime.js +100 -0
  685. package/dist/mail/offline/runtime.js.map +7 -0
  686. package/dist/mail/offline/settings.js +84 -0
  687. package/dist/mail/offline/settings.js.map +7 -0
  688. package/dist/mail/offline/store.js +29 -0
  689. package/dist/mail/offline/store.js.map +7 -0
  690. package/dist/mail/offline/sync.js +251 -0
  691. package/dist/mail/offline/sync.js.map +7 -0
  692. package/dist/mail/offline/wipe.js +19 -0
  693. package/dist/mail/offline/wipe.js.map +7 -0
  694. package/dist/mail/thread-keys.js +53 -0
  695. package/dist/mail/thread-keys.js.map +7 -0
  696. package/dist/mail/threads.js +71 -0
  697. package/dist/mail/threads.js.map +7 -0
  698. package/dist/mail/useMailClient.js +42 -0
  699. package/dist/mail/useMailClient.js.map +7 -0
  700. package/dist/model-connections.js +58 -0
  701. package/dist/model-connections.js.map +7 -0
  702. package/dist/notifications/ActivityFeed.js +70 -0
  703. package/dist/notifications/ActivityFeed.js.map +7 -0
  704. package/dist/notifications/NotificationBell.js +200 -0
  705. package/dist/notifications/NotificationBell.js.map +7 -0
  706. package/dist/notifications/Toaster.js +24 -0
  707. package/dist/notifications/Toaster.js.map +7 -0
  708. package/dist/notifications/activity-types.js +65 -0
  709. package/dist/notifications/activity-types.js.map +7 -0
  710. package/dist/notifications/bell.js +24 -0
  711. package/dist/notifications/bell.js.map +7 -0
  712. package/dist/notifications/calendar-notifications.js +79 -0
  713. package/dist/notifications/calendar-notifications.js.map +7 -0
  714. package/dist/notifications/index.js +108 -0
  715. package/dist/notifications/index.js.map +7 -0
  716. package/dist/notifications/live.js +28 -0
  717. package/dist/notifications/live.js.map +7 -0
  718. package/dist/notifications/notification-types.js +127 -0
  719. package/dist/notifications/notification-types.js.map +7 -0
  720. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  721. package/dist/notifications/notify-store.js.map +7 -0
  722. package/dist/notifications/server-notifications.js +452 -0
  723. package/dist/notifications/server-notifications.js.map +7 -0
  724. package/dist/notifications/useNotifications.js +34 -0
  725. package/dist/notifications/useNotifications.js.map +7 -0
  726. package/dist/offline-store/network.js +11 -0
  727. package/dist/offline-store/network.js.map +7 -0
  728. package/dist/offline-store/store.js +136 -0
  729. package/dist/offline-store/store.js.map +7 -0
  730. package/dist/offline-store/wipe.js +8 -0
  731. package/dist/offline-store/wipe.js.map +7 -0
  732. package/dist/offline.js +58 -0
  733. package/dist/offline.js.map +7 -0
  734. package/dist/people.js +122 -0
  735. package/dist/people.js.map +7 -0
  736. package/dist/projects.js +30 -0
  737. package/dist/projects.js.map +7 -0
  738. package/dist/query-client.js +63 -0
  739. package/dist/query-client.js.map +7 -0
  740. package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
  741. package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
  742. package/dist/query-keys.js.map +7 -0
  743. package/dist/query-persist.js +66 -0
  744. package/dist/query-persist.js.map +7 -0
  745. package/dist/queued-writes.js +59 -0
  746. package/dist/queued-writes.js.map +7 -0
  747. package/dist/remote-control.js +67 -0
  748. package/dist/remote-control.js.map +7 -0
  749. package/dist/search/index.js +23 -0
  750. package/dist/search/index.js.map +7 -0
  751. package/dist/search/session.js +58 -0
  752. package/dist/search/session.js.map +7 -0
  753. package/dist/search/useSemanticSearch.js +82 -0
  754. package/dist/search/useSemanticSearch.js.map +7 -0
  755. package/dist/session/chat.js +512 -0
  756. package/dist/session/chat.js.map +7 -0
  757. package/dist/session/documents.js +196 -0
  758. package/dist/session/documents.js.map +7 -0
  759. package/dist/session/drafts.js +103 -0
  760. package/dist/session/drafts.js.map +7 -0
  761. package/dist/session/index.js +123 -0
  762. package/dist/session/index.js.map +7 -0
  763. package/dist/session/layout.js +339 -0
  764. package/dist/session/layout.js.map +7 -0
  765. package/dist/session/persist.js +106 -0
  766. package/dist/session/persist.js.map +7 -0
  767. package/dist/session/session-hooks.js +53 -0
  768. package/dist/session/session-hooks.js.map +7 -0
  769. package/dist/session/signed-in.js +36 -0
  770. package/dist/session/signed-in.js.map +7 -0
  771. package/dist/session/store.js +166 -0
  772. package/dist/session/store.js.map +7 -0
  773. package/dist/session/thread-tabs.js +121 -0
  774. package/dist/session/thread-tabs.js.map +7 -0
  775. package/dist/session/ui-state-storage.js +76 -0
  776. package/dist/session/ui-state-storage.js.map +7 -0
  777. package/dist/session/workspace.js +77 -0
  778. package/dist/session/workspace.js.map +7 -0
  779. package/dist/shell/index.cjs +37 -37
  780. package/dist/shell/index.js +43 -10
  781. package/dist/shell/index.js.map +7 -1
  782. package/dist/skill-pack.js +111 -0
  783. package/dist/skill-pack.js.map +7 -0
  784. package/dist/storage.js +186 -0
  785. package/dist/storage.js.map +7 -0
  786. package/dist/support/index.js +35 -0
  787. package/dist/support/index.js.map +7 -0
  788. package/dist/tags.js +204 -0
  789. package/dist/tags.js.map +7 -0
  790. package/dist/ui/DebouncedInput.js +109 -0
  791. package/dist/ui/DebouncedInput.js.map +7 -0
  792. package/dist/ui/DictateContext.js +8 -0
  793. package/dist/ui/DictateContext.js.map +7 -0
  794. package/dist/ui/IconToggle.js +79 -0
  795. package/dist/ui/IconToggle.js.map +7 -0
  796. package/dist/ui/VerifiedToggle.js +38 -0
  797. package/dist/ui/VerifiedToggle.js.map +7 -0
  798. package/dist/ui/VisibilityToggle.js +103 -0
  799. package/dist/ui/VisibilityToggle.js.map +7 -0
  800. package/dist/ui/avatar.js +40 -0
  801. package/dist/ui/avatar.js.map +7 -0
  802. package/dist/ui/badge.js +28 -0
  803. package/dist/ui/badge.js.map +7 -0
  804. package/dist/ui/button.js +48 -0
  805. package/dist/ui/button.js.map +7 -0
  806. package/dist/ui/card.js +90 -0
  807. package/dist/ui/card.js.map +7 -0
  808. package/dist/ui/checkbox.js +22 -0
  809. package/dist/ui/checkbox.js.map +7 -0
  810. package/dist/ui/collapsible.js +10 -0
  811. package/dist/ui/collapsible.js.map +7 -0
  812. package/dist/ui/command.js +103 -0
  813. package/dist/ui/command.js.map +7 -0
  814. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  815. package/dist/ui/dialog.js.map +7 -0
  816. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  817. package/dist/ui/dropdown-menu.js.map +7 -0
  818. package/dist/ui/hover-card.js +36 -0
  819. package/dist/ui/hover-card.js.map +7 -0
  820. package/dist/ui/index.cjs +167 -154
  821. package/dist/ui/index.d.ts +2 -1
  822. package/dist/ui/index.js +290 -9
  823. package/dist/ui/index.js.map +7 -1
  824. package/dist/ui/input.js +65 -0
  825. package/dist/ui/input.js.map +7 -0
  826. package/dist/ui/label.js +16 -0
  827. package/dist/ui/label.js.map +7 -0
  828. package/dist/ui/mark-menu.js +300 -0
  829. package/dist/ui/mark-menu.js.map +7 -0
  830. package/dist/ui/popover.js +40 -0
  831. package/dist/ui/popover.js.map +7 -0
  832. package/dist/ui/portal-container.js +17 -0
  833. package/dist/ui/portal-container.js.map +7 -0
  834. package/dist/ui/progress.js +24 -0
  835. package/dist/ui/progress.js.map +7 -0
  836. package/dist/ui/radio-group.js +29 -0
  837. package/dist/ui/radio-group.js.map +7 -0
  838. package/dist/ui/scroll-area.js +39 -0
  839. package/dist/ui/scroll-area.js.map +7 -0
  840. package/dist/ui/select.js +130 -0
  841. package/dist/ui/select.js.map +7 -0
  842. package/dist/ui/separator.js +23 -0
  843. package/dist/ui/separator.js.map +7 -0
  844. package/dist/ui/slider.js +23 -0
  845. package/dist/ui/slider.js.map +7 -0
  846. package/dist/ui/switch.js +28 -0
  847. package/dist/ui/switch.js.map +7 -0
  848. package/dist/ui/table.js +75 -0
  849. package/dist/ui/table.js.map +7 -0
  850. package/dist/ui/tabs.js +48 -0
  851. package/dist/ui/tabs.js.map +7 -0
  852. package/dist/ui/textarea.js +63 -0
  853. package/dist/ui/textarea.js.map +7 -0
  854. package/dist/ui/toggle-group.js +43 -0
  855. package/dist/ui/toggle-group.js.map +7 -0
  856. package/dist/ui/toggle.js +40 -0
  857. package/dist/ui/toggle.js.map +7 -0
  858. package/dist/ui/tooltip.js +215 -0
  859. package/dist/ui/tooltip.js.map +7 -0
  860. package/dist/usage-metered.js +8 -0
  861. package/dist/usage-metered.js.map +7 -0
  862. package/dist/useArbi.js +16 -0
  863. package/dist/useArbi.js.map +7 -0
  864. package/dist/useInstallSkillPack.js +81 -0
  865. package/dist/useInstallSkillPack.js.map +7 -0
  866. package/dist/usermenu/UserMenu.js +188 -0
  867. package/dist/usermenu/UserMenu.js.map +7 -0
  868. package/dist/usermenu/index.js +5 -0
  869. package/dist/usermenu/index.js.map +7 -0
  870. package/dist/users/index.js +15 -0
  871. package/dist/users/index.js.map +7 -0
  872. package/dist/users/user-display.js +60 -0
  873. package/dist/users/user-display.js.map +7 -0
  874. package/dist/viewers/AudioViewer.js +23 -0
  875. package/dist/viewers/AudioViewer.js.map +7 -0
  876. package/dist/viewers/DocxViewer.js +81 -0
  877. package/dist/viewers/DocxViewer.js.map +7 -0
  878. package/dist/viewers/ImageViewer.js +31 -0
  879. package/dist/viewers/ImageViewer.js.map +7 -0
  880. package/dist/viewers/PdfViewer.cjs +17 -0
  881. package/dist/viewers/PdfViewer.cjs.map +1 -0
  882. package/dist/viewers/PdfViewer.d.ts +9 -0
  883. package/dist/viewers/PdfViewer.js +20 -0
  884. package/dist/viewers/PdfViewer.js.map +7 -0
  885. package/dist/viewers/PdfViewerImpl.js +384 -0
  886. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  887. package/dist/viewers/VideoViewer.js +31 -0
  888. package/dist/viewers/VideoViewer.js.map +7 -0
  889. package/dist/viewers/XlsxViewer.js +102 -0
  890. package/dist/viewers/XlsxViewer.js.map +7 -0
  891. package/dist/viewers/index.cjs +79 -653
  892. package/dist/viewers/index.cjs.map +1 -1
  893. package/dist/viewers/index.d.ts +3 -1
  894. package/dist/viewers/index.js +60 -903
  895. package/dist/viewers/index.js.map +7 -1
  896. package/dist/viewers/page-scroll.js +59 -0
  897. package/dist/viewers/page-scroll.js.map +7 -0
  898. package/dist/viewers/pdf-viewer-constants.js +9 -0
  899. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  900. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  901. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  902. package/dist/viewers/selection-runs.js +38 -0
  903. package/dist/viewers/selection-runs.js.map +7 -0
  904. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  905. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  906. package/dist/viewers/useProcessedChunks.js +58 -0
  907. package/dist/viewers/useProcessedChunks.js.map +7 -0
  908. package/dist/viewers/viewer-zoom.js +163 -0
  909. package/dist/viewers/viewer-zoom.js.map +7 -0
  910. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  911. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  912. package/dist/websocket/context.js +14 -0
  913. package/dist/websocket/context.js.map +7 -0
  914. package/dist/websocket/hooks.js +30 -0
  915. package/dist/websocket/hooks.js.map +7 -0
  916. package/dist/websocket/index.js +22 -0
  917. package/dist/websocket/index.js.map +7 -0
  918. package/dist/websocket/live-updates.js +38 -0
  919. package/dist/websocket/live-updates.js.map +7 -0
  920. package/dist/websocket/reconnect.js +13 -0
  921. package/dist/websocket/reconnect.js.map +7 -0
  922. package/dist/websocket/store.js +58 -0
  923. package/dist/websocket/store.js.map +7 -0
  924. package/dist/workforce.js +607 -0
  925. package/dist/workforce.js.map +7 -0
  926. package/dist/workspaces/access-request.js +35 -0
  927. package/dist/workspaces/access-request.js.map +7 -0
  928. package/dist/workspaces/archive.js +59 -0
  929. package/dist/workspaces/archive.js.map +7 -0
  930. package/dist/workspaces/current.js +20 -0
  931. package/dist/workspaces/current.js.map +7 -0
  932. package/dist/workspaces/delete-workspaces.js +15 -0
  933. package/dist/workspaces/delete-workspaces.js.map +7 -0
  934. package/dist/workspaces/export-archive.js +40 -0
  935. package/dist/workspaces/export-archive.js.map +7 -0
  936. package/dist/workspaces/index.js +99 -0
  937. package/dist/workspaces/index.js.map +7 -0
  938. package/dist/workspaces/settings.js +45 -0
  939. package/dist/workspaces/settings.js.map +7 -0
  940. package/dist/workspaces/shell-workspaces.js +49 -0
  941. package/dist/workspaces/shell-workspaces.js.map +7 -0
  942. package/dist/workspaces/switch.js +234 -0
  943. package/dist/workspaces/switch.js.map +7 -0
  944. package/dist/workspaces/transfer.js +170 -0
  945. package/dist/workspaces/transfer.js.map +7 -0
  946. package/dist/workspaces/useShellWorkspaces.js +86 -0
  947. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  948. package/dist/workspaces/workspace-users.js +65 -0
  949. package/dist/workspaces/workspace-users.js.map +7 -0
  950. package/package.json +12 -4
  951. package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
  952. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  953. package/dist/annotations/freeze/index.d.cts +0 -205
  954. package/dist/annotations/index.d.cts +0 -360
  955. package/dist/artifacts/index.d.cts +0 -476
  956. package/dist/artifacts/redline-core.d.cts +0 -39
  957. package/dist/bundle-YNOX7VIL.js +0 -5
  958. package/dist/bundle-YNOX7VIL.js.map +0 -1
  959. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  960. package/dist/calls/livekit/index.d.cts +0 -280
  961. package/dist/chunk-47CCGUWR.js.map +0 -1
  962. package/dist/chunk-6H3O63TQ.js.map +0 -1
  963. package/dist/chunk-74N436VK.js.map +0 -1
  964. package/dist/chunk-APZZQZ6P.js +0 -147
  965. package/dist/chunk-APZZQZ6P.js.map +0 -1
  966. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  967. package/dist/chunk-CPQ3CU4B.js +0 -246
  968. package/dist/chunk-CPQ3CU4B.js.map +0 -1
  969. package/dist/chunk-DPYBZDJB.js.map +0 -1
  970. package/dist/chunk-DQALOQPI.js +0 -2766
  971. package/dist/chunk-DQALOQPI.js.map +0 -1
  972. package/dist/chunk-FZJMA32S.js +0 -1011
  973. package/dist/chunk-FZJMA32S.js.map +0 -1
  974. package/dist/chunk-H5M7FXLB.js +0 -2057
  975. package/dist/chunk-H5M7FXLB.js.map +0 -1
  976. package/dist/chunk-HDCRPPBW.js +0 -75
  977. package/dist/chunk-HDCRPPBW.js.map +0 -1
  978. package/dist/chunk-NIKPG4PW.js +0 -1128
  979. package/dist/chunk-NIKPG4PW.js.map +0 -1
  980. package/dist/chunk-NNAJLY6B.js +0 -4974
  981. package/dist/chunk-NNAJLY6B.js.map +0 -1
  982. package/dist/chunk-OYPKKHXY.js +0 -559
  983. package/dist/chunk-OYPKKHXY.js.map +0 -1
  984. package/dist/chunk-P6WLV5UY.js +0 -644
  985. package/dist/chunk-P6WLV5UY.js.map +0 -1
  986. package/dist/chunk-PTOP7OHG.js.map +0 -1
  987. package/dist/chunk-SN5YV6FF.js +0 -11
  988. package/dist/chunk-SN5YV6FF.js.map +0 -1
  989. package/dist/chunk-T3USOSVN.js.map +0 -1
  990. package/dist/chunk-T4CLW3DN.js +0 -2560
  991. package/dist/chunk-T4CLW3DN.js.map +0 -1
  992. package/dist/chunk-UW2SGTI5.js.map +0 -1
  993. package/dist/chunk-VSCU7K4V.js.map +0 -1
  994. package/dist/chunk-WL2Y2T47.js.map +0 -1
  995. package/dist/chunk-WUTL62MC.js.map +0 -1
  996. package/dist/chunk-Y3MTRA7D.js +0 -97
  997. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  998. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  999. package/dist/document-tools/core.d.cts +0 -883
  1000. package/dist/document-tools/index.d.cts +0 -90
  1001. package/dist/index.d-BMhTH98a.d.cts +0 -2035
  1002. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  1003. package/dist/index.d.cts +0 -15893
  1004. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  1005. package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
  1006. package/dist/shell/index.d.cts +0 -6
  1007. package/dist/store.d-GADDvC7w.d.cts +0 -35
  1008. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  1009. package/dist/ui/index.d.cts +0 -25
  1010. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  1011. 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