@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,38 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { useDocumentTools } from "./environment.js";
3
+ import { fetchDocumentFile, fetchDocumentPdf } from "./document-pdf.js";
4
+ import { documentBytesKey } from "../query-keys.js";
5
+ import { documentBytesKey as documentBytesKey2 } from "../query-keys.js";
6
+ function useDocumentBytes(documentRef, options) {
7
+ const { client } = useDocumentTools();
8
+ const { version, kind, enabled = true, fallback } = options;
9
+ return useQuery({
10
+ queryKey: documentBytesKey2(documentRef, version ?? null, kind),
11
+ queryFn: async ({ signal }) => {
12
+ if (fallback && typeof navigator !== "undefined" && navigator.onLine === false) {
13
+ const offline = await fallback();
14
+ if (offline) return offline;
15
+ }
16
+ try {
17
+ return await (kind === "original" ? fetchDocumentFile : fetchDocumentPdf)(
18
+ client,
19
+ documentRef,
20
+ { signal }
21
+ );
22
+ } catch (error) {
23
+ const offline = await fallback?.();
24
+ if (offline) return offline;
25
+ throw error;
26
+ }
27
+ },
28
+ enabled: enabled && !!documentRef,
29
+ // 'always' so it still runs offline: the fallback serves a copy kept on this device.
30
+ networkMode: "always",
31
+ staleTime: Infinity
32
+ });
33
+ }
34
+ export {
35
+ documentBytesKey,
36
+ useDocumentBytes
37
+ };
38
+ //# sourceMappingURL=useDocumentBytes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/document-tools/useDocumentBytes.ts"],
4
+ "sourcesContent": ["/**\n * The bytes a document viewer shows: the PDF of a document version (`/view`), or for media the\n * stored file itself (`/download`), through the host's API client. Keyed on the version, since a\n * document keeps its id across versions: a new version (a save, a signed copy) must never show the\n * previous one's file.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { useDocumentTools } from './environment'\nimport { fetchDocumentFile, fetchDocumentPdf } from './document-pdf'\n\nimport type { DocumentBytesKind } from '../query-keys'\nexport type { DocumentBytesKind }\n\nexport { documentBytesKey } from '../query-keys'\nimport { documentBytesKey } from '../query-keys'\n\nexport interface UseDocumentBytesOptions {\n /** The document's current version, so a new one reads afresh. */\n version: number | null | undefined\n kind: DocumentBytesKind\n enabled?: boolean\n /**\n * Bytes to use when the network cannot give them (a copy kept on this device): asked first when\n * offline, and again when the request fails.\n */\n fallback?: () => Promise<Blob | undefined>\n}\n\n/** A document's (or version reference's) bytes; see {@link UseDocumentBytesOptions}. */\nexport function useDocumentBytes(documentRef: string, options: UseDocumentBytesOptions) {\n const { client } = useDocumentTools()\n const { version, kind, enabled = true, fallback } = options\n return useQuery({\n queryKey: documentBytesKey(documentRef, version ?? null, kind),\n queryFn: async ({ signal }) => {\n if (fallback && typeof navigator !== 'undefined' && navigator.onLine === false) {\n const offline = await fallback()\n if (offline) return offline\n }\n try {\n return await (kind === 'original' ? fetchDocumentFile : fetchDocumentPdf)(\n client,\n documentRef,\n { signal }\n )\n } catch (error) {\n const offline = await fallback?.()\n if (offline) return offline\n throw error\n }\n },\n enabled: enabled && !!documentRef,\n // 'always' so it still runs offline: the fallback serves a copy kept on this device.\n networkMode: 'always',\n staleTime: Infinity,\n })\n}\n"],
5
+ "mappings": "AAMA,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AACjC,SAAS,mBAAmB,wBAAwB;AAKpD,SAAS,wBAAwB;AACjC,SAAS,oBAAAA,yBAAwB;AAe1B,SAAS,iBAAiB,aAAqB,SAAkC;AACtF,QAAM,EAAE,OAAO,IAAI,iBAAiB;AACpC,QAAM,EAAE,SAAS,MAAM,UAAU,MAAM,SAAS,IAAI;AACpD,SAAO,SAAS;AAAA,IACd,UAAUA,kBAAiB,aAAa,WAAW,MAAM,IAAI;AAAA,IAC7D,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,UAAI,YAAY,OAAO,cAAc,eAAe,UAAU,WAAW,OAAO;AAC9E,cAAM,UAAU,MAAM,SAAS;AAC/B,YAAI,QAAS,QAAO;AAAA,MACtB;AACA,UAAI;AACF,eAAO,OAAO,SAAS,aAAa,oBAAoB;AAAA,UACtD;AAAA,UACA;AAAA,UACA,EAAE,OAAO;AAAA,QACX;AAAA,MACF,SAAS,OAAO;AACd,cAAM,UAAU,MAAM,WAAW;AACjC,YAAI,QAAS,QAAO;AACpB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS,WAAW,CAAC,CAAC;AAAA;AAAA,IAEtB,aAAa;AAAA,IACb,WAAW;AAAA,EACb,CAAC;AACH;",
6
+ "names": ["documentBytesKey"]
7
+ }
@@ -0,0 +1,154 @@
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { useDocumentTools } from "./environment.js";
3
+ import { SIGNED_LOCKED_REASON, fetchMarkupPdf } from "./markup-download.js";
4
+ import {
5
+ copyOpenThreads,
6
+ forgetLegacyLayer,
7
+ migrateLegacyLayer,
8
+ readLegacyLayer,
9
+ versionsWithMarkup
10
+ } from "./markup-transfer.js";
11
+ const SIGNED_UNCHANGED = "The signed PDF is unchanged: the comments are kept beside it as markup.";
12
+ function useDocumentMarkup(documentData, snapshotVersion, currentSigned = false) {
13
+ const { client, notify, saveFile, onDocumentsChanged } = useDocumentTools();
14
+ const documentId = documentData?.external_id;
15
+ const currentVersion = documentData?.current_version ?? 1;
16
+ const shownVersion = snapshotVersion ?? currentVersion;
17
+ const versions = useMemo(() => documentData?.versions ?? [], [documentData?.versions]);
18
+ const [localCounts, setLocalCounts] = useState({});
19
+ const countOf = useCallback(
20
+ (n) => localCounts[`${documentId}@${n}`] ?? versions.find((v) => v.n === n)?.markup_count ?? 0,
21
+ [localCounts, documentId, versions]
22
+ );
23
+ const hasMarkup = countOf(shownVersion) > 0;
24
+ const [showOriginal, setShowOriginal] = useState(false);
25
+ useEffect(() => setShowOriginal(false), [documentId, snapshotVersion]);
26
+ const refresh = useCallback(() => {
27
+ if (!documentId || !onDocumentsChanged) return;
28
+ Promise.resolve(onDocumentsChanged([documentId], "markup")).catch(
29
+ (e) => console.warn("Could not refresh the document after a markup change", e)
30
+ );
31
+ }, [documentId, onDocumentsChanged]);
32
+ const onMarkupChange = useCallback(
33
+ (snapshot) => {
34
+ if (!documentId) return;
35
+ const key = `${documentId}@${shownVersion}`;
36
+ if (countOf(shownVersion) > 0 !== snapshot.count > 0) refresh();
37
+ setLocalCounts((counts) => ({ ...counts, [key]: snapshot.count }));
38
+ },
39
+ [documentId, shownVersion, countOf, refresh]
40
+ );
41
+ const downloadMarkup = useCallback(async () => {
42
+ if (!documentId) return;
43
+ if (currentSigned) {
44
+ notify(SIGNED_LOCKED_REASON, "info");
45
+ return;
46
+ }
47
+ try {
48
+ const { blob, fileName } = await fetchMarkupPdf(
49
+ client,
50
+ documentId,
51
+ snapshotVersion ? snapshotVersion : void 0
52
+ );
53
+ saveFile(blob, fileName);
54
+ } catch (e) {
55
+ notify(e instanceof Error ? e.message : "The markup could not be downloaded", "error");
56
+ }
57
+ }, [client, documentId, snapshotVersion, saveFile, notify, currentSigned]);
58
+ const [legacyCount, setLegacyCount] = useState(0);
59
+ const [migrating, setMigrating] = useState(false);
60
+ const shared = documentData?.shared;
61
+ const loaded = !!documentData;
62
+ const migrate = useCallback(async () => {
63
+ if (!documentId) return;
64
+ const layer = readLegacyLayer(documentId);
65
+ if (!layer) return;
66
+ setMigrating(true);
67
+ try {
68
+ const added = await migrateLegacyLayer(documentId, layer, versions, currentVersion, client);
69
+ setLegacyCount(0);
70
+ setLocalCounts({});
71
+ refresh();
72
+ if (added > 0) {
73
+ notify(
74
+ `${added} annotation${added === 1 ? "" : "s"} from this browser saved to the document`,
75
+ "success",
76
+ {
77
+ description: shared ? "They are now part of the shared markup." : "They are saved with the document, visible only to you."
78
+ }
79
+ );
80
+ }
81
+ } catch (e) {
82
+ notify(
83
+ e instanceof Error ? e.message : "The annotations from this browser could not be saved",
84
+ "error",
85
+ { description: "They are still kept in this browser; open the document again to retry." }
86
+ );
87
+ } finally {
88
+ setMigrating(false);
89
+ }
90
+ }, [client, documentId, versions, currentVersion, refresh, shared, notify]);
91
+ useEffect(() => {
92
+ if (!documentId || !loaded) return;
93
+ const layer = readLegacyLayer(documentId);
94
+ if (!layer) {
95
+ setLegacyCount(0);
96
+ return;
97
+ }
98
+ if (layer.annotations.length === 0) {
99
+ forgetLegacyLayer(documentId);
100
+ setLegacyCount(0);
101
+ return;
102
+ }
103
+ if (shared) setLegacyCount(layer.annotations.length);
104
+ else void migrate();
105
+ }, [documentId, loaded, shared]);
106
+ const legacyPrompt = legacyCount > 0 && !snapshotVersion ? {
107
+ count: legacyCount,
108
+ busy: migrating,
109
+ add: () => void migrate(),
110
+ discard: () => {
111
+ if (documentId) forgetLegacyLayer(documentId);
112
+ setLegacyCount(0);
113
+ }
114
+ } : null;
115
+ const [copying, setCopying] = useState(false);
116
+ const olderWithMarkup = versionsWithMarkup(versions).filter((v) => v.n !== currentVersion).sort((a, b) => b.n - a.n)[0];
117
+ const olderNote = !snapshotVersion && !hasMarkup && olderWithMarkup ? {
118
+ version: olderWithMarkup.n,
119
+ busy: copying,
120
+ signed: currentSigned,
121
+ copy: () => {
122
+ if (!documentId) return;
123
+ setCopying(true);
124
+ copyOpenThreads(documentId, olderWithMarkup.n, client).then((n) => {
125
+ if (n > 0) {
126
+ setLocalCounts((c) => ({ ...c, [`${documentId}@${currentVersion}`]: n }));
127
+ refresh();
128
+ }
129
+ notify(
130
+ n > 0 ? `${n} open comment thread${n === 1 ? "" : "s"} copied to version ${currentVersion}` : `Version ${olderWithMarkup.n} has no open comments`,
131
+ n > 0 ? "success" : "info",
132
+ // The markup is stored beside the version, so the sealed bytes do not change.
133
+ n > 0 && currentSigned ? { description: SIGNED_UNCHANGED } : void 0
134
+ );
135
+ }).catch(
136
+ (e) => notify(e instanceof Error ? e.message : "The comments could not be copied", "error")
137
+ ).finally(() => setCopying(false));
138
+ }
139
+ } : null;
140
+ return {
141
+ hasMarkup,
142
+ showOriginal,
143
+ setShowOriginal,
144
+ onMarkupChange,
145
+ downloadMarkup,
146
+ legacyPrompt,
147
+ olderNote
148
+ };
149
+ }
150
+ export {
151
+ SIGNED_UNCHANGED,
152
+ useDocumentMarkup
153
+ };
154
+ //# sourceMappingURL=useDocumentMarkup.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/document-tools/useDocumentMarkup.ts"],
4
+ "sourcesContent": ["/**\n * Markup state for the document page: whether the version on screen has markup (so the viewer\n * opens on it, the default view), the \"Show original\" toggle, \"Download with markup\", the one-time\n * migration of this browser's old annotation layer, and the note shown when the markup is on an\n * older version (with \"copy open comments\").\n *\n * Whether a version has markup comes from the document's version entries (`markup_count`), kept\n * current by the viewer's own saves (`onMarkupChange`) until the document is refetched.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useDocumentTools } from './environment'\nimport type { MarkupSnapshot } from './markup-store'\nimport { SIGNED_LOCKED_REASON, fetchMarkupPdf } from './markup-download'\nimport {\n copyOpenThreads,\n forgetLegacyLayer,\n migrateLegacyLayer,\n readLegacyLayer,\n versionsWithMarkup,\n type VersionInfo,\n} from './markup-transfer'\n\nexport const SIGNED_UNCHANGED =\n 'The signed PDF is unchanged: the comments are kept beside it as markup.'\n\nexport interface MarkupDocument {\n external_id: string\n shared?: boolean | null\n current_version?: number | null\n versions?: VersionInfo[] | null\n}\n\nexport interface LegacyPrompt {\n count: number\n busy: boolean\n add: () => void\n discard: () => void\n}\n\nexport interface OlderMarkupNote {\n version: number\n busy: boolean\n /** The current version is a signed copy: say that copying leaves its signed PDF as it is. */\n signed: boolean\n copy: () => void\n}\n\nexport function useDocumentMarkup(\n documentData: MarkupDocument | null | undefined,\n /** The version on screen when it is an older one (a read-only snapshot). */\n snapshotVersion: number | undefined,\n /**\n * Whether the version on screen is a signed, sealed copy: locked, so no \"Download with markup\"\n * (and, for the current version, copied comments leave its signed PDF as it is).\n */\n currentSigned = false\n) {\n const { client, notify, saveFile, onDocumentsChanged } = useDocumentTools()\n const documentId = documentData?.external_id\n const currentVersion = documentData?.current_version ?? 1\n const shownVersion = snapshotVersion ?? currentVersion\n const versions = useMemo(() => documentData?.versions ?? [], [documentData?.versions])\n\n // Counts from this session's saves win over the (possibly stale) document record.\n const [localCounts, setLocalCounts] = useState<Record<string, number>>({})\n const countOf = useCallback(\n (n: number) =>\n localCounts[`${documentId}@${n}`] ?? versions.find((v) => v.n === n)?.markup_count ?? 0,\n [localCounts, documentId, versions]\n )\n const hasMarkup = countOf(shownVersion) > 0\n\n const [showOriginal, setShowOriginal] = useState(false)\n useEffect(() => setShowOriginal(false), [documentId, snapshotVersion])\n\n const refresh = useCallback(() => {\n if (!documentId || !onDocumentsChanged) return\n Promise.resolve(onDocumentsChanged([documentId], 'markup')).catch((e: unknown) =>\n console.warn('Could not refresh the document after a markup change', e)\n )\n }, [documentId, onDocumentsChanged])\n\n const onMarkupChange = useCallback(\n (snapshot: MarkupSnapshot) => {\n if (!documentId) return\n const key = `${documentId}@${shownVersion}`\n // The list's \"Download with markup\" and the version entries follow the first/last mark.\n if (countOf(shownVersion) > 0 !== snapshot.count > 0) refresh()\n setLocalCounts((counts) => ({ ...counts, [key]: snapshot.count }))\n },\n [documentId, shownVersion, countOf, refresh]\n )\n\n const downloadMarkup = useCallback(async () => {\n if (!documentId) return\n // A signed version is locked: its markup is never written into its PDF.\n if (currentSigned) {\n notify(SIGNED_LOCKED_REASON, 'info')\n return\n }\n try {\n const { blob, fileName } = await fetchMarkupPdf(\n client,\n documentId,\n snapshotVersion ? snapshotVersion : undefined\n )\n saveFile(blob, fileName)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'The markup could not be downloaded', 'error')\n }\n }, [client, documentId, snapshotVersion, saveFile, notify, currentSigned])\n\n // --- Migration of this browser's layer (arbi:annotations:<docId>) ---\n const [legacyCount, setLegacyCount] = useState(0)\n const [migrating, setMigrating] = useState(false)\n const shared = documentData?.shared\n const loaded = !!documentData\n\n const migrate = useCallback(async () => {\n if (!documentId) return\n const layer = readLegacyLayer(documentId)\n if (!layer) return\n setMigrating(true)\n try {\n const added = await migrateLegacyLayer(documentId, layer, versions, currentVersion, client)\n setLegacyCount(0)\n setLocalCounts({})\n refresh()\n if (added > 0) {\n notify(\n `${added} annotation${added === 1 ? '' : 's'} from this browser saved to the document`,\n 'success',\n {\n description: shared\n ? 'They are now part of the shared markup.'\n : 'They are saved with the document, visible only to you.',\n }\n )\n }\n } catch (e) {\n notify(\n e instanceof Error ? e.message : 'The annotations from this browser could not be saved',\n 'error',\n { description: 'They are still kept in this browser; open the document again to retry.' }\n )\n } finally {\n setMigrating(false)\n }\n }, [client, documentId, versions, currentVersion, refresh, shared, notify])\n\n useEffect(() => {\n if (!documentId || !loaded) return\n const layer = readLegacyLayer(documentId)\n if (!layer) {\n setLegacyCount(0)\n return\n }\n if (layer.annotations.length === 0) {\n forgetLegacyLayer(documentId)\n setLegacyCount(0)\n return\n }\n // A private document is the user's own: its old layer simply becomes its markup. A shared one\n // would show the marks to everyone, so the user decides.\n if (shared) setLegacyCount(layer.annotations.length)\n else void migrate()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, loaded, shared])\n\n const legacyPrompt: LegacyPrompt | null =\n legacyCount > 0 && !snapshotVersion\n ? {\n count: legacyCount,\n busy: migrating,\n add: () => void migrate(),\n discard: () => {\n if (documentId) forgetLegacyLayer(documentId)\n setLegacyCount(0)\n },\n }\n : null\n\n // --- Markup on an older version (a newer version starts with none) ---\n const [copying, setCopying] = useState(false)\n const olderWithMarkup = versionsWithMarkup(versions)\n .filter((v) => v.n !== currentVersion)\n .sort((a, b) => b.n - a.n)[0]\n const olderNote: OlderMarkupNote | null =\n !snapshotVersion && !hasMarkup && olderWithMarkup\n ? {\n version: olderWithMarkup.n,\n busy: copying,\n signed: currentSigned,\n copy: () => {\n if (!documentId) return\n setCopying(true)\n copyOpenThreads(documentId, olderWithMarkup.n, client)\n .then((n) => {\n if (n > 0) {\n setLocalCounts((c) => ({ ...c, [`${documentId}@${currentVersion}`]: n }))\n refresh()\n }\n notify(\n n > 0\n ? `${n} open comment thread${n === 1 ? '' : 's'} copied to version ${currentVersion}`\n : `Version ${olderWithMarkup.n} has no open comments`,\n n > 0 ? 'success' : 'info',\n // The markup is stored beside the version, so the sealed bytes do not change.\n n > 0 && currentSigned ? { description: SIGNED_UNCHANGED } : undefined\n )\n })\n .catch((e: unknown) =>\n notify(e instanceof Error ? e.message : 'The comments could not be copied', 'error')\n )\n .finally(() => setCopying(false))\n },\n }\n : null\n\n return {\n hasMarkup,\n showOriginal,\n setShowOriginal,\n onMarkupChange,\n downloadMarkup,\n legacyPrompt,\n olderNote,\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ import { useSyncExternalStore } from "react";
2
+ import { onlineManager } from "@tanstack/react-query";
3
+ function useIsOnline() {
4
+ return useSyncExternalStore(
5
+ (onChange) => onlineManager.subscribe(onChange),
6
+ () => onlineManager.isOnline(),
7
+ () => true
8
+ );
9
+ }
10
+ export {
11
+ useIsOnline
12
+ };
13
+ //# sourceMappingURL=useIsOnline.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/document-tools/useIsOnline.ts"],
4
+ "sourcesContent": ["/**\n * Reactive connectivity from React Query's `onlineManager` (the browser's online events, plus\n * whatever the host feeds it, e.g. a WebSocket). The markup autosave waits while it is false.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport { onlineManager } from '@tanstack/react-query'\n\nexport function useIsOnline(): boolean {\n return useSyncExternalStore(\n (onChange) => onlineManager.subscribe(onChange),\n () => onlineManager.isOnline(),\n () => true\n )\n}\n"],
5
+ "mappings": "AAKA,SAAS,4BAA4B;AACrC,SAAS,qBAAqB;AAEvB,SAAS,cAAuB;AACrC,SAAO;AAAA,IACL,CAAC,aAAa,cAAc,UAAU,QAAQ;AAAA,IAC9C,MAAM,cAAc,SAAS;AAAA,IAC7B,MAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,60 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { useDocumentTools } from "./environment.js";
3
+ import { sha256Hex } from "./signing.js";
4
+ import { arbiQueryKeys } from "../query-keys.js";
5
+ const VERIFY_PATH = "/v1/sign/verify/{reference}";
6
+ const REFERENCE = /^sig-[0-9a-f]{32}$/;
7
+ function isSignatureReference(reference) {
8
+ return !!reference && REFERENCE.test(reference);
9
+ }
10
+ class SignatureVerificationError extends Error {
11
+ constructor(message, status) {
12
+ super(message);
13
+ this.status = status;
14
+ this.name = "SignatureVerificationError";
15
+ }
16
+ status;
17
+ }
18
+ const VERIFY_ERRORS = {
19
+ 404: "No signature has this reference.",
20
+ 429: "Too many checks, try again in a minute."
21
+ };
22
+ async function fetchSignatureVerification(client, reference) {
23
+ if (!isSignatureReference(reference)) {
24
+ throw new SignatureVerificationError("This is not a signature reference.");
25
+ }
26
+ const { data, response } = await client.GET(VERIFY_PATH, {
27
+ params: { path: { reference } }
28
+ });
29
+ if (!response.ok || !data) {
30
+ throw new SignatureVerificationError(
31
+ VERIFY_ERRORS[response.status] ?? "The signature could not be checked right now.",
32
+ response.status
33
+ );
34
+ }
35
+ return data;
36
+ }
37
+ function useSignatureVerification(reference) {
38
+ const { client } = useDocumentTools();
39
+ return useQuery({
40
+ queryKey: arbiQueryKeys.signatureVerification(reference ?? ""),
41
+ queryFn: () => fetchSignatureVerification(client, reference),
42
+ enabled: !!reference,
43
+ retry: false
44
+ });
45
+ }
46
+ async function matchSignedCopy(file, verification) {
47
+ const hash = await sha256Hex(file);
48
+ if (hash === verification.document_sha256.toLowerCase()) return { kind: "current" };
49
+ const signature = verification.signatures.find((s) => s.sha256.toLowerCase() === hash);
50
+ return signature ? { kind: "earlier", signature } : { kind: "none" };
51
+ }
52
+ export {
53
+ SignatureVerificationError,
54
+ VERIFY_PATH,
55
+ fetchSignatureVerification,
56
+ isSignatureReference,
57
+ matchSignedCopy,
58
+ useSignatureVerification
59
+ };
60
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/document-tools/verification.ts"],
4
+ "sourcesContent": ["/**\n * Checking a signature from its reference, without signing in: the public certificate behind the\n * link on a signed PDF's signature (`GET /v1/sign/verify/{reference}`). It names who signed and\n * when, says whether the signed document is unchanged since, and carries the SHA-256 of the signed\n * PDF and of each signed revision, so anyone can check their own copy in the browser (the file is\n * never uploaded). No email addresses and no document content.\n */\n\nimport type { components } from '@arbidocs/client'\nimport { useQuery } from '@tanstack/react-query'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { sha256Hex } from './signing'\nimport { arbiQueryKeys } from '../query-keys'\n\nexport const VERIFY_PATH = '/v1/sign/verify/{reference}'\n\nexport type SignatureVerification = components['schemas']['SignatureVerification']\nexport type VerifiedSignature = components['schemas']['VerifiedSignature']\n\n/** A signature reference as the backend issues them: `sig-` and 128 random bits in hex. */\nconst REFERENCE = /^sig-[0-9a-f]{32}$/\n\nexport function isSignatureReference(reference: string | null | undefined): boolean {\n return !!reference && REFERENCE.test(reference)\n}\n\nexport class SignatureVerificationError extends Error {\n constructor(\n message: string,\n readonly status?: number\n ) {\n super(message)\n this.name = 'SignatureVerificationError'\n }\n}\n\nconst VERIFY_ERRORS: Record<number, string> = {\n 404: 'No signature has this reference.',\n 429: 'Too many checks, try again in a minute.',\n}\n\nexport async function fetchSignatureVerification(\n client: DocumentToolsClient,\n reference: string\n): Promise<SignatureVerification> {\n if (!isSignatureReference(reference)) {\n throw new SignatureVerificationError('This is not a signature reference.')\n }\n const { data, response } = await client.GET(VERIFY_PATH, {\n params: { path: { reference } },\n })\n if (!response.ok || !data) {\n throw new SignatureVerificationError(\n VERIFY_ERRORS[response.status] ?? 'The signature could not be checked right now.',\n response.status\n )\n }\n return data\n}\n\n/** The certificate of a signature reference. Needs a `<DocumentToolsProvider>` (no user). */\nexport function useSignatureVerification(reference: string | null | undefined) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.signatureVerification(reference ?? ''),\n queryFn: () => fetchSignatureVerification(client, reference!),\n enabled: !!reference,\n retry: false,\n })\n}\n\n/**\n * What a copy is: the signed document as it stands (`current`), the document as it was when an\n * earlier signer signed it (`earlier`, a counter-signed PDF's earlier revision), or neither.\n */\nexport type CopyMatch =\n { kind: 'current' } | { kind: 'earlier'; signature: VerifiedSignature } | { kind: 'none' }\n\n/** Compare a file with the signed PDF and its signed revisions. Hashed here; nothing is uploaded. */\nexport async function matchSignedCopy(\n file: Blob,\n verification: Pick<SignatureVerification, 'document_sha256' | 'signatures'>\n): Promise<CopyMatch> {\n const hash = await sha256Hex(file)\n if (hash === verification.document_sha256.toLowerCase()) return { kind: 'current' }\n const signature = verification.signatures.find((s) => s.sha256.toLowerCase() === hash)\n return signature ? { kind: 'earlier', signature } : { kind: 'none' }\n}\n"],
5
+ "mappings": "AASA,SAAS,gBAAgB;AACzB,SAAS,wBAAkD;AAC3D,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAEvB,MAAM,cAAc;AAM3B,MAAM,YAAY;AAEX,SAAS,qBAAqB,WAA+C;AAClF,SAAO,CAAC,CAAC,aAAa,UAAU,KAAK,SAAS;AAChD;AAEO,MAAM,mCAAmC,MAAM;AAAA,EACpD,YACE,SACS,QACT;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;AAEA,MAAM,gBAAwC;AAAA,EAC5C,KAAK;AAAA,EACL,KAAK;AACP;AAEA,eAAsB,2BACpB,QACA,WACgC;AAChC,MAAI,CAAC,qBAAqB,SAAS,GAAG;AACpC,UAAM,IAAI,2BAA2B,oCAAoC;AAAA,EAC3E;AACA,QAAM,EAAE,MAAM,SAAS,IAAI,MAAM,OAAO,IAAI,aAAa;AAAA,IACvD,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE;AAAA,EAChC,CAAC;AACD,MAAI,CAAC,SAAS,MAAM,CAAC,MAAM;AACzB,UAAM,IAAI;AAAA,MACR,cAAc,SAAS,MAAM,KAAK;AAAA,MAClC,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,yBAAyB,WAAsC;AAC7E,QAAM,EAAE,OAAO,IAAI,iBAAiB;AACpC,SAAO,SAAS;AAAA,IACd,UAAU,cAAc,sBAAsB,aAAa,EAAE;AAAA,IAC7D,SAAS,MAAM,2BAA2B,QAAQ,SAAU;AAAA,IAC5D,SAAS,CAAC,CAAC;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AACH;AAUA,eAAsB,gBACpB,MACA,cACoB;AACpB,QAAM,OAAO,MAAM,UAAU,IAAI;AACjC,MAAI,SAAS,aAAa,gBAAgB,YAAY,EAAG,QAAO,EAAE,MAAM,UAAU;AAClF,QAAM,YAAY,aAAa,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,IAAI;AACrF,SAAO,YAAY,EAAE,MAAM,WAAW,UAAU,IAAI,EAAE,MAAM,OAAO;AACrE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,220 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { X } from "lucide-react";
4
+ import { useParsedDocument, useTags } from "../hooks.js";
5
+ import { useDocument } from "./documents-data.js";
6
+ import { FINISHED_DOCUMENT_STATUSES } from "./processing-order.js";
7
+ import { MarkdownRenderer } from "../ai/MarkdownRenderer.js";
8
+ import { TagEntity } from "../entities/TagEntity.js";
9
+ import { Badge } from "../ui/badge.js";
10
+ import { cn } from "../lib/utils.js";
11
+ const PARSED_STATUSES = /* @__PURE__ */ new Set(["completed", "low-content"]);
12
+ function noTextMessage(status) {
13
+ if (status === "failed")
14
+ return "This document could not be processed, so it has no text to review.";
15
+ if (status === "empty" || status === "skipped") return "No readable content.";
16
+ return "Still processing. The text appears here when it is ready.";
17
+ }
18
+ function DocumentReview({
19
+ docId,
20
+ doc,
21
+ workspaceId,
22
+ stage = "final",
23
+ activeChunkId,
24
+ onClose,
25
+ className
26
+ }) {
27
+ const processingInProp = !!doc?.status && !FINISHED_DOCUMENT_STATUSES.has(doc.status);
28
+ const { data: polled } = useDocument(docId, {
29
+ enabled: processingInProp,
30
+ pollWhileProcessing: true
31
+ });
32
+ const status = processingInProp ? polled?.status ?? doc?.status : doc?.status;
33
+ const noTextYet = stage === "final" && !!status && !PARSED_STATUSES.has(status);
34
+ const parsedQuery = useParsedDocument(docId, stage, { enabled: !noTextYet });
35
+ const { isError: parsedFailed, refetch: refetchParsed } = parsedQuery;
36
+ const readable = !!status && !noTextYet;
37
+ React.useEffect(() => {
38
+ if (readable && parsedFailed) void refetchParsed();
39
+ }, [readable]);
40
+ const tagsQuery = useTags(workspaceId);
41
+ const tagNameById = React.useMemo(() => {
42
+ const map = /* @__PURE__ */ new Map();
43
+ for (const t of tagsQuery.data ?? []) {
44
+ if (t.external_id) map.set(t.external_id, t.name ?? t.external_id.slice(0, 8));
45
+ }
46
+ return map;
47
+ }, [tagsQuery.data]);
48
+ const title = doc?.doc_metadata?.title || doc?.file_name || "Document";
49
+ const { findings, chunkToTag } = React.useMemo(() => {
50
+ const list = [];
51
+ const chunkTag = /* @__PURE__ */ new Map();
52
+ for (const dt of doc?.doctags ?? []) {
53
+ const chunkIds = (dt.citations ?? []).flatMap((d) => (d.chunks ?? []).map((c) => c.chunk_id));
54
+ if (chunkIds.length === 0) continue;
55
+ list.push({
56
+ key: dt.tag_ext_id,
57
+ tagExtId: dt.tag_ext_id,
58
+ statement: dt.note ?? "",
59
+ chunkIds
60
+ });
61
+ for (const cid of chunkIds) if (!chunkTag.has(cid)) chunkTag.set(cid, dt.tag_ext_id);
62
+ }
63
+ return { findings: list, chunkToTag: chunkTag };
64
+ }, [doc?.doctags]);
65
+ const pages = React.useMemo(() => {
66
+ const chunks = parsedQuery.data?.chunks ?? [];
67
+ const byPage = /* @__PURE__ */ new Map();
68
+ for (const c of chunks) {
69
+ const p = c.metadata?.page_number ?? 0;
70
+ if (!byPage.has(p)) byPage.set(p, []);
71
+ byPage.get(p).push(c);
72
+ }
73
+ return [...byPage.entries()].sort((a, b) => a[0] - b[0]);
74
+ }, [parsedQuery.data]);
75
+ const scrollRef = React.useRef(null);
76
+ const [flash, setFlash] = React.useState(null);
77
+ const jumpToChunk = React.useCallback((chunkId) => {
78
+ const el = scrollRef.current?.querySelector(`[data-chunk-id="${chunkId}"]`);
79
+ if (!el) return;
80
+ el.scrollIntoView({ behavior: "smooth", block: "center" });
81
+ setFlash(chunkId);
82
+ window.setTimeout(() => setFlash((c) => c === chunkId ? null : c), 1600);
83
+ }, []);
84
+ const parsedReady = !parsedQuery.isLoading && !!parsedQuery.data;
85
+ React.useEffect(() => {
86
+ if (!activeChunkId || !parsedReady) return;
87
+ const raf = window.requestAnimationFrame(() => jumpToChunk(activeChunkId));
88
+ return () => window.cancelAnimationFrame(raf);
89
+ }, [activeChunkId, parsedReady, jumpToChunk]);
90
+ return /* @__PURE__ */ jsxs(
91
+ "div",
92
+ {
93
+ "data-testid": "document-review",
94
+ className: cn(
95
+ "flex h-full min-h-0 flex-col overflow-hidden rounded-lg border bg-card",
96
+ className
97
+ ),
98
+ children: [
99
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-b px-4 py-3", children: [
100
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
101
+ /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-semibold", title, children: title }),
102
+ /* @__PURE__ */ jsxs("div", { className: "text-xs text-muted-foreground", children: [
103
+ noTextYet ? "" : parsedQuery.data?.metadata?.total_number_of_pages ? `${parsedQuery.data.metadata.total_number_of_pages} pages` : `${pages.length} pages`,
104
+ findings.length ? ` \xB7 ${findings.length} findings` : ""
105
+ ] })
106
+ ] }),
107
+ status ? /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: status }) : null,
108
+ onClose ? /* @__PURE__ */ jsx(
109
+ "button",
110
+ {
111
+ type: "button",
112
+ "aria-label": "Close review",
113
+ "data-testid": "document-review-close",
114
+ onClick: onClose,
115
+ className: "rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground",
116
+ children: /* @__PURE__ */ jsx(X, { className: "size-4" })
117
+ }
118
+ ) : null
119
+ ] }),
120
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1", children: [
121
+ findings.length > 0 ? /* @__PURE__ */ jsxs(
122
+ "aside",
123
+ {
124
+ className: "hidden w-64 shrink-0 overflow-y-auto border-r p-3 md:block",
125
+ "data-testid": "document-review-findings",
126
+ children: [
127
+ /* @__PURE__ */ jsx("div", { className: "mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "AI findings" }),
128
+ /* @__PURE__ */ jsx("ul", { className: "space-y-2", children: findings.map((f) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
129
+ "div",
130
+ {
131
+ role: "button",
132
+ tabIndex: 0,
133
+ "data-testid": "review-finding",
134
+ onClick: () => jumpToChunk(f.chunkIds[0]),
135
+ onKeyDown: (e) => {
136
+ if (e.key === "Enter" || e.key === " ") {
137
+ e.preventDefault();
138
+ jumpToChunk(f.chunkIds[0]);
139
+ }
140
+ },
141
+ className: "w-full cursor-pointer rounded-md border p-2 text-left text-xs transition hover:border-ring hover:bg-muted/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
142
+ children: [
143
+ /* @__PURE__ */ jsx(
144
+ TagEntity,
145
+ {
146
+ size: "sm",
147
+ tag: {
148
+ external_id: f.tagExtId,
149
+ name: tagNameById.get(f.tagExtId) ?? f.tagExtId.slice(0, 8)
150
+ }
151
+ }
152
+ ),
153
+ /* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-3 text-muted-foreground", children: f.statement })
154
+ ]
155
+ }
156
+ ) }, f.key)) })
157
+ ]
158
+ }
159
+ ) : null,
160
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "min-w-0 flex-1 overflow-y-auto px-6 py-4", children: noTextYet ? /* @__PURE__ */ jsx(
161
+ "div",
162
+ {
163
+ className: "flex h-full items-center justify-center text-sm text-muted-foreground",
164
+ "data-testid": "document-review-no-text",
165
+ children: noTextMessage(status)
166
+ }
167
+ ) : parsedQuery.isLoading ? /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: "Loading document\u2026" }) : parsedQuery.isError ? /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: "Could not load this document\u2019s content." }) : pages.length === 0 ? /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: "No readable content." }) : /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-3xl space-y-8", children: pages.map(([pageNum, chunks]) => /* @__PURE__ */ jsxs("section", { children: [
168
+ /* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center gap-3", children: [
169
+ /* @__PURE__ */ jsxs("span", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: [
170
+ "Page ",
171
+ pageNum
172
+ ] }),
173
+ /* @__PURE__ */ jsx("div", { className: "h-px flex-1 bg-border" })
174
+ ] }),
175
+ /* @__PURE__ */ jsx("div", { className: "space-y-3", children: chunks.map((c, i) => {
176
+ const cid = c.metadata?.chunk_ext_id;
177
+ const tagExtId = cid ? chunkToTag.get(cid) : void 0;
178
+ const highlighted = !!tagExtId;
179
+ const isActive = !!cid && cid === activeChunkId;
180
+ return /* @__PURE__ */ jsxs(
181
+ "div",
182
+ {
183
+ "data-chunk-id": cid,
184
+ "data-testid": isActive ? "review-chunk-active" : highlighted ? "review-chunk-cited" : "review-chunk",
185
+ className: cn(
186
+ "scroll-mt-4 rounded-md px-2 py-1 transition-colors",
187
+ highlighted && "bg-[var(--color-ai-accent-soft,theme(colors.amber.100))] ring-1 ring-inset ring-border",
188
+ // The externally-selected search passage wins the
189
+ // styling: a stronger accent ring so the matched
190
+ // hit stands out from any AI-finding highlights.
191
+ isActive && "bg-[var(--color-ai-accent-soft,theme(colors.amber.100))] ring-2 ring-inset ring-ai-accent",
192
+ flash === cid && "ring-2 ring-ring"
193
+ ),
194
+ children: [
195
+ highlighted ? /* @__PURE__ */ jsx("div", { className: "mb-1", children: /* @__PURE__ */ jsx(
196
+ TagEntity,
197
+ {
198
+ size: "sm",
199
+ tag: {
200
+ external_id: tagExtId,
201
+ name: tagNameById.get(tagExtId) ?? tagExtId.slice(0, 8)
202
+ }
203
+ }
204
+ ) }) : null,
205
+ /* @__PURE__ */ jsx(MarkdownRenderer, { className: "prose prose-sm max-w-none dark:prose-invert", children: c.content })
206
+ ]
207
+ },
208
+ cid ?? i
209
+ );
210
+ }) })
211
+ ] }, pageNum)) }) })
212
+ ] })
213
+ ]
214
+ }
215
+ );
216
+ }
217
+ export {
218
+ DocumentReview
219
+ };
220
+ //# sourceMappingURL=DocumentReview.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/DocumentReview.tsx"],
4
+ "sourcesContent": ["/**\n * DocumentReview \u2014 a reusable, decoupled \"review mode\" viewer for a single\n * document. It renders the parsed content (chunks grouped by page, as markdown)\n * and overlays the document's AI findings: each tag citation highlights the\n * chunks it references and is listed in a findings rail that jumps to the\n * passage on click.\n *\n * REUSE-FIRST: reads purely from SDK data \u2014 `useParsedDocument` for the body,\n * the passed-in `doc.doctags[].citations` for findings, `useTags` for label\n * names, and `MarkdownRenderer` for rendering. No app store / react-pdf / Zustand\n * coupling; citation-jump is plain `scrollIntoView` on `data-chunk-id`.\n */\n\nimport React from 'react'\nimport { X } from 'lucide-react'\nimport type { components } from '@arbidocs/client'\n\nimport { useParsedDocument, useTags } from '../hooks'\nimport { useDocument } from './documents-data'\nimport { FINISHED_DOCUMENT_STATUSES } from './processing-order'\nimport { MarkdownRenderer } from '../ai/MarkdownRenderer'\nimport { TagEntity } from '../entities/TagEntity'\nimport { Badge } from '../ui/badge'\nimport { cn } from '../lib/utils'\nimport type { ParsedChunk } from './parsed-types'\n\ntype DocResponse = components['schemas']['DocResponse']\n\nexport interface DocumentReviewProps {\n /** Document to review. */\n docId: string\n /** The document object (from `useDocuments`) \u2014 supplies title + AI findings\n * (`doctags[].citations`). Optional: without it the viewer is a plain reader. */\n doc?: DocResponse\n /** Workspace id \u2014 used to resolve tag ids \u2192 human names for findings. */\n workspaceId?: string\n /** Parse stage to render. Default `final`. */\n stage?: string\n /**\n * A chunk to scroll to and persistently highlight \u2014 the join key is the\n * parsed chunk's `chunk_ext_id`. This is how a semantic-search hit drives the\n * viewer: passing the matched passage's `chunkExtId` scrolls the body to it\n * and marks it, mirroring the monolith's `viewingPassageId` behaviour.\n * Independent of AI findings (which highlight via `doctags[].citations`).\n */\n activeChunkId?: string | null\n /** When provided, a close button is shown in the header. */\n onClose?: () => void\n className?: string\n}\n\n/**\n * Statuses whose parsed text can be read (`low-content` is terminal, with sparse passages). Before\n * then the server has none (404): a copy just saved, still processing, is not an error.\n */\nconst PARSED_STATUSES = new Set<DocResponse['status']>(['completed', 'low-content'])\n\n/** Why a document has no text to review (yet). */\nfunction noTextMessage(status: DocResponse['status'] | undefined): string {\n if (status === 'failed')\n return 'This document could not be processed, so it has no text to review.'\n if (status === 'empty' || status === 'skipped') return 'No readable content.'\n return 'Still processing. The text appears here when it is ready.'\n}\n\ninterface Finding {\n key: string\n tagExtId: string\n statement: string\n chunkIds: string[]\n}\n\nexport function DocumentReview({\n docId,\n doc,\n workspaceId,\n stage = 'final',\n activeChunkId,\n onClose,\n className,\n}: DocumentReviewProps) {\n // Without its record the reader just reads; with it, the final text waits until processing is\n // done. A record still processing is re-read here every few seconds until it finishes, so a\n // missed \"completed\" event (the host's list is not refetched) cannot leave it waiting.\n const processingInProp = !!doc?.status && !FINISHED_DOCUMENT_STATUSES.has(doc.status)\n const { data: polled } = useDocument(docId, {\n enabled: processingInProp,\n pollWhileProcessing: true,\n })\n const status = processingInProp ? (polled?.status ?? doc?.status) : doc?.status\n // Only the final parse waits for the status; another stage (`marker`) is read as asked.\n const noTextYet = stage === 'final' && !!status && !PARSED_STATUSES.has(status)\n const parsedQuery = useParsedDocument(docId, stage, { enabled: !noTextYet })\n // A read made before the record arrived may have stored a 404: once the text is readable, ask\n // again.\n const { isError: parsedFailed, refetch: refetchParsed } = parsedQuery\n const readable = !!status && !noTextYet\n React.useEffect(() => {\n if (readable && parsedFailed) void refetchParsed()\n // On the status becoming readable only, not on every failure (no retry loop).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [readable])\n const tagsQuery = useTags(workspaceId)\n\n const tagNameById = React.useMemo(() => {\n const map = new Map<string, string>()\n for (const t of tagsQuery.data ?? []) {\n if (t.external_id) map.set(t.external_id, t.name ?? t.external_id.slice(0, 8))\n }\n return map\n }, [tagsQuery.data])\n\n const title = doc?.doc_metadata?.title || doc?.file_name || 'Document'\n\n // Findings: one per grounded doctag, plus an index of which chunks it\n // highlights. A doctag used to carry a per-statement citation map, so this\n // produced several findings per tag; each statement was a verbatim copy of\n // the doctag's own note, so the tag's note IS the finding text now.\n const { findings, chunkToTag } = React.useMemo(() => {\n const list: Finding[] = []\n const chunkTag = new Map<string, string>() // chunk_ext_id \u2192 tag_ext_id\n for (const dt of doc?.doctags ?? []) {\n const chunkIds = (dt.citations ?? []).flatMap((d) => (d.chunks ?? []).map((c) => c.chunk_id))\n if (chunkIds.length === 0) continue\n list.push({\n key: dt.tag_ext_id,\n tagExtId: dt.tag_ext_id,\n statement: dt.note ?? '',\n chunkIds,\n })\n for (const cid of chunkIds) if (!chunkTag.has(cid)) chunkTag.set(cid, dt.tag_ext_id)\n }\n return { findings: list, chunkToTag: chunkTag }\n }, [doc?.doctags])\n\n // Group parsed chunks by page.\n const pages = React.useMemo(() => {\n const chunks = (parsedQuery.data?.chunks ?? []) as ParsedChunk[]\n const byPage = new Map<number, ParsedChunk[]>()\n for (const c of chunks) {\n const p = c.metadata?.page_number ?? 0\n if (!byPage.has(p)) byPage.set(p, [])\n byPage.get(p)!.push(c)\n }\n return [...byPage.entries()].sort((a, b) => a[0] - b[0])\n }, [parsedQuery.data])\n\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const [flash, setFlash] = React.useState<string | null>(null)\n\n const jumpToChunk = React.useCallback((chunkId: string) => {\n const el = scrollRef.current?.querySelector<HTMLElement>(`[data-chunk-id=\"${chunkId}\"]`)\n if (!el) return\n el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n setFlash(chunkId)\n window.setTimeout(() => setFlash((c) => (c === chunkId ? null : c)), 1600)\n }, [])\n\n // Drive the viewer from an external passage selection (semantic-search hit).\n // Scroll to + flash the target chunk once its element is in the DOM \u2014 which,\n // since this viewer renders every chunk eagerly, is as soon as the parsed\n // body has loaded. Re-runs whenever the selected passage changes so clicking\n // successive results re-navigates, matching `viewingPassageId` in the monolith.\n const parsedReady = !parsedQuery.isLoading && !!parsedQuery.data\n React.useEffect(() => {\n if (!activeChunkId || !parsedReady) return\n // Defer to the next frame so the chunk nodes are committed before we query.\n const raf = window.requestAnimationFrame(() => jumpToChunk(activeChunkId))\n return () => window.cancelAnimationFrame(raf)\n }, [activeChunkId, parsedReady, jumpToChunk])\n\n return (\n <div\n data-testid=\"document-review\"\n className={cn(\n 'flex h-full min-h-0 flex-col overflow-hidden rounded-lg border bg-card',\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-3 border-b px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-semibold\" title={title}>\n {title}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {noTextYet\n ? ''\n : parsedQuery.data?.metadata?.total_number_of_pages\n ? `${parsedQuery.data.metadata.total_number_of_pages} pages`\n : `${pages.length} pages`}\n {findings.length ? ` \u00B7 ${findings.length} findings` : ''}\n </div>\n </div>\n {status ? <Badge variant=\"secondary\">{status}</Badge> : null}\n {onClose ? (\n <button\n type=\"button\"\n aria-label=\"Close review\"\n data-testid=\"document-review-close\"\n onClick={onClose}\n className=\"rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <X className=\"size-4\" />\n </button>\n ) : null}\n </div>\n\n <div className=\"flex min-h-0 flex-1\">\n {/* Findings rail */}\n {findings.length > 0 ? (\n <aside\n className=\"hidden w-64 shrink-0 overflow-y-auto border-r p-3 md:block\"\n data-testid=\"document-review-findings\"\n >\n <div className=\"mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n AI findings\n </div>\n <ul className=\"space-y-2\">\n {findings.map((f) => (\n <li key={f.key}>\n {/* role=button (not <button>) so the TagEntity pill \u2014 itself a\n button \u2014 isn't nested inside a button (invalid HTML). */}\n <div\n role=\"button\"\n tabIndex={0}\n data-testid=\"review-finding\"\n onClick={() => jumpToChunk(f.chunkIds[0])}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n jumpToChunk(f.chunkIds[0])\n }\n }}\n className=\"w-full cursor-pointer rounded-md border p-2 text-left text-xs transition hover:border-ring hover:bg-muted/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <TagEntity\n size=\"sm\"\n tag={{\n external_id: f.tagExtId,\n name: tagNameById.get(f.tagExtId) ?? f.tagExtId.slice(0, 8),\n }}\n />\n <p className=\"mt-1 line-clamp-3 text-muted-foreground\">{f.statement}</p>\n </div>\n </li>\n ))}\n </ul>\n </aside>\n ) : null}\n\n {/* Document body */}\n <div ref={scrollRef} className=\"min-w-0 flex-1 overflow-y-auto px-6 py-4\">\n {noTextYet ? (\n <div\n className=\"flex h-full items-center justify-center text-sm text-muted-foreground\"\n data-testid=\"document-review-no-text\"\n >\n {noTextMessage(status)}\n </div>\n ) : parsedQuery.isLoading ? (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n Loading document\u2026\n </div>\n ) : parsedQuery.isError ? (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n Could not load this document\u2019s content.\n </div>\n ) : pages.length === 0 ? (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n No readable content.\n </div>\n ) : (\n <div className=\"mx-auto max-w-3xl space-y-8\">\n {pages.map(([pageNum, chunks]) => (\n <section key={pageNum}>\n <div className=\"mb-3 flex items-center gap-3\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n Page {pageNum}\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n <div className=\"space-y-3\">\n {chunks.map((c, i) => {\n const cid = c.metadata?.chunk_ext_id\n const tagExtId = cid ? chunkToTag.get(cid) : undefined\n const highlighted = !!tagExtId\n const isActive = !!cid && cid === activeChunkId\n return (\n <div\n key={cid ?? i}\n data-chunk-id={cid}\n data-testid={\n isActive\n ? 'review-chunk-active'\n : highlighted\n ? 'review-chunk-cited'\n : 'review-chunk'\n }\n className={cn(\n 'scroll-mt-4 rounded-md px-2 py-1 transition-colors',\n highlighted &&\n 'bg-[var(--color-ai-accent-soft,theme(colors.amber.100))] ring-1 ring-inset ring-border',\n // The externally-selected search passage wins the\n // styling: a stronger accent ring so the matched\n // hit stands out from any AI-finding highlights.\n isActive &&\n 'bg-[var(--color-ai-accent-soft,theme(colors.amber.100))] ring-2 ring-inset ring-ai-accent',\n flash === cid && 'ring-2 ring-ring'\n )}\n >\n {highlighted ? (\n <div className=\"mb-1\">\n <TagEntity\n size=\"sm\"\n tag={{\n external_id: tagExtId!,\n name: tagNameById.get(tagExtId!) ?? tagExtId!.slice(0, 8),\n }}\n />\n </div>\n ) : null}\n <MarkdownRenderer className=\"prose prose-sm max-w-none dark:prose-invert\">\n {c.content}\n </MarkdownRenderer>\n </div>\n )\n })}\n </div>\n </section>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }