@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,53 @@
1
+ const time = (iso) => {
2
+ const t = Date.parse(iso);
3
+ return Number.isNaN(t) ? 0 : t;
4
+ };
5
+ function mergeReplies(a, b) {
6
+ const byId = /* @__PURE__ */ new Map();
7
+ for (const r of [...a, ...b]) if (!byId.has(r.id)) byId.set(r.id, r);
8
+ return [...byId.values()].sort((x, y) => time(x.createdAt) - time(y.createdAt));
9
+ }
10
+ function newer(mine, theirs) {
11
+ const winner = time(theirs.updatedAt) > time(mine.updatedAt) ? theirs : mine;
12
+ if (mine.kind === "comment" && theirs.kind === "comment" && winner.kind === "comment") {
13
+ const replies = mergeReplies(mine.replies, theirs.replies);
14
+ if (replies.length !== winner.replies.length) return { ...winner, replies };
15
+ }
16
+ return winner;
17
+ }
18
+ function mergeLayers({ base, mine, theirs, deleted }) {
19
+ const baseById = new Map((base?.annotations ?? []).map((a) => [a.id, a]));
20
+ const theirsById = new Map(theirs.annotations.map((a) => [a.id, a]));
21
+ const mineIds = new Set(mine.annotations.map((a) => a.id));
22
+ const out = [];
23
+ for (const m of mine.annotations) {
24
+ if (deleted?.has(m.id)) continue;
25
+ const t = theirsById.get(m.id);
26
+ if (t) {
27
+ out.push(newer(m, t));
28
+ continue;
29
+ }
30
+ const b = baseById.get(m.id);
31
+ if (b && time(m.updatedAt) <= time(b.updatedAt)) continue;
32
+ out.push(m);
33
+ }
34
+ for (const t of theirs.annotations) {
35
+ if (mineIds.has(t.id) || deleted?.has(t.id)) continue;
36
+ if (baseById.has(t.id)) continue;
37
+ out.push(t);
38
+ }
39
+ const updatedAt = time(theirs.updatedAt) > time(mine.updatedAt) ? theirs.updatedAt : mine.updatedAt;
40
+ return { ...mine, annotations: out, updatedAt };
41
+ }
42
+ function sameMarks(a, b) {
43
+ if (a.annotations.length !== b.annotations.length) return false;
44
+ const byId = new Map(a.annotations.map((m) => [m.id, m.updatedAt]));
45
+ return b.annotations.every(
46
+ (m) => byId.get(m.id) === m.updatedAt && (m.kind !== "comment" || a.annotations.find((x) => x.id === m.id).replies.length === m.replies.length)
47
+ );
48
+ }
49
+ export {
50
+ mergeLayers,
51
+ sameMarks
52
+ };
53
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/annotations/merge.ts"],
4
+ "sourcesContent": ["/**\n * Merging two writers' versions of one layer, by annotation id (a PDF annotation's `/NM`).\n *\n * Used when a save is refused because someone saved first (HTTP 409): the client re-reads the\n * latest layer (\"theirs\") and merges it with its own (\"mine\"), relative to the layer both started\n * from (\"base\"). Nobody's marks are lost:\n *\n * - a mark only one side has is kept, unless that side never had it and the other deleted it:\n * a mark in `base` that `mine` no longer has was deleted here and stays deleted, and one that\n * `theirs` no longer has was deleted there and stays deleted unless it was edited here since;\n * - a mark both sides have: the later edit (`updatedAt`) wins as a whole; a comment additionally\n * keeps every reply either side added;\n * - `deleted` (the ids this session removed, its tombstones) always wins: a concurrent edit\n * elsewhere does not resurrect a mark deleted here, even one `base` never saw.\n */\n\nimport type { Annotation, AnnotationLayer, CommentAnnotation, CommentReply } from './model'\n\nexport interface MergeInput {\n /** The layer both sides started from (the last one this client saved or loaded). */\n base: AnnotationLayer | null\n mine: AnnotationLayer\n theirs: AnnotationLayer\n /** Ids this session deleted. */\n deleted?: ReadonlySet<string>\n}\n\nconst time = (iso: string) => {\n const t = Date.parse(iso)\n return Number.isNaN(t) ? 0 : t\n}\n\nfunction mergeReplies(a: CommentReply[], b: CommentReply[]): CommentReply[] {\n const byId = new Map<string, CommentReply>()\n for (const r of [...a, ...b]) if (!byId.has(r.id)) byId.set(r.id, r)\n return [...byId.values()].sort((x, y) => time(x.createdAt) - time(y.createdAt))\n}\n\n/** The newer of two versions of one mark (ties go to `mine`); comments keep both sides' replies. */\nfunction newer(mine: Annotation, theirs: Annotation): Annotation {\n const winner = time(theirs.updatedAt) > time(mine.updatedAt) ? theirs : mine\n if (mine.kind === 'comment' && theirs.kind === 'comment' && winner.kind === 'comment') {\n const replies = mergeReplies(mine.replies, theirs.replies)\n if (replies.length !== winner.replies.length) return { ...winner, replies } as CommentAnnotation\n }\n return winner\n}\n\n/** Merge two versions of a layer; the result keeps `mine`'s order, then marks only `theirs` has. */\nexport function mergeLayers({ base, mine, theirs, deleted }: MergeInput): AnnotationLayer {\n const baseById = new Map((base?.annotations ?? []).map((a) => [a.id, a]))\n const theirsById = new Map(theirs.annotations.map((a) => [a.id, a]))\n const mineIds = new Set(mine.annotations.map((a) => a.id))\n const out: Annotation[] = []\n\n for (const m of mine.annotations) {\n if (deleted?.has(m.id)) continue\n const t = theirsById.get(m.id)\n if (t) {\n out.push(newer(m, t))\n continue\n }\n const b = baseById.get(m.id)\n // They deleted it. Keep it only if it was edited here after the version they deleted.\n if (b && time(m.updatedAt) <= time(b.updatedAt)) continue\n out.push(m)\n }\n for (const t of theirs.annotations) {\n if (mineIds.has(t.id) || deleted?.has(t.id)) continue\n // Deleted here (it was in the base and is gone from mine): stays deleted.\n if (baseById.has(t.id)) continue\n out.push(t)\n }\n\n const updatedAt =\n time(theirs.updatedAt) > time(mine.updatedAt) ? theirs.updatedAt : mine.updatedAt\n return { ...mine, annotations: out, updatedAt }\n}\n\n/** True when two layers hold the same marks (by id and last edit), whatever their order. */\nexport function sameMarks(a: AnnotationLayer, b: AnnotationLayer): boolean {\n if (a.annotations.length !== b.annotations.length) return false\n const byId = new Map(a.annotations.map((m) => [m.id, m.updatedAt]))\n return b.annotations.every(\n (m) =>\n byId.get(m.id) === m.updatedAt &&\n (m.kind !== 'comment' ||\n (a.annotations.find((x) => x.id === m.id) as CommentAnnotation).replies.length ===\n m.replies.length)\n )\n}\n"],
5
+ "mappings": "AA2BA,MAAM,OAAO,CAAC,QAAgB;AAC5B,QAAM,IAAI,KAAK,MAAM,GAAG;AACxB,SAAO,OAAO,MAAM,CAAC,IAAI,IAAI;AAC/B;AAEA,SAAS,aAAa,GAAmB,GAAmC;AAC1E,QAAM,OAAO,oBAAI,IAA0B;AAC3C,aAAW,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,EAAG,KAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAG,MAAK,IAAI,EAAE,IAAI,CAAC;AACnE,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,CAAC;AAChF;AAGA,SAAS,MAAM,MAAkB,QAAgC;AAC/D,QAAM,SAAS,KAAK,OAAO,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS;AACxE,MAAI,KAAK,SAAS,aAAa,OAAO,SAAS,aAAa,OAAO,SAAS,WAAW;AACrF,UAAM,UAAU,aAAa,KAAK,SAAS,OAAO,OAAO;AACzD,QAAI,QAAQ,WAAW,OAAO,QAAQ,OAAQ,QAAO,EAAE,GAAG,QAAQ,QAAQ;AAAA,EAC5E;AACA,SAAO;AACT;AAGO,SAAS,YAAY,EAAE,MAAM,MAAM,QAAQ,QAAQ,GAAgC;AACxF,QAAM,WAAW,IAAI,KAAK,MAAM,eAAe,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACxE,QAAM,aAAa,IAAI,IAAI,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACnE,QAAM,UAAU,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACzD,QAAM,MAAoB,CAAC;AAE3B,aAAW,KAAK,KAAK,aAAa;AAChC,QAAI,SAAS,IAAI,EAAE,EAAE,EAAG;AACxB,UAAM,IAAI,WAAW,IAAI,EAAE,EAAE;AAC7B,QAAI,GAAG;AACL,UAAI,KAAK,MAAM,GAAG,CAAC,CAAC;AACpB;AAAA,IACF;AACA,UAAM,IAAI,SAAS,IAAI,EAAE,EAAE;AAE3B,QAAI,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,EAAG;AACjD,QAAI,KAAK,CAAC;AAAA,EACZ;AACA,aAAW,KAAK,OAAO,aAAa;AAClC,QAAI,QAAQ,IAAI,EAAE,EAAE,KAAK,SAAS,IAAI,EAAE,EAAE,EAAG;AAE7C,QAAI,SAAS,IAAI,EAAE,EAAE,EAAG;AACxB,QAAI,KAAK,CAAC;AAAA,EACZ;AAEA,QAAM,YACJ,KAAK,OAAO,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,YAAY,KAAK;AAC1E,SAAO,EAAE,GAAG,MAAM,aAAa,KAAK,UAAU;AAChD;AAGO,SAAS,UAAU,GAAoB,GAA6B;AACzE,MAAI,EAAE,YAAY,WAAW,EAAE,YAAY,OAAQ,QAAO;AAC1D,QAAM,OAAO,IAAI,IAAI,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAClE,SAAO,EAAE,YAAY;AAAA,IACnB,CAAC,MACC,KAAK,IAAI,EAAE,EAAE,MAAM,EAAE,cACpB,EAAE,SAAS,aACT,EAAE,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAwB,QAAQ,WACtE,EAAE,QAAQ;AAAA,EAClB;AACF;",
6
+ "names": []
7
+ }
@@ -1,22 +1,21 @@
1
- // src/annotations/model.ts
2
- var LAYER_SCHEMA_VERSION = 1;
3
- var MAX_TEXT_LENGTH = 2e4;
4
- var MAX_ANNOTATIONS = 2e4;
5
- var MAX_RECTS_PER_MARK = 2e3;
6
- var HEX_COLOR = /^#[0-9a-fA-F]{6}$/;
7
- var KINDS = ["highlight", "box", "comment", "stamp", "redaction"];
8
- var REDACTION_STATUSES = ["pending", "approved", "rejected"];
9
- var EDGE_EPSILON = 1e-6;
10
- var AnnotationLayerError = class extends Error {
1
+ const LAYER_SCHEMA_VERSION = 1;
2
+ const MAX_TEXT_LENGTH = 2e4;
3
+ const MAX_ANNOTATIONS = 2e4;
4
+ const MAX_RECTS_PER_MARK = 2e3;
5
+ const HEX_COLOR = /^#[0-9a-fA-F]{6}$/;
6
+ const KINDS = ["highlight", "box", "comment", "stamp", "redaction"];
7
+ const REDACTION_STATUSES = ["pending", "approved", "rejected"];
8
+ const EDGE_EPSILON = 1e-6;
9
+ class AnnotationLayerError extends Error {
11
10
  constructor(message) {
12
11
  super(message);
13
12
  this.name = "AnnotationLayerError";
14
13
  }
15
- };
14
+ }
16
15
  function emptyLayer(documentId, now) {
17
16
  return { schema: LAYER_SCHEMA_VERSION, documentId, annotations: [], updatedAt: now };
18
17
  }
19
- var isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
18
+ const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
20
19
  function fail(path, problem) {
21
20
  throw new AnnotationLayerError(`${path}: ${problem}`);
22
21
  }
@@ -180,7 +179,15 @@ function annotationRects(a) {
180
179
  function isEffectiveRedaction(a) {
181
180
  return a.kind === "redaction" && a.status !== "rejected";
182
181
  }
183
-
184
- export { AnnotationLayerError, LAYER_SCHEMA_VERSION, annotationRects, clampRect, emptyLayer, isEffectiveRedaction, parseAnnotation, parseLayer };
185
- //# sourceMappingURL=chunk-T3USOSVN.js.map
186
- //# sourceMappingURL=chunk-T3USOSVN.js.map
182
+ export {
183
+ AnnotationLayerError,
184
+ LAYER_SCHEMA_VERSION,
185
+ MAX_RECTS_PER_MARK,
186
+ annotationRects,
187
+ clampRect,
188
+ emptyLayer,
189
+ isEffectiveRedaction,
190
+ parseAnnotation,
191
+ parseLayer
192
+ };
193
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/annotations/model.ts"],
4
+ "sourcesContent": ["/**\n * Annotation layer data model.\n *\n * A layer is plain JSON that sits NEXT TO an immutable document: the original file is never\n * touched, marks are drawn over it, and \"freezing\" (see `freeze.ts`) derives a new document.\n *\n * Geometry is stored as fractions (0..1) of the page as DISPLAYED (after rotation and crop),\n * origin top-left. That makes a mark independent of zoom, device pixel ratio and PDF units, and\n * because the original never changes the coordinates never drift.\n *\n * A redaction mark carries the matched text so a reviewer (or an agent) can see what it hides.\n * That text is sensitive: the layer must never travel with a frozen copy.\n */\n\nexport const LAYER_SCHEMA_VERSION = 1\n\nexport type AnnotationKind = 'highlight' | 'box' | 'comment' | 'stamp' | 'redaction'\nexport type RedactionStatus = 'pending' | 'approved' | 'rejected'\n\n/** Fractions of the displayed page, origin top-left. */\nexport interface NormRect {\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface CommentReply {\n id: string\n author: string\n createdAt: string\n body: string\n}\n\ninterface AnnotationBase {\n id: string\n /** 1-based page number. */\n page: number\n author: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface HighlightAnnotation extends AnnotationBase {\n kind: 'highlight'\n rects: NormRect[]\n color: string\n /** The highlighted text, when it came from a text selection. */\n text?: string\n}\n\nexport interface BoxAnnotation extends AnnotationBase {\n kind: 'box'\n rect: NormRect\n color: string\n /** Outline width in PDF points at 100%. */\n strokeWidth: number\n}\n\nexport interface CommentAnnotation extends AnnotationBase {\n kind: 'comment'\n /** Anchor box; the note icon is drawn at its top-left corner. */\n rect: NormRect\n body: string\n replies: CommentReply[]\n resolved: boolean\n}\n\nexport interface StampAnnotation extends AnnotationBase {\n kind: 'stamp'\n rect: NormRect\n label: string\n color: string\n /**\n * A picture stamp: one's saved signature or initials placed on the page (base64 PNG), drawn in\n * the box in place of the framed label (which then only names it).\n */\n image?: string\n}\n\nexport interface RedactionAnnotation extends AnnotationBase {\n kind: 'redaction'\n rects: NormRect[]\n /** The review reason (e.g. \"Privileged\"). Kept separately from the printed [REDACTED] label. */\n reason: string\n /** The text under the mark. Sensitive: stays in the layer, never in a frozen document. */\n text?: string\n status: RedactionStatus\n /** Who last approved or rejected it, and when (absent while pending). For the redaction log. */\n reviewedBy?: string\n reviewedAt?: string\n}\n\nexport type Annotation =\n HighlightAnnotation | BoxAnnotation | CommentAnnotation | StampAnnotation | RedactionAnnotation\n\nexport interface AnnotationLayer {\n schema: typeof LAYER_SCHEMA_VERSION\n /** External id of the immutable document the layer annotates. */\n documentId: string\n /** Optional content hash of the original, so a layer can be checked against the file it marks. */\n documentHash?: string\n annotations: Annotation[]\n updatedAt: string\n}\n\nconst MAX_TEXT_LENGTH = 20_000\nconst MAX_ANNOTATIONS = 20_000\nexport const MAX_RECTS_PER_MARK = 2_000\n\nconst HEX_COLOR = /^#[0-9a-fA-F]{6}$/\nconst KINDS: readonly AnnotationKind[] = ['highlight', 'box', 'comment', 'stamp', 'redaction']\nconst REDACTION_STATUSES: readonly RedactionStatus[] = ['pending', 'approved', 'rejected']\n/** Tolerance for rects that overshoot the page edge by floating-point noise. */\nconst EDGE_EPSILON = 1e-6\n\nexport class AnnotationLayerError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'AnnotationLayerError'\n }\n}\n\nexport function emptyLayer(documentId: string, now: string): AnnotationLayer {\n return { schema: LAYER_SCHEMA_VERSION, documentId, annotations: [], updatedAt: now }\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\nfunction fail(path: string, problem: string): never {\n throw new AnnotationLayerError(`${path}: ${problem}`)\n}\n\nfunction str(v: unknown, path: string, max = MAX_TEXT_LENGTH): string {\n if (typeof v !== 'string') fail(path, 'expected a string')\n if (v.length > max) fail(path, `longer than ${max} characters`)\n return v\n}\n\nfunction optStr(v: unknown, path: string): string | undefined {\n return v === undefined ? undefined : str(v, path)\n}\n\nfunction iso(v: unknown, path: string): string {\n const s = str(v, path, 64)\n if (Number.isNaN(Date.parse(s))) fail(path, 'expected an ISO date')\n return s\n}\n\nfunction color(v: unknown, path: string): string {\n const s = str(v, path, 16)\n if (!HEX_COLOR.test(s)) fail(path, 'expected a #rrggbb colour')\n return s\n}\n\nfunction bool(v: unknown, path: string): boolean {\n if (typeof v !== 'boolean') fail(path, 'expected a boolean')\n return v\n}\n\nfunction rect(v: unknown, path: string): NormRect {\n if (!isRecord(v)) fail(path, 'expected a rectangle')\n const out = { x: v.x, y: v.y, w: v.w, h: v.h }\n for (const [key, n] of Object.entries(out)) {\n if (typeof n !== 'number' || !Number.isFinite(n)) fail(`${path}.${key}`, 'expected a number')\n }\n const r = out as NormRect\n if (r.w < 0 || r.h < 0) fail(path, 'negative size')\n if (r.x < -EDGE_EPSILON || r.y < -EDGE_EPSILON) fail(path, 'outside the page')\n if (r.x + r.w > 1 + EDGE_EPSILON || r.y + r.h > 1 + EDGE_EPSILON) fail(path, 'outside the page')\n return clampRect(r)\n}\n\nfunction rects(v: unknown, path: string): NormRect[] {\n if (!Array.isArray(v)) fail(path, 'expected a list of rectangles')\n if (v.length === 0) fail(path, 'needs at least one rectangle')\n if (v.length > MAX_RECTS_PER_MARK) fail(path, `more than ${MAX_RECTS_PER_MARK} rectangles`)\n return v.map((r, i) => rect(r, `${path}[${i}]`))\n}\n\nfunction reply(v: unknown, path: string): CommentReply {\n if (!isRecord(v)) fail(path, 'expected a reply')\n return {\n id: str(v.id, `${path}.id`, 128),\n author: str(v.author, `${path}.author`, 256),\n createdAt: iso(v.createdAt, `${path}.createdAt`),\n body: str(v.body, `${path}.body`),\n }\n}\n\nexport function clampRect(r: NormRect): NormRect {\n const x = Math.min(1, Math.max(0, r.x))\n const y = Math.min(1, Math.max(0, r.y))\n return { x, y, w: Math.min(r.w, 1 - x), h: Math.min(r.h, 1 - y) }\n}\n\n/** Validate one annotation from untrusted JSON. Throws `AnnotationLayerError`. */\nexport function parseAnnotation(v: unknown, path = 'annotation'): Annotation {\n if (!isRecord(v)) fail(path, 'expected an object')\n const kind = v.kind\n if (typeof kind !== 'string' || !KINDS.includes(kind as AnnotationKind)) {\n fail(`${path}.kind`, 'unknown annotation kind')\n }\n const page = v.page\n if (typeof page !== 'number' || !Number.isInteger(page) || page < 1) {\n fail(`${path}.page`, 'expected a page number of 1 or more')\n }\n const base: AnnotationBase = {\n id: str(v.id, `${path}.id`, 128),\n page,\n author: str(v.author, `${path}.author`, 256),\n createdAt: iso(v.createdAt, `${path}.createdAt`),\n updatedAt: iso(v.updatedAt, `${path}.updatedAt`),\n }\n if (!base.id) fail(`${path}.id`, 'empty id')\n\n switch (kind as AnnotationKind) {\n case 'highlight':\n return {\n ...base,\n kind: 'highlight',\n rects: rects(v.rects, `${path}.rects`),\n color: color(v.color, `${path}.color`),\n text: optStr(v.text, `${path}.text`),\n }\n case 'box': {\n const strokeWidth = v.strokeWidth\n if (typeof strokeWidth !== 'number' || !(strokeWidth > 0) || strokeWidth > 50) {\n fail(`${path}.strokeWidth`, 'expected a width between 0 and 50')\n }\n return {\n ...base,\n kind: 'box',\n rect: rect(v.rect, `${path}.rect`),\n color: color(v.color, `${path}.color`),\n strokeWidth,\n }\n }\n case 'comment': {\n if (!Array.isArray(v.replies)) fail(`${path}.replies`, 'expected a list')\n return {\n ...base,\n kind: 'comment',\n rect: rect(v.rect, `${path}.rect`),\n body: str(v.body, `${path}.body`),\n replies: v.replies.map((r, i) => reply(r, `${path}.replies[${i}]`)),\n resolved: bool(v.resolved, `${path}.resolved`),\n }\n }\n case 'stamp':\n return {\n ...base,\n kind: 'stamp',\n rect: rect(v.rect, `${path}.rect`),\n label: str(v.label, `${path}.label`, 200),\n color: color(v.color, `${path}.color`),\n ...(v.image === undefined || v.image === null\n ? {}\n : { image: str(v.image, `${path}.image`, 600_000) }),\n }\n case 'redaction': {\n const status = v.status\n if (typeof status !== 'string' || !REDACTION_STATUSES.includes(status as RedactionStatus)) {\n fail(`${path}.status`, 'unknown redaction status')\n }\n return {\n ...base,\n kind: 'redaction',\n rects: rects(v.rects, `${path}.rects`),\n reason: str(v.reason, `${path}.reason`, 200),\n text: optStr(v.text, `${path}.text`),\n status: status as RedactionStatus,\n ...(v.reviewedBy === undefined\n ? {}\n : { reviewedBy: str(v.reviewedBy, `${path}.reviewedBy`, 256) }),\n ...(v.reviewedAt === undefined\n ? {}\n : { reviewedAt: iso(v.reviewedAt, `${path}.reviewedAt`) }),\n }\n }\n }\n}\n\n/** Validate a whole layer from untrusted JSON (storage, network, an agent). */\nexport function parseLayer(v: unknown): AnnotationLayer {\n if (!isRecord(v)) fail('layer', 'expected an object')\n if (v.schema !== LAYER_SCHEMA_VERSION)\n fail('layer.schema', `expected schema ${LAYER_SCHEMA_VERSION}`)\n if (!Array.isArray(v.annotations)) fail('layer.annotations', 'expected a list')\n if (v.annotations.length > MAX_ANNOTATIONS) {\n fail('layer.annotations', `more than ${MAX_ANNOTATIONS} annotations`)\n }\n const annotations = v.annotations.map((a, i) => parseAnnotation(a, `layer.annotations[${i}]`))\n const seen = new Set<string>()\n for (const a of annotations) {\n if (seen.has(a.id)) fail('layer.annotations', `duplicate id ${a.id}`)\n seen.add(a.id)\n }\n return {\n schema: LAYER_SCHEMA_VERSION,\n documentId: str(v.documentId, 'layer.documentId', 256),\n documentHash: optStr(v.documentHash, 'layer.documentHash'),\n annotations,\n updatedAt: iso(v.updatedAt, 'layer.updatedAt'),\n }\n}\n\n/** The rectangles a mark covers, whatever its kind. */\nexport function annotationRects(a: Annotation): NormRect[] {\n return a.kind === 'highlight' || a.kind === 'redaction' ? a.rects : [a.rect]\n}\n\n/**\n * True when a redaction mark will be burned into a frozen copy. Fails closed: only an explicit\n * rejection leaves content visible, so a mark nobody reviewed is never silently skipped.\n */\nexport function isEffectiveRedaction(a: Annotation): a is RedactionAnnotation {\n return a.kind === 'redaction' && a.status !== 'rejected'\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ import { clampRect } from "./model.js";
2
+ const MIN_MARK = 0.01;
3
+ function singleRect(a) {
4
+ if (a.kind === "box" || a.kind === "stamp" || a.kind === "comment") return a.rect;
5
+ if (a.kind === "redaction" && a.rects.length === 1) return a.rects[0];
6
+ return null;
7
+ }
8
+ const patchForRect = (a, rect) => a.kind === "redaction" ? { rects: [rect] } : { rect };
9
+ function dragRect(origin, mode, dx, dy) {
10
+ if (mode === "move") {
11
+ return {
12
+ ...origin,
13
+ x: Math.min(Math.max(origin.x + dx, 0), 1 - origin.w),
14
+ y: Math.min(Math.max(origin.y + dy, 0), 1 - origin.h)
15
+ };
16
+ }
17
+ let left = origin.x;
18
+ let right = origin.x + origin.w;
19
+ let top = origin.y;
20
+ let bottom = origin.y + origin.h;
21
+ if (mode.includes("w")) left += dx;
22
+ else right += dx;
23
+ if (mode.includes("n")) top += dy;
24
+ else bottom += dy;
25
+ const x1 = Math.min(Math.max(Math.min(left, right), 0), 1);
26
+ const x2 = Math.min(Math.max(Math.max(left, right), 0), 1);
27
+ const y1 = Math.min(Math.max(Math.min(top, bottom), 0), 1);
28
+ const y2 = Math.min(Math.max(Math.max(top, bottom), 0), 1);
29
+ return clampRect({
30
+ x: x1,
31
+ y: y1,
32
+ w: Math.max(x2 - x1, MIN_MARK),
33
+ h: Math.max(y2 - y1, MIN_MARK)
34
+ });
35
+ }
36
+ export {
37
+ dragRect,
38
+ patchForRect,
39
+ singleRect
40
+ };
41
+ //# sourceMappingURL=overlay-geometry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/annotations/overlay-geometry.ts"],
4
+ "sourcesContent": ["/**\n * Pure geometry for moving and resizing a single-rectangle mark. Kept out of the component file so\n * it can be tested and reused without a renderer.\n */\n\nimport { clampRect, type Annotation, type NormRect } from './model'\n\nconst MIN_MARK = 0.01\n\nexport type DragMode = 'move' | 'nw' | 'ne' | 'sw' | 'se'\n\n/** The single rectangle of a mark that can be moved and resized, or null for multi-rect marks. */\nexport function singleRect(a: Annotation): NormRect | null {\n if (a.kind === 'box' || a.kind === 'stamp' || a.kind === 'comment') return a.rect\n if (a.kind === 'redaction' && a.rects.length === 1) return a.rects[0]\n return null\n}\n\nexport const patchForRect = (a: Annotation, rect: NormRect) =>\n a.kind === 'redaction' ? { rects: [rect] } : { rect }\n\n/** Move or resize `origin` by a pointer delta given as fractions of the page. */\nexport function dragRect(origin: NormRect, mode: DragMode, dx: number, dy: number): NormRect {\n if (mode === 'move') {\n return {\n ...origin,\n x: Math.min(Math.max(origin.x + dx, 0), 1 - origin.w),\n y: Math.min(Math.max(origin.y + dy, 0), 1 - origin.h),\n }\n }\n let left = origin.x\n let right = origin.x + origin.w\n let top = origin.y\n let bottom = origin.y + origin.h\n if (mode.includes('w')) left += dx\n else right += dx\n if (mode.includes('n')) top += dy\n else bottom += dy\n const x1 = Math.min(Math.max(Math.min(left, right), 0), 1)\n const x2 = Math.min(Math.max(Math.max(left, right), 0), 1)\n const y1 = Math.min(Math.max(Math.min(top, bottom), 0), 1)\n const y2 = Math.min(Math.max(Math.max(top, bottom), 0), 1)\n return clampRect({\n x: x1,\n y: y1,\n w: Math.max(x2 - x1, MIN_MARK),\n h: Math.max(y2 - y1, MIN_MARK),\n })\n}\n"],
5
+ "mappings": "AAKA,SAAS,iBAAiD;AAE1D,MAAM,WAAW;AAKV,SAAS,WAAW,GAAgC;AACzD,MAAI,EAAE,SAAS,SAAS,EAAE,SAAS,WAAW,EAAE,SAAS,UAAW,QAAO,EAAE;AAC7E,MAAI,EAAE,SAAS,eAAe,EAAE,MAAM,WAAW,EAAG,QAAO,EAAE,MAAM,CAAC;AACpE,SAAO;AACT;AAEO,MAAM,eAAe,CAAC,GAAe,SAC1C,EAAE,SAAS,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK;AAG/C,SAAS,SAAS,QAAkB,MAAgB,IAAY,IAAsB;AAC3F,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;AAAA,MACpD,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;AAAA,IACtD;AAAA,EACF;AACA,MAAI,OAAO,OAAO;AAClB,MAAI,QAAQ,OAAO,IAAI,OAAO;AAC9B,MAAI,MAAM,OAAO;AACjB,MAAI,SAAS,OAAO,IAAI,OAAO;AAC/B,MAAI,KAAK,SAAS,GAAG,EAAG,SAAQ;AAAA,MAC3B,UAAS;AACd,MAAI,KAAK,SAAS,GAAG,EAAG,QAAO;AAAA,MAC1B,WAAU;AACf,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC;AACzD,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC;AACzD,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC;AACzD,QAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC;AACzD,SAAO,UAAU;AAAA,IACf,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ;AAAA,IAC7B,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ;AAAA,EAC/B,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,33 @@
1
+ const REDACTION_LOG_COLUMNS = ["page", "reason", "status", "approved_by", "time"];
2
+ const STATUS = {
3
+ approved: "redacted (approved)",
4
+ pending: "redacted (not reviewed)",
5
+ rejected: "not redacted (rejected)"
6
+ };
7
+ const top = (a) => Math.min(...a.rects.map((r) => r.y));
8
+ const left = (a) => Math.min(...a.rects.map((r) => r.x));
9
+ function redactionLogRows(layer) {
10
+ return layer.annotations.filter((a) => a.kind === "redaction").sort((a, b) => a.page - b.page || top(a) - top(b) || left(a) - left(b)).map((a) => ({
11
+ page: a.page,
12
+ reason: a.reason,
13
+ status: STATUS[a.status],
14
+ approvedBy: a.status === "approved" ? a.reviewedBy ?? "" : "",
15
+ time: a.reviewedAt ?? a.createdAt
16
+ }));
17
+ }
18
+ const cell = (value) => {
19
+ const text = String(value);
20
+ return `"${(/^[=+\-@]/.test(text) ? `'${text}` : text).replace(/"/g, '""')}"`;
21
+ };
22
+ function redactionLogCsv(layer) {
23
+ const rows = redactionLogRows(layer).map(
24
+ (r) => [r.page, r.reason, r.status, r.approvedBy, r.time].map(cell).join(",")
25
+ );
26
+ return [REDACTION_LOG_COLUMNS.join(","), ...rows].join("\r\n") + "\r\n";
27
+ }
28
+ export {
29
+ REDACTION_LOG_COLUMNS,
30
+ redactionLogCsv,
31
+ redactionLogRows
32
+ };
33
+ //# sourceMappingURL=redaction-log.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/annotations/redaction-log.ts"],
4
+ "sourcesContent": ["/**\n * The redaction log of a layer: one CSV row per redaction mark (page, reason, status, who approved\n * it and when), the record a privilege or redaction log is built from.\n *\n * It never carries the redacted text: the log travels with the redacted copy, so it must not undo\n * it. Rows are in reading order (page, then top to bottom, then left to right).\n */\n\nimport type { AnnotationLayer, RedactionAnnotation } from './model'\n\nexport const REDACTION_LOG_COLUMNS = ['page', 'reason', 'status', 'approved_by', 'time'] as const\n\nexport interface RedactionLogRow {\n page: number\n reason: string\n /** What the frozen copy shows for this mark. */\n status: 'redacted (approved)' | 'redacted (not reviewed)' | 'not redacted (rejected)'\n /** Who approved it; empty when it was not approved. */\n approvedBy: string\n /** When it was reviewed, or when it was made if nobody reviewed it (ISO). */\n time: string\n}\n\nconst STATUS: Record<RedactionAnnotation['status'], RedactionLogRow['status']> = {\n approved: 'redacted (approved)',\n pending: 'redacted (not reviewed)',\n rejected: 'not redacted (rejected)',\n}\n\nconst top = (a: RedactionAnnotation) => Math.min(...a.rects.map((r) => r.y))\nconst left = (a: RedactionAnnotation) => Math.min(...a.rects.map((r) => r.x))\n\nexport function redactionLogRows(layer: AnnotationLayer): RedactionLogRow[] {\n return layer.annotations\n .filter((a): a is RedactionAnnotation => a.kind === 'redaction')\n .sort((a, b) => a.page - b.page || top(a) - top(b) || left(a) - left(b))\n .map((a) => ({\n page: a.page,\n reason: a.reason,\n status: STATUS[a.status],\n approvedBy: a.status === 'approved' ? (a.reviewedBy ?? '') : '',\n time: a.reviewedAt ?? a.createdAt,\n }))\n}\n\n// Quote every cell; a leading =, +, - or @ would run as a formula in a spreadsheet.\nconst cell = (value: string | number) => {\n const text = String(value)\n return `\"${(/^[=+\\-@]/.test(text) ? `'${text}` : text).replace(/\"/g, '\"\"')}\"`\n}\n\n/** The log as CSV text (header row first, CRLF line ends as RFC 4180 has them). */\nexport function redactionLogCsv(layer: AnnotationLayer): string {\n const rows = redactionLogRows(layer).map((r) =>\n [r.page, r.reason, r.status, r.approvedBy, r.time].map(cell).join(',')\n )\n return [REDACTION_LOG_COLUMNS.join(','), ...rows].join('\\r\\n') + '\\r\\n'\n}\n"],
5
+ "mappings": "AAUO,MAAM,wBAAwB,CAAC,QAAQ,UAAU,UAAU,eAAe,MAAM;AAavF,MAAM,SAA2E;AAAA,EAC/E,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AACZ;AAEA,MAAM,MAAM,CAAC,MAA2B,KAAK,IAAI,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3E,MAAM,OAAO,CAAC,MAA2B,KAAK,IAAI,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAErE,SAAS,iBAAiB,OAA2C;AAC1E,SAAO,MAAM,YACV,OAAO,CAAC,MAAgC,EAAE,SAAS,WAAW,EAC9D,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,EACtE,IAAI,CAAC,OAAO;AAAA,IACX,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,QAAQ,OAAO,EAAE,MAAM;AAAA,IACvB,YAAY,EAAE,WAAW,aAAc,EAAE,cAAc,KAAM;AAAA,IAC7D,MAAM,EAAE,cAAc,EAAE;AAAA,EAC1B,EAAE;AACN;AAGA,MAAM,OAAO,CAAC,UAA2B;AACvC,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO,KAAK,WAAW,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM,IAAI,CAAC;AAC5E;AAGO,SAAS,gBAAgB,OAAgC;AAC9D,QAAM,OAAO,iBAAiB,KAAK,EAAE;AAAA,IAAI,CAAC,MACxC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,KAAK,GAAG;AAAA,EACvE;AACA,SAAO,CAAC,sBAAsB,KAAK,GAAG,GAAG,GAAG,IAAI,EAAE,KAAK,MAAM,IAAI;AACnE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,122 @@
1
+ import { mergeLineRects, toNorm } from "./geometry.js";
2
+ const MIN_RECT_PX = 1;
3
+ function selectionToPageMarks(pages) {
4
+ const out = [];
5
+ for (const p of pages) {
6
+ if (!(p.box.width > 0) || !(p.box.height > 0)) continue;
7
+ const local = p.rects.filter((r) => r.width >= MIN_RECT_PX && r.height >= MIN_RECT_PX).map((r) => ({ x: r.x - p.box.x, y: r.y - p.box.y, width: r.width, height: r.height })).filter(
8
+ (r) => r.x + r.width > 0 && r.y + r.height > 0 && r.x < p.box.width && r.y < p.box.height
9
+ );
10
+ const lines = mergeLineRects(local);
11
+ if (lines.length === 0) continue;
12
+ out.push({
13
+ page: p.page,
14
+ rects: lines.map((r) => toNorm(r, { width: p.box.width, height: p.box.height })),
15
+ text: p.text.replace(/\s+/g, " ").trim()
16
+ });
17
+ }
18
+ return out;
19
+ }
20
+ const PAGE_ATTRIBUTE = "data-annotation-page";
21
+ const ownerDocument = (node) => node.ownerDocument ?? document;
22
+ const toPixelRect = (r) => ({
23
+ x: r.left,
24
+ y: r.top,
25
+ width: r.width,
26
+ height: r.height
27
+ });
28
+ function clipRange(range, container) {
29
+ if (!range.intersectsNode(container)) return null;
30
+ const bounds = ownerDocument(container).createRange();
31
+ bounds.selectNodeContents(container);
32
+ const clipped = range.cloneRange();
33
+ if (clipped.compareBoundaryPoints(Range.START_TO_START, bounds) < 0) {
34
+ clipped.setStart(bounds.startContainer, bounds.startOffset);
35
+ }
36
+ if (clipped.compareBoundaryPoints(Range.END_TO_END, bounds) > 0) {
37
+ clipped.setEnd(bounds.endContainer, bounds.endOffset);
38
+ }
39
+ return clipped;
40
+ }
41
+ function textClientRects(range, container) {
42
+ const doc = ownerDocument(container);
43
+ const walker = doc.createTreeWalker(container, NodeFilter.SHOW_TEXT);
44
+ const rects = [];
45
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
46
+ if (!node.textContent?.trim() || !range.intersectsNode(node)) continue;
47
+ const part = doc.createRange();
48
+ part.selectNodeContents(node);
49
+ if (node === range.startContainer) part.setStart(node, range.startOffset);
50
+ if (node === range.endContainer) part.setEnd(node, range.endOffset);
51
+ rects.push(...Array.from(part.getClientRects()));
52
+ }
53
+ return rects;
54
+ }
55
+ function firstTextAt(container, offset) {
56
+ if (container.nodeType === Node.TEXT_NODE) return { node: container, offset };
57
+ const child = container.childNodes[offset];
58
+ if (!child) return null;
59
+ if (child.nodeType === Node.TEXT_NODE) return { node: child, offset: 0 };
60
+ const first = ownerDocument(child).createTreeWalker(child, NodeFilter.SHOW_TEXT).nextNode();
61
+ return first ? { node: first, offset: 0 } : null;
62
+ }
63
+ function extendFocusToPointer(selection, point) {
64
+ if (selection.rangeCount === 0 || selection.isCollapsed) return;
65
+ const range = selection.getRangeAt(0);
66
+ if (selection.focusNode !== range.endContainer || selection.focusOffset !== range.endOffset)
67
+ return;
68
+ const start = firstTextAt(range.endContainer, range.endOffset);
69
+ if (!start) return;
70
+ const doc = ownerDocument(start.node);
71
+ const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT);
72
+ walker.currentNode = start.node;
73
+ const glyph = doc.createRange();
74
+ let end = null;
75
+ let node = start.node;
76
+ let offset = start.offset;
77
+ let passed = false;
78
+ while (node && !passed) {
79
+ const text = node.textContent ?? "";
80
+ for (let i = offset; i < text.length && !passed; i++) {
81
+ glyph.setStart(node, i);
82
+ glyph.setEnd(node, i + 1);
83
+ const r = glyph.getBoundingClientRect();
84
+ if (r.height === 0) continue;
85
+ const mid = r.top + r.height / 2;
86
+ if (mid > point.y + r.height / 2) passed = true;
87
+ else if (Math.abs(mid - point.y) > r.height / 2) continue;
88
+ else if (r.right > point.x + 0.5) passed = true;
89
+ else end = { node, offset: i + 1 };
90
+ }
91
+ node = walker.nextNode();
92
+ offset = 0;
93
+ }
94
+ if (end) selection.extend(end.node, end.offset);
95
+ }
96
+ function readSelection(selection, root = document) {
97
+ if (selection.rangeCount === 0 || selection.isCollapsed) return [];
98
+ const range = selection.getRangeAt(0);
99
+ const pages = [];
100
+ root.querySelectorAll(`[${PAGE_ATTRIBUTE}]`).forEach((overlay) => {
101
+ const page = Number(overlay.getAttribute(PAGE_ATTRIBUTE));
102
+ const container = overlay.parentElement;
103
+ if (!container || !Number.isInteger(page)) return;
104
+ const clipped = clipRange(range, container);
105
+ if (!clipped) return;
106
+ pages.push({
107
+ page,
108
+ box: toPixelRect(overlay.getBoundingClientRect()),
109
+ rects: textClientRects(clipped, container).map(toPixelRect),
110
+ text: clipped.toString()
111
+ });
112
+ });
113
+ return pages;
114
+ }
115
+ export {
116
+ PAGE_ATTRIBUTE,
117
+ clipRange,
118
+ extendFocusToPointer,
119
+ readSelection,
120
+ selectionToPageMarks
121
+ };
122
+ //# sourceMappingURL=selection-marks.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/annotations/selection-marks.ts"],
4
+ "sourcesContent": ["/**\n * Turn a text selection into marks. The browser selects over pdf.js's text layer; each page's\n * share of the selection becomes one mark of normalised line boxes (page-relative, zoom-proof).\n *\n * `selectionToPageMarks` is pure so it can be tested without a layout engine; `readSelection`\n * is the thin DOM side that measures a real selection.\n */\n\nimport { mergeLineRects, toNorm, type PixelRect } from './geometry'\nimport type { NormRect } from './model'\n\n/** One page's slice of a selection, in client (viewport) coordinates. */\nexport interface PageSelection {\n page: number\n /** The page's box on screen. */\n box: PixelRect\n /** Client rects of the selected text on this page. */\n rects: PixelRect[]\n text: string\n}\n\nexport interface PageTextMark {\n page: number\n rects: NormRect[]\n text: string\n}\n\n/** Rects smaller than this many CSS pixels (either side) are layout noise, not selected text. */\nconst MIN_RECT_PX = 1\n\nexport function selectionToPageMarks(pages: PageSelection[]): PageTextMark[] {\n const out: PageTextMark[] = []\n for (const p of pages) {\n if (!(p.box.width > 0) || !(p.box.height > 0)) continue\n const local = p.rects\n .filter((r) => r.width >= MIN_RECT_PX && r.height >= MIN_RECT_PX)\n .map((r) => ({ x: r.x - p.box.x, y: r.y - p.box.y, width: r.width, height: r.height }))\n // keep only what overlaps the page area (a selection can brush a neighbouring page)\n .filter(\n (r) => r.x + r.width > 0 && r.y + r.height > 0 && r.x < p.box.width && r.y < p.box.height\n )\n const lines = mergeLineRects(local)\n if (lines.length === 0) continue\n out.push({\n page: p.page,\n rects: lines.map((r) => toNorm(r, { width: p.box.width, height: p.box.height })),\n text: p.text.replace(/\\s+/g, ' ').trim(),\n })\n }\n return out\n}\n\nexport const PAGE_ATTRIBUTE = 'data-annotation-page'\n\n/** The document a node lives in: the page's own, which is not the opener's when popped out. */\nconst ownerDocument = (node: Node): Document => node.ownerDocument ?? document\n\nconst toPixelRect = (r: DOMRect): PixelRect => ({\n x: r.left,\n y: r.top,\n width: r.width,\n height: r.height,\n})\n\n/** Narrow `range` to the part inside `container`, or null if it does not reach it. */\nexport function clipRange(range: Range, container: Node): Range | null {\n if (!range.intersectsNode(container)) return null\n const bounds = ownerDocument(container).createRange()\n bounds.selectNodeContents(container)\n const clipped = range.cloneRange()\n if (clipped.compareBoundaryPoints(Range.START_TO_START, bounds) < 0) {\n clipped.setStart(bounds.startContainer, bounds.startOffset)\n }\n if (clipped.compareBoundaryPoints(Range.END_TO_END, bounds) > 0) {\n clipped.setEnd(bounds.endContainer, bounds.endOffset)\n }\n return clipped\n}\n\n/**\n * The client rects of the TEXT in `range`, one text node at a time. `range.getClientRects()` also\n * returns the box of every element the range covers completely, and a range clipped to a page\n * starts or ends at that page's container, so on a selection that crosses pages it returns\n * page-sized boxes (the text layer, the canvas wrapper). Measuring only text nodes gives the\n * glyph lines the user actually selected.\n */\nfunction textClientRects(range: Range, container: Node): DOMRect[] {\n const doc = ownerDocument(container)\n const walker = doc.createTreeWalker(container, NodeFilter.SHOW_TEXT)\n const rects: DOMRect[] = []\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (!node.textContent?.trim() || !range.intersectsNode(node)) continue\n const part = doc.createRange()\n part.selectNodeContents(node)\n if (node === range.startContainer) part.setStart(node, range.startOffset)\n if (node === range.endContainer) part.setEnd(node, range.endOffset)\n rects.push(...Array.from(part.getClientRects()))\n }\n return rects\n}\n\n/**\n * The text position a boundary point stands for: a text node is itself, and an element boundary\n * means the first text node after it. Null when there is no text there.\n */\nfunction firstTextAt(container: Node, offset: number): { node: Node; offset: number } | null {\n if (container.nodeType === Node.TEXT_NODE) return { node: container, offset }\n const child = container.childNodes[offset]\n if (!child) return null\n if (child.nodeType === Node.TEXT_NODE) return { node: child, offset: 0 }\n const first = ownerDocument(child).createTreeWalker(child, NodeFilter.SHOW_TEXT).nextNode()\n return first ? { node: first, offset: 0 } : null\n}\n\n/**\n * A mouse drag released just past a line's last glyph can end one character short, or on another\n * line: pdf.js's text layer has an end-of-content element under the text, and the browser puts the\n * caret for a point beyond the glyphs in the wrong place. This moves the focus of a forward\n * selection to the last glyph that lies left of the release point on the release line. It only\n * ever extends the selection, and does nothing when the focus is already where the pointer is.\n */\nexport function extendFocusToPointer(selection: Selection, point: { x: number; y: number }): void {\n if (selection.rangeCount === 0 || selection.isCollapsed) return\n const range = selection.getRangeAt(0)\n // Only a forward selection has its focus at the end of the range.\n if (selection.focusNode !== range.endContainer || selection.focusOffset !== range.endOffset)\n return\n const start = firstTextAt(range.endContainer, range.endOffset)\n if (!start) return\n\n const doc = ownerDocument(start.node)\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT)\n walker.currentNode = start.node\n const glyph = doc.createRange()\n let end: { node: Node; offset: number } | null = null\n let node: Node | null = start.node\n let offset = start.offset\n let passed = false\n while (node && !passed) {\n const text = node.textContent ?? ''\n for (let i = offset; i < text.length && !passed; i++) {\n glyph.setStart(node, i)\n glyph.setEnd(node, i + 1)\n const r = glyph.getBoundingClientRect()\n if (r.height === 0) continue\n const mid = r.top + r.height / 2\n if (mid > point.y + r.height / 2) passed = true\n else if (Math.abs(mid - point.y) > r.height / 2) continue\n else if (r.right > point.x + 0.5) passed = true\n else end = { node, offset: i + 1 }\n }\n node = walker.nextNode()\n offset = 0\n }\n if (end) selection.extend(end.node, end.offset)\n}\n\n/** Read the live selection as per-page slices, using the overlays in `root` to find the pages. */\nexport function readSelection(selection: Selection, root: ParentNode = document): PageSelection[] {\n if (selection.rangeCount === 0 || selection.isCollapsed) return []\n const range = selection.getRangeAt(0)\n const pages: PageSelection[] = []\n root.querySelectorAll<HTMLElement>(`[${PAGE_ATTRIBUTE}]`).forEach((overlay) => {\n const page = Number(overlay.getAttribute(PAGE_ATTRIBUTE))\n const container = overlay.parentElement\n if (!container || !Number.isInteger(page)) return\n const clipped = clipRange(range, container)\n if (!clipped) return\n pages.push({\n page,\n box: toPixelRect(overlay.getBoundingClientRect()),\n rects: textClientRects(clipped, container).map(toPixelRect),\n text: clipped.toString(),\n })\n })\n return pages\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,140 @@
1
+ import {
2
+ parseAnnotation
3
+ } from "./model.js";
4
+ const HISTORY_LIMIT = 200;
5
+ function createHistory(layer) {
6
+ return { present: layer, past: [], future: [] };
7
+ }
8
+ function reduceLayer(layer, action) {
9
+ switch (action.type) {
10
+ case "replaceAll":
11
+ return action.layer;
12
+ case "add": {
13
+ const annotation = parseAnnotation(action.annotation);
14
+ if (layer.annotations.some((a) => a.id === annotation.id)) {
15
+ throw new Error(`annotation ${annotation.id} already exists`);
16
+ }
17
+ return {
18
+ ...layer,
19
+ annotations: [...layer.annotations, annotation],
20
+ updatedAt: annotation.updatedAt
21
+ };
22
+ }
23
+ case "addMany": {
24
+ let next = layer;
25
+ for (const annotation of action.annotations)
26
+ next = reduceLayer(next, { type: "add", annotation });
27
+ return next;
28
+ }
29
+ case "update": {
30
+ const found = layer.annotations.find((a) => a.id === action.id);
31
+ if (!found) return layer;
32
+ const next = parseAnnotation({
33
+ ...found,
34
+ ...action.patch,
35
+ id: found.id,
36
+ kind: found.kind,
37
+ page: found.page,
38
+ createdAt: found.createdAt,
39
+ updatedAt: action.now
40
+ });
41
+ return replace(layer, next, action.now);
42
+ }
43
+ case "remove": {
44
+ if (!layer.annotations.some((a) => a.id === action.id)) return layer;
45
+ return {
46
+ ...layer,
47
+ annotations: layer.annotations.filter((a) => a.id !== action.id),
48
+ updatedAt: action.now
49
+ };
50
+ }
51
+ case "setRedactionStatus": {
52
+ const ids = new Set(action.ids);
53
+ let changed = false;
54
+ const annotations = layer.annotations.map((a) => {
55
+ if (a.kind !== "redaction" || !ids.has(a.id) || a.status === action.status) return a;
56
+ changed = true;
57
+ const next = { ...a, status: action.status, updatedAt: action.now };
58
+ delete next.reviewedBy;
59
+ delete next.reviewedAt;
60
+ if (action.status !== "pending" && action.by) {
61
+ next.reviewedBy = action.by;
62
+ next.reviewedAt = action.now;
63
+ }
64
+ return next;
65
+ });
66
+ return changed ? { ...layer, annotations, updatedAt: action.now } : layer;
67
+ }
68
+ case "reply": {
69
+ const found = layer.annotations.find((a) => a.id === action.id);
70
+ if (!found || found.kind !== "comment") return layer;
71
+ const next = parseAnnotation({
72
+ ...found,
73
+ replies: [...found.replies, action.reply],
74
+ updatedAt: action.now
75
+ });
76
+ return replace(layer, next, action.now);
77
+ }
78
+ case "resolve": {
79
+ const found = layer.annotations.find((a) => a.id === action.id);
80
+ if (!found || found.kind !== "comment" || found.resolved === action.resolved) return layer;
81
+ return replace(
82
+ layer,
83
+ { ...found, resolved: action.resolved, updatedAt: action.now },
84
+ action.now
85
+ );
86
+ }
87
+ }
88
+ }
89
+ function replace(layer, next, now) {
90
+ return {
91
+ ...layer,
92
+ annotations: layer.annotations.map((a) => a.id === next.id ? next : a),
93
+ updatedAt: now
94
+ };
95
+ }
96
+ function applyAction(history, action) {
97
+ const present = reduceLayer(history.present, action);
98
+ if (present === history.present) return history;
99
+ const past = [...history.past, history.present];
100
+ return {
101
+ present,
102
+ past: past.length > HISTORY_LIMIT ? past.slice(past.length - HISTORY_LIMIT) : past,
103
+ future: []
104
+ };
105
+ }
106
+ function undo(history) {
107
+ const previous = history.past[history.past.length - 1];
108
+ if (!previous) return history;
109
+ return {
110
+ present: previous,
111
+ past: history.past.slice(0, -1),
112
+ future: [history.present, ...history.future]
113
+ };
114
+ }
115
+ function redo(history) {
116
+ const [next, ...rest] = history.future;
117
+ if (!next) return history;
118
+ return { present: next, past: [...history.past, history.present], future: rest };
119
+ }
120
+ const canUndo = (h) => h.past.length > 0;
121
+ const canRedo = (h) => h.future.length > 0;
122
+ function annotationsOnPage(layer, page) {
123
+ return layer.annotations.filter((a) => a.page === page);
124
+ }
125
+ function pendingRedactions(layer) {
126
+ return layer.annotations.filter((a) => a.kind === "redaction" && a.status === "pending");
127
+ }
128
+ export {
129
+ HISTORY_LIMIT,
130
+ annotationsOnPage,
131
+ applyAction,
132
+ canRedo,
133
+ canUndo,
134
+ createHistory,
135
+ pendingRedactions,
136
+ redo,
137
+ reduceLayer,
138
+ undo
139
+ };
140
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/annotations/state.ts"],
4
+ "sourcesContent": ["/**\n * Pure state for an annotation layer: actions, a reducer and undo/redo history.\n *\n * No clock and no randomness in here. Callers pass ids and timestamps in, so the reducer is\n * deterministic, trivially testable, and an agent can replay the same actions a person makes.\n */\n\nimport {\n parseAnnotation,\n type Annotation,\n type AnnotationLayer,\n type CommentReply,\n type RedactionAnnotation,\n type RedactionStatus,\n} from './model'\n\n/** Fields a caller may change on any mark. Identity (`id`, `kind`, `page`) is fixed. */\ntype PatchOf<A> = A extends Annotation\n ? Partial<Omit<A, 'id' | 'kind' | 'page' | 'createdAt'>>\n : never\nexport type AnnotationPatch = PatchOf<Annotation>\n\nexport type AnnotationAction =\n | { type: 'add'; annotation: Annotation }\n | { type: 'addMany'; annotations: Annotation[] }\n | { type: 'update'; id: string; patch: AnnotationPatch; now: string }\n | { type: 'remove'; id: string; now: string }\n | {\n type: 'setRedactionStatus'\n ids: string[]\n status: RedactionStatus\n now: string\n /** Who reviewed it; recorded with the time for approve/reject, cleared for pending. */\n by?: string\n }\n | { type: 'reply'; id: string; reply: CommentReply; now: string }\n | { type: 'resolve'; id: string; resolved: boolean; now: string }\n | { type: 'replaceAll'; layer: AnnotationLayer }\n\nexport interface LayerHistory {\n present: AnnotationLayer\n past: AnnotationLayer[]\n future: AnnotationLayer[]\n}\n\nexport const HISTORY_LIMIT = 200\n\nexport function createHistory(layer: AnnotationLayer): LayerHistory {\n return { present: layer, past: [], future: [] }\n}\n\n/** Apply one action to a layer. Returns the same object when nothing changed. */\nexport function reduceLayer(layer: AnnotationLayer, action: AnnotationAction): AnnotationLayer {\n switch (action.type) {\n case 'replaceAll':\n return action.layer\n case 'add': {\n // Validate on the way in: a bad mark must never reach storage or a frozen document.\n const annotation = parseAnnotation(action.annotation)\n if (layer.annotations.some((a) => a.id === annotation.id)) {\n throw new Error(`annotation ${annotation.id} already exists`)\n }\n return {\n ...layer,\n annotations: [...layer.annotations, annotation],\n updatedAt: annotation.updatedAt,\n }\n }\n case 'addMany': {\n // All or nothing: one bad mark rejects the batch, so history never holds half of it.\n let next = layer\n for (const annotation of action.annotations)\n next = reduceLayer(next, { type: 'add', annotation })\n return next\n }\n case 'update': {\n const found = layer.annotations.find((a) => a.id === action.id)\n if (!found) return layer\n // The patch type forbids identity fields, but patches also arrive from JSON (an agent, a\n // network message), so enforce it here rather than trusting the type.\n const next = parseAnnotation({\n ...found,\n ...action.patch,\n id: found.id,\n kind: found.kind,\n page: found.page,\n createdAt: found.createdAt,\n updatedAt: action.now,\n })\n return replace(layer, next, action.now)\n }\n case 'remove': {\n if (!layer.annotations.some((a) => a.id === action.id)) return layer\n return {\n ...layer,\n annotations: layer.annotations.filter((a) => a.id !== action.id),\n updatedAt: action.now,\n }\n }\n case 'setRedactionStatus': {\n const ids = new Set(action.ids)\n let changed = false\n const annotations = layer.annotations.map((a) => {\n if (a.kind !== 'redaction' || !ids.has(a.id) || a.status === action.status) return a\n changed = true\n const next: RedactionAnnotation = { ...a, status: action.status, updatedAt: action.now }\n delete next.reviewedBy\n delete next.reviewedAt\n if (action.status !== 'pending' && action.by) {\n next.reviewedBy = action.by\n next.reviewedAt = action.now\n }\n return next\n })\n return changed ? { ...layer, annotations, updatedAt: action.now } : layer\n }\n case 'reply': {\n const found = layer.annotations.find((a) => a.id === action.id)\n if (!found || found.kind !== 'comment') return layer\n const next = parseAnnotation({\n ...found,\n replies: [...found.replies, action.reply],\n updatedAt: action.now,\n })\n return replace(layer, next, action.now)\n }\n case 'resolve': {\n const found = layer.annotations.find((a) => a.id === action.id)\n if (!found || found.kind !== 'comment' || found.resolved === action.resolved) return layer\n return replace(\n layer,\n { ...found, resolved: action.resolved, updatedAt: action.now },\n action.now\n )\n }\n }\n}\n\nfunction replace(layer: AnnotationLayer, next: Annotation, now: string): AnnotationLayer {\n return {\n ...layer,\n annotations: layer.annotations.map((a) => (a.id === next.id ? next : a)),\n updatedAt: now,\n }\n}\n\n/** Apply an action and record it for undo. A no-op action leaves history untouched. */\nexport function applyAction(history: LayerHistory, action: AnnotationAction): LayerHistory {\n const present = reduceLayer(history.present, action)\n if (present === history.present) return history\n const past = [...history.past, history.present]\n return {\n present,\n past: past.length > HISTORY_LIMIT ? past.slice(past.length - HISTORY_LIMIT) : past,\n future: [],\n }\n}\n\nexport function undo(history: LayerHistory): LayerHistory {\n const previous = history.past[history.past.length - 1]\n if (!previous) return history\n return {\n present: previous,\n past: history.past.slice(0, -1),\n future: [history.present, ...history.future],\n }\n}\n\nexport function redo(history: LayerHistory): LayerHistory {\n const [next, ...rest] = history.future\n if (!next) return history\n return { present: next, past: [...history.past, history.present], future: rest }\n}\n\nexport const canUndo = (h: LayerHistory) => h.past.length > 0\nexport const canRedo = (h: LayerHistory) => h.future.length > 0\n\nexport function annotationsOnPage(layer: AnnotationLayer, page: number): Annotation[] {\n return layer.annotations.filter((a) => a.page === page)\n}\n\nexport function pendingRedactions(layer: AnnotationLayer) {\n return layer.annotations.filter((a) => a.kind === 'redaction' && a.status === 'pending')\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }