@arbidocs/react 0.5.111 → 0.5.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (972) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/config/config-hooks.js +209 -0
  304. package/dist/config/config-hooks.js.map +7 -0
  305. package/dist/connectivity.js +72 -0
  306. package/dist/connectivity.js.map +7 -0
  307. package/dist/connectors/hooks.js +263 -0
  308. package/dist/connectors/hooks.js.map +7 -0
  309. package/dist/connectors/index.js +28 -0
  310. package/dist/connectors/index.js.map +7 -0
  311. package/dist/contacts.js +100 -0
  312. package/dist/contacts.js.map +7 -0
  313. package/dist/conversation-list.js +65 -0
  314. package/dist/conversation-list.js.map +7 -0
  315. package/dist/databases.js +195 -0
  316. package/dist/databases.js.map +7 -0
  317. package/dist/datasets/aggregate.js +281 -0
  318. package/dist/datasets/aggregate.js.map +7 -0
  319. package/dist/datasets/index.js +122 -0
  320. package/dist/datasets/index.js.map +7 -0
  321. package/dist/datasets/members.js +27 -0
  322. package/dist/datasets/members.js.map +7 -0
  323. package/dist/datasets/panel.js +44 -0
  324. package/dist/datasets/panel.js.map +7 -0
  325. package/dist/datasets/registry.js +47 -0
  326. package/dist/datasets/registry.js.map +7 -0
  327. package/dist/datasets/rows-source.js +44 -0
  328. package/dist/datasets/rows-source.js.map +7 -0
  329. package/dist/datasets/sources/activity.js +83 -0
  330. package/dist/datasets/sources/activity.js.map +7 -0
  331. package/dist/datasets/sources/conversations.js +74 -0
  332. package/dist/datasets/sources/conversations.js.map +7 -0
  333. package/dist/datasets/sources/database.js +209 -0
  334. package/dist/datasets/sources/database.js.map +7 -0
  335. package/dist/datasets/sources/documents.js +93 -0
  336. package/dist/datasets/sources/documents.js.map +7 -0
  337. package/dist/datasets/sources/facts.js +56 -0
  338. package/dist/datasets/sources/facts.js.map +7 -0
  339. package/dist/datasets/sources/projects.js +117 -0
  340. package/dist/datasets/sources/projects.js.map +7 -0
  341. package/dist/datasets/sources/tags.js +67 -0
  342. package/dist/datasets/sources/tags.js.map +7 -0
  343. package/dist/datasets/sources/usage.js +268 -0
  344. package/dist/datasets/sources/usage.js.map +7 -0
  345. package/dist/datasets/sources/workflows.js +91 -0
  346. package/dist/datasets/sources/workflows.js.map +7 -0
  347. package/dist/datasets/sources/workspaces.js +67 -0
  348. package/dist/datasets/sources/workspaces.js.map +7 -0
  349. package/dist/datasets/store.js +194 -0
  350. package/dist/datasets/store.js.map +7 -0
  351. package/dist/datasets/types.js +14 -0
  352. package/dist/datasets/types.js.map +7 -0
  353. package/dist/directmessages/ConversationList.js +148 -0
  354. package/dist/directmessages/ConversationList.js.map +7 -0
  355. package/dist/directmessages/DateSeparator.js +8 -0
  356. package/dist/directmessages/DateSeparator.js.map +7 -0
  357. package/dist/directmessages/DmAvatar.js +29 -0
  358. package/dist/directmessages/DmAvatar.js.map +7 -0
  359. package/dist/directmessages/DmComposer.js +201 -0
  360. package/dist/directmessages/DmComposer.js.map +7 -0
  361. package/dist/directmessages/arrivals.js +29 -0
  362. package/dist/directmessages/arrivals.js.map +7 -0
  363. package/dist/directmessages/chat-cache.js +192 -0
  364. package/dist/directmessages/chat-cache.js.map +7 -0
  365. package/dist/directmessages/grouping.js +26 -0
  366. package/dist/directmessages/grouping.js.map +7 -0
  367. package/dist/directmessages/index.js +81 -0
  368. package/dist/directmessages/index.js.map +7 -0
  369. package/dist/directmessages/useChats.js +266 -0
  370. package/dist/directmessages/useChats.js.map +7 -0
  371. package/dist/directmessages/utils.js +23 -0
  372. package/dist/directmessages/utils.js.map +7 -0
  373. package/dist/document-tools/can-annotate.js +7 -0
  374. package/dist/document-tools/can-annotate.js.map +7 -0
  375. package/dist/document-tools/core.js +218 -12
  376. package/dist/document-tools/core.js.map +7 -1
  377. package/dist/document-tools/document-pdf.js +76 -0
  378. package/dist/document-tools/document-pdf.js.map +7 -0
  379. package/dist/document-tools/environment.js +136 -0
  380. package/dist/document-tools/environment.js.map +7 -0
  381. package/dist/document-tools/file-shares.js +112 -0
  382. package/dist/document-tools/file-shares.js.map +7 -0
  383. package/dist/document-tools/frozen-copy.js +27 -0
  384. package/dist/document-tools/frozen-copy.js.map +7 -0
  385. package/dist/document-tools/index.js +26 -148
  386. package/dist/document-tools/index.js.map +7 -1
  387. package/dist/document-tools/markup-download.js +51 -0
  388. package/dist/document-tools/markup-download.js.map +7 -0
  389. package/dist/document-tools/markup-store.js +138 -0
  390. package/dist/document-tools/markup-store.js.map +7 -0
  391. package/dist/document-tools/markup-transfer.js +88 -0
  392. package/dist/document-tools/markup-transfer.js.map +7 -0
  393. package/dist/document-tools/production.js +147 -0
  394. package/dist/document-tools/production.js.map +7 -0
  395. package/dist/document-tools/saved-signature.js +90 -0
  396. package/dist/document-tools/saved-signature.js.map +7 -0
  397. package/dist/document-tools/signature-requests.js +310 -0
  398. package/dist/document-tools/signature-requests.js.map +7 -0
  399. package/dist/document-tools/signing.js +127 -0
  400. package/dist/document-tools/signing.js.map +7 -0
  401. package/dist/document-tools/useDocumentBytes.js +38 -0
  402. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  403. package/dist/document-tools/useDocumentMarkup.js +154 -0
  404. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  405. package/dist/document-tools/useIsOnline.js +13 -0
  406. package/dist/document-tools/useIsOnline.js.map +7 -0
  407. package/dist/document-tools/verification.js +60 -0
  408. package/dist/document-tools/verification.js.map +7 -0
  409. package/dist/documents/DocumentReview.js +220 -0
  410. package/dist/documents/DocumentReview.js.map +7 -0
  411. package/dist/documents/DraftTitleControls.js +41 -0
  412. package/dist/documents/DraftTitleControls.js.map +7 -0
  413. package/dist/documents/InlineMicButton.js +90 -0
  414. package/dist/documents/InlineMicButton.js.map +7 -0
  415. package/dist/documents/MicRecordingOverlay.js +29 -0
  416. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  417. package/dist/documents/MicWaveformIndicator.js +68 -0
  418. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  419. package/dist/documents/PhotoCapture.js +120 -0
  420. package/dist/documents/PhotoCapture.js.map +7 -0
  421. package/dist/documents/VideoCapture.js +129 -0
  422. package/dist/documents/VideoCapture.js.map +7 -0
  423. package/dist/documents/VoiceNoteRecorder.js +166 -0
  424. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  425. package/dist/documents/audio-segmenter.js +63 -0
  426. package/dist/documents/audio-segmenter.js.map +7 -0
  427. package/dist/documents/capture-frame.js +21 -0
  428. package/dist/documents/capture-frame.js.map +7 -0
  429. package/dist/documents/chunked-recorder.js +190 -0
  430. package/dist/documents/chunked-recorder.js.map +7 -0
  431. package/dist/documents/document-download.js +53 -0
  432. package/dist/documents/document-download.js.map +7 -0
  433. package/dist/documents/document-fields.js +109 -0
  434. package/dist/documents/document-fields.js.map +7 -0
  435. package/dist/documents/documents-cache.js +110 -0
  436. package/dist/documents/documents-cache.js.map +7 -0
  437. package/dist/documents/documents-data.js +128 -0
  438. package/dist/documents/documents-data.js.map +7 -0
  439. package/dist/documents/documents-loader.js +113 -0
  440. package/dist/documents/documents-loader.js.map +7 -0
  441. package/dist/documents/documents-writes.js +448 -0
  442. package/dist/documents/documents-writes.js.map +7 -0
  443. package/dist/documents/format-elapsed.js +10 -0
  444. package/dist/documents/format-elapsed.js.map +7 -0
  445. package/dist/documents/has-video-track.js +26 -0
  446. package/dist/documents/has-video-track.js.map +7 -0
  447. package/dist/documents/index.js +266 -0
  448. package/dist/documents/index.js.map +7 -0
  449. package/dist/documents/media-error.js +18 -0
  450. package/dist/documents/media-error.js.map +7 -0
  451. package/dist/documents/offline-documents.js +160 -0
  452. package/dist/documents/offline-documents.js.map +7 -0
  453. package/dist/documents/pending-sync.js +210 -0
  454. package/dist/documents/pending-sync.js.map +7 -0
  455. package/dist/documents/processing-live.js +122 -0
  456. package/dist/documents/processing-live.js.map +7 -0
  457. package/dist/documents/processing-order.js +59 -0
  458. package/dist/documents/processing-order.js.map +7 -0
  459. package/dist/documents/processing-settle.js +21 -0
  460. package/dist/documents/processing-settle.js.map +7 -0
  461. package/dist/documents/related-documents.js +133 -0
  462. package/dist/documents/related-documents.js.map +7 -0
  463. package/dist/documents/support.js +29 -0
  464. package/dist/documents/support.js.map +7 -0
  465. package/dist/documents/upload-files.js +169 -0
  466. package/dist/documents/upload-files.js.map +7 -0
  467. package/dist/documents/useAudioRecorder.js +315 -0
  468. package/dist/documents/useAudioRecorder.js.map +7 -0
  469. package/dist/documents/useCameraStream.js +35 -0
  470. package/dist/documents/useCameraStream.js.map +7 -0
  471. package/dist/documents/useDocumentThumbnails.js +71 -0
  472. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  473. package/dist/documents/useDownloadDocuments.js +90 -0
  474. package/dist/documents/useDownloadDocuments.js.map +7 -0
  475. package/dist/documents/usePassageQuotes.js +37 -0
  476. package/dist/documents/usePassageQuotes.js.map +7 -0
  477. package/dist/documents/useUploadFiles.js +165 -0
  478. package/dist/documents/useUploadFiles.js.map +7 -0
  479. package/dist/documents/useUploadFromUrls.js +63 -0
  480. package/dist/documents/useUploadFromUrls.js.map +7 -0
  481. package/dist/documents/useVideoRecorder.js +62 -0
  482. package/dist/documents/useVideoRecorder.js.map +7 -0
  483. package/dist/entities/AgentMarkers.js +61 -0
  484. package/dist/entities/AgentMarkers.js.map +7 -0
  485. package/dist/entities/DocumentEntity.js +125 -0
  486. package/dist/entities/DocumentEntity.js.map +7 -0
  487. package/dist/entities/EntityPill.js +250 -0
  488. package/dist/entities/EntityPill.js.map +7 -0
  489. package/dist/entities/ProjectEntity.js +61 -0
  490. package/dist/entities/ProjectEntity.js.map +7 -0
  491. package/dist/entities/ShieldIcon.js +49 -0
  492. package/dist/entities/ShieldIcon.js.map +7 -0
  493. package/dist/entities/TagEntity.js +79 -0
  494. package/dist/entities/TagEntity.js.map +7 -0
  495. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  496. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  497. package/dist/entities/UserEntity.js +211 -0
  498. package/dist/entities/UserEntity.js.map +7 -0
  499. package/dist/entities/VerifiedBadge.js +19 -0
  500. package/dist/entities/VerifiedBadge.js.map +7 -0
  501. package/dist/entities/agent-avatar-colors.js +26 -0
  502. package/dist/entities/agent-avatar-colors.js.map +7 -0
  503. package/dist/entities/colors.js +64 -0
  504. package/dist/entities/colors.js.map +7 -0
  505. package/dist/entities/file-type.js +151 -0
  506. package/dist/entities/file-type.js.map +7 -0
  507. package/dist/entities/index.js +100 -0
  508. package/dist/entities/index.js.map +7 -0
  509. package/dist/entities/media-type.js +61 -0
  510. package/dist/entities/media-type.js.map +7 -0
  511. package/dist/entities/registry.js +385 -0
  512. package/dist/entities/registry.js.map +7 -0
  513. package/dist/entities/status.js +43 -0
  514. package/dist/entities/status.js.map +7 -0
  515. package/dist/entities/tag-kinds.js +23 -0
  516. package/dist/entities/tag-kinds.js.map +7 -0
  517. package/dist/entities/tag-types.js +44 -0
  518. package/dist/entities/tag-types.js.map +7 -0
  519. package/dist/entities/vocabulary.js +12 -0
  520. package/dist/entities/vocabulary.js.map +7 -0
  521. package/dist/entity-extraction.js +25 -0
  522. package/dist/entity-extraction.js.map +7 -0
  523. package/dist/facts-search.js +57 -0
  524. package/dist/facts-search.js.map +7 -0
  525. package/dist/facts.js +69 -0
  526. package/dist/facts.js.map +7 -0
  527. package/dist/hooks.js +320 -0
  528. package/dist/hooks.js.map +7 -0
  529. package/dist/host/ArbiHost.js +24 -0
  530. package/dist/host/ArbiHost.js.map +7 -0
  531. package/dist/host/assistant-copy.js +54 -0
  532. package/dist/host/assistant-copy.js.map +7 -0
  533. package/dist/host/config.js +9 -0
  534. package/dist/host/config.js.map +7 -0
  535. package/dist/host/context.js +10 -0
  536. package/dist/host/context.js.map +7 -0
  537. package/dist/host/features.js +144 -0
  538. package/dist/host/features.js.map +7 -0
  539. package/dist/host/index.js +12 -0
  540. package/dist/host/index.js.map +7 -0
  541. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  542. package/dist/host/merge.js.map +7 -0
  543. package/dist/house-template.js +40 -0
  544. package/dist/house-template.js.map +7 -0
  545. package/dist/icons/AppleIcon.js +25 -0
  546. package/dist/icons/AppleIcon.js.map +7 -0
  547. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  548. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  549. package/dist/icons/ArbiIcon.js +24 -0
  550. package/dist/icons/ArbiIcon.js.map +7 -0
  551. package/dist/icons/AudIcon.js +56 -0
  552. package/dist/icons/AudIcon.js.map +7 -0
  553. package/dist/icons/ClaudeIcon.js +28 -0
  554. package/dist/icons/ClaudeIcon.js.map +7 -0
  555. package/dist/icons/DocIcon.js +56 -0
  556. package/dist/icons/DocIcon.js.map +7 -0
  557. package/dist/icons/EmlIcon.js +57 -0
  558. package/dist/icons/EmlIcon.js.map +7 -0
  559. package/dist/icons/FireworksIcon.js +47 -0
  560. package/dist/icons/FireworksIcon.js.map +7 -0
  561. package/dist/icons/GeminiIcon.js +37 -0
  562. package/dist/icons/GeminiIcon.js.map +7 -0
  563. package/dist/icons/GitHubIcon.js +32 -0
  564. package/dist/icons/GitHubIcon.js.map +7 -0
  565. package/dist/icons/GoogleIcon.js +53 -0
  566. package/dist/icons/GoogleIcon.js.map +7 -0
  567. package/dist/icons/HtmlIcon.js +56 -0
  568. package/dist/icons/HtmlIcon.js.map +7 -0
  569. package/dist/icons/ImgIcon.js +56 -0
  570. package/dist/icons/ImgIcon.js.map +7 -0
  571. package/dist/icons/LinkedInIcon.js +25 -0
  572. package/dist/icons/LinkedInIcon.js.map +7 -0
  573. package/dist/icons/OpenAIIcon.js +28 -0
  574. package/dist/icons/OpenAIIcon.js.map +7 -0
  575. package/dist/icons/PdfIcon.js +56 -0
  576. package/dist/icons/PdfIcon.js.map +7 -0
  577. package/dist/icons/ProviderIcon.js +42 -0
  578. package/dist/icons/ProviderIcon.js.map +7 -0
  579. package/dist/icons/TxtIcon.js +56 -0
  580. package/dist/icons/TxtIcon.js.map +7 -0
  581. package/dist/icons/VidIcon.js +56 -0
  582. package/dist/icons/VidIcon.js.map +7 -0
  583. package/dist/icons/XlsIcon.js +56 -0
  584. package/dist/icons/XlsIcon.js.map +7 -0
  585. package/dist/icons/arbi-mark.js +5 -0
  586. package/dist/icons/arbi-mark.js.map +7 -0
  587. package/dist/icons/colors.js +31 -0
  588. package/dist/icons/colors.js.map +7 -0
  589. package/dist/icons/file-type.js +105 -0
  590. package/dist/icons/file-type.js.map +7 -0
  591. package/dist/icons/index.js +55 -0
  592. package/dist/icons/index.js.map +7 -0
  593. package/dist/imagecrop/ImageCropModal.js +56 -0
  594. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  595. package/dist/imagecrop/ImageCropper.js +100 -0
  596. package/dist/imagecrop/ImageCropper.js.map +7 -0
  597. package/dist/imagecrop/cropImage.js +43 -0
  598. package/dist/imagecrop/cropImage.js.map +7 -0
  599. package/dist/imagecrop/index.js +13 -0
  600. package/dist/imagecrop/index.js.map +7 -0
  601. package/dist/index.js +702 -17116
  602. package/dist/index.js.map +7 -1
  603. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  604. package/dist/lazy-chunk.js.map +7 -0
  605. package/dist/lib/collision-padding.js +13 -0
  606. package/dist/lib/collision-padding.js.map +7 -0
  607. package/dist/lib/format-friendly-date.js +55 -0
  608. package/dist/lib/format-friendly-date.js.map +7 -0
  609. package/dist/lib/format-relative-time.js +52 -0
  610. package/dist/lib/format-relative-time.js.map +7 -0
  611. package/dist/lib/markdown-to-text.js +35 -0
  612. package/dist/lib/markdown-to-text.js.map +7 -0
  613. package/dist/lib/toast-interaction.js +9 -0
  614. package/dist/lib/toast-interaction.js.map +7 -0
  615. package/dist/lib/utils.js +9 -0
  616. package/dist/lib/utils.js.map +7 -0
  617. package/dist/mail/client.js +103 -0
  618. package/dist/mail/client.js.map +7 -0
  619. package/dist/mail/document-attachment.js +38 -0
  620. package/dist/mail/document-attachment.js.map +7 -0
  621. package/dist/mail/filing.js +132 -0
  622. package/dist/mail/filing.js.map +7 -0
  623. package/dist/mail/hooks.js +393 -0
  624. package/dist/mail/hooks.js.map +7 -0
  625. package/dist/mail/index.js +120 -0
  626. package/dist/mail/index.js.map +7 -0
  627. package/dist/mail/offline/changes.js +258 -0
  628. package/dist/mail/offline/changes.js.map +7 -0
  629. package/dist/mail/offline/confirm-sign-out.js +37 -0
  630. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  631. package/dist/mail/offline/crypto.js +26 -0
  632. package/dist/mail/offline/crypto.js.map +7 -0
  633. package/dist/mail/offline/drafts.js +69 -0
  634. package/dist/mail/offline/drafts.js.map +7 -0
  635. package/dist/mail/offline/hooks.js +104 -0
  636. package/dist/mail/offline/hooks.js.map +7 -0
  637. package/dist/mail/offline/index.js +48 -0
  638. package/dist/mail/offline/index.js.map +7 -0
  639. package/dist/mail/offline/live.js +233 -0
  640. package/dist/mail/offline/live.js.map +7 -0
  641. package/dist/mail/offline/mailbox.js +191 -0
  642. package/dist/mail/offline/mailbox.js.map +7 -0
  643. package/dist/mail/offline/outbox.js +167 -0
  644. package/dist/mail/offline/outbox.js.map +7 -0
  645. package/dist/mail/offline/reads.js +159 -0
  646. package/dist/mail/offline/reads.js.map +7 -0
  647. package/dist/mail/offline/runtime.js +100 -0
  648. package/dist/mail/offline/runtime.js.map +7 -0
  649. package/dist/mail/offline/settings.js +84 -0
  650. package/dist/mail/offline/settings.js.map +7 -0
  651. package/dist/mail/offline/store.js +29 -0
  652. package/dist/mail/offline/store.js.map +7 -0
  653. package/dist/mail/offline/sync.js +251 -0
  654. package/dist/mail/offline/sync.js.map +7 -0
  655. package/dist/mail/offline/wipe.js +19 -0
  656. package/dist/mail/offline/wipe.js.map +7 -0
  657. package/dist/mail/thread-keys.js +53 -0
  658. package/dist/mail/thread-keys.js.map +7 -0
  659. package/dist/mail/threads.js +71 -0
  660. package/dist/mail/threads.js.map +7 -0
  661. package/dist/mail/useMailClient.js +42 -0
  662. package/dist/mail/useMailClient.js.map +7 -0
  663. package/dist/model-connections.js +58 -0
  664. package/dist/model-connections.js.map +7 -0
  665. package/dist/notifications/ActivityFeed.js +70 -0
  666. package/dist/notifications/ActivityFeed.js.map +7 -0
  667. package/dist/notifications/NotificationBell.js +200 -0
  668. package/dist/notifications/NotificationBell.js.map +7 -0
  669. package/dist/notifications/Toaster.js +24 -0
  670. package/dist/notifications/Toaster.js.map +7 -0
  671. package/dist/notifications/activity-types.js +65 -0
  672. package/dist/notifications/activity-types.js.map +7 -0
  673. package/dist/notifications/bell.js +24 -0
  674. package/dist/notifications/bell.js.map +7 -0
  675. package/dist/notifications/calendar-notifications.js +79 -0
  676. package/dist/notifications/calendar-notifications.js.map +7 -0
  677. package/dist/notifications/index.js +108 -0
  678. package/dist/notifications/index.js.map +7 -0
  679. package/dist/notifications/live.js +28 -0
  680. package/dist/notifications/live.js.map +7 -0
  681. package/dist/notifications/notification-types.js +127 -0
  682. package/dist/notifications/notification-types.js.map +7 -0
  683. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  684. package/dist/notifications/notify-store.js.map +7 -0
  685. package/dist/notifications/server-notifications.js +452 -0
  686. package/dist/notifications/server-notifications.js.map +7 -0
  687. package/dist/notifications/useNotifications.js +34 -0
  688. package/dist/notifications/useNotifications.js.map +7 -0
  689. package/dist/offline-store/network.js +11 -0
  690. package/dist/offline-store/network.js.map +7 -0
  691. package/dist/offline-store/store.js +136 -0
  692. package/dist/offline-store/store.js.map +7 -0
  693. package/dist/offline-store/wipe.js +8 -0
  694. package/dist/offline-store/wipe.js.map +7 -0
  695. package/dist/offline.js +58 -0
  696. package/dist/offline.js.map +7 -0
  697. package/dist/people.js +122 -0
  698. package/dist/people.js.map +7 -0
  699. package/dist/projects.js +30 -0
  700. package/dist/projects.js.map +7 -0
  701. package/dist/query-client.js +63 -0
  702. package/dist/query-client.js.map +7 -0
  703. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  704. package/dist/query-keys.js.map +7 -0
  705. package/dist/query-persist.js +66 -0
  706. package/dist/query-persist.js.map +7 -0
  707. package/dist/queued-writes.js +59 -0
  708. package/dist/queued-writes.js.map +7 -0
  709. package/dist/remote-control.js +67 -0
  710. package/dist/remote-control.js.map +7 -0
  711. package/dist/search/index.js +23 -0
  712. package/dist/search/index.js.map +7 -0
  713. package/dist/search/session.js +58 -0
  714. package/dist/search/session.js.map +7 -0
  715. package/dist/search/useSemanticSearch.js +82 -0
  716. package/dist/search/useSemanticSearch.js.map +7 -0
  717. package/dist/session/chat.js +512 -0
  718. package/dist/session/chat.js.map +7 -0
  719. package/dist/session/documents.js +196 -0
  720. package/dist/session/documents.js.map +7 -0
  721. package/dist/session/drafts.js +103 -0
  722. package/dist/session/drafts.js.map +7 -0
  723. package/dist/session/index.js +123 -0
  724. package/dist/session/index.js.map +7 -0
  725. package/dist/session/layout.js +339 -0
  726. package/dist/session/layout.js.map +7 -0
  727. package/dist/session/persist.js +106 -0
  728. package/dist/session/persist.js.map +7 -0
  729. package/dist/session/session-hooks.js +53 -0
  730. package/dist/session/session-hooks.js.map +7 -0
  731. package/dist/session/signed-in.js +36 -0
  732. package/dist/session/signed-in.js.map +7 -0
  733. package/dist/session/store.js +166 -0
  734. package/dist/session/store.js.map +7 -0
  735. package/dist/session/thread-tabs.js +121 -0
  736. package/dist/session/thread-tabs.js.map +7 -0
  737. package/dist/session/ui-state-storage.js +76 -0
  738. package/dist/session/ui-state-storage.js.map +7 -0
  739. package/dist/session/workspace.js +77 -0
  740. package/dist/session/workspace.js.map +7 -0
  741. package/dist/shell/index.js +43 -10
  742. package/dist/shell/index.js.map +7 -1
  743. package/dist/skill-pack.js +111 -0
  744. package/dist/skill-pack.js.map +7 -0
  745. package/dist/storage.js +186 -0
  746. package/dist/storage.js.map +7 -0
  747. package/dist/support/index.js +35 -0
  748. package/dist/support/index.js.map +7 -0
  749. package/dist/tags.js +204 -0
  750. package/dist/tags.js.map +7 -0
  751. package/dist/ui/DebouncedInput.js +109 -0
  752. package/dist/ui/DebouncedInput.js.map +7 -0
  753. package/dist/ui/DictateContext.js +8 -0
  754. package/dist/ui/DictateContext.js.map +7 -0
  755. package/dist/ui/IconToggle.js +79 -0
  756. package/dist/ui/IconToggle.js.map +7 -0
  757. package/dist/ui/VerifiedToggle.js +38 -0
  758. package/dist/ui/VerifiedToggle.js.map +7 -0
  759. package/dist/ui/VisibilityToggle.js +103 -0
  760. package/dist/ui/VisibilityToggle.js.map +7 -0
  761. package/dist/ui/avatar.js +40 -0
  762. package/dist/ui/avatar.js.map +7 -0
  763. package/dist/ui/badge.js +28 -0
  764. package/dist/ui/badge.js.map +7 -0
  765. package/dist/ui/button.js +48 -0
  766. package/dist/ui/button.js.map +7 -0
  767. package/dist/ui/card.js +90 -0
  768. package/dist/ui/card.js.map +7 -0
  769. package/dist/ui/checkbox.js +22 -0
  770. package/dist/ui/checkbox.js.map +7 -0
  771. package/dist/ui/collapsible.js +10 -0
  772. package/dist/ui/collapsible.js.map +7 -0
  773. package/dist/ui/command.js +103 -0
  774. package/dist/ui/command.js.map +7 -0
  775. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  776. package/dist/ui/dialog.js.map +7 -0
  777. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  778. package/dist/ui/dropdown-menu.js.map +7 -0
  779. package/dist/ui/hover-card.js +36 -0
  780. package/dist/ui/hover-card.js.map +7 -0
  781. package/dist/ui/index.js +290 -10
  782. package/dist/ui/index.js.map +7 -1
  783. package/dist/ui/input.js +65 -0
  784. package/dist/ui/input.js.map +7 -0
  785. package/dist/ui/label.js +16 -0
  786. package/dist/ui/label.js.map +7 -0
  787. package/dist/ui/mark-menu.js +300 -0
  788. package/dist/ui/mark-menu.js.map +7 -0
  789. package/dist/ui/popover.js +40 -0
  790. package/dist/ui/popover.js.map +7 -0
  791. package/dist/ui/portal-container.js +17 -0
  792. package/dist/ui/portal-container.js.map +7 -0
  793. package/dist/ui/progress.js +24 -0
  794. package/dist/ui/progress.js.map +7 -0
  795. package/dist/ui/radio-group.js +29 -0
  796. package/dist/ui/radio-group.js.map +7 -0
  797. package/dist/ui/scroll-area.js +39 -0
  798. package/dist/ui/scroll-area.js.map +7 -0
  799. package/dist/ui/select.js +130 -0
  800. package/dist/ui/select.js.map +7 -0
  801. package/dist/ui/separator.js +23 -0
  802. package/dist/ui/separator.js.map +7 -0
  803. package/dist/ui/slider.js +23 -0
  804. package/dist/ui/slider.js.map +7 -0
  805. package/dist/ui/switch.js +28 -0
  806. package/dist/ui/switch.js.map +7 -0
  807. package/dist/ui/table.js +75 -0
  808. package/dist/ui/table.js.map +7 -0
  809. package/dist/ui/tabs.js +48 -0
  810. package/dist/ui/tabs.js.map +7 -0
  811. package/dist/ui/textarea.js +63 -0
  812. package/dist/ui/textarea.js.map +7 -0
  813. package/dist/ui/toggle-group.js +43 -0
  814. package/dist/ui/toggle-group.js.map +7 -0
  815. package/dist/ui/toggle.js +40 -0
  816. package/dist/ui/toggle.js.map +7 -0
  817. package/dist/ui/tooltip.js +215 -0
  818. package/dist/ui/tooltip.js.map +7 -0
  819. package/dist/usage-metered.js +8 -0
  820. package/dist/usage-metered.js.map +7 -0
  821. package/dist/useArbi.js +16 -0
  822. package/dist/useArbi.js.map +7 -0
  823. package/dist/useInstallSkillPack.js +81 -0
  824. package/dist/useInstallSkillPack.js.map +7 -0
  825. package/dist/usermenu/UserMenu.js +188 -0
  826. package/dist/usermenu/UserMenu.js.map +7 -0
  827. package/dist/usermenu/index.js +5 -0
  828. package/dist/usermenu/index.js.map +7 -0
  829. package/dist/users/index.js +15 -0
  830. package/dist/users/index.js.map +7 -0
  831. package/dist/users/user-display.js +60 -0
  832. package/dist/users/user-display.js.map +7 -0
  833. package/dist/viewers/AudioViewer.js +23 -0
  834. package/dist/viewers/AudioViewer.js.map +7 -0
  835. package/dist/viewers/DocxViewer.js +81 -0
  836. package/dist/viewers/DocxViewer.js.map +7 -0
  837. package/dist/viewers/ImageViewer.js +31 -0
  838. package/dist/viewers/ImageViewer.js.map +7 -0
  839. package/dist/viewers/PdfViewer.js +19 -3
  840. package/dist/viewers/PdfViewer.js.map +7 -1
  841. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  842. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  843. package/dist/viewers/VideoViewer.js +31 -0
  844. package/dist/viewers/VideoViewer.js.map +7 -0
  845. package/dist/viewers/XlsxViewer.js +102 -0
  846. package/dist/viewers/XlsxViewer.js.map +7 -0
  847. package/dist/viewers/index.js +61 -271
  848. package/dist/viewers/index.js.map +7 -1
  849. package/dist/viewers/page-scroll.js +59 -0
  850. package/dist/viewers/page-scroll.js.map +7 -0
  851. package/dist/viewers/pdf-viewer-constants.js +9 -0
  852. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  853. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  854. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  855. package/dist/viewers/selection-runs.js +38 -0
  856. package/dist/viewers/selection-runs.js.map +7 -0
  857. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  858. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  859. package/dist/viewers/useProcessedChunks.js +58 -0
  860. package/dist/viewers/useProcessedChunks.js.map +7 -0
  861. package/dist/viewers/viewer-zoom.js +163 -0
  862. package/dist/viewers/viewer-zoom.js.map +7 -0
  863. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  864. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  865. package/dist/websocket/context.js +14 -0
  866. package/dist/websocket/context.js.map +7 -0
  867. package/dist/websocket/hooks.js +30 -0
  868. package/dist/websocket/hooks.js.map +7 -0
  869. package/dist/websocket/index.js +22 -0
  870. package/dist/websocket/index.js.map +7 -0
  871. package/dist/websocket/live-updates.js +38 -0
  872. package/dist/websocket/live-updates.js.map +7 -0
  873. package/dist/websocket/reconnect.js +13 -0
  874. package/dist/websocket/reconnect.js.map +7 -0
  875. package/dist/websocket/store.js +58 -0
  876. package/dist/websocket/store.js.map +7 -0
  877. package/dist/workforce.js +607 -0
  878. package/dist/workforce.js.map +7 -0
  879. package/dist/workspaces/access-request.js +35 -0
  880. package/dist/workspaces/access-request.js.map +7 -0
  881. package/dist/workspaces/archive.js +59 -0
  882. package/dist/workspaces/archive.js.map +7 -0
  883. package/dist/workspaces/current.js +20 -0
  884. package/dist/workspaces/current.js.map +7 -0
  885. package/dist/workspaces/delete-workspaces.js +15 -0
  886. package/dist/workspaces/delete-workspaces.js.map +7 -0
  887. package/dist/workspaces/export-archive.js +40 -0
  888. package/dist/workspaces/export-archive.js.map +7 -0
  889. package/dist/workspaces/index.js +99 -0
  890. package/dist/workspaces/index.js.map +7 -0
  891. package/dist/workspaces/settings.js +45 -0
  892. package/dist/workspaces/settings.js.map +7 -0
  893. package/dist/workspaces/shell-workspaces.js +49 -0
  894. package/dist/workspaces/shell-workspaces.js.map +7 -0
  895. package/dist/workspaces/switch.js +234 -0
  896. package/dist/workspaces/switch.js.map +7 -0
  897. package/dist/workspaces/transfer.js +170 -0
  898. package/dist/workspaces/transfer.js.map +7 -0
  899. package/dist/workspaces/useShellWorkspaces.js +86 -0
  900. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  901. package/dist/workspaces/workspace-users.js +65 -0
  902. package/dist/workspaces/workspace-users.js.map +7 -0
  903. package/package.json +4 -4
  904. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  905. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  906. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  907. package/dist/annotations/freeze/index.d.cts +0 -205
  908. package/dist/annotations/index.d.cts +0 -360
  909. package/dist/artifacts/index.d.cts +0 -476
  910. package/dist/artifacts/redline-core.d.cts +0 -39
  911. package/dist/bundle-YNOX7VIL.js +0 -5
  912. package/dist/bundle-YNOX7VIL.js.map +0 -1
  913. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  914. package/dist/calls/livekit/index.d.cts +0 -280
  915. package/dist/chunk-47CCGUWR.js.map +0 -1
  916. package/dist/chunk-4FL3X3LA.js +0 -2057
  917. package/dist/chunk-4FL3X3LA.js.map +0 -1
  918. package/dist/chunk-6QNBSXCE.js +0 -271
  919. package/dist/chunk-6QNBSXCE.js.map +0 -1
  920. package/dist/chunk-74N436VK.js.map +0 -1
  921. package/dist/chunk-APZZQZ6P.js +0 -147
  922. package/dist/chunk-APZZQZ6P.js.map +0 -1
  923. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  924. package/dist/chunk-DPYBZDJB.js.map +0 -1
  925. package/dist/chunk-DZKRL5H3.js +0 -2766
  926. package/dist/chunk-DZKRL5H3.js.map +0 -1
  927. package/dist/chunk-HDCRPPBW.js +0 -75
  928. package/dist/chunk-HDCRPPBW.js.map +0 -1
  929. package/dist/chunk-L2IPPTVC.js +0 -20
  930. package/dist/chunk-L2IPPTVC.js.map +0 -1
  931. package/dist/chunk-LSU4UPS5.js +0 -1011
  932. package/dist/chunk-LSU4UPS5.js.map +0 -1
  933. package/dist/chunk-NIKPG4PW.js +0 -1128
  934. package/dist/chunk-NIKPG4PW.js.map +0 -1
  935. package/dist/chunk-NNAJLY6B.js +0 -4974
  936. package/dist/chunk-NNAJLY6B.js.map +0 -1
  937. package/dist/chunk-OYPKKHXY.js +0 -559
  938. package/dist/chunk-OYPKKHXY.js.map +0 -1
  939. package/dist/chunk-PTOP7OHG.js.map +0 -1
  940. package/dist/chunk-QMY2JKBI.js +0 -246
  941. package/dist/chunk-QMY2JKBI.js.map +0 -1
  942. package/dist/chunk-SN5YV6FF.js +0 -11
  943. package/dist/chunk-SN5YV6FF.js.map +0 -1
  944. package/dist/chunk-SSXFVWCT.js.map +0 -1
  945. package/dist/chunk-T3USOSVN.js.map +0 -1
  946. package/dist/chunk-T4CLW3DN.js +0 -2560
  947. package/dist/chunk-T4CLW3DN.js.map +0 -1
  948. package/dist/chunk-UW2SGTI5.js.map +0 -1
  949. package/dist/chunk-VSCU7K4V.js.map +0 -1
  950. package/dist/chunk-WL2Y2T47.js.map +0 -1
  951. package/dist/chunk-WUTL62MC.js.map +0 -1
  952. package/dist/chunk-XWPLOFDN.js +0 -644
  953. package/dist/chunk-XWPLOFDN.js.map +0 -1
  954. package/dist/chunk-Y3MTRA7D.js +0 -97
  955. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  956. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  957. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  958. package/dist/document-tools/core.d.cts +0 -883
  959. package/dist/document-tools/index.d.cts +0 -90
  960. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  961. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  962. package/dist/index.d.cts +0 -15923
  963. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  964. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  965. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  966. package/dist/shell/index.d.cts +0 -6
  967. package/dist/store.d-GADDvC7w.d.cts +0 -35
  968. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  969. package/dist/ui/index.d.cts +0 -26
  970. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  971. package/dist/viewers/PdfViewer.d.cts +0 -9
  972. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,49 @@
1
+ const DRAW_TOOLS = ["box", "comment", "stamp", "redact-area"];
2
+ const TEXT_TOOLS = ["highlight", "redact-text"];
3
+ const DEFAULT_SETTINGS = {
4
+ colors: { highlight: "#ffe066", box: "#e03131", stamp: "#c92a2a" },
5
+ stampLabel: "[REDACTED]",
6
+ stampImage: null,
7
+ redactionReason: "Privileged",
8
+ strokeWidth: 2
9
+ };
10
+ const HIGHLIGHT_COLORS = ["#ffe066", "#8ce99a", "#74c0fc", "#ffa8a8", "#eebefa"];
11
+ const MARK_COLORS = ["#e03131", "#1c7ed6", "#2f9e44", "#f08c00", "#000000"];
12
+ const STAMP_PRESETS = [
13
+ "[REDACTED]",
14
+ "CONFIDENTIAL",
15
+ "DRAFT",
16
+ "APPROVED",
17
+ "FILED",
18
+ "PRIVILEGED",
19
+ "COPY"
20
+ ];
21
+ const REDACTION_REASONS = [
22
+ "Privileged",
23
+ "Confidential",
24
+ "Personal data",
25
+ "Commercial",
26
+ "Irrelevant"
27
+ ];
28
+ function layerStatusText(controller) {
29
+ if (controller.status === "error") return "Could not be loaded";
30
+ if (controller.readOnly) return "View only";
31
+ if (controller.offline) {
32
+ return controller.dirty ? "Offline \u2014 will save when back online" : "Offline";
33
+ }
34
+ if (controller.error) return "Not saved \u2014 retrying";
35
+ if (controller.saving) return "Saving\u2026";
36
+ if (controller.dirty) return "Unsaved changes";
37
+ return "Saved";
38
+ }
39
+ export {
40
+ DEFAULT_SETTINGS,
41
+ DRAW_TOOLS,
42
+ HIGHLIGHT_COLORS,
43
+ MARK_COLORS,
44
+ REDACTION_REASONS,
45
+ STAMP_PRESETS,
46
+ TEXT_TOOLS,
47
+ layerStatusText
48
+ };
49
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/annotations/controller.ts"],
4
+ "sourcesContent": ["/**\n * The contract between the annotation state (`useAnnotationLayer`) and the UI that draws it\n * (`AnnotationPageOverlay`, `AnnotationToolbar`). Components take a controller as a prop and hold\n * no annotation state of their own beyond transient drags.\n */\n\nimport type { Annotation, AnnotationLayer, RedactionStatus } from './model'\nimport type { AnnotationPatch } from './state'\n\nexport type AnnotationTool =\n 'select' | 'highlight' | 'box' | 'comment' | 'stamp' | 'redact-area' | 'redact-text'\n\nexport const DRAW_TOOLS: readonly AnnotationTool[] = ['box', 'comment', 'stamp', 'redact-area']\nexport const TEXT_TOOLS: readonly AnnotationTool[] = ['highlight', 'redact-text']\n\n/** Tools that colour what they make. */\nexport type ColoredTool = 'highlight' | 'box' | 'stamp'\n\nexport interface ToolSettings {\n colors: Record<ColoredTool, string>\n stampLabel: string\n /** The stamp tool places this picture (one's saved signature or initials) instead of a label. */\n stampImage: { image: string; label: string } | null\n redactionReason: string\n /** Box outline width in points. */\n strokeWidth: number\n}\n\nexport const DEFAULT_SETTINGS: ToolSettings = {\n colors: { highlight: '#ffe066', box: '#e03131', stamp: '#c92a2a' },\n stampLabel: '[REDACTED]',\n stampImage: null,\n redactionReason: 'Privileged',\n strokeWidth: 2,\n}\n\nexport const HIGHLIGHT_COLORS = ['#ffe066', '#8ce99a', '#74c0fc', '#ffa8a8', '#eebefa']\nexport const MARK_COLORS = ['#e03131', '#1c7ed6', '#2f9e44', '#f08c00', '#000000']\nexport const STAMP_PRESETS = [\n '[REDACTED]',\n 'CONFIDENTIAL',\n 'DRAFT',\n 'APPROVED',\n 'FILED',\n 'PRIVILEGED',\n 'COPY',\n]\nexport const REDACTION_REASONS = [\n 'Privileged',\n 'Confidential',\n 'Personal data',\n 'Commercial',\n 'Irrelevant',\n]\n\n/** A mark as the UI describes it: identity, author and timestamps are added by the controller. */\nexport type NewMark = Annotation extends infer A\n ? A extends Annotation\n ? Omit<A, 'id' | 'author' | 'createdAt' | 'updatedAt'>\n : never\n : never\n\nexport type LayerStatus = 'loading' | 'ready' | 'error'\n\nexport interface AnnotationController {\n layer: AnnotationLayer\n status: LayerStatus\n /** The last load, save or validation failure, for the UI to show. */\n error: string | null\n saving: boolean\n /** True when edits have not reached the store yet. */\n dirty: boolean\n /** The device is offline (or the store unreachable): edits are kept and saved when it is back. */\n offline: boolean\n /** View only (e.g. a guest on a shared document): marks show, nothing can be changed. */\n readOnly: boolean\n author: string\n\n tool: AnnotationTool\n setTool(tool: AnnotationTool): void\n settings: ToolSettings\n setSettings(patch: Partial<ToolSettings>): void\n selectedId: string | null\n select(id: string | null): void\n\n add(mark: NewMark): string | null\n /** Add several marks as ONE undo step (e.g. a selection spanning pages). */\n addMany(marks: NewMark[]): string[]\n update(id: string, patch: AnnotationPatch): void\n remove(id: string): void\n setRedactionStatus(ids: string[], status: RedactionStatus): void\n reply(id: string, body: string): void\n resolve(id: string, resolved: boolean): void\n\n undo(): void\n redo(): void\n canUndo: boolean\n canRedo: boolean\n /** Write to the store now (before leaving the page). */\n flush(): Promise<void>\n}\n\n/** The save state in words, as the toolbar shows it. */\nexport function layerStatusText(controller: AnnotationController): string {\n if (controller.status === 'error') return 'Could not be loaded'\n if (controller.readOnly) return 'View only'\n if (controller.offline) {\n return controller.dirty ? 'Offline \u2014 will save when back online' : 'Offline'\n }\n if (controller.error) return 'Not saved \u2014 retrying'\n if (controller.saving) return 'Saving\u2026'\n if (controller.dirty) return 'Unsaved changes'\n return 'Saved'\n}\n"],
5
+ "mappings": "AAYO,MAAM,aAAwC,CAAC,OAAO,WAAW,SAAS,aAAa;AACvF,MAAM,aAAwC,CAAC,aAAa,aAAa;AAezE,MAAM,mBAAiC;AAAA,EAC5C,QAAQ,EAAE,WAAW,WAAW,KAAK,WAAW,OAAO,UAAU;AAAA,EACjE,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,aAAa;AACf;AAEO,MAAM,mBAAmB,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAC/E,MAAM,cAAc,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAC1E,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,MAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAkDO,SAAS,gBAAgB,YAA0C;AACxE,MAAI,WAAW,WAAW,QAAS,QAAO;AAC1C,MAAI,WAAW,SAAU,QAAO;AAChC,MAAI,WAAW,SAAS;AACtB,WAAO,WAAW,QAAQ,8CAAyC;AAAA,EACrE;AACA,MAAI,WAAW,MAAO,QAAO;AAC7B,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,MAAO,QAAO;AAC7B,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ import { pdfjs } from "react-pdf";
2
+ import { isEffectiveRedaction } from "../model.js";
3
+ import { freezePdf } from "./freeze.js";
4
+ import { browserCanvasFactory, createPdfJsRasterizer } from "./raster.js";
5
+ async function freezePdfInBrowser(bytes, layer, { assets, password, ...options }) {
6
+ const needsRaster = options.mode === "image" || layer.annotations.some(isEffectiveRedaction);
7
+ const rasterizer = needsRaster ? await createPdfJsRasterizer(pdfjs, bytes, browserCanvasFactory(), {
8
+ password,
9
+ documentOptions: {
10
+ cMapUrl: assets?.cMapUrl ?? "/cmaps/",
11
+ cMapPacked: true,
12
+ standardFontDataUrl: assets?.standardFontDataUrl ?? "/standard_fonts/",
13
+ wasmUrl: assets?.wasmUrl ?? "/wasm/"
14
+ }
15
+ }) : void 0;
16
+ return freezePdf(bytes, layer, { ...options, rasterizer });
17
+ }
18
+ export {
19
+ freezePdfInBrowser
20
+ };
21
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/annotations/freeze/browser.ts"],
4
+ "sourcesContent": ["/**\n * Freeze in the browser: wires the pdf.js already loaded for viewing (via react-pdf) into the\n * rasteriser, so a frozen copy is produced client-side and the document never leaves the device.\n */\n\nimport { pdfjs } from 'react-pdf'\nimport type { PdfViewerAssets } from '../../viewers/PdfViewer'\nimport { isEffectiveRedaction, type AnnotationLayer } from '../model'\nimport { freezePdf } from './freeze'\nimport { browserCanvasFactory, createPdfJsRasterizer, type PdfJsModule } from './raster'\nimport type { FreezeOptions, FreezeResult } from './types'\n\nexport type BrowserFreezeOptions = Omit<FreezeOptions, 'rasterizer'> & {\n /** Where the app serves pdf.js cmaps, fonts and wasm from; same shape the viewer takes. */\n assets?: PdfViewerAssets\n password?: string\n}\n\nexport async function freezePdfInBrowser(\n bytes: Uint8Array,\n layer: AnnotationLayer,\n { assets, password, ...options }: BrowserFreezeOptions\n): Promise<FreezeResult> {\n // Redactions always produce an image copy, so a rasteriser is needed whenever they apply.\n const needsRaster = options.mode === 'image' || layer.annotations.some(isEffectiveRedaction)\n const rasterizer = needsRaster\n ? await createPdfJsRasterizer(pdfjs as unknown as PdfJsModule, bytes, browserCanvasFactory(), {\n password,\n documentOptions: {\n cMapUrl: assets?.cMapUrl ?? '/cmaps/',\n cMapPacked: true,\n standardFontDataUrl: assets?.standardFontDataUrl ?? '/standard_fonts/',\n wasmUrl: assets?.wasmUrl ?? '/wasm/',\n },\n })\n : undefined\n return freezePdf(bytes, layer, { ...options, rasterizer })\n}\n"],
5
+ "mappings": "AAKA,SAAS,aAAa;AAEtB,SAAS,4BAAkD;AAC3D,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB,6BAA+C;AAS9E,eAAsB,mBACpB,OACA,OACA,EAAE,QAAQ,UAAU,GAAG,QAAQ,GACR;AAEvB,QAAM,cAAc,QAAQ,SAAS,WAAW,MAAM,YAAY,KAAK,oBAAoB;AAC3F,QAAM,aAAa,cACf,MAAM,sBAAsB,OAAiC,OAAO,qBAAqB,GAAG;AAAA,IAC1F;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS,QAAQ,WAAW;AAAA,MAC5B,YAAY;AAAA,MACZ,qBAAqB,QAAQ,uBAAuB;AAAA,MACpD,SAAS,QAAQ,WAAW;AAAA,IAC9B;AAAA,EACF,CAAC,IACD;AACJ,SAAO,UAAU,OAAO,OAAO,EAAE,GAAG,SAAS,WAAW,CAAC;AAC3D;",
6
+ "names": []
7
+ }
@@ -0,0 +1,201 @@
1
+ import { PDFDocument, PDFHexString, PDFName, StandardFonts } from "pdf-lib";
2
+ import { loadPdfDocument, readProvenance } from "./freeze.js";
3
+ import {
4
+ batesLabel,
5
+ buildQr,
6
+ drawBatesLabel,
7
+ drawQr,
8
+ validateBates
9
+ } from "./stamp.js";
10
+ import { insertIndexPages } from "./index-page.js";
11
+ import { FreezeError } from "./types.js";
12
+ import { TextSanitiser } from "./vector.js";
13
+ const BUNDLE_KEY = "ArbiBundle";
14
+ const DEFAULT_QR_CORNER = "bottom-left";
15
+ const DEFAULT_BATES_CORNER = "bottom-right";
16
+ function checkAborted(signal) {
17
+ if (signal?.aborted) throw new DOMException("Bundle aborted", "AbortError");
18
+ }
19
+ function outputName(name, used) {
20
+ const base = (name.replace(/\.pdf$/i, "").replace(/[\\/:*?"<>|]+/g, "_").trim() || "document") + ".pdf";
21
+ let candidate = base;
22
+ for (let n = 2; used.has(candidate); n++) candidate = base.replace(/\.pdf$/, `-${n}.pdf`);
23
+ used.add(candidate);
24
+ return candidate;
25
+ }
26
+ function validate(items, options) {
27
+ if (items.length === 0)
28
+ throw new FreezeError("invalid-option", "A bundle needs at least one document");
29
+ validateBates(options.bates);
30
+ if (options.qr) {
31
+ const missing = items.find((i) => !i.qrUrl);
32
+ if (missing) {
33
+ throw new FreezeError("invalid-option", `"${missing.name}" has no link for its QR code`);
34
+ }
35
+ }
36
+ const corner = options.bates.corner ?? DEFAULT_BATES_CORNER;
37
+ if (options.qr && (options.qrCorner ?? DEFAULT_QR_CORNER) === corner) {
38
+ throw new FreezeError(
39
+ "invalid-option",
40
+ "The Bates label and the QR code need different corners"
41
+ );
42
+ }
43
+ }
44
+ async function stampPages(doc, items, firstIndex, options) {
45
+ const font = await doc.embedFont(StandardFonts.Helvetica);
46
+ const sanitiser = new TextSanitiser(font);
47
+ const label = batesLabel(options.bates, firstIndex);
48
+ if (!sanitiser.supports(label)) {
49
+ throw new FreezeError(
50
+ "unsupported-text",
51
+ `Bates prefix "${options.bates.prefix}" uses characters the built-in font cannot draw`
52
+ );
53
+ }
54
+ const pages = doc.getPages();
55
+ const corner = options.bates.corner ?? DEFAULT_BATES_CORNER;
56
+ let at = 0;
57
+ for (const item of items) {
58
+ const qr = options.qr && item.qrUrl ? buildQr(item.qrUrl) : void 0;
59
+ for (let p = 0; p < item.pages; p++, at++) {
60
+ const page = pages[at];
61
+ drawBatesLabel(page, batesLabel(options.bates, firstIndex + at), font, corner);
62
+ if (qr) drawQr(page, qr, options.qrCorner ?? DEFAULT_QR_CORNER);
63
+ }
64
+ }
65
+ }
66
+ function setBundleRecord(doc, record) {
67
+ const info = doc.context.lookup(doc.context.trailerInfo.Info);
68
+ if (!info || !("set" in info)) return;
69
+ info.set(
70
+ PDFName.of(BUNDLE_KEY),
71
+ PDFHexString.fromText(JSON.stringify(record))
72
+ );
73
+ }
74
+ async function buildBundle(items, options) {
75
+ validate(items, options);
76
+ const now = options.now ?? (/* @__PURE__ */ new Date()).toISOString();
77
+ const used = /* @__PURE__ */ new Set();
78
+ const files = [];
79
+ const index = [];
80
+ const loaded = [];
81
+ for (const item of items) {
82
+ checkAborted(options.signal);
83
+ const doc = await loadPdfDocument(item.bytes);
84
+ loaded.push({ item, doc, pages: doc.getPageCount() });
85
+ }
86
+ if (options.layout === "merged") {
87
+ const out = await PDFDocument.create();
88
+ out.setProducer("ARBI");
89
+ out.setCreator("ARBI");
90
+ out.setCreationDate(new Date(now));
91
+ out.setModificationDate(new Date(now));
92
+ const provenance = {};
93
+ for (const { item, doc } of loaded) {
94
+ checkAborted(options.signal);
95
+ for (const page of await out.copyPages(doc, doc.getPageIndices())) out.addPage(page);
96
+ provenance[item.documentId] = await readProvenance(item.bytes).catch(() => null);
97
+ }
98
+ await stampPages(
99
+ out,
100
+ loaded.map(({ item, pages }) => ({ pages, qrUrl: item.qrUrl })),
101
+ 0,
102
+ options
103
+ );
104
+ const file = outputName(options.mergedName ?? "production.pdf", used);
105
+ let first2 = 0;
106
+ for (const { item, pages } of loaded) {
107
+ index.push({
108
+ documentId: item.documentId,
109
+ name: item.name,
110
+ file,
111
+ pages,
112
+ firstLabel: batesLabel(options.bates, first2),
113
+ lastLabel: batesLabel(options.bates, first2 + pages - 1)
114
+ });
115
+ first2 += pages;
116
+ }
117
+ const indexPages2 = options.indexPage ? await insertIndexPages(out, index, {
118
+ size: pageSize(loaded[0].doc),
119
+ producedAt: now,
120
+ producedBy: options.author
121
+ }) : 0;
122
+ setBundleRecord(out, {
123
+ schema: 1,
124
+ producedAt: now,
125
+ ...indexPages2 ? { indexPages: indexPages2 } : {},
126
+ ...options.author ? { producedBy: options.author } : {},
127
+ layout: "merged",
128
+ items: index.map((e) => ({
129
+ documentId: e.documentId,
130
+ name: e.name,
131
+ pages: e.pages,
132
+ firstLabel: e.firstLabel,
133
+ lastLabel: e.lastLabel,
134
+ frozen: provenance[e.documentId] ?? null
135
+ }))
136
+ });
137
+ const total = first2;
138
+ files.push({
139
+ name: file,
140
+ bytes: await out.save(),
141
+ pages: total + indexPages2,
142
+ firstLabel: batesLabel(options.bates, 0),
143
+ lastLabel: batesLabel(options.bates, total - 1)
144
+ });
145
+ options.onProgress?.(loaded.length, loaded.length);
146
+ return { files, index, indexPages: indexPages2 };
147
+ }
148
+ let first = 0;
149
+ for (const [n, { item, doc, pages }] of loaded.entries()) {
150
+ checkAborted(options.signal);
151
+ await stampPages(doc, [{ pages, qrUrl: item.qrUrl }], first, options);
152
+ doc.setModificationDate(new Date(now));
153
+ const file = outputName(item.name, used);
154
+ const entry = {
155
+ documentId: item.documentId,
156
+ name: item.name,
157
+ file,
158
+ pages,
159
+ firstLabel: batesLabel(options.bates, first),
160
+ lastLabel: batesLabel(options.bates, first + pages - 1)
161
+ };
162
+ index.push(entry);
163
+ files.push({
164
+ name: file,
165
+ bytes: await doc.save(),
166
+ pages,
167
+ firstLabel: entry.firstLabel,
168
+ lastLabel: entry.lastLabel
169
+ });
170
+ first += pages;
171
+ options.onProgress?.(n + 1, loaded.length);
172
+ }
173
+ if (!options.indexPage) return { files, index, indexPages: 0 };
174
+ const cover = await PDFDocument.create();
175
+ cover.setProducer("ARBI");
176
+ cover.setCreator("ARBI");
177
+ cover.setCreationDate(new Date(now));
178
+ const indexPages = await insertIndexPages(cover, index, {
179
+ size: pageSize(loaded[0].doc),
180
+ producedAt: now,
181
+ producedBy: options.author
182
+ });
183
+ files.unshift({
184
+ name: outputName("index.pdf", used),
185
+ bytes: await cover.save(),
186
+ pages: indexPages,
187
+ firstLabel: "",
188
+ lastLabel: ""
189
+ });
190
+ return { files, index, indexPages };
191
+ }
192
+ function pageSize(doc) {
193
+ const page = doc.getPage(0);
194
+ const { width, height } = page.getSize();
195
+ const turned = page.getRotation().angle % 180 !== 0;
196
+ return turned ? [height, width] : [width, height];
197
+ }
198
+ export {
199
+ buildBundle
200
+ };
201
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/annotations/freeze/bundle.ts"],
4
+ "sourcesContent": ["/**\n * Production bundle: take documents that are ALREADY frozen (or never needed freezing) and number\n * them consecutively with a Bates label, optionally adding a QR code that links back to the\n * document in ARBI.\n *\n * `merged` joins the documents into one PDF; `per-document` keeps one PDF each. Either way the\n * numbering runs on across the whole set in the order given, so a label is unique within the\n * production. Splitting a document is deliberately not part of this.\n *\n * `indexPage` adds an index first (every document with its Bates range): the first page(s) of a\n * merged file, or an `index.pdf` of its own ahead of the per-document files. It is not numbered.\n */\n\nimport { PDFDocument, PDFHexString, PDFName, StandardFonts } from 'pdf-lib'\nimport { loadPdfDocument, readProvenance } from './freeze'\nimport {\n batesLabel,\n buildQr,\n drawBatesLabel,\n drawQr,\n validateBates,\n type BatesOptions,\n type StampCorner,\n} from './stamp'\nimport { insertIndexPages } from './index-page'\nimport { FreezeError, type FreezeProvenance } from './types'\nimport { TextSanitiser } from './vector'\n\nconst BUNDLE_KEY = 'ArbiBundle'\nconst DEFAULT_QR_CORNER: StampCorner = 'bottom-left'\nconst DEFAULT_BATES_CORNER: StampCorner = 'bottom-right'\n\nexport type BundleLayout = 'merged' | 'per-document'\n\nexport interface BundleItem {\n /** Shown in the index and used to name the output file. */\n name: string\n /** External id of the document this PDF represents. */\n documentId: string\n /** PDF bytes, normally the output of `freezePdf`. */\n bytes: Uint8Array\n /** What the QR code opens. Required for every item when `qr` is on. */\n qrUrl?: string\n}\n\nexport interface BundleOptions {\n layout: BundleLayout\n bates: BatesOptions\n /** Add a QR code (to each item's `qrUrl`) on every page. Default false. */\n qr?: boolean\n qrCorner?: StampCorner\n /** Name of the merged file. Default `production.pdf`. */\n mergedName?: string\n /** Put an index page (documents and Bates ranges) at the start. Default false. */\n indexPage?: boolean\n /** ISO timestamp; defaults to now. Injectable for deterministic tests. */\n now?: string\n /** Who produced the set; recorded in a merged file's metadata. */\n author?: string\n onProgress?: (done: number, total: number) => void\n signal?: AbortSignal\n}\n\nexport interface BundleIndexEntry {\n documentId: string\n name: string\n /** The output file that holds this document. */\n file: string\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface BundleFile {\n name: string\n bytes: Uint8Array\n pages: number\n firstLabel: string\n lastLabel: string\n}\n\nexport interface BundleResult {\n files: BundleFile[]\n index: BundleIndexEntry[]\n /** Index pages added at the start (0 without `indexPage`). */\n indexPages: number\n}\n\nfunction checkAborted(signal?: AbortSignal) {\n if (signal?.aborted) throw new DOMException('Bundle aborted', 'AbortError')\n}\n\nfunction outputName(name: string, used: Set<string>): string {\n const base =\n (name\n .replace(/\\.pdf$/i, '')\n .replace(/[\\\\/:*?\"<>|]+/g, '_')\n .trim() || 'document') + '.pdf'\n let candidate = base\n for (let n = 2; used.has(candidate); n++) candidate = base.replace(/\\.pdf$/, `-${n}.pdf`)\n used.add(candidate)\n return candidate\n}\n\nfunction validate(items: BundleItem[], options: BundleOptions) {\n if (items.length === 0)\n throw new FreezeError('invalid-option', 'A bundle needs at least one document')\n validateBates(options.bates)\n if (options.qr) {\n const missing = items.find((i) => !i.qrUrl)\n if (missing) {\n throw new FreezeError('invalid-option', `\"${missing.name}\" has no link for its QR code`)\n }\n }\n const corner = options.bates.corner ?? DEFAULT_BATES_CORNER\n if (options.qr && (options.qrCorner ?? DEFAULT_QR_CORNER) === corner) {\n throw new FreezeError(\n 'invalid-option',\n 'The Bates label and the QR code need different corners'\n )\n }\n}\n\n/** Stamp the pages of `doc`, item by item, numbering from `firstIndex`. */\nasync function stampPages(\n doc: PDFDocument,\n items: { pages: number; qrUrl?: string }[],\n firstIndex: number,\n options: BundleOptions\n): Promise<void> {\n const font = await doc.embedFont(StandardFonts.Helvetica)\n const sanitiser = new TextSanitiser(font)\n const label = batesLabel(options.bates, firstIndex)\n if (!sanitiser.supports(label)) {\n throw new FreezeError(\n 'unsupported-text',\n `Bates prefix \"${options.bates.prefix}\" uses characters the built-in font cannot draw`\n )\n }\n const pages = doc.getPages()\n const corner = options.bates.corner ?? DEFAULT_BATES_CORNER\n let at = 0\n for (const item of items) {\n const qr = options.qr && item.qrUrl ? buildQr(item.qrUrl) : undefined\n for (let p = 0; p < item.pages; p++, at++) {\n const page = pages[at]\n drawBatesLabel(page, batesLabel(options.bates, firstIndex + at), font, corner)\n if (qr) drawQr(page, qr, options.qrCorner ?? DEFAULT_QR_CORNER)\n }\n }\n}\n\nfunction setBundleRecord(doc: PDFDocument, record: unknown) {\n const info = doc.context.lookup(doc.context.trailerInfo.Info)\n if (!info || !('set' in info)) return\n ;(info as unknown as { set(k: PDFName, v: PDFHexString): void }).set(\n PDFName.of(BUNDLE_KEY),\n PDFHexString.fromText(JSON.stringify(record))\n )\n}\n\nexport async function buildBundle(\n items: BundleItem[],\n options: BundleOptions\n): Promise<BundleResult> {\n validate(items, options)\n const now = options.now ?? new Date().toISOString()\n const used = new Set<string>()\n const files: BundleFile[] = []\n const index: BundleIndexEntry[] = []\n\n // Load everything first: a bad PDF fails the whole set before any output exists.\n const loaded: { item: BundleItem; doc: PDFDocument; pages: number }[] = []\n for (const item of items) {\n checkAborted(options.signal)\n const doc = await loadPdfDocument(item.bytes)\n loaded.push({ item, doc, pages: doc.getPageCount() })\n }\n\n if (options.layout === 'merged') {\n const out = await PDFDocument.create()\n out.setProducer('ARBI')\n out.setCreator('ARBI')\n out.setCreationDate(new Date(now))\n out.setModificationDate(new Date(now))\n const provenance: Record<string, FreezeProvenance | null> = {}\n for (const { item, doc } of loaded) {\n checkAborted(options.signal)\n for (const page of await out.copyPages(doc, doc.getPageIndices())) out.addPage(page)\n provenance[item.documentId] = await readProvenance(item.bytes).catch(() => null)\n }\n await stampPages(\n out,\n loaded.map(({ item, pages }) => ({ pages, qrUrl: item.qrUrl })),\n 0,\n options\n )\n\n const file = outputName(options.mergedName ?? 'production.pdf', used)\n let first = 0\n for (const { item, pages } of loaded) {\n index.push({\n documentId: item.documentId,\n name: item.name,\n file,\n pages,\n firstLabel: batesLabel(options.bates, first),\n lastLabel: batesLabel(options.bates, first + pages - 1),\n })\n first += pages\n }\n const indexPages = options.indexPage\n ? await insertIndexPages(out, index, {\n size: pageSize(loaded[0].doc),\n producedAt: now,\n producedBy: options.author,\n })\n : 0\n setBundleRecord(out, {\n schema: 1,\n producedAt: now,\n ...(indexPages ? { indexPages } : {}),\n ...(options.author ? { producedBy: options.author } : {}),\n layout: 'merged',\n items: index.map((e) => ({\n documentId: e.documentId,\n name: e.name,\n pages: e.pages,\n firstLabel: e.firstLabel,\n lastLabel: e.lastLabel,\n frozen: provenance[e.documentId] ?? null,\n })),\n })\n const total = first\n files.push({\n name: file,\n bytes: await out.save(),\n pages: total + indexPages,\n firstLabel: batesLabel(options.bates, 0),\n lastLabel: batesLabel(options.bates, total - 1),\n })\n options.onProgress?.(loaded.length, loaded.length)\n return { files, index, indexPages }\n }\n\n let first = 0\n for (const [n, { item, doc, pages }] of loaded.entries()) {\n checkAborted(options.signal)\n await stampPages(doc, [{ pages, qrUrl: item.qrUrl }], first, options)\n doc.setModificationDate(new Date(now))\n const file = outputName(item.name, used)\n const entry: BundleIndexEntry = {\n documentId: item.documentId,\n name: item.name,\n file,\n pages,\n firstLabel: batesLabel(options.bates, first),\n lastLabel: batesLabel(options.bates, first + pages - 1),\n }\n index.push(entry)\n files.push({\n name: file,\n bytes: await doc.save(),\n pages,\n firstLabel: entry.firstLabel,\n lastLabel: entry.lastLabel,\n })\n first += pages\n options.onProgress?.(n + 1, loaded.length)\n }\n if (!options.indexPage) return { files, index, indexPages: 0 }\n const cover = await PDFDocument.create()\n cover.setProducer('ARBI')\n cover.setCreator('ARBI')\n cover.setCreationDate(new Date(now))\n const indexPages = await insertIndexPages(cover, index, {\n size: pageSize(loaded[0].doc),\n producedAt: now,\n producedBy: options.author,\n })\n files.unshift({\n name: outputName('index.pdf', used),\n bytes: await cover.save(),\n pages: indexPages,\n firstLabel: '',\n lastLabel: '',\n })\n return { files, index, indexPages }\n}\n\n/** The displayed size of a document's first page, for an index page that matches it. */\nfunction pageSize(doc: PDFDocument): [number, number] {\n const page = doc.getPage(0)\n const { width, height } = page.getSize()\n const turned = page.getRotation().angle % 180 !== 0\n return turned ? [height, width] : [width, height]\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["first", "indexPages"]
7
+ }
@@ -0,0 +1,37 @@
1
+ function normaliseRotation(angle) {
2
+ const a = (Math.round(angle / 90) * 90 % 360 + 360) % 360;
3
+ return a;
4
+ }
5
+ function displayedSize(g) {
6
+ return g.rotation === 90 || g.rotation === 270 ? { width: g.height, height: g.width } : { width: g.width, height: g.height };
7
+ }
8
+ function displayedToUser(g, dx, dy) {
9
+ switch (g.rotation) {
10
+ case 0:
11
+ return { x: g.x + dx, y: g.y + g.height - dy };
12
+ case 90:
13
+ return { x: g.x + dy, y: g.y + dx };
14
+ case 180:
15
+ return { x: g.x + g.width - dx, y: g.y + dy };
16
+ case 270:
17
+ return { x: g.x + g.width - dy, y: g.y + g.height - dx };
18
+ }
19
+ }
20
+ function normToUserRect(g, r) {
21
+ const size = displayedSize(g);
22
+ const a = displayedToUser(g, r.x * size.width, r.y * size.height);
23
+ const b = displayedToUser(g, (r.x + r.w) * size.width, (r.y + r.h) * size.height);
24
+ return {
25
+ x: Math.min(a.x, b.x),
26
+ y: Math.min(a.y, b.y),
27
+ width: Math.abs(b.x - a.x),
28
+ height: Math.abs(b.y - a.y)
29
+ };
30
+ }
31
+ export {
32
+ displayedSize,
33
+ displayedToUser,
34
+ normToUserRect,
35
+ normaliseRotation
36
+ };
37
+ //# sourceMappingURL=coords.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/annotations/freeze/coords.ts"],
4
+ "sourcesContent": ["/**\n * Mapping between the DISPLAYED page (what a viewer shows: crop box, then /Rotate) and the PDF's\n * unrotated user space (origin bottom-left of the media box, points). Marks are stored in the\n * displayed frame; this is the only place that knows how to leave it.\n */\n\nimport type { NormRect } from '../model'\n\nexport type PageRotation = 0 | 90 | 180 | 270\n\n/** The visible box of a page in user space, plus its /Rotate. */\nexport interface PageGeometry {\n /** Crop box origin and size in user-space points. */\n x: number\n y: number\n width: number\n height: number\n rotation: PageRotation\n}\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport interface UserRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport function normaliseRotation(angle: number): PageRotation {\n const a = (((Math.round(angle / 90) * 90) % 360) + 360) % 360\n return a as PageRotation\n}\n\n/** Size of the page as displayed, in points (width and height swap at 90/270). */\nexport function displayedSize(g: PageGeometry): { width: number; height: number } {\n return g.rotation === 90 || g.rotation === 270\n ? { width: g.height, height: g.width }\n : { width: g.width, height: g.height }\n}\n\n/** A point given in displayed points from the top-left, as a user-space point. */\nexport function displayedToUser(g: PageGeometry, dx: number, dy: number): Point {\n switch (g.rotation) {\n case 0:\n return { x: g.x + dx, y: g.y + g.height - dy }\n case 90:\n return { x: g.x + dy, y: g.y + dx }\n case 180:\n return { x: g.x + g.width - dx, y: g.y + dy }\n case 270:\n return { x: g.x + g.width - dy, y: g.y + g.height - dx }\n }\n}\n\n/** The user-space bounding box of a normalised displayed rectangle. */\nexport function normToUserRect(g: PageGeometry, r: NormRect): UserRect {\n const size = displayedSize(g)\n const a = displayedToUser(g, r.x * size.width, r.y * size.height)\n const b = displayedToUser(g, (r.x + r.w) * size.width, (r.y + r.h) * size.height)\n return {\n x: Math.min(a.x, b.x),\n y: Math.min(a.y, b.y),\n width: Math.abs(b.x - a.x),\n height: Math.abs(b.y - a.y),\n }\n}\n"],
5
+ "mappings": "AAgCO,SAAS,kBAAkB,OAA6B;AAC7D,QAAM,KAAO,KAAK,MAAM,QAAQ,EAAE,IAAI,KAAM,MAAO,OAAO;AAC1D,SAAO;AACT;AAGO,SAAS,cAAc,GAAoD;AAChF,SAAO,EAAE,aAAa,MAAM,EAAE,aAAa,MACvC,EAAE,OAAO,EAAE,QAAQ,QAAQ,EAAE,MAAM,IACnC,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AACzC;AAGO,SAAS,gBAAgB,GAAiB,IAAY,IAAmB;AAC9E,UAAQ,EAAE,UAAU;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG;AAAA,IAC/C,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG;AAAA,IACpC,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,IAAI,GAAG,EAAE,IAAI,GAAG;AAAA,IAC9C,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,IAAI,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG;AAAA,EAC3D;AACF;AAGO,SAAS,eAAe,GAAiB,GAAuB;AACrE,QAAM,OAAO,cAAc,CAAC;AAC5B,QAAM,IAAI,gBAAgB,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,KAAK,MAAM;AAChE,QAAM,IAAI,gBAAgB,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,QAAQ,EAAE,IAAI,EAAE,KAAK,KAAK,MAAM;AAChF,SAAO;AAAA,IACL,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,IACpB,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,IACpB,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,IACzB,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,EAC5B;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,261 @@
1
+ import { EncryptedPDFError, PDFDocument, PDFHexString, PDFName, StandardFonts, rgb } from "pdf-lib";
2
+ import {
3
+ isEffectiveRedaction,
4
+ parseLayer
5
+ } from "../model.js";
6
+ import { displayedSize } from "./coords.js";
7
+ import { hashLayer, sha256Hex } from "./hash.js";
8
+ import { burnMarks } from "./raster.js";
9
+ import {
10
+ ENCRYPTED_MESSAGE,
11
+ FreezeError
12
+ } from "./types.js";
13
+ import {
14
+ TextSanitiser,
15
+ appendCommentAppendix,
16
+ createVectorContext,
17
+ drawVectorMark,
18
+ numberComments,
19
+ pageGeometry
20
+ } from "./vector.js";
21
+ const DEFAULT_DPI = 200;
22
+ const DEFAULT_JPEG_QUALITY = 0.92;
23
+ const DEFAULT_REDACTION_PADDING_PT = 1.5;
24
+ const MIN_DPI = 72;
25
+ const MAX_DPI = 600;
26
+ const FALLBACK_PAGE = [595.28, 841.89];
27
+ const PROVENANCE_KEY = "ArbiProvenance";
28
+ const KINDS = ["highlight", "box", "comment", "stamp", "redaction"];
29
+ async function freezePdf(original, rawLayer, options) {
30
+ const layer = parseLayer(rawLayer);
31
+ const now = options.now ?? (/* @__PURE__ */ new Date()).toISOString();
32
+ const comments = options.comments ?? "omit";
33
+ const dpi = options.dpi ?? DEFAULT_DPI;
34
+ if (!(dpi >= MIN_DPI && dpi <= MAX_DPI)) {
35
+ throw new FreezeError("invalid-option", `dpi must be between ${MIN_DPI} and ${MAX_DPI}`);
36
+ }
37
+ const redactions = layer.annotations.filter(isEffectiveRedaction);
38
+ const pending = redactions.filter((r) => r.status === "pending");
39
+ if (pending.length > 0 && (options.pendingRedactions ?? "error") === "error") {
40
+ throw new FreezeError(
41
+ "pending-redactions",
42
+ `${pending.length} redaction mark(s) have not been approved or rejected`
43
+ );
44
+ }
45
+ const marks = layer.annotations.filter((a) => a.kind !== "redaction" || isEffectiveRedaction(a));
46
+ const modeApplied = redactions.length > 0 ? "image" : options.mode;
47
+ const [originalSha256, layerSha256] = await Promise.all([sha256Hex(original), hashLayer(layer)]);
48
+ const warnings = [];
49
+ if (redactions.length > 0 && comments !== "omit" && marks.some((a) => a.kind === "comment")) {
50
+ warnings.push(
51
+ "Comments are included in a document with redactions and may repeat redacted text"
52
+ );
53
+ }
54
+ let built;
55
+ if (modeApplied === "image") {
56
+ built = await freezeAsImage(marks, options, comments, dpi, now, warnings);
57
+ } else {
58
+ built = await freezeAsVector(original, marks, comments, now, warnings);
59
+ }
60
+ const provenance = {
61
+ schema: 1,
62
+ derivedFrom: layer.documentId,
63
+ originalSha256,
64
+ layerSha256,
65
+ modeRequested: options.mode,
66
+ modeApplied,
67
+ ...modeApplied !== options.mode ? { modeChangedBecause: "redactions-present" } : {},
68
+ frozenAt: now,
69
+ frozenBy: options.author,
70
+ pages: built.pages,
71
+ ...built.dpi === void 0 ? {} : { dpi: built.dpi },
72
+ counts: countKinds(marks),
73
+ redactions: summariseRedactions(redactions)
74
+ };
75
+ setProvenance(built.doc, provenance);
76
+ return { bytes: await built.doc.save(), provenance, warnings };
77
+ }
78
+ function countKinds(marks) {
79
+ const counts = Object.fromEntries(KINDS.map((k) => [k, 0]));
80
+ for (const a of marks) counts[a.kind]++;
81
+ return counts;
82
+ }
83
+ function summariseRedactions(redactions) {
84
+ const reasons = {};
85
+ const pages = /* @__PURE__ */ new Set();
86
+ for (const r of redactions) {
87
+ if (r.kind !== "redaction") continue;
88
+ pages.add(r.page);
89
+ reasons[r.reason] = (reasons[r.reason] ?? 0) + 1;
90
+ }
91
+ return { count: redactions.length, pages: [...pages].sort((a, b) => a - b), reasons };
92
+ }
93
+ function checkPages(marks, pages) {
94
+ for (const a of marks) {
95
+ if (a.page > pages) {
96
+ throw new FreezeError(
97
+ "page-out-of-range",
98
+ `mark ${a.id} is on page ${a.page}; the document has ${pages}`
99
+ );
100
+ }
101
+ }
102
+ }
103
+ function checkAborted(signal) {
104
+ if (signal?.aborted) throw new DOMException("Freeze aborted", "AbortError");
105
+ }
106
+ async function loadPdfDocument(bytes) {
107
+ try {
108
+ return await PDFDocument.load(bytes);
109
+ } catch (error) {
110
+ if (error instanceof EncryptedPDFError || /is encrypted/i.test(error?.message ?? "")) {
111
+ throw new FreezeError("encrypted", ENCRYPTED_MESSAGE);
112
+ }
113
+ throw new FreezeError("invalid-pdf", `The PDF could not be read: ${error.message}`);
114
+ }
115
+ }
116
+ async function freezeAsVector(original, marks, comments, now, warnings) {
117
+ const doc = await loadPdfDocument(original);
118
+ const pages = doc.getPages();
119
+ checkPages(marks, pages.length);
120
+ const ctx = await createVectorContext(doc, marks, comments);
121
+ for (const a of marks) drawVectorMark(pages[a.page - 1], a, ctx);
122
+ if (comments === "appendix") {
123
+ const first = pages[0] ? displayedSize(pageGeometry(pages[0])) : void 0;
124
+ const size = first ? [first.width, first.height] : FALLBACK_PAGE;
125
+ appendCommentAppendix(
126
+ ctx,
127
+ marks.filter((a) => a.kind === "comment"),
128
+ size
129
+ );
130
+ }
131
+ reportReplaced(ctx.sanitiser, warnings);
132
+ doc.setProducer("ARBI");
133
+ doc.setModificationDate(new Date(now));
134
+ return { doc, pages: pages.length };
135
+ }
136
+ async function freezeAsImage(marks, options, comments, dpi, now, warnings) {
137
+ const rasterizer = options.rasterizer;
138
+ if (!rasterizer) {
139
+ throw new FreezeError("rasterizer-required", "Image freeze needs a page rasterizer");
140
+ }
141
+ try {
142
+ checkPages(marks, rasterizer.numPages);
143
+ const out = await PDFDocument.create();
144
+ out.setProducer("ARBI");
145
+ out.setCreator("ARBI");
146
+ out.setCreationDate(new Date(now));
147
+ out.setModificationDate(new Date(now));
148
+ const numbers = numberComments(marks);
149
+ const format = options.imageFormat ?? "jpeg";
150
+ const quality = options.jpegQuality ?? DEFAULT_JPEG_QUALITY;
151
+ const burn = {
152
+ paddingPt: options.redactionPaddingPt ?? DEFAULT_REDACTION_PADDING_PT,
153
+ labels: options.redactionLabels ?? true,
154
+ comments,
155
+ numbers,
156
+ images: await stampImages(marks)
157
+ };
158
+ const ocrFont = options.ocr ? await out.embedFont(StandardFonts.Helvetica) : void 0;
159
+ const ocrSanitiser = ocrFont ? new TextSanitiser(ocrFont) : void 0;
160
+ let lowestDpi = dpi;
161
+ let firstSize;
162
+ for (let n = 1; n <= rasterizer.numPages; n++) {
163
+ checkAborted(options.signal);
164
+ const page = await rasterizer.renderPage(n, dpi);
165
+ try {
166
+ burnMarks(
167
+ page,
168
+ marks.filter((a) => a.page === n),
169
+ burn
170
+ );
171
+ const bytes = await page.encode(format, quality);
172
+ const image = format === "png" ? await out.embedPng(bytes) : await out.embedJpg(bytes);
173
+ const outPage = out.addPage([page.widthPt, page.heightPt]);
174
+ outPage.drawImage(image, { x: 0, y: 0, width: page.widthPt, height: page.heightPt });
175
+ lowestDpi = Math.min(lowestDpi, page.dpi);
176
+ firstSize ??= [page.widthPt, page.heightPt];
177
+ if (options.ocr && ocrFont && ocrSanitiser) {
178
+ const words = await options.ocr({
179
+ pageNumber: n,
180
+ bytes,
181
+ format,
182
+ widthPx: page.widthPx,
183
+ heightPx: page.heightPx
184
+ });
185
+ drawInvisibleText(outPage, words, page.widthPt, page.heightPt, ocrFont, ocrSanitiser);
186
+ }
187
+ } finally {
188
+ page.release();
189
+ }
190
+ options.onProgress?.(n, rasterizer.numPages);
191
+ }
192
+ if (comments === "appendix") {
193
+ const ctx = await createVectorContext(out, marks, comments);
194
+ appendCommentAppendix(
195
+ ctx,
196
+ marks.filter((a) => a.kind === "comment"),
197
+ firstSize ?? FALLBACK_PAGE
198
+ );
199
+ reportReplaced(ctx.sanitiser, warnings);
200
+ }
201
+ return { doc: out, pages: rasterizer.numPages, dpi: Math.round(lowestDpi) };
202
+ } finally {
203
+ await rasterizer.destroy();
204
+ }
205
+ }
206
+ function drawInvisibleText(page, words, widthPt, heightPt, font, sanitiser) {
207
+ for (const w of words) {
208
+ if (!w.text || !sanitiser.supports(w.text)) continue;
209
+ const size = Math.max(1, w.h * heightPt * 0.8);
210
+ page.drawText(w.text, {
211
+ x: w.x * widthPt,
212
+ y: heightPt - (w.y + w.h) * heightPt,
213
+ size,
214
+ font,
215
+ color: rgb(0, 0, 0),
216
+ opacity: 0
217
+ });
218
+ }
219
+ }
220
+ function reportReplaced(sanitiser, warnings) {
221
+ if (sanitiser.replaced.size > 0) {
222
+ warnings.push(
223
+ `${sanitiser.replaced.size} character(s) in comments cannot be drawn by the built-in font and were replaced with "?"`
224
+ );
225
+ }
226
+ }
227
+ function setProvenance(doc, provenance) {
228
+ const info = doc.context.lookup(doc.context.trailerInfo.Info);
229
+ if (!info || !("set" in info)) throw new Error("document has no info dictionary");
230
+ info.set(
231
+ PDFName.of(PROVENANCE_KEY),
232
+ PDFHexString.fromText(JSON.stringify(provenance))
233
+ );
234
+ }
235
+ async function readProvenance(bytes) {
236
+ const doc = await PDFDocument.load(bytes);
237
+ const info = doc.context.lookup(doc.context.trailerInfo.Info);
238
+ if (!info || !("get" in info)) return null;
239
+ const value = info.get(PDFName.of(PROVENANCE_KEY));
240
+ if (!(value instanceof PDFHexString)) return null;
241
+ return JSON.parse(value.decodeText());
242
+ }
243
+ async function stampImages(marks) {
244
+ const out = /* @__PURE__ */ new Map();
245
+ if (typeof createImageBitmap !== "function") return out;
246
+ for (const a of marks) {
247
+ if (a.kind !== "stamp" || !a.image) continue;
248
+ const raw = atob(a.image);
249
+ const bytes = new Uint8Array(raw.length);
250
+ for (let i = 0; i < raw.length; i++) bytes[i] = raw.charCodeAt(i);
251
+ out.set(a.id, await createImageBitmap(new Blob([bytes], { type: "image/png" })));
252
+ }
253
+ return out;
254
+ }
255
+ export {
256
+ DEFAULT_DPI,
257
+ freezePdf,
258
+ loadPdfDocument,
259
+ readProvenance
260
+ };
261
+ //# sourceMappingURL=freeze.js.map