@arbidocs/react 0.5.110 → 0.5.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1011) hide show
  1. package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
  2. package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
  3. package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
  4. package/dist/account/client.js +96 -0
  5. package/dist/account/client.js.map +7 -0
  6. package/dist/account/delete.js +70 -0
  7. package/dist/account/delete.js.map +7 -0
  8. package/dist/account/didit.js +34 -0
  9. package/dist/account/didit.js.map +7 -0
  10. package/dist/account/dismissed-tips.js +33 -0
  11. package/dist/account/dismissed-tips.js.map +7 -0
  12. package/dist/account/email.js +84 -0
  13. package/dist/account/email.js.map +7 -0
  14. package/dist/account/entitlements.js +47 -0
  15. package/dist/account/entitlements.js.map +7 -0
  16. package/dist/account/identity.js +270 -0
  17. package/dist/account/identity.js.map +7 -0
  18. package/dist/account/index.js +93 -0
  19. package/dist/account/index.js.map +7 -0
  20. package/dist/account/notifications.js +59 -0
  21. package/dist/account/notifications.js.map +7 -0
  22. package/dist/account/password.js +103 -0
  23. package/dist/account/password.js.map +7 -0
  24. package/dist/account/profile.js +116 -0
  25. package/dist/account/profile.js.map +7 -0
  26. package/dist/account/recovery.js +13 -0
  27. package/dist/account/recovery.js.map +7 -0
  28. package/dist/account/relevance.js +82 -0
  29. package/dist/account/relevance.js.map +7 -0
  30. package/dist/account/sessions.js +37 -0
  31. package/dist/account/sessions.js.map +7 -0
  32. package/dist/account/settings.js +39 -0
  33. package/dist/account/settings.js.map +7 -0
  34. package/dist/account/table-views.js +16 -0
  35. package/dist/account/table-views.js.map +7 -0
  36. package/dist/ai/AiAnswer.js +83 -0
  37. package/dist/ai/AiAnswer.js.map +7 -0
  38. package/dist/ai/AiMarkdown.js +40 -0
  39. package/dist/ai/AiMarkdown.js.map +7 -0
  40. package/dist/ai/ArtifactCanvas.js +193 -0
  41. package/dist/ai/ArtifactCanvas.js.map +7 -0
  42. package/dist/ai/CitationRenderer.js +413 -0
  43. package/dist/ai/CitationRenderer.js.map +7 -0
  44. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  45. package/dist/ai/MarkdownRenderer.js.map +7 -0
  46. package/dist/ai/MessageArtifactCard.js +75 -0
  47. package/dist/ai/MessageArtifactCard.js.map +7 -0
  48. package/dist/ai/PassageCard.js +79 -0
  49. package/dist/ai/PassageCard.js.map +7 -0
  50. package/dist/ai/engine.js +110 -0
  51. package/dist/ai/engine.js.map +7 -0
  52. package/dist/ai/index.js +63 -0
  53. package/dist/ai/index.js.map +7 -0
  54. package/dist/ai/markdown-base-components.js +37 -0
  55. package/dist/ai/markdown-base-components.js.map +7 -0
  56. package/dist/ai/markdown-streaming-context.js +6 -0
  57. package/dist/ai/markdown-streaming-context.js.map +7 -0
  58. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  59. package/dist/ai/normalize-citations.js.map +7 -0
  60. package/dist/ai/redline.js +41 -0
  61. package/dist/ai/redline.js.map +7 -0
  62. package/dist/ai/split-markdown-blocks.js +40 -0
  63. package/dist/ai/split-markdown-blocks.js.map +7 -0
  64. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  65. package/dist/ai/stored-markdown.js.map +7 -0
  66. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  67. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  68. package/dist/annotations/AnnotationToolbar.js +398 -0
  69. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  70. package/dist/annotations/FreezeDialog.js +170 -0
  71. package/dist/annotations/FreezeDialog.js.map +7 -0
  72. package/dist/annotations/ProductionDialog.js +354 -0
  73. package/dist/annotations/ProductionDialog.js.map +7 -0
  74. package/dist/annotations/controller.js +49 -0
  75. package/dist/annotations/controller.js.map +7 -0
  76. package/dist/annotations/freeze/browser.js +21 -0
  77. package/dist/annotations/freeze/browser.js.map +7 -0
  78. package/dist/annotations/freeze/bundle.js +201 -0
  79. package/dist/annotations/freeze/bundle.js.map +7 -0
  80. package/dist/annotations/freeze/coords.js +37 -0
  81. package/dist/annotations/freeze/coords.js.map +7 -0
  82. package/dist/annotations/freeze/freeze.js +261 -0
  83. package/dist/annotations/freeze/freeze.js.map +7 -0
  84. package/dist/annotations/freeze/hash.js +28 -0
  85. package/dist/annotations/freeze/hash.js.map +7 -0
  86. package/dist/annotations/freeze/index-page.js +78 -0
  87. package/dist/annotations/freeze/index-page.js.map +7 -0
  88. package/dist/annotations/freeze/index.d.ts +1 -1
  89. package/dist/annotations/freeze/index.js +28 -22
  90. package/dist/annotations/freeze/index.js.map +7 -1
  91. package/dist/annotations/freeze/raster.js +208 -0
  92. package/dist/annotations/freeze/raster.js.map +7 -0
  93. package/dist/annotations/freeze/stamp.js +117 -0
  94. package/dist/annotations/freeze/stamp.js.map +7 -0
  95. package/dist/annotations/freeze/types.js +14 -0
  96. package/dist/annotations/freeze/types.js.map +7 -0
  97. package/dist/annotations/freeze/vector.js +283 -0
  98. package/dist/annotations/freeze/vector.js.map +7 -0
  99. package/dist/annotations/geometry.js +81 -0
  100. package/dist/annotations/geometry.js.map +7 -0
  101. package/dist/annotations/index.js +125 -6
  102. package/dist/annotations/index.js.map +7 -1
  103. package/dist/annotations/merge.js +53 -0
  104. package/dist/annotations/merge.js.map +7 -0
  105. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  106. package/dist/annotations/model.js.map +7 -0
  107. package/dist/annotations/overlay-geometry.js +41 -0
  108. package/dist/annotations/overlay-geometry.js.map +7 -0
  109. package/dist/annotations/redaction-log.js +33 -0
  110. package/dist/annotations/redaction-log.js.map +7 -0
  111. package/dist/annotations/selection-marks.js +122 -0
  112. package/dist/annotations/selection-marks.js.map +7 -0
  113. package/dist/annotations/state.js +140 -0
  114. package/dist/annotations/state.js.map +7 -0
  115. package/dist/annotations/store.js +49 -0
  116. package/dist/annotations/store.js.map +7 -0
  117. package/dist/annotations/useAnnotationLayer.js +306 -0
  118. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  119. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  120. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  121. package/dist/annotations/useTextSelectionMarks.js +100 -0
  122. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  123. package/dist/artifacts/artifact-kind.js +19 -0
  124. package/dist/artifacts/artifact-kind.js.map +7 -0
  125. package/dist/artifacts/index.cjs +13 -13
  126. package/dist/artifacts/index.js +89 -571
  127. package/dist/artifacts/index.js.map +7 -1
  128. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  129. package/dist/artifacts/normalize-markdown.js.map +7 -0
  130. package/dist/artifacts/redline-core.js +12 -3
  131. package/dist/artifacts/redline-core.js.map +7 -1
  132. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  133. package/dist/artifacts/redline-diff.js.map +7 -0
  134. package/dist/artifacts/redline-engine.js +14 -0
  135. package/dist/artifacts/redline-engine.js.map +7 -0
  136. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  137. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  138. package/dist/artifacts/useArtifactEditSession.js +183 -0
  139. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  140. package/dist/artifacts/useArtifactSession.js +173 -0
  141. package/dist/artifacts/useArtifactSession.js.map +7 -0
  142. package/dist/artifacts/useArtifactSource.js +16 -0
  143. package/dist/artifacts/useArtifactSource.js.map +7 -0
  144. package/dist/artifacts/useArtifactText.js +78 -0
  145. package/dist/artifacts/useArtifactText.js.map +7 -0
  146. package/dist/artifacts/useRedline.js +65 -0
  147. package/dist/artifacts/useRedline.js.map +7 -0
  148. package/dist/artifacts/useStreamedArtifact.js +74 -0
  149. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  150. package/dist/artifacts/versions.js +68 -0
  151. package/dist/artifacts/versions.js.map +7 -0
  152. package/dist/billing.js +200 -0
  153. package/dist/billing.js.map +7 -0
  154. package/dist/boot-timeout.js +19 -0
  155. package/dist/boot-timeout.js.map +7 -0
  156. package/dist/calendar/accounts.js +213 -0
  157. package/dist/calendar/accounts.js.map +7 -0
  158. package/dist/calendar/hooks.js +409 -0
  159. package/dist/calendar/hooks.js.map +7 -0
  160. package/dist/calendar/index.js +31 -0
  161. package/dist/calendar/index.js.map +7 -0
  162. package/dist/calendar/keys.js +5 -0
  163. package/dist/calendar/keys.js.map +7 -0
  164. package/dist/calendar/offline/outbox.js +231 -0
  165. package/dist/calendar/offline/outbox.js.map +7 -0
  166. package/dist/calendar/offline/runtime.js +109 -0
  167. package/dist/calendar/offline/runtime.js.map +7 -0
  168. package/dist/calendar/offline/support.js +41 -0
  169. package/dist/calendar/offline/support.js.map +7 -0
  170. package/dist/calendar/support.js +34 -0
  171. package/dist/calendar/support.js.map +7 -0
  172. package/dist/calls/actions.js +226 -0
  173. package/dist/calls/actions.js.map +7 -0
  174. package/dist/calls/events.js +138 -0
  175. package/dist/calls/events.js.map +7 -0
  176. package/dist/calls/gate.js +19 -0
  177. package/dist/calls/gate.js.map +7 -0
  178. package/dist/calls/hooks.js +115 -0
  179. package/dist/calls/hooks.js.map +7 -0
  180. package/dist/calls/in-call-chat.js +132 -0
  181. package/dist/calls/in-call-chat.js.map +7 -0
  182. package/dist/calls/index.js +24 -0
  183. package/dist/calls/index.js.map +7 -0
  184. package/dist/calls/keys.js +17 -0
  185. package/dist/calls/keys.js.map +7 -0
  186. package/dist/calls/livekit/index.cjs +48 -48
  187. package/dist/calls/livekit/index.js +6 -958
  188. package/dist/calls/livekit/index.js.map +7 -1
  189. package/dist/calls/livekit/room.js +98 -0
  190. package/dist/calls/livekit/room.js.map +7 -0
  191. package/dist/calls/livekit/useCallRecorder.js +219 -0
  192. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  193. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  194. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  195. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  196. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  197. package/dist/calls/livekit/useInCallChat.js +161 -0
  198. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  199. package/dist/calls/livekit/useWebinar.js +239 -0
  200. package/dist/calls/livekit/useWebinar.js.map +7 -0
  201. package/dist/calls/meeting-chat.js +149 -0
  202. package/dist/calls/meeting-chat.js.map +7 -0
  203. package/dist/calls/moderation.js +50 -0
  204. package/dist/calls/moderation.js.map +7 -0
  205. package/dist/calls/open-meeting-chat.js +29 -0
  206. package/dist/calls/open-meeting-chat.js.map +7 -0
  207. package/dist/calls/read-only.js +24 -0
  208. package/dist/calls/read-only.js.map +7 -0
  209. package/dist/calls/recording-media.js +218 -0
  210. package/dist/calls/recording-media.js.map +7 -0
  211. package/dist/calls/recording-playback.js +260 -0
  212. package/dist/calls/recording-playback.js.map +7 -0
  213. package/dist/calls/recording.js +268 -0
  214. package/dist/calls/recording.js.map +7 -0
  215. package/dist/calls/save-to-thread.js +80 -0
  216. package/dist/calls/save-to-thread.js.map +7 -0
  217. package/dist/calls/session.js +134 -0
  218. package/dist/calls/session.js.map +7 -0
  219. package/dist/calls/transcript-format.js +147 -0
  220. package/dist/calls/transcript-format.js.map +7 -0
  221. package/dist/calls/transcription.js +101 -0
  222. package/dist/calls/transcription.js.map +7 -0
  223. package/dist/calls/webinar.js +71 -0
  224. package/dist/calls/webinar.js.map +7 -0
  225. package/dist/charge-watch.js +71 -0
  226. package/dist/charge-watch.js.map +7 -0
  227. package/dist/chat/ChatBubble.js +146 -0
  228. package/dist/chat/ChatBubble.js.map +7 -0
  229. package/dist/chat/ConversationScope.js +30 -0
  230. package/dist/chat/ConversationScope.js.map +7 -0
  231. package/dist/chat/active-config.js +20 -0
  232. package/dist/chat/active-config.js.map +7 -0
  233. package/dist/chat/agent-chat-owner.js +25 -0
  234. package/dist/chat/agent-chat-owner.js.map +7 -0
  235. package/dist/chat/chat-artifacts.js +64 -0
  236. package/dist/chat/chat-artifacts.js.map +7 -0
  237. package/dist/chat/citations.js +32 -0
  238. package/dist/chat/citations.js.map +7 -0
  239. package/dist/chat/config-model.js +10 -0
  240. package/dist/chat/config-model.js.map +7 -0
  241. package/dist/chat/conversation-cache.js +676 -0
  242. package/dist/chat/conversation-cache.js.map +7 -0
  243. package/dist/chat/conversation-events.js +57 -0
  244. package/dist/chat/conversation-events.js.map +7 -0
  245. package/dist/chat/conversation-mentions.js +58 -0
  246. package/dist/chat/conversation-mentions.js.map +7 -0
  247. package/dist/chat/conversation-workspace.js +58 -0
  248. package/dist/chat/conversation-workspace.js.map +7 -0
  249. package/dist/chat/mentions.js +116 -0
  250. package/dist/chat/mentions.js.map +7 -0
  251. package/dist/chat/open-document.js +106 -0
  252. package/dist/chat/open-document.js.map +7 -0
  253. package/dist/chat/orphaned.js +44 -0
  254. package/dist/chat/orphaned.js.map +7 -0
  255. package/dist/chat/pendingFirstTurn.js +30 -0
  256. package/dist/chat/pendingFirstTurn.js.map +7 -0
  257. package/dist/chat/reply-target.js +12 -0
  258. package/dist/chat/reply-target.js.map +7 -0
  259. package/dist/chat/run-finished.js +28 -0
  260. package/dist/chat/run-finished.js.map +7 -0
  261. package/dist/chat/run-state.js +91 -0
  262. package/dist/chat/run-state.js.map +7 -0
  263. package/dist/chat/stream-handlers.js +419 -0
  264. package/dist/chat/stream-handlers.js.map +7 -0
  265. package/dist/chat/thread-binding.js +76 -0
  266. package/dist/chat/thread-binding.js.map +7 -0
  267. package/dist/chat/thread-document.js +53 -0
  268. package/dist/chat/thread-document.js.map +7 -0
  269. package/dist/chat/turn-control.js +79 -0
  270. package/dist/chat/turn-control.js.map +7 -0
  271. package/dist/chat/useAgentRunControl.js +36 -0
  272. package/dist/chat/useAgentRunControl.js.map +7 -0
  273. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  274. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  275. package/dist/chat/useAskAgain.js +32 -0
  276. package/dist/chat/useAskAgain.js.map +7 -0
  277. package/dist/chat/useAutoSendDraft.js +17 -0
  278. package/dist/chat/useAutoSendDraft.js.map +7 -0
  279. package/dist/chat/useBranchNavigation.js +97 -0
  280. package/dist/chat/useBranchNavigation.js.map +7 -0
  281. package/dist/chat/useConnectRunStream.js +169 -0
  282. package/dist/chat/useConnectRunStream.js.map +7 -0
  283. package/dist/chat/useConversation.js +431 -0
  284. package/dist/chat/useConversation.js.map +7 -0
  285. package/dist/chat/useConversationActions.js +662 -0
  286. package/dist/chat/useConversationActions.js.map +7 -0
  287. package/dist/chat/useConversationData.js +143 -0
  288. package/dist/chat/useConversationData.js.map +7 -0
  289. package/dist/chat/useConversationDocuments.js +41 -0
  290. package/dist/chat/useConversationDocuments.js.map +7 -0
  291. package/dist/chat/useConversationSettings.js +78 -0
  292. package/dist/chat/useConversationSettings.js.map +7 -0
  293. package/dist/chat/useConversationTurn.js +31 -0
  294. package/dist/chat/useConversationTurn.js.map +7 -0
  295. package/dist/chat/useConversationWorkspace.js +12 -0
  296. package/dist/chat/useConversationWorkspace.js.map +7 -0
  297. package/dist/chat/useDeleteMessage.js +15 -0
  298. package/dist/chat/useDeleteMessage.js.map +7 -0
  299. package/dist/chat/useDocumentAutoAdd.js +73 -0
  300. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  301. package/dist/chat/useMessageTimer.js +39 -0
  302. package/dist/chat/useMessageTimer.js.map +7 -0
  303. package/dist/chat/useThinkingContent.js +67 -0
  304. package/dist/chat/useThinkingContent.js.map +7 -0
  305. package/dist/chat/useThreadDocument.js +61 -0
  306. package/dist/chat/useThreadDocument.js.map +7 -0
  307. package/dist/chat/workflow-run-titles.js +50 -0
  308. package/dist/chat/workflow-run-titles.js.map +7 -0
  309. package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
  310. package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
  311. package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
  312. package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
  313. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  314. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  315. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  316. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  317. package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
  318. package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
  319. package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
  320. package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
  321. package/dist/chunk-PWGSIM3F.cjs +291 -0
  322. package/dist/chunk-PWGSIM3F.cjs.map +1 -0
  323. package/dist/chunk-QP3WQSAA.cjs +23 -0
  324. package/dist/chunk-QP3WQSAA.cjs.map +1 -0
  325. package/dist/chunk-T5FZICXN.cjs +50 -0
  326. package/dist/chunk-T5FZICXN.cjs.map +1 -0
  327. package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
  328. package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  329. package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
  330. package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
  331. package/dist/config/config-hooks.js +209 -0
  332. package/dist/config/config-hooks.js.map +7 -0
  333. package/dist/connectivity.js +72 -0
  334. package/dist/connectivity.js.map +7 -0
  335. package/dist/connectors/hooks.js +263 -0
  336. package/dist/connectors/hooks.js.map +7 -0
  337. package/dist/connectors/index.js +28 -0
  338. package/dist/connectors/index.js.map +7 -0
  339. package/dist/contacts.js +100 -0
  340. package/dist/contacts.js.map +7 -0
  341. package/dist/conversation-list.js +65 -0
  342. package/dist/conversation-list.js.map +7 -0
  343. package/dist/databases.js +195 -0
  344. package/dist/databases.js.map +7 -0
  345. package/dist/datasets/aggregate.js +281 -0
  346. package/dist/datasets/aggregate.js.map +7 -0
  347. package/dist/datasets/index.js +122 -0
  348. package/dist/datasets/index.js.map +7 -0
  349. package/dist/datasets/members.js +27 -0
  350. package/dist/datasets/members.js.map +7 -0
  351. package/dist/datasets/panel.js +44 -0
  352. package/dist/datasets/panel.js.map +7 -0
  353. package/dist/datasets/registry.js +47 -0
  354. package/dist/datasets/registry.js.map +7 -0
  355. package/dist/datasets/rows-source.js +44 -0
  356. package/dist/datasets/rows-source.js.map +7 -0
  357. package/dist/datasets/sources/activity.js +83 -0
  358. package/dist/datasets/sources/activity.js.map +7 -0
  359. package/dist/datasets/sources/conversations.js +74 -0
  360. package/dist/datasets/sources/conversations.js.map +7 -0
  361. package/dist/datasets/sources/database.js +209 -0
  362. package/dist/datasets/sources/database.js.map +7 -0
  363. package/dist/datasets/sources/documents.js +93 -0
  364. package/dist/datasets/sources/documents.js.map +7 -0
  365. package/dist/datasets/sources/facts.js +56 -0
  366. package/dist/datasets/sources/facts.js.map +7 -0
  367. package/dist/datasets/sources/projects.js +117 -0
  368. package/dist/datasets/sources/projects.js.map +7 -0
  369. package/dist/datasets/sources/tags.js +67 -0
  370. package/dist/datasets/sources/tags.js.map +7 -0
  371. package/dist/datasets/sources/usage.js +268 -0
  372. package/dist/datasets/sources/usage.js.map +7 -0
  373. package/dist/datasets/sources/workflows.js +91 -0
  374. package/dist/datasets/sources/workflows.js.map +7 -0
  375. package/dist/datasets/sources/workspaces.js +67 -0
  376. package/dist/datasets/sources/workspaces.js.map +7 -0
  377. package/dist/datasets/store.js +194 -0
  378. package/dist/datasets/store.js.map +7 -0
  379. package/dist/datasets/types.js +14 -0
  380. package/dist/datasets/types.js.map +7 -0
  381. package/dist/directmessages/ConversationList.js +148 -0
  382. package/dist/directmessages/ConversationList.js.map +7 -0
  383. package/dist/directmessages/DateSeparator.js +8 -0
  384. package/dist/directmessages/DateSeparator.js.map +7 -0
  385. package/dist/directmessages/DmAvatar.js +29 -0
  386. package/dist/directmessages/DmAvatar.js.map +7 -0
  387. package/dist/directmessages/DmComposer.js +201 -0
  388. package/dist/directmessages/DmComposer.js.map +7 -0
  389. package/dist/directmessages/arrivals.js +29 -0
  390. package/dist/directmessages/arrivals.js.map +7 -0
  391. package/dist/directmessages/chat-cache.js +192 -0
  392. package/dist/directmessages/chat-cache.js.map +7 -0
  393. package/dist/directmessages/grouping.js +26 -0
  394. package/dist/directmessages/grouping.js.map +7 -0
  395. package/dist/directmessages/index.js +81 -0
  396. package/dist/directmessages/index.js.map +7 -0
  397. package/dist/directmessages/useChats.js +266 -0
  398. package/dist/directmessages/useChats.js.map +7 -0
  399. package/dist/directmessages/utils.js +23 -0
  400. package/dist/directmessages/utils.js.map +7 -0
  401. package/dist/document-tools/can-annotate.js +7 -0
  402. package/dist/document-tools/can-annotate.js.map +7 -0
  403. package/dist/document-tools/core.cjs +99 -99
  404. package/dist/document-tools/core.d.ts +2 -2
  405. package/dist/document-tools/core.js +218 -12
  406. package/dist/document-tools/core.js.map +7 -1
  407. package/dist/document-tools/document-pdf.js +76 -0
  408. package/dist/document-tools/document-pdf.js.map +7 -0
  409. package/dist/document-tools/environment.js +136 -0
  410. package/dist/document-tools/environment.js.map +7 -0
  411. package/dist/document-tools/file-shares.js +112 -0
  412. package/dist/document-tools/file-shares.js.map +7 -0
  413. package/dist/document-tools/frozen-copy.js +27 -0
  414. package/dist/document-tools/frozen-copy.js.map +7 -0
  415. package/dist/document-tools/index.cjs +101 -101
  416. package/dist/document-tools/index.d.ts +1 -1
  417. package/dist/document-tools/index.js +26 -148
  418. package/dist/document-tools/index.js.map +7 -1
  419. package/dist/document-tools/markup-download.js +51 -0
  420. package/dist/document-tools/markup-download.js.map +7 -0
  421. package/dist/document-tools/markup-store.js +138 -0
  422. package/dist/document-tools/markup-store.js.map +7 -0
  423. package/dist/document-tools/markup-transfer.js +88 -0
  424. package/dist/document-tools/markup-transfer.js.map +7 -0
  425. package/dist/document-tools/production.js +147 -0
  426. package/dist/document-tools/production.js.map +7 -0
  427. package/dist/document-tools/saved-signature.js +90 -0
  428. package/dist/document-tools/saved-signature.js.map +7 -0
  429. package/dist/document-tools/signature-requests.js +310 -0
  430. package/dist/document-tools/signature-requests.js.map +7 -0
  431. package/dist/document-tools/signing.js +127 -0
  432. package/dist/document-tools/signing.js.map +7 -0
  433. package/dist/document-tools/useDocumentBytes.js +38 -0
  434. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  435. package/dist/document-tools/useDocumentMarkup.js +154 -0
  436. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  437. package/dist/document-tools/useIsOnline.js +13 -0
  438. package/dist/document-tools/useIsOnline.js.map +7 -0
  439. package/dist/document-tools/verification.js +60 -0
  440. package/dist/document-tools/verification.js.map +7 -0
  441. package/dist/documents/DocumentReview.js +220 -0
  442. package/dist/documents/DocumentReview.js.map +7 -0
  443. package/dist/documents/DraftTitleControls.js +41 -0
  444. package/dist/documents/DraftTitleControls.js.map +7 -0
  445. package/dist/documents/InlineMicButton.js +90 -0
  446. package/dist/documents/InlineMicButton.js.map +7 -0
  447. package/dist/documents/MicRecordingOverlay.js +29 -0
  448. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  449. package/dist/documents/MicWaveformIndicator.js +68 -0
  450. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  451. package/dist/documents/PhotoCapture.js +120 -0
  452. package/dist/documents/PhotoCapture.js.map +7 -0
  453. package/dist/documents/VideoCapture.js +129 -0
  454. package/dist/documents/VideoCapture.js.map +7 -0
  455. package/dist/documents/VoiceNoteRecorder.js +166 -0
  456. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  457. package/dist/documents/audio-segmenter.js +63 -0
  458. package/dist/documents/audio-segmenter.js.map +7 -0
  459. package/dist/documents/capture-frame.js +21 -0
  460. package/dist/documents/capture-frame.js.map +7 -0
  461. package/dist/documents/chunked-recorder.js +190 -0
  462. package/dist/documents/chunked-recorder.js.map +7 -0
  463. package/dist/documents/document-download.js +53 -0
  464. package/dist/documents/document-download.js.map +7 -0
  465. package/dist/documents/document-fields.js +109 -0
  466. package/dist/documents/document-fields.js.map +7 -0
  467. package/dist/documents/documents-cache.js +110 -0
  468. package/dist/documents/documents-cache.js.map +7 -0
  469. package/dist/documents/documents-data.js +128 -0
  470. package/dist/documents/documents-data.js.map +7 -0
  471. package/dist/documents/documents-loader.js +113 -0
  472. package/dist/documents/documents-loader.js.map +7 -0
  473. package/dist/documents/documents-writes.js +448 -0
  474. package/dist/documents/documents-writes.js.map +7 -0
  475. package/dist/documents/format-elapsed.js +10 -0
  476. package/dist/documents/format-elapsed.js.map +7 -0
  477. package/dist/documents/has-video-track.js +26 -0
  478. package/dist/documents/has-video-track.js.map +7 -0
  479. package/dist/documents/index.js +266 -0
  480. package/dist/documents/index.js.map +7 -0
  481. package/dist/documents/media-error.js +18 -0
  482. package/dist/documents/media-error.js.map +7 -0
  483. package/dist/documents/offline-documents.js +160 -0
  484. package/dist/documents/offline-documents.js.map +7 -0
  485. package/dist/documents/pending-sync.js +210 -0
  486. package/dist/documents/pending-sync.js.map +7 -0
  487. package/dist/documents/processing-live.js +122 -0
  488. package/dist/documents/processing-live.js.map +7 -0
  489. package/dist/documents/processing-order.js +59 -0
  490. package/dist/documents/processing-order.js.map +7 -0
  491. package/dist/documents/processing-settle.js +21 -0
  492. package/dist/documents/processing-settle.js.map +7 -0
  493. package/dist/documents/related-documents.js +133 -0
  494. package/dist/documents/related-documents.js.map +7 -0
  495. package/dist/documents/support.js +29 -0
  496. package/dist/documents/support.js.map +7 -0
  497. package/dist/documents/upload-files.js +169 -0
  498. package/dist/documents/upload-files.js.map +7 -0
  499. package/dist/documents/useAudioRecorder.js +315 -0
  500. package/dist/documents/useAudioRecorder.js.map +7 -0
  501. package/dist/documents/useCameraStream.js +35 -0
  502. package/dist/documents/useCameraStream.js.map +7 -0
  503. package/dist/documents/useDocumentThumbnails.js +71 -0
  504. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  505. package/dist/documents/useDownloadDocuments.js +90 -0
  506. package/dist/documents/useDownloadDocuments.js.map +7 -0
  507. package/dist/documents/usePassageQuotes.js +37 -0
  508. package/dist/documents/usePassageQuotes.js.map +7 -0
  509. package/dist/documents/useUploadFiles.js +165 -0
  510. package/dist/documents/useUploadFiles.js.map +7 -0
  511. package/dist/documents/useUploadFromUrls.js +63 -0
  512. package/dist/documents/useUploadFromUrls.js.map +7 -0
  513. package/dist/documents/useVideoRecorder.js +62 -0
  514. package/dist/documents/useVideoRecorder.js.map +7 -0
  515. package/dist/entities/AgentMarkers.js +61 -0
  516. package/dist/entities/AgentMarkers.js.map +7 -0
  517. package/dist/entities/DocumentEntity.js +125 -0
  518. package/dist/entities/DocumentEntity.js.map +7 -0
  519. package/dist/entities/EntityPill.js +250 -0
  520. package/dist/entities/EntityPill.js.map +7 -0
  521. package/dist/entities/ProjectEntity.js +61 -0
  522. package/dist/entities/ProjectEntity.js.map +7 -0
  523. package/dist/entities/ShieldIcon.js +49 -0
  524. package/dist/entities/ShieldIcon.js.map +7 -0
  525. package/dist/entities/TagEntity.js +79 -0
  526. package/dist/entities/TagEntity.js.map +7 -0
  527. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  528. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  529. package/dist/entities/UserEntity.js +211 -0
  530. package/dist/entities/UserEntity.js.map +7 -0
  531. package/dist/entities/VerifiedBadge.js +19 -0
  532. package/dist/entities/VerifiedBadge.js.map +7 -0
  533. package/dist/entities/agent-avatar-colors.js +26 -0
  534. package/dist/entities/agent-avatar-colors.js.map +7 -0
  535. package/dist/entities/colors.js +64 -0
  536. package/dist/entities/colors.js.map +7 -0
  537. package/dist/entities/file-type.js +151 -0
  538. package/dist/entities/file-type.js.map +7 -0
  539. package/dist/entities/index.js +100 -0
  540. package/dist/entities/index.js.map +7 -0
  541. package/dist/entities/media-type.js +61 -0
  542. package/dist/entities/media-type.js.map +7 -0
  543. package/dist/entities/registry.js +385 -0
  544. package/dist/entities/registry.js.map +7 -0
  545. package/dist/entities/status.js +43 -0
  546. package/dist/entities/status.js.map +7 -0
  547. package/dist/entities/tag-kinds.js +23 -0
  548. package/dist/entities/tag-kinds.js.map +7 -0
  549. package/dist/entities/tag-types.js +44 -0
  550. package/dist/entities/tag-types.js.map +7 -0
  551. package/dist/entities/vocabulary.js +12 -0
  552. package/dist/entities/vocabulary.js.map +7 -0
  553. package/dist/entity-extraction.js +25 -0
  554. package/dist/entity-extraction.js.map +7 -0
  555. package/dist/facts-search.js +57 -0
  556. package/dist/facts-search.js.map +7 -0
  557. package/dist/facts.js +69 -0
  558. package/dist/facts.js.map +7 -0
  559. package/dist/hooks.js +320 -0
  560. package/dist/hooks.js.map +7 -0
  561. package/dist/host/ArbiHost.js +24 -0
  562. package/dist/host/ArbiHost.js.map +7 -0
  563. package/dist/host/assistant-copy.js +54 -0
  564. package/dist/host/assistant-copy.js.map +7 -0
  565. package/dist/host/config.js +9 -0
  566. package/dist/host/config.js.map +7 -0
  567. package/dist/host/context.js +10 -0
  568. package/dist/host/context.js.map +7 -0
  569. package/dist/host/features.js +144 -0
  570. package/dist/host/features.js.map +7 -0
  571. package/dist/host/index.js +12 -0
  572. package/dist/host/index.js.map +7 -0
  573. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  574. package/dist/host/merge.js.map +7 -0
  575. package/dist/house-template.js +40 -0
  576. package/dist/house-template.js.map +7 -0
  577. package/dist/icons/AppleIcon.js +25 -0
  578. package/dist/icons/AppleIcon.js.map +7 -0
  579. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  580. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  581. package/dist/icons/ArbiIcon.js +24 -0
  582. package/dist/icons/ArbiIcon.js.map +7 -0
  583. package/dist/icons/AudIcon.js +56 -0
  584. package/dist/icons/AudIcon.js.map +7 -0
  585. package/dist/icons/ClaudeIcon.js +28 -0
  586. package/dist/icons/ClaudeIcon.js.map +7 -0
  587. package/dist/icons/DocIcon.js +56 -0
  588. package/dist/icons/DocIcon.js.map +7 -0
  589. package/dist/icons/EmlIcon.js +57 -0
  590. package/dist/icons/EmlIcon.js.map +7 -0
  591. package/dist/icons/FireworksIcon.js +47 -0
  592. package/dist/icons/FireworksIcon.js.map +7 -0
  593. package/dist/icons/GeminiIcon.js +37 -0
  594. package/dist/icons/GeminiIcon.js.map +7 -0
  595. package/dist/icons/GitHubIcon.js +32 -0
  596. package/dist/icons/GitHubIcon.js.map +7 -0
  597. package/dist/icons/GoogleIcon.js +53 -0
  598. package/dist/icons/GoogleIcon.js.map +7 -0
  599. package/dist/icons/HtmlIcon.js +56 -0
  600. package/dist/icons/HtmlIcon.js.map +7 -0
  601. package/dist/icons/ImgIcon.js +56 -0
  602. package/dist/icons/ImgIcon.js.map +7 -0
  603. package/dist/icons/LinkedInIcon.js +25 -0
  604. package/dist/icons/LinkedInIcon.js.map +7 -0
  605. package/dist/icons/OpenAIIcon.js +28 -0
  606. package/dist/icons/OpenAIIcon.js.map +7 -0
  607. package/dist/icons/PdfIcon.js +56 -0
  608. package/dist/icons/PdfIcon.js.map +7 -0
  609. package/dist/icons/ProviderIcon.js +42 -0
  610. package/dist/icons/ProviderIcon.js.map +7 -0
  611. package/dist/icons/TxtIcon.js +56 -0
  612. package/dist/icons/TxtIcon.js.map +7 -0
  613. package/dist/icons/VidIcon.js +56 -0
  614. package/dist/icons/VidIcon.js.map +7 -0
  615. package/dist/icons/XlsIcon.js +56 -0
  616. package/dist/icons/XlsIcon.js.map +7 -0
  617. package/dist/icons/arbi-mark.js +5 -0
  618. package/dist/icons/arbi-mark.js.map +7 -0
  619. package/dist/icons/colors.js +31 -0
  620. package/dist/icons/colors.js.map +7 -0
  621. package/dist/icons/file-type.js +105 -0
  622. package/dist/icons/file-type.js.map +7 -0
  623. package/dist/icons/index.js +55 -0
  624. package/dist/icons/index.js.map +7 -0
  625. package/dist/imagecrop/ImageCropModal.js +56 -0
  626. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  627. package/dist/imagecrop/ImageCropper.js +100 -0
  628. package/dist/imagecrop/ImageCropper.js.map +7 -0
  629. package/dist/imagecrop/cropImage.js +43 -0
  630. package/dist/imagecrop/cropImage.js.map +7 -0
  631. package/dist/imagecrop/index.js +13 -0
  632. package/dist/imagecrop/index.js.map +7 -0
  633. package/dist/index.cjs +1689 -1619
  634. package/dist/index.cjs.map +1 -1
  635. package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
  636. package/dist/index.d.ts +38 -8
  637. package/dist/index.js +702 -17060
  638. package/dist/index.js.map +7 -1
  639. package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
  640. package/dist/lazy-chunk.js +46 -0
  641. package/dist/lazy-chunk.js.map +7 -0
  642. package/dist/lib/collision-padding.js +13 -0
  643. package/dist/lib/collision-padding.js.map +7 -0
  644. package/dist/lib/format-friendly-date.js +55 -0
  645. package/dist/lib/format-friendly-date.js.map +7 -0
  646. package/dist/lib/format-relative-time.js +52 -0
  647. package/dist/lib/format-relative-time.js.map +7 -0
  648. package/dist/lib/markdown-to-text.js +35 -0
  649. package/dist/lib/markdown-to-text.js.map +7 -0
  650. package/dist/lib/toast-interaction.js +9 -0
  651. package/dist/lib/toast-interaction.js.map +7 -0
  652. package/dist/lib/utils.js +9 -0
  653. package/dist/lib/utils.js.map +7 -0
  654. package/dist/mail/client.js +103 -0
  655. package/dist/mail/client.js.map +7 -0
  656. package/dist/mail/document-attachment.js +38 -0
  657. package/dist/mail/document-attachment.js.map +7 -0
  658. package/dist/mail/filing.js +132 -0
  659. package/dist/mail/filing.js.map +7 -0
  660. package/dist/mail/hooks.js +393 -0
  661. package/dist/mail/hooks.js.map +7 -0
  662. package/dist/mail/index.js +120 -0
  663. package/dist/mail/index.js.map +7 -0
  664. package/dist/mail/offline/changes.js +258 -0
  665. package/dist/mail/offline/changes.js.map +7 -0
  666. package/dist/mail/offline/confirm-sign-out.js +37 -0
  667. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  668. package/dist/mail/offline/crypto.js +26 -0
  669. package/dist/mail/offline/crypto.js.map +7 -0
  670. package/dist/mail/offline/drafts.js +69 -0
  671. package/dist/mail/offline/drafts.js.map +7 -0
  672. package/dist/mail/offline/hooks.js +104 -0
  673. package/dist/mail/offline/hooks.js.map +7 -0
  674. package/dist/mail/offline/index.js +48 -0
  675. package/dist/mail/offline/index.js.map +7 -0
  676. package/dist/mail/offline/live.js +233 -0
  677. package/dist/mail/offline/live.js.map +7 -0
  678. package/dist/mail/offline/mailbox.js +191 -0
  679. package/dist/mail/offline/mailbox.js.map +7 -0
  680. package/dist/mail/offline/outbox.js +167 -0
  681. package/dist/mail/offline/outbox.js.map +7 -0
  682. package/dist/mail/offline/reads.js +159 -0
  683. package/dist/mail/offline/reads.js.map +7 -0
  684. package/dist/mail/offline/runtime.js +100 -0
  685. package/dist/mail/offline/runtime.js.map +7 -0
  686. package/dist/mail/offline/settings.js +84 -0
  687. package/dist/mail/offline/settings.js.map +7 -0
  688. package/dist/mail/offline/store.js +29 -0
  689. package/dist/mail/offline/store.js.map +7 -0
  690. package/dist/mail/offline/sync.js +251 -0
  691. package/dist/mail/offline/sync.js.map +7 -0
  692. package/dist/mail/offline/wipe.js +19 -0
  693. package/dist/mail/offline/wipe.js.map +7 -0
  694. package/dist/mail/thread-keys.js +53 -0
  695. package/dist/mail/thread-keys.js.map +7 -0
  696. package/dist/mail/threads.js +71 -0
  697. package/dist/mail/threads.js.map +7 -0
  698. package/dist/mail/useMailClient.js +42 -0
  699. package/dist/mail/useMailClient.js.map +7 -0
  700. package/dist/model-connections.js +58 -0
  701. package/dist/model-connections.js.map +7 -0
  702. package/dist/notifications/ActivityFeed.js +70 -0
  703. package/dist/notifications/ActivityFeed.js.map +7 -0
  704. package/dist/notifications/NotificationBell.js +200 -0
  705. package/dist/notifications/NotificationBell.js.map +7 -0
  706. package/dist/notifications/Toaster.js +24 -0
  707. package/dist/notifications/Toaster.js.map +7 -0
  708. package/dist/notifications/activity-types.js +65 -0
  709. package/dist/notifications/activity-types.js.map +7 -0
  710. package/dist/notifications/bell.js +24 -0
  711. package/dist/notifications/bell.js.map +7 -0
  712. package/dist/notifications/calendar-notifications.js +79 -0
  713. package/dist/notifications/calendar-notifications.js.map +7 -0
  714. package/dist/notifications/index.js +108 -0
  715. package/dist/notifications/index.js.map +7 -0
  716. package/dist/notifications/live.js +28 -0
  717. package/dist/notifications/live.js.map +7 -0
  718. package/dist/notifications/notification-types.js +127 -0
  719. package/dist/notifications/notification-types.js.map +7 -0
  720. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  721. package/dist/notifications/notify-store.js.map +7 -0
  722. package/dist/notifications/server-notifications.js +452 -0
  723. package/dist/notifications/server-notifications.js.map +7 -0
  724. package/dist/notifications/useNotifications.js +34 -0
  725. package/dist/notifications/useNotifications.js.map +7 -0
  726. package/dist/offline-store/network.js +11 -0
  727. package/dist/offline-store/network.js.map +7 -0
  728. package/dist/offline-store/store.js +136 -0
  729. package/dist/offline-store/store.js.map +7 -0
  730. package/dist/offline-store/wipe.js +8 -0
  731. package/dist/offline-store/wipe.js.map +7 -0
  732. package/dist/offline.js +58 -0
  733. package/dist/offline.js.map +7 -0
  734. package/dist/people.js +122 -0
  735. package/dist/people.js.map +7 -0
  736. package/dist/projects.js +30 -0
  737. package/dist/projects.js.map +7 -0
  738. package/dist/query-client.js +63 -0
  739. package/dist/query-client.js.map +7 -0
  740. package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
  741. package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
  742. package/dist/query-keys.js.map +7 -0
  743. package/dist/query-persist.js +66 -0
  744. package/dist/query-persist.js.map +7 -0
  745. package/dist/queued-writes.js +59 -0
  746. package/dist/queued-writes.js.map +7 -0
  747. package/dist/remote-control.js +67 -0
  748. package/dist/remote-control.js.map +7 -0
  749. package/dist/search/index.js +23 -0
  750. package/dist/search/index.js.map +7 -0
  751. package/dist/search/session.js +58 -0
  752. package/dist/search/session.js.map +7 -0
  753. package/dist/search/useSemanticSearch.js +82 -0
  754. package/dist/search/useSemanticSearch.js.map +7 -0
  755. package/dist/session/chat.js +512 -0
  756. package/dist/session/chat.js.map +7 -0
  757. package/dist/session/documents.js +196 -0
  758. package/dist/session/documents.js.map +7 -0
  759. package/dist/session/drafts.js +103 -0
  760. package/dist/session/drafts.js.map +7 -0
  761. package/dist/session/index.js +123 -0
  762. package/dist/session/index.js.map +7 -0
  763. package/dist/session/layout.js +339 -0
  764. package/dist/session/layout.js.map +7 -0
  765. package/dist/session/persist.js +106 -0
  766. package/dist/session/persist.js.map +7 -0
  767. package/dist/session/session-hooks.js +53 -0
  768. package/dist/session/session-hooks.js.map +7 -0
  769. package/dist/session/signed-in.js +36 -0
  770. package/dist/session/signed-in.js.map +7 -0
  771. package/dist/session/store.js +166 -0
  772. package/dist/session/store.js.map +7 -0
  773. package/dist/session/thread-tabs.js +121 -0
  774. package/dist/session/thread-tabs.js.map +7 -0
  775. package/dist/session/ui-state-storage.js +76 -0
  776. package/dist/session/ui-state-storage.js.map +7 -0
  777. package/dist/session/workspace.js +77 -0
  778. package/dist/session/workspace.js.map +7 -0
  779. package/dist/shell/index.cjs +37 -37
  780. package/dist/shell/index.js +43 -10
  781. package/dist/shell/index.js.map +7 -1
  782. package/dist/skill-pack.js +111 -0
  783. package/dist/skill-pack.js.map +7 -0
  784. package/dist/storage.js +186 -0
  785. package/dist/storage.js.map +7 -0
  786. package/dist/support/index.js +35 -0
  787. package/dist/support/index.js.map +7 -0
  788. package/dist/tags.js +204 -0
  789. package/dist/tags.js.map +7 -0
  790. package/dist/ui/DebouncedInput.js +109 -0
  791. package/dist/ui/DebouncedInput.js.map +7 -0
  792. package/dist/ui/DictateContext.js +8 -0
  793. package/dist/ui/DictateContext.js.map +7 -0
  794. package/dist/ui/IconToggle.js +79 -0
  795. package/dist/ui/IconToggle.js.map +7 -0
  796. package/dist/ui/VerifiedToggle.js +38 -0
  797. package/dist/ui/VerifiedToggle.js.map +7 -0
  798. package/dist/ui/VisibilityToggle.js +103 -0
  799. package/dist/ui/VisibilityToggle.js.map +7 -0
  800. package/dist/ui/avatar.js +40 -0
  801. package/dist/ui/avatar.js.map +7 -0
  802. package/dist/ui/badge.js +28 -0
  803. package/dist/ui/badge.js.map +7 -0
  804. package/dist/ui/button.js +48 -0
  805. package/dist/ui/button.js.map +7 -0
  806. package/dist/ui/card.js +90 -0
  807. package/dist/ui/card.js.map +7 -0
  808. package/dist/ui/checkbox.js +22 -0
  809. package/dist/ui/checkbox.js.map +7 -0
  810. package/dist/ui/collapsible.js +10 -0
  811. package/dist/ui/collapsible.js.map +7 -0
  812. package/dist/ui/command.js +103 -0
  813. package/dist/ui/command.js.map +7 -0
  814. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  815. package/dist/ui/dialog.js.map +7 -0
  816. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  817. package/dist/ui/dropdown-menu.js.map +7 -0
  818. package/dist/ui/hover-card.js +36 -0
  819. package/dist/ui/hover-card.js.map +7 -0
  820. package/dist/ui/index.cjs +167 -154
  821. package/dist/ui/index.d.ts +2 -1
  822. package/dist/ui/index.js +290 -9
  823. package/dist/ui/index.js.map +7 -1
  824. package/dist/ui/input.js +65 -0
  825. package/dist/ui/input.js.map +7 -0
  826. package/dist/ui/label.js +16 -0
  827. package/dist/ui/label.js.map +7 -0
  828. package/dist/ui/mark-menu.js +300 -0
  829. package/dist/ui/mark-menu.js.map +7 -0
  830. package/dist/ui/popover.js +40 -0
  831. package/dist/ui/popover.js.map +7 -0
  832. package/dist/ui/portal-container.js +17 -0
  833. package/dist/ui/portal-container.js.map +7 -0
  834. package/dist/ui/progress.js +24 -0
  835. package/dist/ui/progress.js.map +7 -0
  836. package/dist/ui/radio-group.js +29 -0
  837. package/dist/ui/radio-group.js.map +7 -0
  838. package/dist/ui/scroll-area.js +39 -0
  839. package/dist/ui/scroll-area.js.map +7 -0
  840. package/dist/ui/select.js +130 -0
  841. package/dist/ui/select.js.map +7 -0
  842. package/dist/ui/separator.js +23 -0
  843. package/dist/ui/separator.js.map +7 -0
  844. package/dist/ui/slider.js +23 -0
  845. package/dist/ui/slider.js.map +7 -0
  846. package/dist/ui/switch.js +28 -0
  847. package/dist/ui/switch.js.map +7 -0
  848. package/dist/ui/table.js +75 -0
  849. package/dist/ui/table.js.map +7 -0
  850. package/dist/ui/tabs.js +48 -0
  851. package/dist/ui/tabs.js.map +7 -0
  852. package/dist/ui/textarea.js +63 -0
  853. package/dist/ui/textarea.js.map +7 -0
  854. package/dist/ui/toggle-group.js +43 -0
  855. package/dist/ui/toggle-group.js.map +7 -0
  856. package/dist/ui/toggle.js +40 -0
  857. package/dist/ui/toggle.js.map +7 -0
  858. package/dist/ui/tooltip.js +215 -0
  859. package/dist/ui/tooltip.js.map +7 -0
  860. package/dist/usage-metered.js +8 -0
  861. package/dist/usage-metered.js.map +7 -0
  862. package/dist/useArbi.js +16 -0
  863. package/dist/useArbi.js.map +7 -0
  864. package/dist/useInstallSkillPack.js +81 -0
  865. package/dist/useInstallSkillPack.js.map +7 -0
  866. package/dist/usermenu/UserMenu.js +188 -0
  867. package/dist/usermenu/UserMenu.js.map +7 -0
  868. package/dist/usermenu/index.js +5 -0
  869. package/dist/usermenu/index.js.map +7 -0
  870. package/dist/users/index.js +15 -0
  871. package/dist/users/index.js.map +7 -0
  872. package/dist/users/user-display.js +60 -0
  873. package/dist/users/user-display.js.map +7 -0
  874. package/dist/viewers/AudioViewer.js +23 -0
  875. package/dist/viewers/AudioViewer.js.map +7 -0
  876. package/dist/viewers/DocxViewer.js +81 -0
  877. package/dist/viewers/DocxViewer.js.map +7 -0
  878. package/dist/viewers/ImageViewer.js +31 -0
  879. package/dist/viewers/ImageViewer.js.map +7 -0
  880. package/dist/viewers/PdfViewer.cjs +17 -0
  881. package/dist/viewers/PdfViewer.cjs.map +1 -0
  882. package/dist/viewers/PdfViewer.d.ts +9 -0
  883. package/dist/viewers/PdfViewer.js +20 -0
  884. package/dist/viewers/PdfViewer.js.map +7 -0
  885. package/dist/viewers/PdfViewerImpl.js +384 -0
  886. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  887. package/dist/viewers/VideoViewer.js +31 -0
  888. package/dist/viewers/VideoViewer.js.map +7 -0
  889. package/dist/viewers/XlsxViewer.js +102 -0
  890. package/dist/viewers/XlsxViewer.js.map +7 -0
  891. package/dist/viewers/index.cjs +79 -653
  892. package/dist/viewers/index.cjs.map +1 -1
  893. package/dist/viewers/index.d.ts +3 -1
  894. package/dist/viewers/index.js +60 -903
  895. package/dist/viewers/index.js.map +7 -1
  896. package/dist/viewers/page-scroll.js +59 -0
  897. package/dist/viewers/page-scroll.js.map +7 -0
  898. package/dist/viewers/pdf-viewer-constants.js +9 -0
  899. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  900. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  901. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  902. package/dist/viewers/selection-runs.js +38 -0
  903. package/dist/viewers/selection-runs.js.map +7 -0
  904. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  905. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  906. package/dist/viewers/useProcessedChunks.js +58 -0
  907. package/dist/viewers/useProcessedChunks.js.map +7 -0
  908. package/dist/viewers/viewer-zoom.js +163 -0
  909. package/dist/viewers/viewer-zoom.js.map +7 -0
  910. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  911. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  912. package/dist/websocket/context.js +14 -0
  913. package/dist/websocket/context.js.map +7 -0
  914. package/dist/websocket/hooks.js +30 -0
  915. package/dist/websocket/hooks.js.map +7 -0
  916. package/dist/websocket/index.js +22 -0
  917. package/dist/websocket/index.js.map +7 -0
  918. package/dist/websocket/live-updates.js +38 -0
  919. package/dist/websocket/live-updates.js.map +7 -0
  920. package/dist/websocket/reconnect.js +13 -0
  921. package/dist/websocket/reconnect.js.map +7 -0
  922. package/dist/websocket/store.js +58 -0
  923. package/dist/websocket/store.js.map +7 -0
  924. package/dist/workforce.js +607 -0
  925. package/dist/workforce.js.map +7 -0
  926. package/dist/workspaces/access-request.js +35 -0
  927. package/dist/workspaces/access-request.js.map +7 -0
  928. package/dist/workspaces/archive.js +59 -0
  929. package/dist/workspaces/archive.js.map +7 -0
  930. package/dist/workspaces/current.js +20 -0
  931. package/dist/workspaces/current.js.map +7 -0
  932. package/dist/workspaces/delete-workspaces.js +15 -0
  933. package/dist/workspaces/delete-workspaces.js.map +7 -0
  934. package/dist/workspaces/export-archive.js +40 -0
  935. package/dist/workspaces/export-archive.js.map +7 -0
  936. package/dist/workspaces/index.js +99 -0
  937. package/dist/workspaces/index.js.map +7 -0
  938. package/dist/workspaces/settings.js +45 -0
  939. package/dist/workspaces/settings.js.map +7 -0
  940. package/dist/workspaces/shell-workspaces.js +49 -0
  941. package/dist/workspaces/shell-workspaces.js.map +7 -0
  942. package/dist/workspaces/switch.js +234 -0
  943. package/dist/workspaces/switch.js.map +7 -0
  944. package/dist/workspaces/transfer.js +170 -0
  945. package/dist/workspaces/transfer.js.map +7 -0
  946. package/dist/workspaces/useShellWorkspaces.js +86 -0
  947. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  948. package/dist/workspaces/workspace-users.js +65 -0
  949. package/dist/workspaces/workspace-users.js.map +7 -0
  950. package/package.json +12 -4
  951. package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
  952. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  953. package/dist/annotations/freeze/index.d.cts +0 -205
  954. package/dist/annotations/index.d.cts +0 -360
  955. package/dist/artifacts/index.d.cts +0 -476
  956. package/dist/artifacts/redline-core.d.cts +0 -39
  957. package/dist/bundle-YNOX7VIL.js +0 -5
  958. package/dist/bundle-YNOX7VIL.js.map +0 -1
  959. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  960. package/dist/calls/livekit/index.d.cts +0 -280
  961. package/dist/chunk-47CCGUWR.js.map +0 -1
  962. package/dist/chunk-6H3O63TQ.js.map +0 -1
  963. package/dist/chunk-74N436VK.js.map +0 -1
  964. package/dist/chunk-APZZQZ6P.js +0 -147
  965. package/dist/chunk-APZZQZ6P.js.map +0 -1
  966. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  967. package/dist/chunk-CPQ3CU4B.js +0 -246
  968. package/dist/chunk-CPQ3CU4B.js.map +0 -1
  969. package/dist/chunk-DPYBZDJB.js.map +0 -1
  970. package/dist/chunk-DQALOQPI.js +0 -2766
  971. package/dist/chunk-DQALOQPI.js.map +0 -1
  972. package/dist/chunk-FZJMA32S.js +0 -1011
  973. package/dist/chunk-FZJMA32S.js.map +0 -1
  974. package/dist/chunk-H5M7FXLB.js +0 -2057
  975. package/dist/chunk-H5M7FXLB.js.map +0 -1
  976. package/dist/chunk-HDCRPPBW.js +0 -75
  977. package/dist/chunk-HDCRPPBW.js.map +0 -1
  978. package/dist/chunk-NIKPG4PW.js +0 -1128
  979. package/dist/chunk-NIKPG4PW.js.map +0 -1
  980. package/dist/chunk-NNAJLY6B.js +0 -4974
  981. package/dist/chunk-NNAJLY6B.js.map +0 -1
  982. package/dist/chunk-OYPKKHXY.js +0 -559
  983. package/dist/chunk-OYPKKHXY.js.map +0 -1
  984. package/dist/chunk-P6WLV5UY.js +0 -644
  985. package/dist/chunk-P6WLV5UY.js.map +0 -1
  986. package/dist/chunk-PTOP7OHG.js.map +0 -1
  987. package/dist/chunk-SN5YV6FF.js +0 -11
  988. package/dist/chunk-SN5YV6FF.js.map +0 -1
  989. package/dist/chunk-T3USOSVN.js.map +0 -1
  990. package/dist/chunk-T4CLW3DN.js +0 -2560
  991. package/dist/chunk-T4CLW3DN.js.map +0 -1
  992. package/dist/chunk-UW2SGTI5.js.map +0 -1
  993. package/dist/chunk-VSCU7K4V.js.map +0 -1
  994. package/dist/chunk-WL2Y2T47.js.map +0 -1
  995. package/dist/chunk-WUTL62MC.js.map +0 -1
  996. package/dist/chunk-Y3MTRA7D.js +0 -97
  997. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  998. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  999. package/dist/document-tools/core.d.cts +0 -883
  1000. package/dist/document-tools/index.d.cts +0 -90
  1001. package/dist/index.d-BMhTH98a.d.cts +0 -2035
  1002. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  1003. package/dist/index.d.cts +0 -15893
  1004. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  1005. package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
  1006. package/dist/shell/index.d.cts +0 -6
  1007. package/dist/store.d-GADDvC7w.d.cts +0 -35
  1008. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  1009. package/dist/ui/index.d.cts +0 -25
  1010. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  1011. package/dist/viewers/index.d.cts +0 -260
@@ -0,0 +1,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
+ }
@@ -0,0 +1,41 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Sparkles } from "lucide-react";
3
+ import { IconToggle } from "../ui/IconToggle.js";
4
+ const AUTO_RENAME_COLORS = { text: "text-amber-700", bg: "bg-amber-500" };
5
+ function DraftTitleControls({
6
+ title,
7
+ onTitleChange,
8
+ placeholder,
9
+ autoRename,
10
+ onAutoRenameChange
11
+ }) {
12
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-shrink-0 items-center gap-1.5", children: [
13
+ /* @__PURE__ */ jsx(
14
+ "input",
15
+ {
16
+ type: "text",
17
+ value: title,
18
+ onChange: (e) => onTitleChange(e.target.value),
19
+ placeholder,
20
+ className: "min-w-0 max-w-[220px] rounded-md bg-muted px-2 py-1 text-sm font-medium outline-none focus-visible:ring-1 focus-visible:ring-primary",
21
+ "data-testid": "draft-title-input"
22
+ }
23
+ ),
24
+ /* @__PURE__ */ jsx(
25
+ IconToggle,
26
+ {
27
+ icon: Sparkles,
28
+ isActive: autoRename,
29
+ onToggle: onAutoRenameChange,
30
+ colors: AUTO_RENAME_COLORS,
31
+ tooltipActive: "Auto-name from content is on \u2014 generates a title once saved",
32
+ tooltipInactive: "Auto-name from content is off \u2014 uses the name typed above",
33
+ "data-testid": "draft-auto-rename-toggle"
34
+ }
35
+ )
36
+ ] });
37
+ }
38
+ export {
39
+ DraftTitleControls
40
+ };
41
+ //# sourceMappingURL=DraftTitleControls.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/DraftTitleControls.tsx"],
4
+ "sourcesContent": ["/**\n * DraftTitleControls\n *\n * A title field + an auto-name toggle for an unsaved draft (blank document,\n * voice note, or anything else a host app drafts before it exists on the\n * backend) \u2014 so picking a name or leaving AI generation on doesn't require a\n * separate settings surface.\n *\n * REUSE-FIRST: props/callbacks in, no store or config-API coupling. The host\n * owns where `title` is stored and what `autoRename` actually controls (in\n * ARBI-frontend, the same `DoctagLLM.AUTO_RENAME` config field the Upload\n * modal's toggle already writes).\n */\n\nimport { Sparkles } from 'lucide-react'\nimport { IconToggle } from '../ui/IconToggle'\n\nconst AUTO_RENAME_COLORS = { text: 'text-amber-700', bg: 'bg-amber-500' }\n\nexport interface DraftTitleControlsProps {\n title: string\n onTitleChange: (title: string) => void\n placeholder: string\n autoRename: boolean\n onAutoRenameChange: (value: boolean) => void\n}\n\nexport function DraftTitleControls({\n title,\n onTitleChange,\n placeholder,\n autoRename,\n onAutoRenameChange,\n}: DraftTitleControlsProps) {\n return (\n <div className=\"flex min-w-0 flex-shrink-0 items-center gap-1.5\">\n <input\n type=\"text\"\n value={title}\n onChange={(e) => onTitleChange(e.target.value)}\n placeholder={placeholder}\n className=\"min-w-0 max-w-[220px] rounded-md bg-muted px-2 py-1 text-sm font-medium outline-none focus-visible:ring-1 focus-visible:ring-primary\"\n data-testid=\"draft-title-input\"\n />\n <IconToggle\n icon={Sparkles}\n isActive={autoRename}\n onToggle={onAutoRenameChange}\n colors={AUTO_RENAME_COLORS}\n tooltipActive=\"Auto-name from content is on \u2014 generates a title once saved\"\n tooltipInactive=\"Auto-name from content is off \u2014 uses the name typed above\"\n data-testid=\"draft-auto-rename-toggle\"\n />\n </div>\n )\n}\n"],
5
+ "mappings": "AAmCI,SACE,KADF;AArBJ,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAE3B,MAAM,qBAAqB,EAAE,MAAM,kBAAkB,IAAI,eAAe;AAUjE,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,SACE,qBAAC,SAAI,WAAU,mDACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,QAC7C;AAAA,QACA,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,IACd;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,eAAc;AAAA,QACd,iBAAgB;AAAA,QAChB,eAAY;AAAA;AAAA,IACd;AAAA,KACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,90 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { Mic, Square, Loader2 } from "lucide-react";
4
+ import { useAudioRecorder } from "./useAudioRecorder.js";
5
+ import { MicRecordingOverlay } from "./MicRecordingOverlay.js";
6
+ const HOLD_THRESHOLD_MS = 350;
7
+ function InlineMicButton({
8
+ focused,
9
+ onTranscript,
10
+ onError,
11
+ transcribe,
12
+ className
13
+ }) {
14
+ const recorder = useAudioRecorder();
15
+ const [isTranscribing, setIsTranscribing] = useState(false);
16
+ const [latched, setLatched] = useState(false);
17
+ const pressedAtRef = useRef(0);
18
+ useEffect(() => {
19
+ if (recorder.error) onError?.(recorder.error);
20
+ }, [recorder.error]);
21
+ useEffect(() => {
22
+ if (recorder.state !== "stopped" || !recorder.blob) return;
23
+ const blob = recorder.blob;
24
+ setIsTranscribing(true);
25
+ transcribe(blob).then((text) => {
26
+ if (text.trim()) onTranscript(text.trim());
27
+ }).catch((err) => {
28
+ onError?.(err instanceof Error ? err.message : "Could not transcribe audio.");
29
+ }).finally(() => {
30
+ setIsTranscribing(false);
31
+ setLatched(false);
32
+ recorder.reset();
33
+ });
34
+ }, [recorder.state, recorder.blob]);
35
+ const isRecording = recorder.state === "recording";
36
+ const isBusy = isTranscribing;
37
+ if (!focused && !isRecording && !isBusy) return null;
38
+ const handlePointerDown = (e) => {
39
+ e.preventDefault();
40
+ if (isRecording) return;
41
+ pressedAtRef.current = Date.now();
42
+ void recorder.start();
43
+ };
44
+ const handlePointerUp = () => {
45
+ if (!isRecording) return;
46
+ if (latched) {
47
+ recorder.stop();
48
+ setLatched(false);
49
+ return;
50
+ }
51
+ const held = Date.now() - pressedAtRef.current;
52
+ if (held >= HOLD_THRESHOLD_MS) {
53
+ recorder.stop();
54
+ } else {
55
+ setLatched(true);
56
+ }
57
+ };
58
+ const handlePointerLeave = () => {
59
+ if (isRecording && !latched) recorder.stop();
60
+ };
61
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
62
+ /* @__PURE__ */ jsx(
63
+ "button",
64
+ {
65
+ type: "button",
66
+ onPointerDown: handlePointerDown,
67
+ onPointerUp: handlePointerUp,
68
+ onPointerLeave: handlePointerLeave,
69
+ onPointerCancel: handlePointerLeave,
70
+ disabled: isBusy,
71
+ title: isRecording ? "Release to stop, or tap again if hands-free" : "Hold, or tap to dictate",
72
+ "data-testid": "inline-mic-button",
73
+ className: `inline-flex items-center justify-center rounded-full transition-colors disabled:pointer-events-none ${isRecording ? "h-7 w-7 bg-red-500 text-white shadow-sm hover:bg-red-600" : isBusy ? "h-6 w-6 text-muted-foreground" : "h-6 w-6 text-muted-foreground/50 hover:bg-muted hover:text-muted-foreground"} ${className ?? ""}`,
74
+ children: isBusy ? /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }) : isRecording ? /* @__PURE__ */ jsx(Square, { className: "h-3 w-3 fill-current" }) : /* @__PURE__ */ jsx(Mic, { className: "h-3.5 w-3.5" })
75
+ }
76
+ ),
77
+ isRecording && /* @__PURE__ */ jsx(
78
+ MicRecordingOverlay,
79
+ {
80
+ level: recorder.level,
81
+ elapsedMs: recorder.elapsedMs,
82
+ caption: latched ? "Tap the mic again to stop" : "Release to stop, or keep holding"
83
+ }
84
+ )
85
+ ] });
86
+ }
87
+ export {
88
+ InlineMicButton
89
+ };
90
+ //# sourceMappingURL=InlineMicButton.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/InlineMicButton.tsx"],
4
+ "sourcesContent": ["/**\n * InlineMicButton\n *\n * A dictate-instead-of-type button meant to sit inside a text field's own\n * padding (a corner of an `<input>`/`<textarea>`), not a standalone feature\n * in its own right \u2014 no waveform, no timer, no card chrome. Only shows while\n * the host field is focused (or mid-recording/transcribing, so it never\n * vanishes out from under an active dictation) \u2014 otherwise the field stays\n * clean. Idle it's subtle (small, muted); once pressed it's the opposite \u2014\n * a solid, unmissable recording indicator, because \"is this thing listening\"\n * is the one moment subtlety actively hurts. Built on the same\n * useAudioRecorder engine as VoiceNoteRecorder/MicButton.\n *\n * Two ways to use it, same as WhatsApp/Telegram voice messages:\n * - Press and hold, release to stop \u2014 quick dictation, thumb-friendly.\n * - A quick tap instead locks it into hands-free recording (no need to keep\n * the pointer down for a long note); tap again to stop. A tap is whatever\n * releases before HOLD_THRESHOLD_MS \u2014 past that it's a hold, and release\n * stops it immediately.\n *\n * REUSE-FIRST: props/callbacks in. The host supplies `transcribe` (its own\n * speech-to-text endpoint), `focused` (its own focus state), and\n * `onTranscript` (where the text goes \u2014 append, insert at cursor, whatever\n * fits the field).\n *\n * `preventDefault()` on pointerdown so pressing this button never steals\n * focus from the field it's embedded in \u2014 without that, a field that blurs\n * to collapse itself (e.g. an editor that exits edit mode on blur) would\n * close out from under a user mid-dictation, and `focused` would immediately\n * flip false and hide the button being pressed.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Mic, Square, Loader2 } from 'lucide-react'\nimport { useAudioRecorder } from './useAudioRecorder'\nimport { MicRecordingOverlay } from './MicRecordingOverlay'\n\n// Below this, a press-release is a \"tap\" (locks into hands-free recording);\n// at or above it, release stops the recording immediately (press-and-hold).\nconst HOLD_THRESHOLD_MS = 350\n\nexport interface InlineMicButtonProps {\n /** Whether the host field currently has focus. The button renders only\n * while this is true, or while actively recording/transcribing. */\n focused: boolean\n /** Called with the transcribed text once recording stops and transcription\n * resolves. The host decides how to merge it into the field's value. */\n onTranscript: (text: string) => void\n /** Surfaces recorder or transcription failures \u2014 wire to the host's own\n * notification system. Without it, failures are silent. */\n onError?: (message: string) => void\n /** The host's own speech-to-text call. */\n transcribe: (blob: Blob) => Promise<string>\n className?: string\n}\n\nexport function InlineMicButton({\n focused,\n onTranscript,\n onError,\n transcribe,\n className,\n}: InlineMicButtonProps) {\n const recorder = useAudioRecorder()\n const [isTranscribing, setIsTranscribing] = useState(false)\n // True once a quick tap has left the recording running hands-free \u2014 the\n // next press (of any length) is the \"stop\" gesture rather than a new hold.\n const [latched, setLatched] = useState(false)\n const pressedAtRef = useRef(0)\n\n useEffect(() => {\n if (recorder.error) onError?.(recorder.error)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.error])\n\n useEffect(() => {\n if (recorder.state !== 'stopped' || !recorder.blob) return\n const blob = recorder.blob\n setIsTranscribing(true)\n transcribe(blob)\n .then((text) => {\n if (text.trim()) onTranscript(text.trim())\n })\n .catch((err) => {\n onError?.(err instanceof Error ? err.message : 'Could not transcribe audio.')\n })\n .finally(() => {\n setIsTranscribing(false)\n setLatched(false)\n recorder.reset()\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.state, recorder.blob])\n\n const isRecording = recorder.state === 'recording'\n const isBusy = isTranscribing\n\n if (!focused && !isRecording && !isBusy) return null\n\n const handlePointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n if (isRecording) return // latched (or otherwise already going) \u2014 let pointerup stop it\n pressedAtRef.current = Date.now()\n void recorder.start()\n }\n\n const handlePointerUp = () => {\n if (!isRecording) return\n if (latched) {\n recorder.stop()\n setLatched(false)\n return\n }\n const held = Date.now() - pressedAtRef.current\n if (held >= HOLD_THRESHOLD_MS) {\n recorder.stop()\n } else {\n setLatched(true)\n }\n }\n\n const handlePointerLeave = () => {\n // Dragged off mid-hold (not latched into hands-free) \u2014 stop, same as\n // releasing over the button. Latched recording stays running regardless\n // of where the pointer goes; that's the point of hands-free.\n if (isRecording && !latched) recorder.stop()\n }\n\n return (\n <>\n <button\n type=\"button\"\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerLeave}\n onPointerCancel={handlePointerLeave}\n disabled={isBusy}\n title={\n isRecording ? 'Release to stop, or tap again if hands-free' : 'Hold, or tap to dictate'\n }\n data-testid=\"inline-mic-button\"\n className={`inline-flex items-center justify-center rounded-full transition-colors disabled:pointer-events-none ${\n isRecording\n ? 'h-7 w-7 bg-red-500 text-white shadow-sm hover:bg-red-600'\n : isBusy\n ? 'h-6 w-6 text-muted-foreground'\n : 'h-6 w-6 text-muted-foreground/50 hover:bg-muted hover:text-muted-foreground'\n } ${className ?? ''}`}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : isRecording ? (\n <Square className=\"h-3 w-3 fill-current\" />\n ) : (\n <Mic className=\"h-3.5 w-3.5\" />\n )}\n </button>\n {/* Same big, unmissable \"is it hearing me\" feedback as the chat\n composer's mic \u2014 reused, not reimplemented, so every recording in\n the app looks and feels the same. */}\n {isRecording && (\n <MicRecordingOverlay\n level={recorder.level}\n elapsedMs={recorder.elapsedMs}\n caption={latched ? 'Tap the mic again to stop' : 'Release to stop, or keep holding'}\n />\n )}\n </>\n )\n}\n"],
5
+ "mappings": "AAiII,mBAqBM,KArBN;AAjGJ,SAAS,WAAW,QAAQ,gBAAgB;AAC5C,SAAS,KAAK,QAAQ,eAAe;AACrC,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AAIpC,MAAM,oBAAoB;AAiBnB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,WAAW,iBAAiB;AAClC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAG1D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,eAAe,OAAO,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,SAAS,MAAO,WAAU,SAAS,KAAK;AAAA,EAE9C,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,YAAU,MAAM;AACd,QAAI,SAAS,UAAU,aAAa,CAAC,SAAS,KAAM;AACpD,UAAM,OAAO,SAAS;AACtB,sBAAkB,IAAI;AACtB,eAAW,IAAI,EACZ,KAAK,CAAC,SAAS;AACd,UAAI,KAAK,KAAK,EAAG,cAAa,KAAK,KAAK,CAAC;AAAA,IAC3C,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,gBAAU,eAAe,QAAQ,IAAI,UAAU,6BAA6B;AAAA,IAC9E,CAAC,EACA,QAAQ,MAAM;AACb,wBAAkB,KAAK;AACvB,iBAAW,KAAK;AAChB,eAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EAEL,GAAG,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC;AAElC,QAAM,cAAc,SAAS,UAAU;AACvC,QAAM,SAAS;AAEf,MAAI,CAAC,WAAW,CAAC,eAAe,CAAC,OAAQ,QAAO;AAEhD,QAAM,oBAAoB,CAAC,MAA0B;AACnD,MAAE,eAAe;AACjB,QAAI,YAAa;AACjB,iBAAa,UAAU,KAAK,IAAI;AAChC,SAAK,SAAS,MAAM;AAAA,EACtB;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,YAAa;AAClB,QAAI,SAAS;AACX,eAAS,KAAK;AACd,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,IAAI,IAAI,aAAa;AACvC,QAAI,QAAQ,mBAAmB;AAC7B,eAAS,KAAK;AAAA,IAChB,OAAO;AACL,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAI/B,QAAI,eAAe,CAAC,QAAS,UAAS,KAAK;AAAA,EAC7C;AAEA,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,OACE,cAAc,gDAAgD;AAAA,QAEhE,eAAY;AAAA,QACZ,WAAW,uGACT,cACI,6DACA,SACE,kCACA,6EACR,IAAI,aAAa,EAAE;AAAA,QAElB,mBACC,oBAAC,WAAQ,WAAU,4BAA2B,IAC5C,cACF,oBAAC,UAAO,WAAU,wBAAuB,IAEzC,oBAAC,OAAI,WAAU,eAAc;AAAA;AAAA,IAEjC;AAAA,IAIC,eACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,SAAS;AAAA,QAChB,WAAW,SAAS;AAAA,QACpB,SAAS,UAAU,8BAA8B;AAAA;AAAA,IACnD;AAAA,KAEJ;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { createPortal } from "react-dom";
3
+ import { MicWaveformIndicator } from "./MicWaveformIndicator.js";
4
+ function MicRecordingOverlay({
5
+ level,
6
+ elapsedMs,
7
+ caption = "Keep button pressed while speaking"
8
+ }) {
9
+ if (typeof document === "undefined") return null;
10
+ return createPortal(
11
+ /* @__PURE__ */ jsx(
12
+ "div",
13
+ {
14
+ "aria-hidden": true,
15
+ className: "pointer-events-none fixed inset-0 z-[2147483647] flex items-center justify-center",
16
+ "data-testid": "mic-recording-overlay",
17
+ children: /* @__PURE__ */ jsxs("div", { className: "flex w-72 flex-col items-center gap-3 rounded-2xl bg-background/95 px-6 py-5 shadow-2xl ring-1 ring-border backdrop-blur-sm", children: [
18
+ /* @__PURE__ */ jsx(MicWaveformIndicator, { level, elapsedMs }),
19
+ /* @__PURE__ */ jsx("p", { className: "text-center text-sm font-medium text-muted-foreground", children: caption })
20
+ ] })
21
+ }
22
+ ),
23
+ document.body
24
+ );
25
+ }
26
+ export {
27
+ MicRecordingOverlay
28
+ };
29
+ //# sourceMappingURL=MicRecordingOverlay.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/MicRecordingOverlay.tsx"],
4
+ "sourcesContent": ["/**\n * MicRecordingOverlay\n *\n * The big, unmissable \"is it hearing me\" feedback for an active recording \u2014\n * a centered, portaled card with the REC-badge/timer/waveform visual\n * (MicWaveformIndicator). Shared by any recorder in the app that wants the\n * same prominent treatment while actively recording: the chat composer's\n * press-and-hold mic and the inline dictate button both use this, so\n * \"you are recording\" looks and feels identical everywhere it happens.\n *\n * Non-interactive (pointer-events disabled) so it never blocks a click\n * elsewhere; mounted via a portal so it renders above whatever field or\n * layout it was triggered from, regardless of overflow/z-index there.\n */\n\nimport { createPortal } from 'react-dom'\nimport { MicWaveformIndicator } from './MicWaveformIndicator'\n\nexport interface MicRecordingOverlayProps {\n level: number\n elapsedMs: number\n /** Caption under the waveform \u2014 defaults to the press-and-hold framing. */\n caption?: string\n}\n\nexport function MicRecordingOverlay({\n level,\n elapsedMs,\n caption = 'Keep button pressed while speaking',\n}: MicRecordingOverlayProps) {\n if (typeof document === 'undefined') return null\n return createPortal(\n <div\n aria-hidden\n className=\"pointer-events-none fixed inset-0 z-[2147483647] flex items-center justify-center\"\n data-testid=\"mic-recording-overlay\"\n >\n <div className=\"flex w-72 flex-col items-center gap-3 rounded-2xl bg-background/95 px-6 py-5 shadow-2xl ring-1 ring-border backdrop-blur-sm\">\n <MicWaveformIndicator level={level} elapsedMs={elapsedMs} />\n <p className=\"text-center text-sm font-medium text-muted-foreground\">{caption}</p>\n </div>\n </div>,\n document.body\n )\n}\n"],
5
+ "mappings": "AAqCM,SACE,KADF;AAtBN,SAAS,oBAAoB;AAC7B,SAAS,4BAA4B;AAS9B,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAA6B;AAC3B,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,SAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAU;AAAA,QACV,eAAY;AAAA,QAEZ,+BAAC,SAAI,WAAU,+HACb;AAAA,8BAAC,wBAAqB,OAAc,WAAsB;AAAA,UAC1D,oBAAC,OAAE,WAAU,yDAAyD,mBAAQ;AAAA,WAChF;AAAA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,68 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { formatElapsed } from "./format-elapsed.js";
3
+ const BAR_WEIGHTS = [
4
+ 0.25,
5
+ 0.32,
6
+ 0.48,
7
+ 0.62,
8
+ 0.82,
9
+ 0.56,
10
+ 0.92,
11
+ 0.72,
12
+ 1,
13
+ 0.86,
14
+ 0.62,
15
+ 0.96,
16
+ 0.76,
17
+ 0.5,
18
+ 0.84,
19
+ 0.66,
20
+ 0.42,
21
+ 0.56,
22
+ 0.36,
23
+ 0.28,
24
+ 0.22
25
+ ];
26
+ const MIN_BAR_PX = 3;
27
+ const MAX_BAR_PX = 40;
28
+ function MicWaveformIndicator({
29
+ level,
30
+ elapsedMs,
31
+ paused = false
32
+ }) {
33
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3", "data-testid": "mic-waveform-indicator", children: [
34
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
35
+ /* @__PURE__ */ jsxs("span", { className: "relative flex h-2 w-2", children: [
36
+ !paused && /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75" }),
37
+ /* @__PURE__ */ jsx(
38
+ "span",
39
+ {
40
+ className: `relative inline-flex h-2 w-2 rounded-full ${paused ? "bg-muted-foreground" : "bg-red-500"}`
41
+ }
42
+ )
43
+ ] }),
44
+ /* @__PURE__ */ jsx(
45
+ "span",
46
+ {
47
+ className: `text-xs font-semibold uppercase tracking-wide ${paused ? "text-muted-foreground" : "text-red-500"}`,
48
+ children: paused ? "Paused" : "Rec"
49
+ }
50
+ ),
51
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-xs tabular-nums text-muted-foreground", children: formatElapsed(elapsedMs) })
52
+ ] }),
53
+ /* @__PURE__ */ jsx("div", { className: "flex h-10 items-end gap-[3px]", "data-testid": "mic-waveform-indicator-bars", children: BAR_WEIGHTS.map((weight, i) => /* @__PURE__ */ jsx(
54
+ "span",
55
+ {
56
+ className: "w-1 rounded-full bg-secondary transition-[height] duration-75 ease-out",
57
+ style: {
58
+ height: Math.min(MAX_BAR_PX, Math.max(MIN_BAR_PX, level * weight * MAX_BAR_PX))
59
+ }
60
+ },
61
+ i
62
+ )) })
63
+ ] });
64
+ }
65
+ export {
66
+ MicWaveformIndicator
67
+ };
68
+ //# sourceMappingURL=MicWaveformIndicator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/MicWaveformIndicator.tsx"],
4
+ "sourcesContent": ["/**\n * MicWaveformIndicator\n *\n * The REC-badge + timer + waveform visual \u2014 the reusable \"is it hearing me\"\n * piece shared by any press-and-hold or toggle-style audio recorder a host\n * app builds on `useAudioRecorder`. Purely presentational: no portal, no\n * card chrome, no caption \u2014 callers provide their own context around it.\n *\n * Styled like the REC-badge + timer + waveform convention every voice\n * recorder app uses (Voice Memos, WhatsApp, Slack huddles) \u2014 recognisable\n * at a glance as \"this bar height is how loud you are\", not just decoration.\n */\n\nimport { formatElapsed } from './format-elapsed'\n\n// A waveform silhouette (bell-shaped with a little natural asymmetry) rather\n// than a uniform bank of bars \u2014 reads as an actual audio waveform rather\n// than N identical dots. Every bar still scales with the same live `level`.\nconst BAR_WEIGHTS = [\n 0.25, 0.32, 0.48, 0.62, 0.82, 0.56, 0.92, 0.72, 1, 0.86, 0.62, 0.96, 0.76, 0.5, 0.84, 0.66, 0.42,\n 0.56, 0.36, 0.28, 0.22,\n]\nconst MIN_BAR_PX = 3\nconst MAX_BAR_PX = 40\n\nexport interface MicWaveformIndicatorProps {\n level: number\n elapsedMs: number\n /** Dims the REC badge and freezes the \"recording\" framing while paused,\n * without needing a separate visual language. */\n paused?: boolean\n}\n\nexport function MicWaveformIndicator({\n level,\n elapsedMs,\n paused = false,\n}: MicWaveformIndicatorProps) {\n return (\n <div className=\"flex flex-col items-center gap-3\" data-testid=\"mic-waveform-indicator\">\n <div className=\"flex items-center gap-2\">\n <span className=\"relative flex h-2 w-2\">\n {!paused && (\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75\" />\n )}\n <span\n className={`relative inline-flex h-2 w-2 rounded-full ${paused ? 'bg-muted-foreground' : 'bg-red-500'}`}\n />\n </span>\n <span\n className={`text-xs font-semibold uppercase tracking-wide ${paused ? 'text-muted-foreground' : 'text-red-500'}`}\n >\n {paused ? 'Paused' : 'Rec'}\n </span>\n <span className=\"font-mono text-xs tabular-nums text-muted-foreground\">\n {formatElapsed(elapsedMs)}\n </span>\n </div>\n <div className=\"flex h-10 items-end gap-[3px]\" data-testid=\"mic-waveform-indicator-bars\">\n {BAR_WEIGHTS.map((weight, i) => (\n <span\n key={i}\n className=\"w-1 rounded-full bg-secondary transition-[height] duration-75 ease-out\"\n style={{\n height: Math.min(MAX_BAR_PX, Math.max(MIN_BAR_PX, level * weight * MAX_BAR_PX)),\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "AAyCQ,SAEI,KAFJ;AA5BR,SAAS,qBAAqB;AAK9B,MAAM,cAAc;AAAA,EAClB;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAG;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAC5F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACpB;AACA,MAAM,aAAa;AACnB,MAAM,aAAa;AAUZ,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAA8B;AAC5B,SACE,qBAAC,SAAI,WAAU,oCAAmC,eAAY,0BAC5D;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,2BAAC,UAAK,WAAU,yBACb;AAAA,SAAC,UACA,oBAAC,UAAK,WAAU,sFAAqF;AAAA,QAEvG;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,6CAA6C,SAAS,wBAAwB,YAAY;AAAA;AAAA,QACvG;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,iDAAiD,SAAS,0BAA0B,cAAc;AAAA,UAE5G,mBAAS,WAAW;AAAA;AAAA,MACvB;AAAA,MACA,oBAAC,UAAK,WAAU,wDACb,wBAAc,SAAS,GAC1B;AAAA,OACF;AAAA,IACA,oBAAC,SAAI,WAAU,iCAAgC,eAAY,+BACxD,sBAAY,IAAI,CAAC,QAAQ,MACxB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,QAAQ,KAAK,IAAI,YAAY,KAAK,IAAI,YAAY,QAAQ,SAAS,UAAU,CAAC;AAAA,QAChF;AAAA;AAAA,MAJK;AAAA,IAKP,CACD,GACH;AAAA,KACF;AAEJ;",
6
+ "names": []
7
+ }