@arbidocs/react 0.5.111 → 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 (983) hide show
  1. package/dist/account/client.js +96 -0
  2. package/dist/account/client.js.map +7 -0
  3. package/dist/account/delete.js +70 -0
  4. package/dist/account/delete.js.map +7 -0
  5. package/dist/account/didit.js +34 -0
  6. package/dist/account/didit.js.map +7 -0
  7. package/dist/account/dismissed-tips.js +33 -0
  8. package/dist/account/dismissed-tips.js.map +7 -0
  9. package/dist/account/email.js +84 -0
  10. package/dist/account/email.js.map +7 -0
  11. package/dist/account/entitlements.js +47 -0
  12. package/dist/account/entitlements.js.map +7 -0
  13. package/dist/account/identity.js +270 -0
  14. package/dist/account/identity.js.map +7 -0
  15. package/dist/account/index.js +93 -0
  16. package/dist/account/index.js.map +7 -0
  17. package/dist/account/notifications.js +59 -0
  18. package/dist/account/notifications.js.map +7 -0
  19. package/dist/account/password.js +103 -0
  20. package/dist/account/password.js.map +7 -0
  21. package/dist/account/profile.js +116 -0
  22. package/dist/account/profile.js.map +7 -0
  23. package/dist/account/recovery.js +13 -0
  24. package/dist/account/recovery.js.map +7 -0
  25. package/dist/account/relevance.js +82 -0
  26. package/dist/account/relevance.js.map +7 -0
  27. package/dist/account/sessions.js +37 -0
  28. package/dist/account/sessions.js.map +7 -0
  29. package/dist/account/settings.js +39 -0
  30. package/dist/account/settings.js.map +7 -0
  31. package/dist/account/table-views.js +16 -0
  32. package/dist/account/table-views.js.map +7 -0
  33. package/dist/ai/AiAnswer.js +83 -0
  34. package/dist/ai/AiAnswer.js.map +7 -0
  35. package/dist/ai/AiMarkdown.js +40 -0
  36. package/dist/ai/AiMarkdown.js.map +7 -0
  37. package/dist/ai/ArtifactCanvas.js +193 -0
  38. package/dist/ai/ArtifactCanvas.js.map +7 -0
  39. package/dist/ai/CitationRenderer.js +413 -0
  40. package/dist/ai/CitationRenderer.js.map +7 -0
  41. package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
  42. package/dist/ai/MarkdownRenderer.js.map +7 -0
  43. package/dist/ai/MessageArtifactCard.js +75 -0
  44. package/dist/ai/MessageArtifactCard.js.map +7 -0
  45. package/dist/ai/PassageCard.js +79 -0
  46. package/dist/ai/PassageCard.js.map +7 -0
  47. package/dist/ai/engine.js +110 -0
  48. package/dist/ai/engine.js.map +7 -0
  49. package/dist/ai/index.js +63 -0
  50. package/dist/ai/index.js.map +7 -0
  51. package/dist/ai/markdown-base-components.js +37 -0
  52. package/dist/ai/markdown-base-components.js.map +7 -0
  53. package/dist/ai/markdown-streaming-context.js +6 -0
  54. package/dist/ai/markdown-streaming-context.js.map +7 -0
  55. package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
  56. package/dist/ai/normalize-citations.js.map +7 -0
  57. package/dist/ai/redline.js +41 -0
  58. package/dist/ai/redline.js.map +7 -0
  59. package/dist/ai/split-markdown-blocks.js +40 -0
  60. package/dist/ai/split-markdown-blocks.js.map +7 -0
  61. package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
  62. package/dist/ai/stored-markdown.js.map +7 -0
  63. package/dist/annotations/AnnotationPageOverlay.js +807 -0
  64. package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
  65. package/dist/annotations/AnnotationToolbar.js +398 -0
  66. package/dist/annotations/AnnotationToolbar.js.map +7 -0
  67. package/dist/annotations/FreezeDialog.js +170 -0
  68. package/dist/annotations/FreezeDialog.js.map +7 -0
  69. package/dist/annotations/ProductionDialog.js +354 -0
  70. package/dist/annotations/ProductionDialog.js.map +7 -0
  71. package/dist/annotations/controller.js +49 -0
  72. package/dist/annotations/controller.js.map +7 -0
  73. package/dist/annotations/freeze/browser.js +21 -0
  74. package/dist/annotations/freeze/browser.js.map +7 -0
  75. package/dist/annotations/freeze/bundle.js +201 -0
  76. package/dist/annotations/freeze/bundle.js.map +7 -0
  77. package/dist/annotations/freeze/coords.js +37 -0
  78. package/dist/annotations/freeze/coords.js.map +7 -0
  79. package/dist/annotations/freeze/freeze.js +261 -0
  80. package/dist/annotations/freeze/freeze.js.map +7 -0
  81. package/dist/annotations/freeze/hash.js +28 -0
  82. package/dist/annotations/freeze/hash.js.map +7 -0
  83. package/dist/annotations/freeze/index-page.js +78 -0
  84. package/dist/annotations/freeze/index-page.js.map +7 -0
  85. package/dist/annotations/freeze/index.js +28 -22
  86. package/dist/annotations/freeze/index.js.map +7 -1
  87. package/dist/annotations/freeze/raster.js +208 -0
  88. package/dist/annotations/freeze/raster.js.map +7 -0
  89. package/dist/annotations/freeze/stamp.js +117 -0
  90. package/dist/annotations/freeze/stamp.js.map +7 -0
  91. package/dist/annotations/freeze/types.js +14 -0
  92. package/dist/annotations/freeze/types.js.map +7 -0
  93. package/dist/annotations/freeze/vector.js +283 -0
  94. package/dist/annotations/freeze/vector.js.map +7 -0
  95. package/dist/annotations/geometry.js +81 -0
  96. package/dist/annotations/geometry.js.map +7 -0
  97. package/dist/annotations/index.js +125 -6
  98. package/dist/annotations/index.js.map +7 -1
  99. package/dist/annotations/merge.js +53 -0
  100. package/dist/annotations/merge.js.map +7 -0
  101. package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
  102. package/dist/annotations/model.js.map +7 -0
  103. package/dist/annotations/overlay-geometry.js +41 -0
  104. package/dist/annotations/overlay-geometry.js.map +7 -0
  105. package/dist/annotations/redaction-log.js +33 -0
  106. package/dist/annotations/redaction-log.js.map +7 -0
  107. package/dist/annotations/selection-marks.js +122 -0
  108. package/dist/annotations/selection-marks.js.map +7 -0
  109. package/dist/annotations/state.js +140 -0
  110. package/dist/annotations/state.js.map +7 -0
  111. package/dist/annotations/store.js +49 -0
  112. package/dist/annotations/store.js.map +7 -0
  113. package/dist/annotations/useAnnotationLayer.js +306 -0
  114. package/dist/annotations/useAnnotationLayer.js.map +7 -0
  115. package/dist/annotations/useAnnotationShortcuts.js +31 -0
  116. package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
  117. package/dist/annotations/useTextSelectionMarks.js +100 -0
  118. package/dist/annotations/useTextSelectionMarks.js.map +7 -0
  119. package/dist/artifacts/artifact-kind.js +19 -0
  120. package/dist/artifacts/artifact-kind.js.map +7 -0
  121. package/dist/artifacts/index.js +89 -571
  122. package/dist/artifacts/index.js.map +7 -1
  123. package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
  124. package/dist/artifacts/normalize-markdown.js.map +7 -0
  125. package/dist/artifacts/redline-core.js +12 -3
  126. package/dist/artifacts/redline-core.js.map +7 -1
  127. package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
  128. package/dist/artifacts/redline-diff.js.map +7 -0
  129. package/dist/artifacts/redline-engine.js +14 -0
  130. package/dist/artifacts/redline-engine.js.map +7 -0
  131. package/dist/artifacts/renderArtifactMarkdown.js +9 -0
  132. package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
  133. package/dist/artifacts/useArtifactEditSession.js +183 -0
  134. package/dist/artifacts/useArtifactEditSession.js.map +7 -0
  135. package/dist/artifacts/useArtifactSession.js +173 -0
  136. package/dist/artifacts/useArtifactSession.js.map +7 -0
  137. package/dist/artifacts/useArtifactSource.js +16 -0
  138. package/dist/artifacts/useArtifactSource.js.map +7 -0
  139. package/dist/artifacts/useArtifactText.js +78 -0
  140. package/dist/artifacts/useArtifactText.js.map +7 -0
  141. package/dist/artifacts/useRedline.js +65 -0
  142. package/dist/artifacts/useRedline.js.map +7 -0
  143. package/dist/artifacts/useStreamedArtifact.js +74 -0
  144. package/dist/artifacts/useStreamedArtifact.js.map +7 -0
  145. package/dist/artifacts/versions.js +68 -0
  146. package/dist/artifacts/versions.js.map +7 -0
  147. package/dist/billing.js +200 -0
  148. package/dist/billing.js.map +7 -0
  149. package/dist/boot-timeout.js +19 -0
  150. package/dist/boot-timeout.js.map +7 -0
  151. package/dist/calendar/accounts.js +213 -0
  152. package/dist/calendar/accounts.js.map +7 -0
  153. package/dist/calendar/hooks.js +409 -0
  154. package/dist/calendar/hooks.js.map +7 -0
  155. package/dist/calendar/index.js +31 -0
  156. package/dist/calendar/index.js.map +7 -0
  157. package/dist/calendar/keys.js +5 -0
  158. package/dist/calendar/keys.js.map +7 -0
  159. package/dist/calendar/offline/outbox.js +231 -0
  160. package/dist/calendar/offline/outbox.js.map +7 -0
  161. package/dist/calendar/offline/runtime.js +109 -0
  162. package/dist/calendar/offline/runtime.js.map +7 -0
  163. package/dist/calendar/offline/support.js +41 -0
  164. package/dist/calendar/offline/support.js.map +7 -0
  165. package/dist/calendar/support.js +34 -0
  166. package/dist/calendar/support.js.map +7 -0
  167. package/dist/calls/actions.js +226 -0
  168. package/dist/calls/actions.js.map +7 -0
  169. package/dist/calls/events.js +138 -0
  170. package/dist/calls/events.js.map +7 -0
  171. package/dist/calls/gate.js +19 -0
  172. package/dist/calls/gate.js.map +7 -0
  173. package/dist/calls/hooks.js +115 -0
  174. package/dist/calls/hooks.js.map +7 -0
  175. package/dist/calls/in-call-chat.js +132 -0
  176. package/dist/calls/in-call-chat.js.map +7 -0
  177. package/dist/calls/index.js +24 -0
  178. package/dist/calls/index.js.map +7 -0
  179. package/dist/calls/keys.js +17 -0
  180. package/dist/calls/keys.js.map +7 -0
  181. package/dist/calls/livekit/index.js +6 -958
  182. package/dist/calls/livekit/index.js.map +7 -1
  183. package/dist/calls/livekit/room.js +98 -0
  184. package/dist/calls/livekit/room.js.map +7 -0
  185. package/dist/calls/livekit/useCallRecorder.js +219 -0
  186. package/dist/calls/livekit/useCallRecorder.js.map +7 -0
  187. package/dist/calls/livekit/useCallTranscriber.js +309 -0
  188. package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
  189. package/dist/calls/livekit/useHostMuteNotice.js +29 -0
  190. package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
  191. package/dist/calls/livekit/useInCallChat.js +161 -0
  192. package/dist/calls/livekit/useInCallChat.js.map +7 -0
  193. package/dist/calls/livekit/useWebinar.js +239 -0
  194. package/dist/calls/livekit/useWebinar.js.map +7 -0
  195. package/dist/calls/meeting-chat.js +149 -0
  196. package/dist/calls/meeting-chat.js.map +7 -0
  197. package/dist/calls/moderation.js +50 -0
  198. package/dist/calls/moderation.js.map +7 -0
  199. package/dist/calls/open-meeting-chat.js +29 -0
  200. package/dist/calls/open-meeting-chat.js.map +7 -0
  201. package/dist/calls/read-only.js +24 -0
  202. package/dist/calls/read-only.js.map +7 -0
  203. package/dist/calls/recording-media.js +218 -0
  204. package/dist/calls/recording-media.js.map +7 -0
  205. package/dist/calls/recording-playback.js +260 -0
  206. package/dist/calls/recording-playback.js.map +7 -0
  207. package/dist/calls/recording.js +268 -0
  208. package/dist/calls/recording.js.map +7 -0
  209. package/dist/calls/save-to-thread.js +80 -0
  210. package/dist/calls/save-to-thread.js.map +7 -0
  211. package/dist/calls/session.js +134 -0
  212. package/dist/calls/session.js.map +7 -0
  213. package/dist/calls/transcript-format.js +147 -0
  214. package/dist/calls/transcript-format.js.map +7 -0
  215. package/dist/calls/transcription.js +101 -0
  216. package/dist/calls/transcription.js.map +7 -0
  217. package/dist/calls/webinar.js +71 -0
  218. package/dist/calls/webinar.js.map +7 -0
  219. package/dist/charge-watch.js +71 -0
  220. package/dist/charge-watch.js.map +7 -0
  221. package/dist/chat/ChatBubble.js +146 -0
  222. package/dist/chat/ChatBubble.js.map +7 -0
  223. package/dist/chat/ConversationScope.js +30 -0
  224. package/dist/chat/ConversationScope.js.map +7 -0
  225. package/dist/chat/active-config.js +20 -0
  226. package/dist/chat/active-config.js.map +7 -0
  227. package/dist/chat/agent-chat-owner.js +25 -0
  228. package/dist/chat/agent-chat-owner.js.map +7 -0
  229. package/dist/chat/chat-artifacts.js +64 -0
  230. package/dist/chat/chat-artifacts.js.map +7 -0
  231. package/dist/chat/citations.js +32 -0
  232. package/dist/chat/citations.js.map +7 -0
  233. package/dist/chat/config-model.js +10 -0
  234. package/dist/chat/config-model.js.map +7 -0
  235. package/dist/chat/conversation-cache.js +676 -0
  236. package/dist/chat/conversation-cache.js.map +7 -0
  237. package/dist/chat/conversation-events.js +57 -0
  238. package/dist/chat/conversation-events.js.map +7 -0
  239. package/dist/chat/conversation-mentions.js +58 -0
  240. package/dist/chat/conversation-mentions.js.map +7 -0
  241. package/dist/chat/conversation-workspace.js +58 -0
  242. package/dist/chat/conversation-workspace.js.map +7 -0
  243. package/dist/chat/mentions.js +116 -0
  244. package/dist/chat/mentions.js.map +7 -0
  245. package/dist/chat/open-document.js +106 -0
  246. package/dist/chat/open-document.js.map +7 -0
  247. package/dist/chat/orphaned.js +44 -0
  248. package/dist/chat/orphaned.js.map +7 -0
  249. package/dist/chat/pendingFirstTurn.js +30 -0
  250. package/dist/chat/pendingFirstTurn.js.map +7 -0
  251. package/dist/chat/reply-target.js +12 -0
  252. package/dist/chat/reply-target.js.map +7 -0
  253. package/dist/chat/run-finished.js +28 -0
  254. package/dist/chat/run-finished.js.map +7 -0
  255. package/dist/chat/run-state.js +91 -0
  256. package/dist/chat/run-state.js.map +7 -0
  257. package/dist/chat/stream-handlers.js +419 -0
  258. package/dist/chat/stream-handlers.js.map +7 -0
  259. package/dist/chat/thread-binding.js +76 -0
  260. package/dist/chat/thread-binding.js.map +7 -0
  261. package/dist/chat/thread-document.js +53 -0
  262. package/dist/chat/thread-document.js.map +7 -0
  263. package/dist/chat/turn-control.js +79 -0
  264. package/dist/chat/turn-control.js.map +7 -0
  265. package/dist/chat/useAgentRunControl.js +36 -0
  266. package/dist/chat/useAgentRunControl.js.map +7 -0
  267. package/dist/chat/useAnswerAgentQuestion.js +19 -0
  268. package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
  269. package/dist/chat/useAskAgain.js +32 -0
  270. package/dist/chat/useAskAgain.js.map +7 -0
  271. package/dist/chat/useAutoSendDraft.js +17 -0
  272. package/dist/chat/useAutoSendDraft.js.map +7 -0
  273. package/dist/chat/useBranchNavigation.js +97 -0
  274. package/dist/chat/useBranchNavigation.js.map +7 -0
  275. package/dist/chat/useConnectRunStream.js +169 -0
  276. package/dist/chat/useConnectRunStream.js.map +7 -0
  277. package/dist/chat/useConversation.js +431 -0
  278. package/dist/chat/useConversation.js.map +7 -0
  279. package/dist/chat/useConversationActions.js +662 -0
  280. package/dist/chat/useConversationActions.js.map +7 -0
  281. package/dist/chat/useConversationData.js +143 -0
  282. package/dist/chat/useConversationData.js.map +7 -0
  283. package/dist/chat/useConversationDocuments.js +41 -0
  284. package/dist/chat/useConversationDocuments.js.map +7 -0
  285. package/dist/chat/useConversationSettings.js +78 -0
  286. package/dist/chat/useConversationSettings.js.map +7 -0
  287. package/dist/chat/useConversationTurn.js +31 -0
  288. package/dist/chat/useConversationTurn.js.map +7 -0
  289. package/dist/chat/useConversationWorkspace.js +12 -0
  290. package/dist/chat/useConversationWorkspace.js.map +7 -0
  291. package/dist/chat/useDeleteMessage.js +15 -0
  292. package/dist/chat/useDeleteMessage.js.map +7 -0
  293. package/dist/chat/useDocumentAutoAdd.js +73 -0
  294. package/dist/chat/useDocumentAutoAdd.js.map +7 -0
  295. package/dist/chat/useMessageTimer.js +39 -0
  296. package/dist/chat/useMessageTimer.js.map +7 -0
  297. package/dist/chat/useThinkingContent.js +67 -0
  298. package/dist/chat/useThinkingContent.js.map +7 -0
  299. package/dist/chat/useThreadDocument.js +61 -0
  300. package/dist/chat/useThreadDocument.js.map +7 -0
  301. package/dist/chat/workflow-run-titles.js +50 -0
  302. package/dist/chat/workflow-run-titles.js.map +7 -0
  303. package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
  304. package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
  305. package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
  306. package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
  307. package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
  308. package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
  309. package/dist/config/config-hooks.js +209 -0
  310. package/dist/config/config-hooks.js.map +7 -0
  311. package/dist/connectivity.js +72 -0
  312. package/dist/connectivity.js.map +7 -0
  313. package/dist/connectors/hooks.js +263 -0
  314. package/dist/connectors/hooks.js.map +7 -0
  315. package/dist/connectors/index.js +28 -0
  316. package/dist/connectors/index.js.map +7 -0
  317. package/dist/contacts.js +100 -0
  318. package/dist/contacts.js.map +7 -0
  319. package/dist/conversation-list.js +65 -0
  320. package/dist/conversation-list.js.map +7 -0
  321. package/dist/databases.js +195 -0
  322. package/dist/databases.js.map +7 -0
  323. package/dist/datasets/aggregate.js +281 -0
  324. package/dist/datasets/aggregate.js.map +7 -0
  325. package/dist/datasets/index.js +122 -0
  326. package/dist/datasets/index.js.map +7 -0
  327. package/dist/datasets/members.js +27 -0
  328. package/dist/datasets/members.js.map +7 -0
  329. package/dist/datasets/panel.js +44 -0
  330. package/dist/datasets/panel.js.map +7 -0
  331. package/dist/datasets/registry.js +47 -0
  332. package/dist/datasets/registry.js.map +7 -0
  333. package/dist/datasets/rows-source.js +44 -0
  334. package/dist/datasets/rows-source.js.map +7 -0
  335. package/dist/datasets/sources/activity.js +83 -0
  336. package/dist/datasets/sources/activity.js.map +7 -0
  337. package/dist/datasets/sources/conversations.js +74 -0
  338. package/dist/datasets/sources/conversations.js.map +7 -0
  339. package/dist/datasets/sources/database.js +209 -0
  340. package/dist/datasets/sources/database.js.map +7 -0
  341. package/dist/datasets/sources/documents.js +93 -0
  342. package/dist/datasets/sources/documents.js.map +7 -0
  343. package/dist/datasets/sources/facts.js +56 -0
  344. package/dist/datasets/sources/facts.js.map +7 -0
  345. package/dist/datasets/sources/projects.js +117 -0
  346. package/dist/datasets/sources/projects.js.map +7 -0
  347. package/dist/datasets/sources/tags.js +67 -0
  348. package/dist/datasets/sources/tags.js.map +7 -0
  349. package/dist/datasets/sources/usage.js +268 -0
  350. package/dist/datasets/sources/usage.js.map +7 -0
  351. package/dist/datasets/sources/workflows.js +91 -0
  352. package/dist/datasets/sources/workflows.js.map +7 -0
  353. package/dist/datasets/sources/workspaces.js +67 -0
  354. package/dist/datasets/sources/workspaces.js.map +7 -0
  355. package/dist/datasets/store.js +194 -0
  356. package/dist/datasets/store.js.map +7 -0
  357. package/dist/datasets/types.js +14 -0
  358. package/dist/datasets/types.js.map +7 -0
  359. package/dist/directmessages/ConversationList.js +148 -0
  360. package/dist/directmessages/ConversationList.js.map +7 -0
  361. package/dist/directmessages/DateSeparator.js +8 -0
  362. package/dist/directmessages/DateSeparator.js.map +7 -0
  363. package/dist/directmessages/DmAvatar.js +29 -0
  364. package/dist/directmessages/DmAvatar.js.map +7 -0
  365. package/dist/directmessages/DmComposer.js +201 -0
  366. package/dist/directmessages/DmComposer.js.map +7 -0
  367. package/dist/directmessages/arrivals.js +29 -0
  368. package/dist/directmessages/arrivals.js.map +7 -0
  369. package/dist/directmessages/chat-cache.js +192 -0
  370. package/dist/directmessages/chat-cache.js.map +7 -0
  371. package/dist/directmessages/grouping.js +26 -0
  372. package/dist/directmessages/grouping.js.map +7 -0
  373. package/dist/directmessages/index.js +81 -0
  374. package/dist/directmessages/index.js.map +7 -0
  375. package/dist/directmessages/useChats.js +266 -0
  376. package/dist/directmessages/useChats.js.map +7 -0
  377. package/dist/directmessages/utils.js +23 -0
  378. package/dist/directmessages/utils.js.map +7 -0
  379. package/dist/document-tools/can-annotate.js +7 -0
  380. package/dist/document-tools/can-annotate.js.map +7 -0
  381. package/dist/document-tools/core.cjs +80 -80
  382. package/dist/document-tools/core.js +218 -12
  383. package/dist/document-tools/core.js.map +7 -1
  384. package/dist/document-tools/document-pdf.js +76 -0
  385. package/dist/document-tools/document-pdf.js.map +7 -0
  386. package/dist/document-tools/environment.js +136 -0
  387. package/dist/document-tools/environment.js.map +7 -0
  388. package/dist/document-tools/file-shares.js +112 -0
  389. package/dist/document-tools/file-shares.js.map +7 -0
  390. package/dist/document-tools/frozen-copy.js +27 -0
  391. package/dist/document-tools/frozen-copy.js.map +7 -0
  392. package/dist/document-tools/index.cjs +80 -80
  393. package/dist/document-tools/index.js +26 -148
  394. package/dist/document-tools/index.js.map +7 -1
  395. package/dist/document-tools/markup-download.js +51 -0
  396. package/dist/document-tools/markup-download.js.map +7 -0
  397. package/dist/document-tools/markup-store.js +138 -0
  398. package/dist/document-tools/markup-store.js.map +7 -0
  399. package/dist/document-tools/markup-transfer.js +88 -0
  400. package/dist/document-tools/markup-transfer.js.map +7 -0
  401. package/dist/document-tools/production.js +147 -0
  402. package/dist/document-tools/production.js.map +7 -0
  403. package/dist/document-tools/saved-signature.js +90 -0
  404. package/dist/document-tools/saved-signature.js.map +7 -0
  405. package/dist/document-tools/signature-requests.js +310 -0
  406. package/dist/document-tools/signature-requests.js.map +7 -0
  407. package/dist/document-tools/signing.js +127 -0
  408. package/dist/document-tools/signing.js.map +7 -0
  409. package/dist/document-tools/useDocumentBytes.js +38 -0
  410. package/dist/document-tools/useDocumentBytes.js.map +7 -0
  411. package/dist/document-tools/useDocumentMarkup.js +154 -0
  412. package/dist/document-tools/useDocumentMarkup.js.map +7 -0
  413. package/dist/document-tools/useIsOnline.js +13 -0
  414. package/dist/document-tools/useIsOnline.js.map +7 -0
  415. package/dist/document-tools/verification.js +60 -0
  416. package/dist/document-tools/verification.js.map +7 -0
  417. package/dist/documents/DocumentReview.js +220 -0
  418. package/dist/documents/DocumentReview.js.map +7 -0
  419. package/dist/documents/DraftTitleControls.js +41 -0
  420. package/dist/documents/DraftTitleControls.js.map +7 -0
  421. package/dist/documents/InlineMicButton.js +90 -0
  422. package/dist/documents/InlineMicButton.js.map +7 -0
  423. package/dist/documents/MicRecordingOverlay.js +29 -0
  424. package/dist/documents/MicRecordingOverlay.js.map +7 -0
  425. package/dist/documents/MicWaveformIndicator.js +68 -0
  426. package/dist/documents/MicWaveformIndicator.js.map +7 -0
  427. package/dist/documents/PhotoCapture.js +120 -0
  428. package/dist/documents/PhotoCapture.js.map +7 -0
  429. package/dist/documents/VideoCapture.js +129 -0
  430. package/dist/documents/VideoCapture.js.map +7 -0
  431. package/dist/documents/VoiceNoteRecorder.js +166 -0
  432. package/dist/documents/VoiceNoteRecorder.js.map +7 -0
  433. package/dist/documents/audio-segmenter.js +63 -0
  434. package/dist/documents/audio-segmenter.js.map +7 -0
  435. package/dist/documents/capture-frame.js +21 -0
  436. package/dist/documents/capture-frame.js.map +7 -0
  437. package/dist/documents/chunked-recorder.js +190 -0
  438. package/dist/documents/chunked-recorder.js.map +7 -0
  439. package/dist/documents/document-download.js +53 -0
  440. package/dist/documents/document-download.js.map +7 -0
  441. package/dist/documents/document-fields.js +109 -0
  442. package/dist/documents/document-fields.js.map +7 -0
  443. package/dist/documents/documents-cache.js +110 -0
  444. package/dist/documents/documents-cache.js.map +7 -0
  445. package/dist/documents/documents-data.js +128 -0
  446. package/dist/documents/documents-data.js.map +7 -0
  447. package/dist/documents/documents-loader.js +113 -0
  448. package/dist/documents/documents-loader.js.map +7 -0
  449. package/dist/documents/documents-writes.js +448 -0
  450. package/dist/documents/documents-writes.js.map +7 -0
  451. package/dist/documents/format-elapsed.js +10 -0
  452. package/dist/documents/format-elapsed.js.map +7 -0
  453. package/dist/documents/has-video-track.js +26 -0
  454. package/dist/documents/has-video-track.js.map +7 -0
  455. package/dist/documents/index.js +266 -0
  456. package/dist/documents/index.js.map +7 -0
  457. package/dist/documents/media-error.js +18 -0
  458. package/dist/documents/media-error.js.map +7 -0
  459. package/dist/documents/offline-documents.js +160 -0
  460. package/dist/documents/offline-documents.js.map +7 -0
  461. package/dist/documents/pending-sync.js +210 -0
  462. package/dist/documents/pending-sync.js.map +7 -0
  463. package/dist/documents/processing-live.js +122 -0
  464. package/dist/documents/processing-live.js.map +7 -0
  465. package/dist/documents/processing-order.js +59 -0
  466. package/dist/documents/processing-order.js.map +7 -0
  467. package/dist/documents/processing-settle.js +21 -0
  468. package/dist/documents/processing-settle.js.map +7 -0
  469. package/dist/documents/related-documents.js +133 -0
  470. package/dist/documents/related-documents.js.map +7 -0
  471. package/dist/documents/support.js +29 -0
  472. package/dist/documents/support.js.map +7 -0
  473. package/dist/documents/upload-files.js +169 -0
  474. package/dist/documents/upload-files.js.map +7 -0
  475. package/dist/documents/useAudioRecorder.js +315 -0
  476. package/dist/documents/useAudioRecorder.js.map +7 -0
  477. package/dist/documents/useCameraStream.js +35 -0
  478. package/dist/documents/useCameraStream.js.map +7 -0
  479. package/dist/documents/useDocumentThumbnails.js +71 -0
  480. package/dist/documents/useDocumentThumbnails.js.map +7 -0
  481. package/dist/documents/useDownloadDocuments.js +90 -0
  482. package/dist/documents/useDownloadDocuments.js.map +7 -0
  483. package/dist/documents/usePassageQuotes.js +37 -0
  484. package/dist/documents/usePassageQuotes.js.map +7 -0
  485. package/dist/documents/useUploadFiles.js +165 -0
  486. package/dist/documents/useUploadFiles.js.map +7 -0
  487. package/dist/documents/useUploadFromUrls.js +63 -0
  488. package/dist/documents/useUploadFromUrls.js.map +7 -0
  489. package/dist/documents/useVideoRecorder.js +62 -0
  490. package/dist/documents/useVideoRecorder.js.map +7 -0
  491. package/dist/entities/AgentMarkers.js +61 -0
  492. package/dist/entities/AgentMarkers.js.map +7 -0
  493. package/dist/entities/DocumentEntity.js +125 -0
  494. package/dist/entities/DocumentEntity.js.map +7 -0
  495. package/dist/entities/EntityPill.js +250 -0
  496. package/dist/entities/EntityPill.js.map +7 -0
  497. package/dist/entities/ProjectEntity.js +61 -0
  498. package/dist/entities/ProjectEntity.js.map +7 -0
  499. package/dist/entities/ShieldIcon.js +49 -0
  500. package/dist/entities/ShieldIcon.js.map +7 -0
  501. package/dist/entities/TagEntity.js +79 -0
  502. package/dist/entities/TagEntity.js.map +7 -0
  503. package/dist/entities/ThreadVisibilityIcon.js +15 -0
  504. package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
  505. package/dist/entities/UserEntity.js +211 -0
  506. package/dist/entities/UserEntity.js.map +7 -0
  507. package/dist/entities/VerifiedBadge.js +19 -0
  508. package/dist/entities/VerifiedBadge.js.map +7 -0
  509. package/dist/entities/agent-avatar-colors.js +26 -0
  510. package/dist/entities/agent-avatar-colors.js.map +7 -0
  511. package/dist/entities/colors.js +64 -0
  512. package/dist/entities/colors.js.map +7 -0
  513. package/dist/entities/file-type.js +151 -0
  514. package/dist/entities/file-type.js.map +7 -0
  515. package/dist/entities/index.js +100 -0
  516. package/dist/entities/index.js.map +7 -0
  517. package/dist/entities/media-type.js +61 -0
  518. package/dist/entities/media-type.js.map +7 -0
  519. package/dist/entities/registry.js +385 -0
  520. package/dist/entities/registry.js.map +7 -0
  521. package/dist/entities/status.js +43 -0
  522. package/dist/entities/status.js.map +7 -0
  523. package/dist/entities/tag-kinds.js +23 -0
  524. package/dist/entities/tag-kinds.js.map +7 -0
  525. package/dist/entities/tag-types.js +44 -0
  526. package/dist/entities/tag-types.js.map +7 -0
  527. package/dist/entities/vocabulary.js +12 -0
  528. package/dist/entities/vocabulary.js.map +7 -0
  529. package/dist/entity-extraction.js +25 -0
  530. package/dist/entity-extraction.js.map +7 -0
  531. package/dist/facts-search.js +57 -0
  532. package/dist/facts-search.js.map +7 -0
  533. package/dist/facts.js +69 -0
  534. package/dist/facts.js.map +7 -0
  535. package/dist/hooks.js +320 -0
  536. package/dist/hooks.js.map +7 -0
  537. package/dist/host/ArbiHost.js +24 -0
  538. package/dist/host/ArbiHost.js.map +7 -0
  539. package/dist/host/assistant-copy.js +54 -0
  540. package/dist/host/assistant-copy.js.map +7 -0
  541. package/dist/host/config.js +9 -0
  542. package/dist/host/config.js.map +7 -0
  543. package/dist/host/context.js +10 -0
  544. package/dist/host/context.js.map +7 -0
  545. package/dist/host/features.js +144 -0
  546. package/dist/host/features.js.map +7 -0
  547. package/dist/host/index.js +12 -0
  548. package/dist/host/index.js.map +7 -0
  549. package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
  550. package/dist/host/merge.js.map +7 -0
  551. package/dist/house-template.js +40 -0
  552. package/dist/house-template.js.map +7 -0
  553. package/dist/icons/AppleIcon.js +25 -0
  554. package/dist/icons/AppleIcon.js.map +7 -0
  555. package/dist/icons/ArbiBotHeadIcon.js +46 -0
  556. package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
  557. package/dist/icons/ArbiIcon.js +24 -0
  558. package/dist/icons/ArbiIcon.js.map +7 -0
  559. package/dist/icons/AudIcon.js +56 -0
  560. package/dist/icons/AudIcon.js.map +7 -0
  561. package/dist/icons/ClaudeIcon.js +28 -0
  562. package/dist/icons/ClaudeIcon.js.map +7 -0
  563. package/dist/icons/DocIcon.js +56 -0
  564. package/dist/icons/DocIcon.js.map +7 -0
  565. package/dist/icons/EmlIcon.js +57 -0
  566. package/dist/icons/EmlIcon.js.map +7 -0
  567. package/dist/icons/FireworksIcon.js +47 -0
  568. package/dist/icons/FireworksIcon.js.map +7 -0
  569. package/dist/icons/GeminiIcon.js +37 -0
  570. package/dist/icons/GeminiIcon.js.map +7 -0
  571. package/dist/icons/GitHubIcon.js +32 -0
  572. package/dist/icons/GitHubIcon.js.map +7 -0
  573. package/dist/icons/GoogleIcon.js +53 -0
  574. package/dist/icons/GoogleIcon.js.map +7 -0
  575. package/dist/icons/HtmlIcon.js +56 -0
  576. package/dist/icons/HtmlIcon.js.map +7 -0
  577. package/dist/icons/ImgIcon.js +56 -0
  578. package/dist/icons/ImgIcon.js.map +7 -0
  579. package/dist/icons/LinkedInIcon.js +25 -0
  580. package/dist/icons/LinkedInIcon.js.map +7 -0
  581. package/dist/icons/OpenAIIcon.js +28 -0
  582. package/dist/icons/OpenAIIcon.js.map +7 -0
  583. package/dist/icons/PdfIcon.js +56 -0
  584. package/dist/icons/PdfIcon.js.map +7 -0
  585. package/dist/icons/ProviderIcon.js +42 -0
  586. package/dist/icons/ProviderIcon.js.map +7 -0
  587. package/dist/icons/TxtIcon.js +56 -0
  588. package/dist/icons/TxtIcon.js.map +7 -0
  589. package/dist/icons/VidIcon.js +56 -0
  590. package/dist/icons/VidIcon.js.map +7 -0
  591. package/dist/icons/XlsIcon.js +56 -0
  592. package/dist/icons/XlsIcon.js.map +7 -0
  593. package/dist/icons/arbi-mark.js +5 -0
  594. package/dist/icons/arbi-mark.js.map +7 -0
  595. package/dist/icons/colors.js +31 -0
  596. package/dist/icons/colors.js.map +7 -0
  597. package/dist/icons/file-type.js +105 -0
  598. package/dist/icons/file-type.js.map +7 -0
  599. package/dist/icons/index.js +55 -0
  600. package/dist/icons/index.js.map +7 -0
  601. package/dist/imagecrop/ImageCropModal.js +56 -0
  602. package/dist/imagecrop/ImageCropModal.js.map +7 -0
  603. package/dist/imagecrop/ImageCropper.js +100 -0
  604. package/dist/imagecrop/ImageCropper.js.map +7 -0
  605. package/dist/imagecrop/cropImage.js +43 -0
  606. package/dist/imagecrop/cropImage.js.map +7 -0
  607. package/dist/imagecrop/index.js +13 -0
  608. package/dist/imagecrop/index.js.map +7 -0
  609. package/dist/index.cjs +282 -282
  610. package/dist/index.js +702 -17116
  611. package/dist/index.js.map +7 -1
  612. package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
  613. package/dist/lazy-chunk.js.map +7 -0
  614. package/dist/lib/collision-padding.js +13 -0
  615. package/dist/lib/collision-padding.js.map +7 -0
  616. package/dist/lib/format-friendly-date.js +55 -0
  617. package/dist/lib/format-friendly-date.js.map +7 -0
  618. package/dist/lib/format-relative-time.js +52 -0
  619. package/dist/lib/format-relative-time.js.map +7 -0
  620. package/dist/lib/markdown-to-text.js +35 -0
  621. package/dist/lib/markdown-to-text.js.map +7 -0
  622. package/dist/lib/toast-interaction.js +9 -0
  623. package/dist/lib/toast-interaction.js.map +7 -0
  624. package/dist/lib/utils.js +9 -0
  625. package/dist/lib/utils.js.map +7 -0
  626. package/dist/mail/client.js +103 -0
  627. package/dist/mail/client.js.map +7 -0
  628. package/dist/mail/document-attachment.js +38 -0
  629. package/dist/mail/document-attachment.js.map +7 -0
  630. package/dist/mail/filing.js +132 -0
  631. package/dist/mail/filing.js.map +7 -0
  632. package/dist/mail/hooks.js +393 -0
  633. package/dist/mail/hooks.js.map +7 -0
  634. package/dist/mail/index.js +120 -0
  635. package/dist/mail/index.js.map +7 -0
  636. package/dist/mail/offline/changes.js +258 -0
  637. package/dist/mail/offline/changes.js.map +7 -0
  638. package/dist/mail/offline/confirm-sign-out.js +37 -0
  639. package/dist/mail/offline/confirm-sign-out.js.map +7 -0
  640. package/dist/mail/offline/crypto.js +26 -0
  641. package/dist/mail/offline/crypto.js.map +7 -0
  642. package/dist/mail/offline/drafts.js +69 -0
  643. package/dist/mail/offline/drafts.js.map +7 -0
  644. package/dist/mail/offline/hooks.js +104 -0
  645. package/dist/mail/offline/hooks.js.map +7 -0
  646. package/dist/mail/offline/index.js +48 -0
  647. package/dist/mail/offline/index.js.map +7 -0
  648. package/dist/mail/offline/live.js +233 -0
  649. package/dist/mail/offline/live.js.map +7 -0
  650. package/dist/mail/offline/mailbox.js +191 -0
  651. package/dist/mail/offline/mailbox.js.map +7 -0
  652. package/dist/mail/offline/outbox.js +167 -0
  653. package/dist/mail/offline/outbox.js.map +7 -0
  654. package/dist/mail/offline/reads.js +159 -0
  655. package/dist/mail/offline/reads.js.map +7 -0
  656. package/dist/mail/offline/runtime.js +100 -0
  657. package/dist/mail/offline/runtime.js.map +7 -0
  658. package/dist/mail/offline/settings.js +84 -0
  659. package/dist/mail/offline/settings.js.map +7 -0
  660. package/dist/mail/offline/store.js +29 -0
  661. package/dist/mail/offline/store.js.map +7 -0
  662. package/dist/mail/offline/sync.js +251 -0
  663. package/dist/mail/offline/sync.js.map +7 -0
  664. package/dist/mail/offline/wipe.js +19 -0
  665. package/dist/mail/offline/wipe.js.map +7 -0
  666. package/dist/mail/thread-keys.js +53 -0
  667. package/dist/mail/thread-keys.js.map +7 -0
  668. package/dist/mail/threads.js +71 -0
  669. package/dist/mail/threads.js.map +7 -0
  670. package/dist/mail/useMailClient.js +42 -0
  671. package/dist/mail/useMailClient.js.map +7 -0
  672. package/dist/model-connections.js +58 -0
  673. package/dist/model-connections.js.map +7 -0
  674. package/dist/notifications/ActivityFeed.js +70 -0
  675. package/dist/notifications/ActivityFeed.js.map +7 -0
  676. package/dist/notifications/NotificationBell.js +200 -0
  677. package/dist/notifications/NotificationBell.js.map +7 -0
  678. package/dist/notifications/Toaster.js +24 -0
  679. package/dist/notifications/Toaster.js.map +7 -0
  680. package/dist/notifications/activity-types.js +65 -0
  681. package/dist/notifications/activity-types.js.map +7 -0
  682. package/dist/notifications/bell.js +24 -0
  683. package/dist/notifications/bell.js.map +7 -0
  684. package/dist/notifications/calendar-notifications.js +79 -0
  685. package/dist/notifications/calendar-notifications.js.map +7 -0
  686. package/dist/notifications/index.js +108 -0
  687. package/dist/notifications/index.js.map +7 -0
  688. package/dist/notifications/live.js +28 -0
  689. package/dist/notifications/live.js.map +7 -0
  690. package/dist/notifications/notification-types.js +127 -0
  691. package/dist/notifications/notification-types.js.map +7 -0
  692. package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
  693. package/dist/notifications/notify-store.js.map +7 -0
  694. package/dist/notifications/server-notifications.js +452 -0
  695. package/dist/notifications/server-notifications.js.map +7 -0
  696. package/dist/notifications/useNotifications.js +34 -0
  697. package/dist/notifications/useNotifications.js.map +7 -0
  698. package/dist/offline-store/network.js +11 -0
  699. package/dist/offline-store/network.js.map +7 -0
  700. package/dist/offline-store/store.js +136 -0
  701. package/dist/offline-store/store.js.map +7 -0
  702. package/dist/offline-store/wipe.js +8 -0
  703. package/dist/offline-store/wipe.js.map +7 -0
  704. package/dist/offline.js +58 -0
  705. package/dist/offline.js.map +7 -0
  706. package/dist/people.js +122 -0
  707. package/dist/people.js.map +7 -0
  708. package/dist/projects.js +30 -0
  709. package/dist/projects.js.map +7 -0
  710. package/dist/query-client.js +63 -0
  711. package/dist/query-client.js.map +7 -0
  712. package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
  713. package/dist/query-keys.js.map +7 -0
  714. package/dist/query-persist.js +66 -0
  715. package/dist/query-persist.js.map +7 -0
  716. package/dist/queued-writes.js +59 -0
  717. package/dist/queued-writes.js.map +7 -0
  718. package/dist/remote-control.js +67 -0
  719. package/dist/remote-control.js.map +7 -0
  720. package/dist/search/index.js +23 -0
  721. package/dist/search/index.js.map +7 -0
  722. package/dist/search/session.js +58 -0
  723. package/dist/search/session.js.map +7 -0
  724. package/dist/search/useSemanticSearch.js +82 -0
  725. package/dist/search/useSemanticSearch.js.map +7 -0
  726. package/dist/session/chat.js +512 -0
  727. package/dist/session/chat.js.map +7 -0
  728. package/dist/session/documents.js +196 -0
  729. package/dist/session/documents.js.map +7 -0
  730. package/dist/session/drafts.js +103 -0
  731. package/dist/session/drafts.js.map +7 -0
  732. package/dist/session/index.js +123 -0
  733. package/dist/session/index.js.map +7 -0
  734. package/dist/session/layout.js +339 -0
  735. package/dist/session/layout.js.map +7 -0
  736. package/dist/session/persist.js +106 -0
  737. package/dist/session/persist.js.map +7 -0
  738. package/dist/session/session-hooks.js +53 -0
  739. package/dist/session/session-hooks.js.map +7 -0
  740. package/dist/session/signed-in.js +36 -0
  741. package/dist/session/signed-in.js.map +7 -0
  742. package/dist/session/store.js +166 -0
  743. package/dist/session/store.js.map +7 -0
  744. package/dist/session/thread-tabs.js +121 -0
  745. package/dist/session/thread-tabs.js.map +7 -0
  746. package/dist/session/ui-state-storage.js +76 -0
  747. package/dist/session/ui-state-storage.js.map +7 -0
  748. package/dist/session/workspace.js +77 -0
  749. package/dist/session/workspace.js.map +7 -0
  750. package/dist/shell/index.cjs +37 -37
  751. package/dist/shell/index.js +43 -10
  752. package/dist/shell/index.js.map +7 -1
  753. package/dist/skill-pack.js +111 -0
  754. package/dist/skill-pack.js.map +7 -0
  755. package/dist/storage.js +186 -0
  756. package/dist/storage.js.map +7 -0
  757. package/dist/support/index.js +35 -0
  758. package/dist/support/index.js.map +7 -0
  759. package/dist/tags.js +204 -0
  760. package/dist/tags.js.map +7 -0
  761. package/dist/ui/DebouncedInput.js +109 -0
  762. package/dist/ui/DebouncedInput.js.map +7 -0
  763. package/dist/ui/DictateContext.js +8 -0
  764. package/dist/ui/DictateContext.js.map +7 -0
  765. package/dist/ui/IconToggle.js +79 -0
  766. package/dist/ui/IconToggle.js.map +7 -0
  767. package/dist/ui/VerifiedToggle.js +38 -0
  768. package/dist/ui/VerifiedToggle.js.map +7 -0
  769. package/dist/ui/VisibilityToggle.js +103 -0
  770. package/dist/ui/VisibilityToggle.js.map +7 -0
  771. package/dist/ui/avatar.js +40 -0
  772. package/dist/ui/avatar.js.map +7 -0
  773. package/dist/ui/badge.js +28 -0
  774. package/dist/ui/badge.js.map +7 -0
  775. package/dist/ui/button.js +48 -0
  776. package/dist/ui/button.js.map +7 -0
  777. package/dist/ui/card.js +90 -0
  778. package/dist/ui/card.js.map +7 -0
  779. package/dist/ui/checkbox.js +22 -0
  780. package/dist/ui/checkbox.js.map +7 -0
  781. package/dist/ui/collapsible.js +10 -0
  782. package/dist/ui/collapsible.js.map +7 -0
  783. package/dist/ui/command.js +103 -0
  784. package/dist/ui/command.js.map +7 -0
  785. package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
  786. package/dist/ui/dialog.js.map +7 -0
  787. package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
  788. package/dist/ui/dropdown-menu.js.map +7 -0
  789. package/dist/ui/hover-card.js +36 -0
  790. package/dist/ui/hover-card.js.map +7 -0
  791. package/dist/ui/index.cjs +154 -154
  792. package/dist/ui/index.js +290 -10
  793. package/dist/ui/index.js.map +7 -1
  794. package/dist/ui/input.js +65 -0
  795. package/dist/ui/input.js.map +7 -0
  796. package/dist/ui/label.js +16 -0
  797. package/dist/ui/label.js.map +7 -0
  798. package/dist/ui/mark-menu.js +300 -0
  799. package/dist/ui/mark-menu.js.map +7 -0
  800. package/dist/ui/popover.js +40 -0
  801. package/dist/ui/popover.js.map +7 -0
  802. package/dist/ui/portal-container.js +17 -0
  803. package/dist/ui/portal-container.js.map +7 -0
  804. package/dist/ui/progress.js +24 -0
  805. package/dist/ui/progress.js.map +7 -0
  806. package/dist/ui/radio-group.js +29 -0
  807. package/dist/ui/radio-group.js.map +7 -0
  808. package/dist/ui/scroll-area.js +39 -0
  809. package/dist/ui/scroll-area.js.map +7 -0
  810. package/dist/ui/select.js +130 -0
  811. package/dist/ui/select.js.map +7 -0
  812. package/dist/ui/separator.js +23 -0
  813. package/dist/ui/separator.js.map +7 -0
  814. package/dist/ui/slider.js +23 -0
  815. package/dist/ui/slider.js.map +7 -0
  816. package/dist/ui/switch.js +28 -0
  817. package/dist/ui/switch.js.map +7 -0
  818. package/dist/ui/table.js +75 -0
  819. package/dist/ui/table.js.map +7 -0
  820. package/dist/ui/tabs.js +48 -0
  821. package/dist/ui/tabs.js.map +7 -0
  822. package/dist/ui/textarea.js +63 -0
  823. package/dist/ui/textarea.js.map +7 -0
  824. package/dist/ui/toggle-group.js +43 -0
  825. package/dist/ui/toggle-group.js.map +7 -0
  826. package/dist/ui/toggle.js +40 -0
  827. package/dist/ui/toggle.js.map +7 -0
  828. package/dist/ui/tooltip.js +215 -0
  829. package/dist/ui/tooltip.js.map +7 -0
  830. package/dist/usage-metered.js +8 -0
  831. package/dist/usage-metered.js.map +7 -0
  832. package/dist/useArbi.js +16 -0
  833. package/dist/useArbi.js.map +7 -0
  834. package/dist/useInstallSkillPack.js +81 -0
  835. package/dist/useInstallSkillPack.js.map +7 -0
  836. package/dist/usermenu/UserMenu.js +188 -0
  837. package/dist/usermenu/UserMenu.js.map +7 -0
  838. package/dist/usermenu/index.js +5 -0
  839. package/dist/usermenu/index.js.map +7 -0
  840. package/dist/users/index.js +15 -0
  841. package/dist/users/index.js.map +7 -0
  842. package/dist/users/user-display.js +60 -0
  843. package/dist/users/user-display.js.map +7 -0
  844. package/dist/viewers/AudioViewer.js +23 -0
  845. package/dist/viewers/AudioViewer.js.map +7 -0
  846. package/dist/viewers/DocxViewer.js +81 -0
  847. package/dist/viewers/DocxViewer.js.map +7 -0
  848. package/dist/viewers/ImageViewer.js +31 -0
  849. package/dist/viewers/ImageViewer.js.map +7 -0
  850. package/dist/viewers/PdfViewer.js +19 -3
  851. package/dist/viewers/PdfViewer.js.map +7 -1
  852. package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
  853. package/dist/viewers/PdfViewerImpl.js.map +7 -0
  854. package/dist/viewers/VideoViewer.js +31 -0
  855. package/dist/viewers/VideoViewer.js.map +7 -0
  856. package/dist/viewers/XlsxViewer.js +102 -0
  857. package/dist/viewers/XlsxViewer.js.map +7 -0
  858. package/dist/viewers/index.js +61 -271
  859. package/dist/viewers/index.js.map +7 -1
  860. package/dist/viewers/page-scroll.js +59 -0
  861. package/dist/viewers/page-scroll.js.map +7 -0
  862. package/dist/viewers/pdf-viewer-constants.js +9 -0
  863. package/dist/viewers/pdf-viewer-constants.js.map +7 -0
  864. package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
  865. package/dist/viewers/pdfjs-polyfills.js.map +7 -0
  866. package/dist/viewers/selection-runs.js +38 -0
  867. package/dist/viewers/selection-runs.js.map +7 -0
  868. package/dist/viewers/usePageIntersectionObserver.js +68 -0
  869. package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
  870. package/dist/viewers/useProcessedChunks.js +58 -0
  871. package/dist/viewers/useProcessedChunks.js.map +7 -0
  872. package/dist/viewers/viewer-zoom.js +163 -0
  873. package/dist/viewers/viewer-zoom.js.map +7 -0
  874. package/dist/websocket/ArbiWebSocketProvider.js +207 -0
  875. package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
  876. package/dist/websocket/context.js +14 -0
  877. package/dist/websocket/context.js.map +7 -0
  878. package/dist/websocket/hooks.js +30 -0
  879. package/dist/websocket/hooks.js.map +7 -0
  880. package/dist/websocket/index.js +22 -0
  881. package/dist/websocket/index.js.map +7 -0
  882. package/dist/websocket/live-updates.js +38 -0
  883. package/dist/websocket/live-updates.js.map +7 -0
  884. package/dist/websocket/reconnect.js +13 -0
  885. package/dist/websocket/reconnect.js.map +7 -0
  886. package/dist/websocket/store.js +58 -0
  887. package/dist/websocket/store.js.map +7 -0
  888. package/dist/workforce.js +607 -0
  889. package/dist/workforce.js.map +7 -0
  890. package/dist/workspaces/access-request.js +35 -0
  891. package/dist/workspaces/access-request.js.map +7 -0
  892. package/dist/workspaces/archive.js +59 -0
  893. package/dist/workspaces/archive.js.map +7 -0
  894. package/dist/workspaces/current.js +20 -0
  895. package/dist/workspaces/current.js.map +7 -0
  896. package/dist/workspaces/delete-workspaces.js +15 -0
  897. package/dist/workspaces/delete-workspaces.js.map +7 -0
  898. package/dist/workspaces/export-archive.js +40 -0
  899. package/dist/workspaces/export-archive.js.map +7 -0
  900. package/dist/workspaces/index.js +99 -0
  901. package/dist/workspaces/index.js.map +7 -0
  902. package/dist/workspaces/settings.js +45 -0
  903. package/dist/workspaces/settings.js.map +7 -0
  904. package/dist/workspaces/shell-workspaces.js +49 -0
  905. package/dist/workspaces/shell-workspaces.js.map +7 -0
  906. package/dist/workspaces/switch.js +234 -0
  907. package/dist/workspaces/switch.js.map +7 -0
  908. package/dist/workspaces/transfer.js +170 -0
  909. package/dist/workspaces/transfer.js.map +7 -0
  910. package/dist/workspaces/useShellWorkspaces.js +86 -0
  911. package/dist/workspaces/useShellWorkspaces.js.map +7 -0
  912. package/dist/workspaces/workspace-users.js +65 -0
  913. package/dist/workspaces/workspace-users.js.map +7 -0
  914. package/package.json +4 -4
  915. package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
  916. package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
  917. package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
  918. package/dist/annotations/freeze/index.d.cts +0 -205
  919. package/dist/annotations/index.d.cts +0 -360
  920. package/dist/artifacts/index.d.cts +0 -476
  921. package/dist/artifacts/redline-core.d.cts +0 -39
  922. package/dist/bundle-YNOX7VIL.js +0 -5
  923. package/dist/bundle-YNOX7VIL.js.map +0 -1
  924. package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
  925. package/dist/calls/livekit/index.d.cts +0 -280
  926. package/dist/chunk-47CCGUWR.js.map +0 -1
  927. package/dist/chunk-4FL3X3LA.js +0 -2057
  928. package/dist/chunk-4FL3X3LA.js.map +0 -1
  929. package/dist/chunk-6QNBSXCE.js +0 -271
  930. package/dist/chunk-6QNBSXCE.js.map +0 -1
  931. package/dist/chunk-74N436VK.js.map +0 -1
  932. package/dist/chunk-APZZQZ6P.js +0 -147
  933. package/dist/chunk-APZZQZ6P.js.map +0 -1
  934. package/dist/chunk-BF5KW5ZI.js.map +0 -1
  935. package/dist/chunk-DPYBZDJB.js.map +0 -1
  936. package/dist/chunk-DZKRL5H3.js +0 -2766
  937. package/dist/chunk-DZKRL5H3.js.map +0 -1
  938. package/dist/chunk-HDCRPPBW.js +0 -75
  939. package/dist/chunk-HDCRPPBW.js.map +0 -1
  940. package/dist/chunk-L2IPPTVC.js +0 -20
  941. package/dist/chunk-L2IPPTVC.js.map +0 -1
  942. package/dist/chunk-LSU4UPS5.js +0 -1011
  943. package/dist/chunk-LSU4UPS5.js.map +0 -1
  944. package/dist/chunk-NIKPG4PW.js +0 -1128
  945. package/dist/chunk-NIKPG4PW.js.map +0 -1
  946. package/dist/chunk-NNAJLY6B.js +0 -4974
  947. package/dist/chunk-NNAJLY6B.js.map +0 -1
  948. package/dist/chunk-OYPKKHXY.js +0 -559
  949. package/dist/chunk-OYPKKHXY.js.map +0 -1
  950. package/dist/chunk-PTOP7OHG.js.map +0 -1
  951. package/dist/chunk-QMY2JKBI.js +0 -246
  952. package/dist/chunk-QMY2JKBI.js.map +0 -1
  953. package/dist/chunk-SN5YV6FF.js +0 -11
  954. package/dist/chunk-SN5YV6FF.js.map +0 -1
  955. package/dist/chunk-SSXFVWCT.js.map +0 -1
  956. package/dist/chunk-T3USOSVN.js.map +0 -1
  957. package/dist/chunk-T4CLW3DN.js +0 -2560
  958. package/dist/chunk-T4CLW3DN.js.map +0 -1
  959. package/dist/chunk-UW2SGTI5.js.map +0 -1
  960. package/dist/chunk-VSCU7K4V.js.map +0 -1
  961. package/dist/chunk-WL2Y2T47.js.map +0 -1
  962. package/dist/chunk-WUTL62MC.js.map +0 -1
  963. package/dist/chunk-XWPLOFDN.js +0 -644
  964. package/dist/chunk-XWPLOFDN.js.map +0 -1
  965. package/dist/chunk-Y3MTRA7D.js +0 -97
  966. package/dist/chunk-Y3MTRA7D.js.map +0 -1
  967. package/dist/chunk-YNNAJJ5Z.js.map +0 -1
  968. package/dist/chunk-ZM6N7YZH.js.map +0 -1
  969. package/dist/document-tools/core.d.cts +0 -883
  970. package/dist/document-tools/index.d.cts +0 -90
  971. package/dist/index.d-LArLnpI8.d.cts +0 -2036
  972. package/dist/index.d-oR5FKZpJ.d.cts +0 -579
  973. package/dist/index.d.cts +0 -15923
  974. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
  975. package/dist/model.d-CNtRWKVK.d.cts +0 -110
  976. package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
  977. package/dist/shell/index.d.cts +0 -6
  978. package/dist/store.d-GADDvC7w.d.cts +0 -35
  979. package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
  980. package/dist/ui/index.d.cts +0 -26
  981. package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
  982. package/dist/viewers/PdfViewer.d.cts +0 -9
  983. package/dist/viewers/index.d.cts +0 -262
@@ -0,0 +1,166 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { Mic, Pause, Play, Square, Trash2, Check, Loader2, RotateCcw } from "lucide-react";
4
+ import { Button } from "../ui/button.js";
5
+ import { AudioViewer } from "../viewers/AudioViewer.js";
6
+ import { useAudioRecorder } from "./useAudioRecorder.js";
7
+ import { MicWaveformIndicator } from "./MicWaveformIndicator.js";
8
+ function VoiceNoteRecorder({
9
+ onSave,
10
+ onDiscard,
11
+ onError,
12
+ title = "Voice Memo",
13
+ isSaving = false,
14
+ transcribe
15
+ }) {
16
+ const recorder = useAudioRecorder();
17
+ const [transcript, setTranscript] = useState(null);
18
+ const [isTranscribing, setIsTranscribing] = useState(false);
19
+ useEffect(() => {
20
+ if (recorder.error) onError?.(recorder.error);
21
+ }, [recorder.error]);
22
+ useEffect(() => {
23
+ if (recorder.state !== "stopped" || !recorder.blob) {
24
+ setTranscript(null);
25
+ setIsTranscribing(false);
26
+ return;
27
+ }
28
+ if (!transcribe) return;
29
+ let cancelled = false;
30
+ setIsTranscribing(true);
31
+ transcribe(recorder.blob).then((text) => {
32
+ if (!cancelled) setTranscript(text);
33
+ }).catch(() => {
34
+ }).finally(() => {
35
+ if (!cancelled) setIsTranscribing(false);
36
+ });
37
+ return () => {
38
+ cancelled = true;
39
+ };
40
+ }, [recorder.state, recorder.blob]);
41
+ const handleSave = () => {
42
+ if (!recorder.blob) return;
43
+ void onSave(recorder.blob, recorder.mimeType);
44
+ };
45
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-6 p-8", children: [
46
+ recorder.state === "idle" && /* @__PURE__ */ jsxs(Fragment, { children: [
47
+ /* @__PURE__ */ jsx(
48
+ Button,
49
+ {
50
+ type: "button",
51
+ size: "lg",
52
+ className: "h-16 w-16 rounded-full p-0",
53
+ onClick: () => void recorder.start(),
54
+ "data-testid": "voice-note-record-button",
55
+ children: /* @__PURE__ */ jsx(Mic, { className: "h-6 w-6" })
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Press to start recording" })
59
+ ] }),
60
+ (recorder.state === "recording" || recorder.state === "paused") && /* @__PURE__ */ jsxs(Fragment, { children: [
61
+ /* @__PURE__ */ jsx(
62
+ MicWaveformIndicator,
63
+ {
64
+ level: recorder.level,
65
+ elapsedMs: recorder.elapsedMs,
66
+ paused: recorder.state === "paused"
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
70
+ recorder.state === "recording" ? /* @__PURE__ */ jsxs(
71
+ Button,
72
+ {
73
+ type: "button",
74
+ variant: "outline",
75
+ onClick: recorder.pause,
76
+ "data-testid": "voice-note-pause-button",
77
+ children: [
78
+ /* @__PURE__ */ jsx(Pause, { className: "mr-1.5 h-4 w-4" }),
79
+ "Pause"
80
+ ]
81
+ }
82
+ ) : /* @__PURE__ */ jsxs(
83
+ Button,
84
+ {
85
+ type: "button",
86
+ variant: "outline",
87
+ onClick: recorder.resume,
88
+ "data-testid": "voice-note-resume-button",
89
+ children: [
90
+ /* @__PURE__ */ jsx(Play, { className: "mr-1.5 h-4 w-4" }),
91
+ "Resume"
92
+ ]
93
+ }
94
+ ),
95
+ /* @__PURE__ */ jsxs(Button, { type: "button", onClick: recorder.stop, "data-testid": "voice-note-stop-button", children: [
96
+ /* @__PURE__ */ jsx(Square, { className: "mr-1.5 h-3.5 w-3.5 fill-current" }),
97
+ "Stop"
98
+ ] })
99
+ ] })
100
+ ] }),
101
+ recorder.state === "stopped" && recorder.blob && /* @__PURE__ */ jsxs(Fragment, { children: [
102
+ /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(AudioViewer, { blob: recorder.blob, title }) }),
103
+ (isTranscribing || transcript) && /* @__PURE__ */ jsx(
104
+ "div",
105
+ {
106
+ className: "w-full max-w-md rounded-md border border-border bg-muted/30 p-3 text-sm text-muted-foreground",
107
+ "data-testid": "voice-note-rough-transcript",
108
+ children: isTranscribing ? /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
109
+ /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }),
110
+ "Transcribing\u2026"
111
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
112
+ /* @__PURE__ */ jsx("p", { className: "mb-1 text-xs font-semibold uppercase tracking-wide", children: "Rough transcript" }),
113
+ /* @__PURE__ */ jsx("p", { children: transcript })
114
+ ] })
115
+ }
116
+ ),
117
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
118
+ /* @__PURE__ */ jsxs(
119
+ Button,
120
+ {
121
+ type: "button",
122
+ variant: "outline",
123
+ onClick: onDiscard,
124
+ disabled: isSaving,
125
+ "data-testid": "voice-note-discard-button",
126
+ children: [
127
+ /* @__PURE__ */ jsx(Trash2, { className: "mr-1.5 h-4 w-4" }),
128
+ "Discard"
129
+ ]
130
+ }
131
+ ),
132
+ /* @__PURE__ */ jsxs(
133
+ Button,
134
+ {
135
+ type: "button",
136
+ variant: "outline",
137
+ onClick: recorder.reset,
138
+ disabled: isSaving,
139
+ "data-testid": "voice-note-record-again-button",
140
+ children: [
141
+ /* @__PURE__ */ jsx(RotateCcw, { className: "mr-1.5 h-4 w-4" }),
142
+ "Record again"
143
+ ]
144
+ }
145
+ ),
146
+ /* @__PURE__ */ jsxs(
147
+ Button,
148
+ {
149
+ type: "button",
150
+ onClick: handleSave,
151
+ disabled: isSaving,
152
+ "data-testid": "voice-note-save-button",
153
+ children: [
154
+ isSaving ? /* @__PURE__ */ jsx(Loader2, { className: "mr-1.5 h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(Check, { className: "mr-1.5 h-4 w-4" }),
155
+ isSaving ? "Saving\u2026" : "Save"
156
+ ]
157
+ }
158
+ )
159
+ ] })
160
+ ] })
161
+ ] });
162
+ }
163
+ export {
164
+ VoiceNoteRecorder
165
+ };
166
+ //# sourceMappingURL=VoiceNoteRecorder.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/VoiceNoteRecorder.tsx"],
4
+ "sourcesContent": ["/**\n * VoiceNoteRecorder\n *\n * A toggle-style recorder (press to start, pause/resume, stop, review, then\n * save or discard) as opposed to a press-and-hold mic. Shares its\n * capture/metering engine (useAudioRecorder) and its REC-badge/timer/waveform\n * visual (MicWaveformIndicator) with any other recorder a host app builds.\n *\n * REUSE-FIRST: no app coupling. The host supplies `onSave`/`onDiscard` (and\n * optionally `onError`) \u2014 this component owns only the recording UI and\n * in-memory blob, never persistence. Nothing is uploaded until the host's\n * `onSave` is called and resolves.\n */\n\nimport { useEffect, useState } from 'react'\nimport { Mic, Pause, Play, Square, Trash2, Check, Loader2, RotateCcw } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { AudioViewer } from '../viewers/AudioViewer'\nimport { useAudioRecorder } from './useAudioRecorder'\nimport { MicWaveformIndicator } from './MicWaveformIndicator'\n\nexport interface VoiceNoteRecorderProps {\n /** Called with the reviewed recording when the user hits Save. Resolve to\n * let the host close/replace this recorder; the recorder shows a saving\n * spinner while the promise is pending. */\n onSave: (blob: Blob, mimeType: string | null) => Promise<void> | void\n /** Called when the user discards the draft. */\n onDiscard: () => void\n /** Surfaces recorder failures (e.g. denied mic permission) \u2014 wire this to\n * the host's own notification system. Without it, failures are silent. */\n onError?: (message: string) => void\n /** Title passed through to the playback preview. */\n title?: string\n /** External saving state, e.g. while the host's onSave promise is\n * pending \u2014 disables actions and shows a spinner on Save. */\n isSaving?: boolean\n /**\n * Optional: called once with the finished recording as soon as it stops,\n * to produce a quick rough transcript shown inline during review. Purely\n * client-side and ephemeral \u2014 it's never uploaded and has no bearing on\n * what onSave receives; a host with real (e.g. diarized) transcription as\n * part of its normal document processing can skip this prop entirely.\n */\n transcribe?: (blob: Blob) => Promise<string>\n}\n\nexport function VoiceNoteRecorder({\n onSave,\n onDiscard,\n onError,\n title = 'Voice Memo',\n isSaving = false,\n transcribe,\n}: VoiceNoteRecorderProps) {\n const recorder = useAudioRecorder()\n const [transcript, setTranscript] = useState<string | null>(null)\n const [isTranscribing, setIsTranscribing] = useState(false)\n\n useEffect(() => {\n if (recorder.error) onError?.(recorder.error)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.error])\n\n // Kick off the rough transcript the moment a recording is ready to review,\n // so it's usually done by the time the user has looked at the playback\n // controls. Reset on any state other than 'stopped' (re-record, discard)\n // so a stale transcript from a previous take never lingers.\n useEffect(() => {\n if (recorder.state !== 'stopped' || !recorder.blob) {\n setTranscript(null)\n setIsTranscribing(false)\n return\n }\n if (!transcribe) return\n let cancelled = false\n setIsTranscribing(true)\n transcribe(recorder.blob)\n .then((text) => {\n if (!cancelled) setTranscript(text)\n })\n .catch(() => {\n // Best-effort: a failed rough transcript just means the review UI\n // shows nothing extra \u2014 the real transcript still arrives later.\n })\n .finally(() => {\n if (!cancelled) setIsTranscribing(false)\n })\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.state, recorder.blob])\n\n const handleSave = () => {\n if (!recorder.blob) return\n void onSave(recorder.blob, recorder.mimeType)\n }\n\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-6 p-8\">\n {recorder.state === 'idle' && (\n <>\n <Button\n type=\"button\"\n size=\"lg\"\n className=\"h-16 w-16 rounded-full p-0\"\n onClick={() => void recorder.start()}\n data-testid=\"voice-note-record-button\"\n >\n <Mic className=\"h-6 w-6\" />\n </Button>\n <p className=\"text-sm text-muted-foreground\">Press to start recording</p>\n </>\n )}\n\n {(recorder.state === 'recording' || recorder.state === 'paused') && (\n <>\n <MicWaveformIndicator\n level={recorder.level}\n elapsedMs={recorder.elapsedMs}\n paused={recorder.state === 'paused'}\n />\n <div className=\"flex items-center gap-3\">\n {recorder.state === 'recording' ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={recorder.pause}\n data-testid=\"voice-note-pause-button\"\n >\n <Pause className=\"mr-1.5 h-4 w-4\" />\n Pause\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={recorder.resume}\n data-testid=\"voice-note-resume-button\"\n >\n <Play className=\"mr-1.5 h-4 w-4\" />\n Resume\n </Button>\n )}\n <Button type=\"button\" onClick={recorder.stop} data-testid=\"voice-note-stop-button\">\n <Square className=\"mr-1.5 h-3.5 w-3.5 fill-current\" />\n Stop\n </Button>\n </div>\n </>\n )}\n\n {recorder.state === 'stopped' && recorder.blob && (\n <>\n <div className=\"w-full max-w-md\">\n <AudioViewer blob={recorder.blob} title={title} />\n </div>\n {(isTranscribing || transcript) && (\n <div\n className=\"w-full max-w-md rounded-md border border-border bg-muted/30 p-3 text-sm text-muted-foreground\"\n data-testid=\"voice-note-rough-transcript\"\n >\n {isTranscribing ? (\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Transcribing\u2026\n </span>\n ) : (\n <>\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-wide\">\n Rough transcript\n </p>\n <p>{transcript}</p>\n </>\n )}\n </div>\n )}\n <div className=\"flex items-center gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onDiscard}\n disabled={isSaving}\n data-testid=\"voice-note-discard-button\"\n >\n <Trash2 className=\"mr-1.5 h-4 w-4\" />\n Discard\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={recorder.reset}\n disabled={isSaving}\n data-testid=\"voice-note-record-again-button\"\n >\n <RotateCcw className=\"mr-1.5 h-4 w-4\" />\n Record again\n </Button>\n <Button\n type=\"button\"\n onClick={handleSave}\n disabled={isSaving}\n data-testid=\"voice-note-save-button\"\n >\n {isSaving ? (\n <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1.5 h-4 w-4\" />\n )}\n {isSaving ? 'Saving\u2026' : 'Save'}\n </Button>\n </div>\n </>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,63 @@
1
+ const DEFAULT_SEGMENTER_CONFIG = {
2
+ voiceThreshold: 0.3,
3
+ silenceMs: 700,
4
+ maxMs: 1e4,
5
+ minVoiceMs: 600
6
+ };
7
+ const INITIAL_SEGMENTER_STATE = { phase: "idle" };
8
+ function levelFromRms(rms) {
9
+ return Math.sqrt(Math.min(1, rms * 8));
10
+ }
11
+ function end(state, at, reason, config) {
12
+ return {
13
+ type: "end",
14
+ at,
15
+ startedAt: state.startedAt,
16
+ voiceMs: state.voiceMs,
17
+ keep: state.voiceMs >= config.minVoiceMs,
18
+ reason
19
+ };
20
+ }
21
+ function stepSegmenter(state, level, t, config = DEFAULT_SEGMENTER_CONFIG) {
22
+ const voice = level >= config.voiceThreshold;
23
+ if (state.phase === "idle") {
24
+ if (!voice) return { state, events: [] };
25
+ return {
26
+ state: { phase: "voice", startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },
27
+ events: [{ type: "start", at: t }]
28
+ };
29
+ }
30
+ const dt = Math.max(0, t - state.lastSampleAt);
31
+ const next = {
32
+ ...state,
33
+ lastSampleAt: t,
34
+ lastVoiceAt: voice ? t : state.lastVoiceAt,
35
+ voiceMs: state.voiceMs + (voice ? dt : 0)
36
+ };
37
+ if (t - next.startedAt >= config.maxMs) {
38
+ const events = [end(next, t, "max", config)];
39
+ if (!voice) return { state: { phase: "idle" }, events };
40
+ events.push({ type: "start", at: t });
41
+ return {
42
+ state: { phase: "voice", startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },
43
+ events
44
+ };
45
+ }
46
+ const silence = config.silenceMs + (next.voiceMs < config.minVoiceMs ? config.holdShortMs ?? 0 : 0);
47
+ if (!voice && t - next.lastVoiceAt >= silence) {
48
+ return { state: { phase: "idle" }, events: [end(next, t, "silence", config)] };
49
+ }
50
+ return { state: next, events: [] };
51
+ }
52
+ function flushSegmenter(state, t, config = DEFAULT_SEGMENTER_CONFIG) {
53
+ if (state.phase === "idle") return { state, events: [] };
54
+ return { state: { phase: "idle" }, events: [end(state, t, "flush", config)] };
55
+ }
56
+ export {
57
+ DEFAULT_SEGMENTER_CONFIG,
58
+ INITIAL_SEGMENTER_STATE,
59
+ flushSegmenter,
60
+ levelFromRms,
61
+ stepSegmenter
62
+ };
63
+ //# sourceMappingURL=audio-segmenter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/audio-segmenter.ts"],
4
+ "sourcesContent": ["/**\n * audio-segmenter \u2014 the voice-activity state machine behind `useAudioRecorder`'s\n * segmenting mode. Pure: fed one (level, time) sample per meter tick, it says\n * when a speech segment starts and when it ends, and whether the segment held\n * enough voice to be worth keeping. The hook owns the MediaRecorders; this\n * owns only the decisions, so it is unit-testable with synthetic levels.\n *\n * A segment starts on the first sample at or above `voiceThreshold`, ends after\n * `silenceMs` without voice or at `maxMs` (a cut while still speaking starts the\n * next segment on the same sample), and is dropped when it held less than\n * `minVoiceMs` of voice \u2014 a cough, a click, a door.\n */\n\nexport interface SegmenterConfig {\n /** Meter level (0-1, as `useAudioRecorder` reports it) that counts as voice. */\n voiceThreshold: number\n /** Silence that ends a segment. */\n silenceMs: number\n /** Longest segment; a longer utterance is cut into several. */\n maxMs: number\n /** Segments with less voice than this are dropped. */\n minVoiceMs: number\n /**\n * Extra silence a segment that is still too short waits for more voice before it ends (0 = none).\n * A short word and a short phrase a pause apart \u2014 \"Perfect.\" \u2026 \"Thank you both.\" \u2014 then make one\n * segment instead of two dropped ones.\n */\n holdShortMs?: number\n}\n\nexport const DEFAULT_SEGMENTER_CONFIG: SegmenterConfig = {\n voiceThreshold: 0.3,\n silenceMs: 700,\n maxMs: 10_000,\n minVoiceMs: 600,\n}\n\nexport type SegmenterState =\n | { phase: 'idle' }\n | {\n phase: 'voice'\n /** When the segment started (the clock of the samples). */\n startedAt: number\n /** The last sample that carried voice. */\n lastVoiceAt: number\n /** The previous sample, to integrate voice time between samples. */\n lastSampleAt: number\n /** Voice accumulated so far. */\n voiceMs: number\n }\n\nexport type SegmenterEvent =\n | { type: 'start'; at: number }\n | {\n type: 'end'\n at: number\n startedAt: number\n voiceMs: number\n /** False when the segment held too little voice: discard it. */\n keep: boolean\n reason: 'silence' | 'max' | 'flush'\n }\n\nexport const INITIAL_SEGMENTER_STATE: SegmenterState = { phase: 'idle' }\n\n/**\n * The meter level (0-1) of an RMS amplitude, as the segmenter's thresholds expect it. Normal\n * speech RMS is tiny (a laptop mic at conversational distance rarely exceeds ~0.1), so it is\n * boosted, then a sqrt (perceptual) curve makes quiet-to-moderate speech clearly visible.\n */\nexport function levelFromRms(rms: number): number {\n return Math.sqrt(Math.min(1, rms * 8))\n}\n\nfunction end(\n state: Extract<SegmenterState, { phase: 'voice' }>,\n at: number,\n reason: 'silence' | 'max' | 'flush',\n config: SegmenterConfig\n): SegmenterEvent {\n return {\n type: 'end',\n at,\n startedAt: state.startedAt,\n voiceMs: state.voiceMs,\n keep: state.voiceMs >= config.minVoiceMs,\n reason,\n }\n}\n\n/** Feed one meter sample. Returns the next state and what happened (0-2 events). */\nexport function stepSegmenter(\n state: SegmenterState,\n level: number,\n t: number,\n config: SegmenterConfig = DEFAULT_SEGMENTER_CONFIG\n): { state: SegmenterState; events: SegmenterEvent[] } {\n const voice = level >= config.voiceThreshold\n if (state.phase === 'idle') {\n if (!voice) return { state, events: [] }\n return {\n state: { phase: 'voice', startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },\n events: [{ type: 'start', at: t }],\n }\n }\n const dt = Math.max(0, t - state.lastSampleAt)\n const next = {\n ...state,\n lastSampleAt: t,\n lastVoiceAt: voice ? t : state.lastVoiceAt,\n voiceMs: state.voiceMs + (voice ? dt : 0),\n }\n if (t - next.startedAt >= config.maxMs) {\n const events: SegmenterEvent[] = [end(next, t, 'max', config)]\n if (!voice) return { state: { phase: 'idle' }, events }\n events.push({ type: 'start', at: t })\n return {\n state: { phase: 'voice', startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },\n events,\n }\n }\n const silence =\n config.silenceMs + (next.voiceMs < config.minVoiceMs ? (config.holdShortMs ?? 0) : 0)\n if (!voice && t - next.lastVoiceAt >= silence) {\n return { state: { phase: 'idle' }, events: [end(next, t, 'silence', config)] }\n }\n return { state: next, events: [] }\n}\n\n/** Close the open segment, if any (recording stopped). */\nexport function flushSegmenter(\n state: SegmenterState,\n t: number,\n config: SegmenterConfig = DEFAULT_SEGMENTER_CONFIG\n): { state: SegmenterState; events: SegmenterEvent[] } {\n if (state.phase === 'idle') return { state, events: [] }\n return { state: { phase: 'idle' }, events: [end(state, t, 'flush', config)] }\n}\n"],
5
+ "mappings": "AA8BO,MAAM,2BAA4C;AAAA,EACvD,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AACd;AA4BO,MAAM,0BAA0C,EAAE,OAAO,OAAO;AAOhE,SAAS,aAAa,KAAqB;AAChD,SAAO,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;AACvC;AAEA,SAAS,IACP,OACA,IACA,QACA,QACgB;AAChB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,MAAM,MAAM,WAAW,OAAO;AAAA,IAC9B;AAAA,EACF;AACF;AAGO,SAAS,cACd,OACA,OACA,GACA,SAA0B,0BAC2B;AACrD,QAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,MAAM,UAAU,QAAQ;AAC1B,QAAI,CAAC,MAAO,QAAO,EAAE,OAAO,QAAQ,CAAC,EAAE;AACvC,WAAO;AAAA,MACL,OAAO,EAAE,OAAO,SAAS,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,SAAS,EAAE;AAAA,MACnF,QAAQ,CAAC,EAAE,MAAM,SAAS,IAAI,EAAE,CAAC;AAAA,IACnC;AAAA,EACF;AACA,QAAM,KAAK,KAAK,IAAI,GAAG,IAAI,MAAM,YAAY;AAC7C,QAAM,OAAO;AAAA,IACX,GAAG;AAAA,IACH,cAAc;AAAA,IACd,aAAa,QAAQ,IAAI,MAAM;AAAA,IAC/B,SAAS,MAAM,WAAW,QAAQ,KAAK;AAAA,EACzC;AACA,MAAI,IAAI,KAAK,aAAa,OAAO,OAAO;AACtC,UAAM,SAA2B,CAAC,IAAI,MAAM,GAAG,OAAO,MAAM,CAAC;AAC7D,QAAI,CAAC,MAAO,QAAO,EAAE,OAAO,EAAE,OAAO,OAAO,GAAG,OAAO;AACtD,WAAO,KAAK,EAAE,MAAM,SAAS,IAAI,EAAE,CAAC;AACpC,WAAO;AAAA,MACL,OAAO,EAAE,OAAO,SAAS,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,SAAS,EAAE;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AACA,QAAM,UACJ,OAAO,aAAa,KAAK,UAAU,OAAO,aAAc,OAAO,eAAe,IAAK;AACrF,MAAI,CAAC,SAAS,IAAI,KAAK,eAAe,SAAS;AAC7C,WAAO,EAAE,OAAO,EAAE,OAAO,OAAO,GAAG,QAAQ,CAAC,IAAI,MAAM,GAAG,WAAW,MAAM,CAAC,EAAE;AAAA,EAC/E;AACA,SAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE;AACnC;AAGO,SAAS,eACd,OACA,GACA,SAA0B,0BAC2B;AACrD,MAAI,MAAM,UAAU,OAAQ,QAAO,EAAE,OAAO,QAAQ,CAAC,EAAE;AACvD,SAAO,EAAE,OAAO,EAAE,OAAO,OAAO,GAAG,QAAQ,CAAC,IAAI,OAAO,GAAG,SAAS,MAAM,CAAC,EAAE;AAC9E;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ function captureFrameAsBlob(video, mimeType = "image/png") {
2
+ return new Promise((resolve, reject) => {
3
+ const canvas = document.createElement("canvas");
4
+ canvas.width = video.videoWidth;
5
+ canvas.height = video.videoHeight;
6
+ const ctx = canvas.getContext("2d");
7
+ if (!ctx) {
8
+ reject(new Error("Canvas 2D context is not available"));
9
+ return;
10
+ }
11
+ ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
12
+ canvas.toBlob((blob) => {
13
+ if (blob) resolve(blob);
14
+ else reject(new Error("Failed to capture the photo"));
15
+ }, mimeType);
16
+ });
17
+ }
18
+ export {
19
+ captureFrameAsBlob
20
+ };
21
+ //# sourceMappingURL=capture-frame.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/capture-frame.ts"],
4
+ "sourcesContent": ["/**\n * Captures the current frame of a live `<video>` element (bound to a camera\n * `MediaStream`, e.g. via useCameraStream) as an image Blob \u2014 the shutter\n * action for photo capture. Draws to an off-screen canvas rather than reading\n * pixels any other way, since `HTMLCanvasElement.toBlob` is the one\n * cross-browser path from \"a decoded video frame\" to \"an encoded image file\".\n */\nexport function captureFrameAsBlob(video: HTMLVideoElement, mimeType = 'image/png'): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement('canvas')\n canvas.width = video.videoWidth\n canvas.height = video.videoHeight\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n reject(new Error('Canvas 2D context is not available'))\n return\n }\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height)\n canvas.toBlob((blob) => {\n if (blob) resolve(blob)\n else reject(new Error('Failed to capture the photo'))\n }, mimeType)\n })\n}\n"],
5
+ "mappings": "AAOO,SAAS,mBAAmB,OAAyB,WAAW,aAA4B;AACjG,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,MAAM;AACrB,WAAO,SAAS,MAAM;AACtB,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,KAAK;AACR,aAAO,IAAI,MAAM,oCAAoC,CAAC;AACtD;AAAA,IACF;AACA,QAAI,UAAU,OAAO,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACtD,WAAO,OAAO,CAAC,SAAS;AACtB,UAAI,KAAM,SAAQ,IAAI;AAAA,UACjB,QAAO,IAAI,MAAM,6BAA6B,CAAC;AAAA,IACtD,GAAG,QAAQ;AAAA,EACb,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,190 @@
1
+ const AUDIO_MIME_PREFERENCE = [
2
+ "audio/webm;codecs=opus",
3
+ "audio/ogg;codecs=opus",
4
+ "audio/mp4;codecs=mp4a.40.2",
5
+ "audio/mp4"
6
+ ];
7
+ const VIDEO_MIME_PREFERENCE = [
8
+ "video/webm;codecs=av01,opus",
9
+ "video/webm;codecs=av1,opus",
10
+ "video/webm;codecs=vp9,opus",
11
+ "video/webm;codecs=vp8,opus",
12
+ "video/webm",
13
+ "video/mp4"
14
+ ];
15
+ function pickRecorderMimeType(kind, isTypeSupported = (t) => typeof MediaRecorder !== "undefined" && MediaRecorder.isTypeSupported(t)) {
16
+ const list = kind === "audio" ? AUDIO_MIME_PREFERENCE : VIDEO_MIME_PREFERENCE;
17
+ for (const type of list) {
18
+ try {
19
+ if (isTypeSupported(type)) return type;
20
+ } catch {
21
+ }
22
+ }
23
+ return list[list.length - 1];
24
+ }
25
+ function createChunkedRecorder(options) {
26
+ const now = options.now ?? (() => Date.now());
27
+ const mode = options.mode ?? "restart";
28
+ let running = false;
29
+ let index = 0;
30
+ let timer = null;
31
+ let tail = Promise.resolve();
32
+ const recorderInit = () => ({
33
+ mimeType: options.mimeType,
34
+ ...options.audioBitsPerSecond ? { audioBitsPerSecond: options.audioBitsPerSecond } : {},
35
+ ...options.videoBitsPerSecond ? { videoBitsPerSecond: options.videoBitsPerSecond } : {}
36
+ });
37
+ const fail = (err) => {
38
+ running = false;
39
+ if (timer !== null) clearTimeout(timer);
40
+ timer = null;
41
+ options.onError?.(err);
42
+ };
43
+ const beginPart = () => {
44
+ let recorder;
45
+ try {
46
+ recorder = new MediaRecorder(options.stream, recorderInit());
47
+ } catch (err) {
48
+ fail(err);
49
+ return void 0;
50
+ }
51
+ const chunks = [];
52
+ const part = { recorder, startedAt: now(), chunks };
53
+ recorder.ondataavailable = (e) => {
54
+ if (e.data.size > 0) chunks.push(e.data);
55
+ };
56
+ recorder.onstart = () => {
57
+ part.startedAt = now();
58
+ };
59
+ try {
60
+ recorder.start();
61
+ } catch (err) {
62
+ fail(err);
63
+ return void 0;
64
+ }
65
+ return part;
66
+ };
67
+ const endPart = (part) => new Promise((resolve) => {
68
+ const { recorder, startedAt, chunks } = part;
69
+ const durationMs = Math.max(0, now() - startedAt);
70
+ const partIndex = index++;
71
+ const emit = () => {
72
+ if (chunks.length) {
73
+ const type = recorder.mimeType || options.mimeType;
74
+ options.onChunk({
75
+ blob: new Blob(chunks, { type }),
76
+ mimeType: type,
77
+ index: partIndex,
78
+ startedAt,
79
+ durationMs,
80
+ standalone: true
81
+ });
82
+ }
83
+ resolve();
84
+ };
85
+ if (recorder.state === "inactive") {
86
+ emit();
87
+ return;
88
+ }
89
+ recorder.onstop = emit;
90
+ recorder.stop();
91
+ });
92
+ let open;
93
+ const rotate = () => {
94
+ if (!running || !open) return;
95
+ const finished = open;
96
+ open = beginPart();
97
+ tail = tail.then(() => endPart(finished));
98
+ if (running) timer = setTimeout(rotate, options.chunkMs);
99
+ };
100
+ let sliceStartedAt = 0;
101
+ let sliceRecorder = null;
102
+ let stopResolve = null;
103
+ const startTimeslice = () => {
104
+ let recorder;
105
+ try {
106
+ recorder = new MediaRecorder(options.stream, recorderInit());
107
+ } catch (err) {
108
+ fail(err);
109
+ return;
110
+ }
111
+ sliceRecorder = recorder;
112
+ sliceStartedAt = now();
113
+ recorder.ondataavailable = (e) => {
114
+ const at = now();
115
+ const startedAt = sliceStartedAt;
116
+ sliceStartedAt = at;
117
+ if (!e.data.size) return;
118
+ const type = recorder.mimeType || options.mimeType;
119
+ const partIndex = index++;
120
+ options.onChunk({
121
+ blob: e.data,
122
+ mimeType: type,
123
+ index: partIndex,
124
+ startedAt,
125
+ durationMs: Math.max(0, at - startedAt),
126
+ standalone: partIndex === 0
127
+ });
128
+ };
129
+ recorder.onstop = () => {
130
+ stopResolve?.();
131
+ stopResolve = null;
132
+ };
133
+ try {
134
+ recorder.start();
135
+ } catch (err) {
136
+ sliceRecorder = null;
137
+ fail(err);
138
+ return;
139
+ }
140
+ timer = setInterval(() => {
141
+ if (recorder.state === "recording") recorder.requestData();
142
+ }, options.chunkMs);
143
+ };
144
+ return {
145
+ get running() {
146
+ return running;
147
+ },
148
+ start() {
149
+ if (running) return;
150
+ running = true;
151
+ index = 0;
152
+ if (mode === "timeslice") {
153
+ startTimeslice();
154
+ return;
155
+ }
156
+ open = beginPart();
157
+ if (running) timer = setTimeout(rotate, options.chunkMs);
158
+ },
159
+ stop() {
160
+ if (!running && !open && !sliceRecorder) return tail;
161
+ running = false;
162
+ if (timer !== null) {
163
+ clearTimeout(timer);
164
+ clearInterval(timer);
165
+ }
166
+ timer = null;
167
+ if (mode === "timeslice") {
168
+ const recorder = sliceRecorder;
169
+ sliceRecorder = null;
170
+ if (!recorder || recorder.state === "inactive") return tail;
171
+ tail = new Promise((resolve) => {
172
+ stopResolve = resolve;
173
+ recorder.stop();
174
+ });
175
+ return tail;
176
+ }
177
+ const finished = open;
178
+ open = void 0;
179
+ if (finished) tail = tail.then(() => endPart(finished));
180
+ return tail;
181
+ }
182
+ };
183
+ }
184
+ export {
185
+ AUDIO_MIME_PREFERENCE,
186
+ VIDEO_MIME_PREFERENCE,
187
+ createChunkedRecorder,
188
+ pickRecorderMimeType
189
+ };
190
+ //# sourceMappingURL=chunked-recorder.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/chunked-recorder.ts"],
4
+ "sourcesContent": ["/**\n * Chunked MediaRecorder engine \u2014 records a stream in fixed-length parts for a\n * long-running recording that is uploaded as it goes (call recording).\n *\n * Two ways to cut the parts:\n * - `restart` (default): every `chunkMs` the recorder is stopped and a new\n * one started on the same stream, so EVERY part is a standalone file with\n * its own container header (playable, decodable and transcribable on its\n * own). The gap between two parts is the few ms between stop and start.\n * - `timeslice`: one recorder, `requestData()` every `chunkMs` \u2014 the parts\n * are consecutive byte ranges of ONE file (only the first carries the\n * header), so concatenating them in order gives the whole recording with\n * no gap. Used where the parts are only ever played back as one file.\n *\n * Framework-free (no React) so it can be driven by `useAudioRecorder`'s\n * chunk mode and directly by a host that records a composed stream.\n */\n\n/** One part of a chunked recording. */\nexport interface RecordedChunk {\n blob: Blob\n mimeType: string\n /** 0, 1, 2\u2026 in recording order (per recorder instance). */\n index: number\n /** Wall-clock start of the part, ms since epoch. */\n startedAt: number\n durationMs: number\n /** `restart`: always true. `timeslice`: only the first part starts a file. */\n standalone: boolean\n}\n\nexport interface ChunkedRecorderOptions {\n stream: MediaStream\n /** MediaRecorder MIME type (pick it with {@link pickRecorderMimeType}). */\n mimeType: string\n /** Part length, ms (~30 s for call recording). */\n chunkMs: number\n mode?: 'restart' | 'timeslice'\n audioBitsPerSecond?: number\n videoBitsPerSecond?: number\n onChunk(chunk: RecordedChunk): void\n /** Called when a MediaRecorder fails; the recorder stops. */\n onError?(error: unknown): void\n /** Wall clock (tests). */\n now?: () => number\n}\n\nexport interface ChunkedRecorder {\n readonly running: boolean\n start(): void\n /** Stop and flush the tail part; resolves once it was handed to `onChunk`. */\n stop(): Promise<void>\n}\n\n/** Audio MIME types in preference order: Opus/WebM, then AAC/MP4 (Safari). */\nexport const AUDIO_MIME_PREFERENCE = [\n 'audio/webm;codecs=opus',\n 'audio/ogg;codecs=opus',\n 'audio/mp4;codecs=mp4a.40.2',\n 'audio/mp4',\n] as const\n\n/** Video MIME types in preference order: AV1, VP9, VP8 (with Opus), then MP4. */\nexport const VIDEO_MIME_PREFERENCE = [\n 'video/webm;codecs=av01,opus',\n 'video/webm;codecs=av1,opus',\n 'video/webm;codecs=vp9,opus',\n 'video/webm;codecs=vp8,opus',\n 'video/webm',\n 'video/mp4',\n] as const\n\n/**\n * The first MIME type `isTypeSupported` accepts, or the last of the list (the\n * broadest container) when it accepts none.\n */\nexport function pickRecorderMimeType(\n kind: 'audio' | 'video',\n isTypeSupported: (type: string) => boolean = (t) =>\n typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported(t)\n): string {\n const list: readonly string[] = kind === 'audio' ? AUDIO_MIME_PREFERENCE : VIDEO_MIME_PREFERENCE\n for (const type of list) {\n try {\n if (isTypeSupported(type)) return type\n } catch {\n // A browser that throws on an unknown type: try the next one.\n }\n }\n return list[list.length - 1]\n}\n\nexport function createChunkedRecorder(options: ChunkedRecorderOptions): ChunkedRecorder {\n const now = options.now ?? (() => Date.now())\n const mode = options.mode ?? 'restart'\n let running = false\n let index = 0\n let timer: ReturnType<typeof setInterval> | ReturnType<typeof setTimeout> | null = null\n let tail: Promise<void> = Promise.resolve()\n\n const recorderInit = (): MediaRecorderOptions => ({\n mimeType: options.mimeType,\n ...(options.audioBitsPerSecond ? { audioBitsPerSecond: options.audioBitsPerSecond } : {}),\n ...(options.videoBitsPerSecond ? { videoBitsPerSecond: options.videoBitsPerSecond } : {}),\n })\n\n const fail = (err: unknown) => {\n running = false\n if (timer !== null) clearTimeout(timer as ReturnType<typeof setTimeout>)\n timer = null\n options.onError?.(err)\n }\n\n /** `restart`: one recorder per part; resolves when that part was emitted. */\n const beginPart = ():\n { recorder: MediaRecorder; startedAt: number; chunks: Blob[] } | undefined => {\n let recorder: MediaRecorder\n try {\n recorder = new MediaRecorder(options.stream, recorderInit())\n } catch (err) {\n fail(err)\n return undefined\n }\n const chunks: Blob[] = []\n const part = { recorder, startedAt: now(), chunks }\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data)\n }\n // Capture begins at the recorder's `start` event, which can come a second or more after\n // start() while the encoder spins up. Time the part from there: a part timed from start()\n // carries that latency as phantom silence at its start, and a transcript cut there splits a\n // sentence spoken across the part boundary.\n recorder.onstart = () => {\n part.startedAt = now()\n }\n try {\n recorder.start()\n } catch (err) {\n fail(err)\n return undefined\n }\n return part\n }\n\n const endPart = (part: { recorder: MediaRecorder; startedAt: number; chunks: Blob[] }) =>\n new Promise<void>((resolve) => {\n const { recorder, startedAt, chunks } = part\n const durationMs = Math.max(0, now() - startedAt)\n const partIndex = index++\n const emit = () => {\n if (chunks.length) {\n const type = recorder.mimeType || options.mimeType\n options.onChunk({\n blob: new Blob(chunks, { type }),\n mimeType: type,\n index: partIndex,\n startedAt,\n durationMs,\n standalone: true,\n })\n }\n resolve()\n }\n if (recorder.state === 'inactive') {\n emit()\n return\n }\n recorder.onstop = emit\n recorder.stop()\n })\n\n let open: { recorder: MediaRecorder; startedAt: number; chunks: Blob[] } | undefined\n\n const rotate = () => {\n if (!running || !open) return\n const finished = open\n // Start the next part before the previous one flushes: no gap but the start latency.\n open = beginPart()\n tail = tail.then(() => endPart(finished))\n if (running) timer = setTimeout(rotate, options.chunkMs)\n }\n\n // `timeslice`: one recorder; each dataavailable is a part.\n let sliceStartedAt = 0\n let sliceRecorder: MediaRecorder | null = null\n let stopResolve: (() => void) | null = null\n\n const startTimeslice = () => {\n let recorder: MediaRecorder\n try {\n recorder = new MediaRecorder(options.stream, recorderInit())\n } catch (err) {\n fail(err)\n return\n }\n sliceRecorder = recorder\n sliceStartedAt = now()\n recorder.ondataavailable = (e) => {\n const at = now()\n const startedAt = sliceStartedAt\n sliceStartedAt = at\n if (!e.data.size) return\n const type = recorder.mimeType || options.mimeType\n const partIndex = index++\n options.onChunk({\n blob: e.data,\n mimeType: type,\n index: partIndex,\n startedAt,\n durationMs: Math.max(0, at - startedAt),\n standalone: partIndex === 0,\n })\n }\n recorder.onstop = () => {\n stopResolve?.()\n stopResolve = null\n }\n try {\n recorder.start()\n } catch (err) {\n sliceRecorder = null\n fail(err)\n return\n }\n timer = setInterval(() => {\n if (recorder.state === 'recording') recorder.requestData()\n }, options.chunkMs)\n }\n\n return {\n get running() {\n return running\n },\n start() {\n if (running) return\n running = true\n index = 0\n if (mode === 'timeslice') {\n startTimeslice()\n return\n }\n open = beginPart()\n if (running) timer = setTimeout(rotate, options.chunkMs)\n },\n stop() {\n if (!running && !open && !sliceRecorder) return tail\n running = false\n if (timer !== null) {\n clearTimeout(timer as ReturnType<typeof setTimeout>)\n clearInterval(timer as ReturnType<typeof setInterval>)\n }\n timer = null\n if (mode === 'timeslice') {\n const recorder = sliceRecorder\n sliceRecorder = null\n if (!recorder || recorder.state === 'inactive') return tail\n tail = new Promise<void>((resolve) => {\n stopResolve = resolve\n // stop() fires a final dataavailable (the tail), then stop.\n recorder.stop()\n })\n return tail\n }\n const finished = open\n open = undefined\n if (finished) tail = tail.then(() => endPart(finished))\n return tail\n },\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ import { getDocumentDate } from "./document-fields.js";
2
+ import { getDocumentTitle } from "../entities/DocumentEntity.js";
3
+ function fallbackFileName(doc) {
4
+ if (doc.file_name) return doc.file_name;
5
+ const title = getDocumentTitle(doc, `document-${doc.external_id}`);
6
+ const extension = doc.file_type || "pdf";
7
+ const ext = extension.startsWith(".") ? extension : `.${extension}`;
8
+ return title.toLowerCase().endsWith(ext.toLowerCase()) ? title : `${title}${ext}`;
9
+ }
10
+ const COLUMN_MAPPING = {
11
+ file_name: {
12
+ header: "File Name",
13
+ getValue: (d) => d.file_name || getDocumentTitle(d, `document-${d.external_id}.pdf`)
14
+ },
15
+ title: { header: "Title", getValue: (d) => getDocumentTitle(d) },
16
+ n_pages: { header: "Pages", getValue: (d) => d.n_pages || "" },
17
+ doc_date: { header: "Document Date", getValue: (d) => getDocumentDate(d) || "" },
18
+ doc_id: { header: "Document ID", getValue: (d) => d.external_id },
19
+ status: { header: "Status", getValue: (d) => d.status || "" },
20
+ uploaded: { header: "Upload Date", getValue: (d) => d.created_at || "" },
21
+ updated_at: { header: "Last Modified", getValue: (d) => d.updated_at || "" },
22
+ file_type: { header: "File Type", getValue: (d) => d.file_type || "" },
23
+ file_size: { header: "File Size", getValue: (d) => d.file_size || "" },
24
+ shared: { header: "Shared", getValue: (d) => d.shared ? "Yes" : "No" }
25
+ };
26
+ function buildDocumentMetadataRows(documents, selectedColumns) {
27
+ const columns = selectedColumns || Object.keys(COLUMN_MAPPING);
28
+ return documents.map((doc) => {
29
+ const row = {};
30
+ for (const colId of columns) {
31
+ const standard = COLUMN_MAPPING[colId];
32
+ if (standard) {
33
+ row[standard.header] = standard.getValue(doc);
34
+ } else if (colId.startsWith("tag-")) {
35
+ const bare = colId.replace(/^tag-/, "");
36
+ const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === colId || dt.tag_ext_id === bare);
37
+ if (doctag) row[colId] = doctag.note || "Yes";
38
+ }
39
+ }
40
+ return row;
41
+ });
42
+ }
43
+ function archiveName(workspaceName, suffix) {
44
+ const date = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
45
+ const sanitizedName = (workspaceName || "workspace").replace(/[^a-z0-9-_]/gi, "_");
46
+ return `${date}_${sanitizedName}_${suffix}.zip`;
47
+ }
48
+ export {
49
+ archiveName,
50
+ buildDocumentMetadataRows,
51
+ fallbackFileName
52
+ };
53
+ //# sourceMappingURL=document-download.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/documents/document-download.ts"],
4
+ "sourcesContent": ["/**\n * Document download building blocks shared by the documents ZIP (`useDownloadDocuments`) and a\n * workspace export archive: name a file and the archive, and build the metadata rows of\n * `index.csv`. Fetching and saving are the document tools' `fetchDocumentFile` and `downloadBlob`.\n */\n\nimport type { WorkspaceDocument as Doc } from './documents-cache'\nimport { getDocumentDate } from './document-fields'\nimport { getDocumentTitle } from '../entities/DocumentEntity'\n\n/** The ZIP entry name for a document when the server did not name it. */\nexport function fallbackFileName(doc: Doc): string {\n if (doc.file_name) return doc.file_name\n const title = getDocumentTitle(doc, `document-${doc.external_id}`)\n const extension = doc.file_type || 'pdf'\n const ext = extension.startsWith('.') ? extension : `.${extension}`\n return title.toLowerCase().endsWith(ext.toLowerCase()) ? title : `${title}${ext}`\n}\n\nconst COLUMN_MAPPING: Record<string, { header: string; getValue: (d: Doc) => string | number }> = {\n file_name: {\n header: 'File Name',\n getValue: (d) => d.file_name || getDocumentTitle(d, `document-${d.external_id}.pdf`),\n },\n title: { header: 'Title', getValue: (d) => getDocumentTitle(d) },\n n_pages: { header: 'Pages', getValue: (d) => d.n_pages || '' },\n doc_date: { header: 'Document Date', getValue: (d) => getDocumentDate(d) || '' },\n doc_id: { header: 'Document ID', getValue: (d) => d.external_id },\n status: { header: 'Status', getValue: (d) => d.status || '' },\n uploaded: { header: 'Upload Date', getValue: (d) => d.created_at || '' },\n updated_at: { header: 'Last Modified', getValue: (d) => d.updated_at || '' },\n file_type: { header: 'File Type', getValue: (d) => d.file_type || '' },\n file_size: { header: 'File Size', getValue: (d) => d.file_size || '' },\n shared: { header: 'Shared', getValue: (d) => (d.shared ? 'Yes' : 'No') },\n}\n\n/**\n * One `index.csv` row per document for the chosen columns (`undefined` = every\n * standard column). A `tag-\u2026` column holds that tag's value, or \"Yes\" for a\n * label without one.\n */\nexport function buildDocumentMetadataRows(\n documents: Doc[],\n selectedColumns?: string[]\n): Record<string, string | number>[] {\n const columns = selectedColumns || Object.keys(COLUMN_MAPPING)\n return documents.map((doc) => {\n const row: Record<string, string | number> = {}\n for (const colId of columns) {\n const standard = COLUMN_MAPPING[colId]\n if (standard) {\n row[standard.header] = standard.getValue(doc)\n } else if (colId.startsWith('tag-')) {\n // Column ids are tag ext ids; older callers passed them without the prefix.\n const bare = colId.replace(/^tag-/, '')\n const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === colId || dt.tag_ext_id === bare)\n if (doctag) row[colId] = doctag.note || 'Yes'\n }\n }\n return row\n })\n}\n\n/** `2026-10-15_My_Workspace_<suffix>.zip` */\nexport function archiveName(workspaceName: string | undefined, suffix: string): string {\n const date = new Date().toISOString().split('T')[0]\n const sanitizedName = (workspaceName || 'workspace').replace(/[^a-z0-9-_]/gi, '_')\n return `${date}_${sanitizedName}_${suffix}.zip`\n}\n"],
5
+ "mappings": "AAOA,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AAG1B,SAAS,iBAAiB,KAAkB;AACjD,MAAI,IAAI,UAAW,QAAO,IAAI;AAC9B,QAAM,QAAQ,iBAAiB,KAAK,YAAY,IAAI,WAAW,EAAE;AACjE,QAAM,YAAY,IAAI,aAAa;AACnC,QAAM,MAAM,UAAU,WAAW,GAAG,IAAI,YAAY,IAAI,SAAS;AACjE,SAAO,MAAM,YAAY,EAAE,SAAS,IAAI,YAAY,CAAC,IAAI,QAAQ,GAAG,KAAK,GAAG,GAAG;AACjF;AAEA,MAAM,iBAA4F;AAAA,EAChG,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,UAAU,CAAC,MAAM,EAAE,aAAa,iBAAiB,GAAG,YAAY,EAAE,WAAW,MAAM;AAAA,EACrF;AAAA,EACA,OAAO,EAAE,QAAQ,SAAS,UAAU,CAAC,MAAM,iBAAiB,CAAC,EAAE;AAAA,EAC/D,SAAS,EAAE,QAAQ,SAAS,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG;AAAA,EAC7D,UAAU,EAAE,QAAQ,iBAAiB,UAAU,CAAC,MAAM,gBAAgB,CAAC,KAAK,GAAG;AAAA,EAC/E,QAAQ,EAAE,QAAQ,eAAe,UAAU,CAAC,MAAM,EAAE,YAAY;AAAA,EAChE,QAAQ,EAAE,QAAQ,UAAU,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG;AAAA,EAC5D,UAAU,EAAE,QAAQ,eAAe,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG;AAAA,EACvE,YAAY,EAAE,QAAQ,iBAAiB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG;AAAA,EAC3E,WAAW,EAAE,QAAQ,aAAa,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG;AAAA,EACrE,WAAW,EAAE,QAAQ,aAAa,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG;AAAA,EACrE,QAAQ,EAAE,QAAQ,UAAU,UAAU,CAAC,MAAO,EAAE,SAAS,QAAQ,KAAM;AACzE;AAOO,SAAS,0BACd,WACA,iBACmC;AACnC,QAAM,UAAU,mBAAmB,OAAO,KAAK,cAAc;AAC7D,SAAO,UAAU,IAAI,CAAC,QAAQ;AAC5B,UAAM,MAAuC,CAAC;AAC9C,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,eAAe,KAAK;AACrC,UAAI,UAAU;AACZ,YAAI,SAAS,MAAM,IAAI,SAAS,SAAS,GAAG;AAAA,MAC9C,WAAW,MAAM,WAAW,MAAM,GAAG;AAEnC,cAAM,OAAO,MAAM,QAAQ,SAAS,EAAE;AACtC,cAAM,SAAS,IAAI,SAAS,KAAK,CAAC,OAAO,GAAG,eAAe,SAAS,GAAG,eAAe,IAAI;AAC1F,YAAI,OAAQ,KAAI,KAAK,IAAI,OAAO,QAAQ;AAAA,MAC1C;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAGO,SAAS,YAAY,eAAmC,QAAwB;AACrF,QAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAClD,QAAM,iBAAiB,iBAAiB,aAAa,QAAQ,iBAAiB,GAAG;AACjF,SAAO,GAAG,IAAI,IAAI,aAAa,IAAI,MAAM;AAC3C;",
6
+ "names": []
7
+ }