@arbidocs/blocks 0.5.107 → 0.5.108

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 (341) hide show
  1. package/dist/{ConnectedCallDock-TDYRHPAK.js → ConnectedCallDock-DV4FU376.js} +8 -8
  2. package/dist/{ConnectedCallDock-TDYRHPAK.js.map → ConnectedCallDock-DV4FU376.js.map} +1 -1
  3. package/dist/{ConnectedCallDock-H3WWFGXF.cjs → ConnectedCallDock-EM2VVGZK.cjs} +10 -10
  4. package/dist/{ConnectedCallDock-H3WWFGXF.cjs.map → ConnectedCallDock-EM2VVGZK.cjs.map} +1 -1
  5. package/dist/{ConnectedCallRoom-55O5OUN7.cjs → ConnectedCallRoom-7WEPEWUJ.cjs} +9 -9
  6. package/dist/{ConnectedCallRoom-55O5OUN7.cjs.map → ConnectedCallRoom-7WEPEWUJ.cjs.map} +1 -1
  7. package/dist/{ConnectedCallRoom-Z6F6WCLH.js → ConnectedCallRoom-RYTZP34O.js} +8 -8
  8. package/dist/{ConnectedCallRoom-Z6F6WCLH.js.map → ConnectedCallRoom-RYTZP34O.js.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js → ConnectedNativeDocxComparison-2NDXXZLQ.js} +15 -15
  10. package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js.map → ConnectedNativeDocxComparison-2NDXXZLQ.js.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs → ConnectedNativeDocxComparison-7HOY3AVI.cjs} +16 -16
  12. package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs.map → ConnectedNativeDocxComparison-7HOY3AVI.cjs.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs → ConnectedNativeDocxEditor-CUWDPHXN.cjs} +16 -16
  14. package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs.map → ConnectedNativeDocxEditor-CUWDPHXN.cjs.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js → ConnectedNativeDocxEditor-SPZB6Y27.js} +14 -14
  16. package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js.map → ConnectedNativeDocxEditor-SPZB6Y27.js.map} +1 -1
  17. package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js → ConnectedProductionSetDialog-N3EDG3SU.js} +4 -4
  18. package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js.map → ConnectedProductionSetDialog-N3EDG3SU.js.map} +1 -1
  19. package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs → ConnectedProductionSetDialog-XAEFEN3N.cjs} +4 -4
  20. package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs.map → ConnectedProductionSetDialog-XAEFEN3N.cjs.map} +1 -1
  21. package/dist/{ConnectedStreamedWordArtifact-HLJ5IIOU.js → ConnectedStreamedWordArtifact-6LTGEAJO.js} +15 -15
  22. package/dist/ConnectedStreamedWordArtifact-6LTGEAJO.js.map +1 -0
  23. package/dist/{ConnectedStreamedWordArtifact-JQ34AOUU.cjs → ConnectedStreamedWordArtifact-HNCRKZTV.cjs} +16 -16
  24. package/dist/ConnectedStreamedWordArtifact-HNCRKZTV.cjs.map +1 -0
  25. package/dist/{DocumentReviewCard-7JSXRJZ2.js → DocumentReviewCard-RJD3CO32.js} +8 -8
  26. package/dist/{DocumentReviewCard-7JSXRJZ2.js.map → DocumentReviewCard-RJD3CO32.js.map} +1 -1
  27. package/dist/{DocumentReviewCard-C4HVT3WM.cjs → DocumentReviewCard-VON7LOOY.cjs} +8 -8
  28. package/dist/{DocumentReviewCard-C4HVT3WM.cjs.map → DocumentReviewCard-VON7LOOY.cjs.map} +1 -1
  29. package/dist/{FilesViewerDialog-IMQTZWKD.js → FilesViewerDialog-7SJGY72Q.js} +21 -21
  30. package/dist/{FilesViewerDialog-IMQTZWKD.js.map → FilesViewerDialog-7SJGY72Q.js.map} +1 -1
  31. package/dist/{FilesViewerDialog-UP7GFHYN.cjs → FilesViewerDialog-VIPTC6OT.cjs} +27 -27
  32. package/dist/{FilesViewerDialog-UP7GFHYN.cjs.map → FilesViewerDialog-VIPTC6OT.cjs.map} +1 -1
  33. package/dist/{RechartsRenderer-GIRCW7DB.cjs → RechartsRenderer-THES2SE5.cjs} +6 -5
  34. package/dist/RechartsRenderer-THES2SE5.cjs.map +1 -0
  35. package/dist/{RechartsRenderer-23OF4H6X.js → RechartsRenderer-XIZLV6GH.js} +6 -5
  36. package/dist/RechartsRenderer-XIZLV6GH.js.map +1 -0
  37. package/dist/{WorkspaceTableView-PJM47B5F.cjs → WorkspaceTableView-FNME7TL6.cjs} +9 -9
  38. package/dist/{WorkspaceTableView-PJM47B5F.cjs.map → WorkspaceTableView-FNME7TL6.cjs.map} +1 -1
  39. package/dist/{WorkspaceTableView-YDA7A4UJ.js → WorkspaceTableView-XQ6J2JKI.js} +7 -7
  40. package/dist/{WorkspaceTableView-YDA7A4UJ.js.map → WorkspaceTableView-XQ6J2JKI.js.map} +1 -1
  41. package/dist/agents/index.cjs +202 -202
  42. package/dist/agents/index.js +8 -8
  43. package/dist/{ai-ADS6YSS2.cjs → ai-3SAMEYBB.cjs} +20 -20
  44. package/dist/ai-3SAMEYBB.cjs.map +1 -0
  45. package/dist/{ai-KHWTGBT5.js → ai-OTQWSYVK.js} +12 -12
  46. package/dist/ai-OTQWSYVK.js.map +1 -0
  47. package/dist/calls/index.cjs +57 -57
  48. package/dist/calls/index.js +9 -9
  49. package/dist/chat/index.cjs +3 -3
  50. package/dist/chat/index.js +3 -3
  51. package/dist/{chunk-O27K7KTZ.cjs → chunk-2TBQBF4Y.cjs} +5 -5
  52. package/dist/{chunk-O27K7KTZ.cjs.map → chunk-2TBQBF4Y.cjs.map} +1 -1
  53. package/dist/{chunk-YJWAGXYM.js → chunk-4ZA2RSQH.js} +3 -3
  54. package/dist/{chunk-YJWAGXYM.js.map → chunk-4ZA2RSQH.js.map} +1 -1
  55. package/dist/{chunk-6A4GNM4T.cjs → chunk-5D2ZINOJ.cjs} +16 -16
  56. package/dist/{chunk-6A4GNM4T.cjs.map → chunk-5D2ZINOJ.cjs.map} +1 -1
  57. package/dist/{chunk-BFVCYBND.cjs → chunk-5HXQOM3I.cjs} +5 -5
  58. package/dist/{chunk-BFVCYBND.cjs.map → chunk-5HXQOM3I.cjs.map} +1 -1
  59. package/dist/{chunk-GSD5U553.cjs → chunk-5KKT65WU.cjs} +3 -3
  60. package/dist/{chunk-GSD5U553.cjs.map → chunk-5KKT65WU.cjs.map} +1 -1
  61. package/dist/{chunk-AVGHTUPE.js → chunk-5PWLXLHY.js} +5 -5
  62. package/dist/chunk-5PWLXLHY.js.map +1 -0
  63. package/dist/{chunk-BBWLFK3C.js → chunk-5XIMUQ63.js} +3 -3
  64. package/dist/{chunk-BBWLFK3C.js.map → chunk-5XIMUQ63.js.map} +1 -1
  65. package/dist/{chunk-AHMRYY7J.cjs → chunk-6DAJXQZZ.cjs} +13 -13
  66. package/dist/{chunk-AHMRYY7J.cjs.map → chunk-6DAJXQZZ.cjs.map} +1 -1
  67. package/dist/{chunk-3PV25ICC.js → chunk-6KKVJ2V6.js} +3 -3
  68. package/dist/{chunk-3PV25ICC.js.map → chunk-6KKVJ2V6.js.map} +1 -1
  69. package/dist/{chunk-OLAYDOPC.js → chunk-6LUHNFEE.js} +6 -6
  70. package/dist/{chunk-OLAYDOPC.js.map → chunk-6LUHNFEE.js.map} +1 -1
  71. package/dist/{chunk-FSXQHEFQ.cjs → chunk-7CDV7Y4U.cjs} +25 -25
  72. package/dist/{chunk-FSXQHEFQ.cjs.map → chunk-7CDV7Y4U.cjs.map} +1 -1
  73. package/dist/{chunk-OAIOOVFN.cjs → chunk-7SJXYEZI.cjs} +36 -36
  74. package/dist/chunk-7SJXYEZI.cjs.map +1 -0
  75. package/dist/{chunk-LFYKB7KF.cjs → chunk-7V6APLF7.cjs} +19 -19
  76. package/dist/{chunk-LFYKB7KF.cjs.map → chunk-7V6APLF7.cjs.map} +1 -1
  77. package/dist/{chunk-4WMGFGYP.cjs → chunk-AJZ66VJC.cjs} +4 -4
  78. package/dist/{chunk-4WMGFGYP.cjs.map → chunk-AJZ66VJC.cjs.map} +1 -1
  79. package/dist/{chunk-KCP42W67.cjs → chunk-ARGQ5YZ5.cjs} +3 -3
  80. package/dist/{chunk-KCP42W67.cjs.map → chunk-ARGQ5YZ5.cjs.map} +1 -1
  81. package/dist/{chunk-BH6IKGZ3.js → chunk-AUAHGQY6.js} +5 -5
  82. package/dist/{chunk-BH6IKGZ3.js.map → chunk-AUAHGQY6.js.map} +1 -1
  83. package/dist/{chunk-KIXFXCHL.js → chunk-CEOCA7ID.js} +3 -3
  84. package/dist/{chunk-KIXFXCHL.js.map → chunk-CEOCA7ID.js.map} +1 -1
  85. package/dist/{chunk-TNKPQ3EF.js → chunk-CIRSOYGK.js} +12 -12
  86. package/dist/{chunk-TNKPQ3EF.js.map → chunk-CIRSOYGK.js.map} +1 -1
  87. package/dist/{chunk-BAUZUIHB.js → chunk-COL2TJGO.js} +83 -83
  88. package/dist/chunk-COL2TJGO.js.map +1 -0
  89. package/dist/{chunk-XHN5KOI2.cjs → chunk-DRLD4P2C.cjs} +8 -8
  90. package/dist/{chunk-XHN5KOI2.cjs.map → chunk-DRLD4P2C.cjs.map} +1 -1
  91. package/dist/{chunk-5AC52BHL.cjs → chunk-DYPFNQTQ.cjs} +140 -140
  92. package/dist/chunk-DYPFNQTQ.cjs.map +1 -0
  93. package/dist/{chunk-SCLGUHLU.cjs → chunk-E7TGSOPR.cjs} +4 -4
  94. package/dist/{chunk-SCLGUHLU.cjs.map → chunk-E7TGSOPR.cjs.map} +1 -1
  95. package/dist/{chunk-CRLFLMTK.cjs → chunk-EOXA4VJH.cjs} +3 -3
  96. package/dist/{chunk-CRLFLMTK.cjs.map → chunk-EOXA4VJH.cjs.map} +1 -1
  97. package/dist/{chunk-DBKZANTC.js → chunk-GA47YVW5.js} +3 -3
  98. package/dist/{chunk-DBKZANTC.js.map → chunk-GA47YVW5.js.map} +1 -1
  99. package/dist/{chunk-RCZRI72J.cjs → chunk-GMODJT4N.cjs} +4 -4
  100. package/dist/{chunk-RCZRI72J.cjs.map → chunk-GMODJT4N.cjs.map} +1 -1
  101. package/dist/{chunk-22KAKJ3W.cjs → chunk-GS5MFUPC.cjs} +4 -4
  102. package/dist/{chunk-22KAKJ3W.cjs.map → chunk-GS5MFUPC.cjs.map} +1 -1
  103. package/dist/{chunk-62OMGQHS.js → chunk-H6W3VXHU.js} +3 -3
  104. package/dist/{chunk-62OMGQHS.js.map → chunk-H6W3VXHU.js.map} +1 -1
  105. package/dist/{chunk-DX3Z2COD.cjs → chunk-HUYKO2ES.cjs} +3 -3
  106. package/dist/{chunk-DX3Z2COD.cjs.map → chunk-HUYKO2ES.cjs.map} +1 -1
  107. package/dist/{chunk-U5F5P4YU.js → chunk-IK234EFX.js} +12 -12
  108. package/dist/{chunk-U5F5P4YU.js.map → chunk-IK234EFX.js.map} +1 -1
  109. package/dist/{chunk-UQ2OBHMV.js → chunk-JUGEFTRC.js} +1010 -1010
  110. package/dist/chunk-JUGEFTRC.js.map +1 -0
  111. package/dist/{chunk-CHQMVIHR.js → chunk-LPGBRMYS.js} +36 -36
  112. package/dist/chunk-LPGBRMYS.js.map +1 -0
  113. package/dist/{chunk-D35EHOK5.cjs → chunk-M23W7IID.cjs} +12 -12
  114. package/dist/chunk-M23W7IID.cjs.map +1 -0
  115. package/dist/{chunk-FPOKWML2.js → chunk-MIVNNQO3.js} +21 -4
  116. package/dist/chunk-MIVNNQO3.js.map +1 -0
  117. package/dist/{chunk-WI3BVKEC.cjs → chunk-MNFI66H5.cjs} +5 -5
  118. package/dist/{chunk-WI3BVKEC.cjs.map → chunk-MNFI66H5.cjs.map} +1 -1
  119. package/dist/{chunk-T5ZMG6MC.js → chunk-NF4M7PUB.js} +3 -3
  120. package/dist/{chunk-T5ZMG6MC.js.map → chunk-NF4M7PUB.js.map} +1 -1
  121. package/dist/{chunk-ZNY5W3VX.js → chunk-NPSFPBIB.js} +3 -3
  122. package/dist/{chunk-ZNY5W3VX.js.map → chunk-NPSFPBIB.js.map} +1 -1
  123. package/dist/{chunk-LYW5A35J.js → chunk-OMIYTUVR.js} +12 -12
  124. package/dist/{chunk-LYW5A35J.js.map → chunk-OMIYTUVR.js.map} +1 -1
  125. package/dist/{chunk-ZMVF7EYJ.cjs → chunk-PBPO54KZ.cjs} +21 -3
  126. package/dist/chunk-PBPO54KZ.cjs.map +1 -0
  127. package/dist/{chunk-7V4OCZS6.cjs → chunk-RA3EGF6K.cjs} +6 -6
  128. package/dist/{chunk-7V4OCZS6.cjs.map → chunk-RA3EGF6K.cjs.map} +1 -1
  129. package/dist/{chunk-PL7O3RJJ.cjs → chunk-RKBAY7GZ.cjs} +3 -3
  130. package/dist/{chunk-PL7O3RJJ.cjs.map → chunk-RKBAY7GZ.cjs.map} +1 -1
  131. package/dist/{chunk-J3E5CSSC.js → chunk-RKFWBIKS.js} +3 -3
  132. package/dist/{chunk-J3E5CSSC.js.map → chunk-RKFWBIKS.js.map} +1 -1
  133. package/dist/{chunk-YLKHTBYA.js → chunk-RRP7MQAO.js} +3 -3
  134. package/dist/{chunk-YLKHTBYA.js.map → chunk-RRP7MQAO.js.map} +1 -1
  135. package/dist/{chunk-U6LQ6Z3P.cjs → chunk-SP3IKIPA.cjs} +6 -6
  136. package/dist/{chunk-U6LQ6Z3P.cjs.map → chunk-SP3IKIPA.cjs.map} +1 -1
  137. package/dist/{chunk-GX75YCWJ.cjs → chunk-SQUOXOY3.cjs} +560 -560
  138. package/dist/chunk-SQUOXOY3.cjs.map +1 -0
  139. package/dist/{chunk-6ZYOUT73.js → chunk-T5LORFHL.js} +7 -7
  140. package/dist/{chunk-6ZYOUT73.js.map → chunk-T5LORFHL.js.map} +1 -1
  141. package/dist/{chunk-45OU2UAA.cjs → chunk-TEMTKBBL.cjs} +10 -10
  142. package/dist/{chunk-45OU2UAA.cjs.map → chunk-TEMTKBBL.cjs.map} +1 -1
  143. package/dist/{chunk-PHDUN4SG.cjs → chunk-THCMGAFX.cjs} +41 -41
  144. package/dist/{chunk-PHDUN4SG.cjs.map → chunk-THCMGAFX.cjs.map} +1 -1
  145. package/dist/{chunk-HTGEAQOA.js → chunk-TOMDMKOD.js} +7 -7
  146. package/dist/{chunk-HTGEAQOA.js.map → chunk-TOMDMKOD.js.map} +1 -1
  147. package/dist/{chunk-WJHRWXWJ.js → chunk-TXIAF4PX.js} +3 -3
  148. package/dist/{chunk-WJHRWXWJ.js.map → chunk-TXIAF4PX.js.map} +1 -1
  149. package/dist/{chunk-6M5NAAWX.js → chunk-UCSEE52D.js} +3 -3
  150. package/dist/{chunk-6M5NAAWX.js.map → chunk-UCSEE52D.js.map} +1 -1
  151. package/dist/{chunk-I7CJDF3V.cjs → chunk-UHMP6S7M.cjs} +104 -103
  152. package/dist/chunk-UHMP6S7M.cjs.map +1 -0
  153. package/dist/{chunk-PGCKTXYH.js → chunk-UHUI6A36.js} +3 -3
  154. package/dist/{chunk-PGCKTXYH.js.map → chunk-UHUI6A36.js.map} +1 -1
  155. package/dist/{chunk-6KQVTMRL.cjs → chunk-UOGXKHTJ.cjs} +3 -3
  156. package/dist/{chunk-6KQVTMRL.cjs.map → chunk-UOGXKHTJ.cjs.map} +1 -1
  157. package/dist/{chunk-7S7YVBFK.js → chunk-VDSDG4FR.js} +3 -3
  158. package/dist/{chunk-7S7YVBFK.js.map → chunk-VDSDG4FR.js.map} +1 -1
  159. package/dist/{chunk-3GFQNJYE.js → chunk-VGWCHX6G.js} +104 -103
  160. package/dist/chunk-VGWCHX6G.js.map +1 -0
  161. package/dist/{chunk-VY3HTT37.js → chunk-VUH547VQ.js} +3 -3
  162. package/dist/{chunk-VY3HTT37.js.map → chunk-VUH547VQ.js.map} +1 -1
  163. package/dist/{chunk-AZCMKGDG.js → chunk-W37PFYFL.js} +4 -4
  164. package/dist/{chunk-AZCMKGDG.js.map → chunk-W37PFYFL.js.map} +1 -1
  165. package/dist/{chunk-JGUM4EXE.cjs → chunk-W3IX3GZS.cjs} +8 -8
  166. package/dist/{chunk-JGUM4EXE.cjs.map → chunk-W3IX3GZS.cjs.map} +1 -1
  167. package/dist/{chunk-UCA4JLLJ.cjs → chunk-X7GT57KW.cjs} +3 -3
  168. package/dist/{chunk-UCA4JLLJ.cjs.map → chunk-X7GT57KW.cjs.map} +1 -1
  169. package/dist/{chunk-IXL2KJOZ.cjs → chunk-XBEGD33U.cjs} +40 -40
  170. package/dist/{chunk-IXL2KJOZ.cjs.map → chunk-XBEGD33U.cjs.map} +1 -1
  171. package/dist/{chunk-FDNIK5YS.cjs → chunk-XBKIFGBB.cjs} +8 -8
  172. package/dist/{chunk-FDNIK5YS.cjs.map → chunk-XBKIFGBB.cjs.map} +1 -1
  173. package/dist/{chunk-HZE5MHQO.js → chunk-XT7HKQ4H.js} +3 -3
  174. package/dist/{chunk-HZE5MHQO.js.map → chunk-XT7HKQ4H.js.map} +1 -1
  175. package/dist/{chunk-M3OK6KGR.js → chunk-ZGQKED5T.js} +3 -3
  176. package/dist/{chunk-M3OK6KGR.js.map → chunk-ZGQKED5T.js.map} +1 -1
  177. package/dist/{chunk-NWBCZ4PA.js → chunk-ZKBYG6MN.js} +4 -4
  178. package/dist/{chunk-NWBCZ4PA.js.map → chunk-ZKBYG6MN.js.map} +1 -1
  179. package/dist/collaboration/index.cjs +1 -1
  180. package/dist/collaboration/index.js +1 -1
  181. package/dist/connect/docx.cjs +19 -19
  182. package/dist/connect/docx.js +15 -15
  183. package/dist/connect/index.cjs +762 -762
  184. package/dist/connect/index.js +63 -63
  185. package/dist/connect/viewer.cjs +14 -14
  186. package/dist/connect/viewer.js +13 -13
  187. package/dist/connection/dashboards/ConnectedDashboardsPage.d.ts +6 -0
  188. package/dist/dashboards/chartModel.d.ts +12 -0
  189. package/dist/dashboards/index.cjs +113 -42
  190. package/dist/dashboards/index.cjs.map +1 -1
  191. package/dist/dashboards/index.js +95 -24
  192. package/dist/dashboards/index.js.map +1 -1
  193. package/dist/embed/index.cjs +29 -29
  194. package/dist/embed/index.js +23 -23
  195. package/dist/facts/index.cjs +43 -43
  196. package/dist/facts/index.js +2 -2
  197. package/dist/files/index.cjs +1 -1
  198. package/dist/files/index.js +1 -1
  199. package/dist/home/index.cjs +31 -31
  200. package/dist/home/index.js +3 -3
  201. package/dist/index.cjs +383 -383
  202. package/dist/index.js +21 -21
  203. package/dist/settings/index.cjs +153 -153
  204. package/dist/settings/index.js +4 -4
  205. package/dist/shell/index.cjs +36 -36
  206. package/dist/shell/index.js +4 -4
  207. package/dist/site/index.cjs +5 -5
  208. package/dist/site/index.js +1 -1
  209. package/dist/studio/index.cjs +19 -19
  210. package/dist/studio/index.js +14 -14
  211. package/dist/styles.css +1 -1
  212. package/dist/workflow-canvas/index.cjs +33 -33
  213. package/dist/workflow-canvas/index.js +22 -22
  214. package/node_modules/@arbidocs/coedit/package.json +2 -2
  215. package/node_modules/@docx-editor.dev/core/dist/automation.cjs +1 -1
  216. package/node_modules/@docx-editor.dev/core/dist/automation.d.ts +60 -13
  217. package/node_modules/@docx-editor.dev/core/dist/automation.js +1 -1
  218. package/node_modules/@docx-editor.dev/core/dist/binding.cjs +1 -1
  219. package/node_modules/@docx-editor.dev/core/dist/binding.d.ts +21 -13
  220. package/node_modules/@docx-editor.dev/core/dist/binding.js +1 -1
  221. package/node_modules/@docx-editor.dev/core/dist/{index-Bsg7oIKP.d.ts → chrome-print-CAs51cpq.d.ts} +31 -21
  222. package/node_modules/@docx-editor.dev/core/dist/{chunk-VDNNLG6X.js → chunk-236O4YQW.js} +1 -1
  223. package/node_modules/@docx-editor.dev/core/dist/chunk-4HENIAFG.js +1 -0
  224. package/node_modules/@docx-editor.dev/core/dist/{chunk-SRPILEWV.cjs → chunk-6JPL6ZAS.cjs} +5 -5
  225. package/node_modules/@docx-editor.dev/core/dist/{chunk-2RC2EPND.js → chunk-6ZQP4HQ7.js} +1 -1
  226. package/node_modules/@docx-editor.dev/core/dist/{chunk-ZUHOMK52.cjs → chunk-7WQ7AAHW.cjs} +1 -1
  227. package/node_modules/@docx-editor.dev/core/dist/{chunk-Z6WBFXJU.js → chunk-BCXH4BXB.js} +3 -3
  228. package/node_modules/@docx-editor.dev/core/dist/{chunk-QMLCVPCD.cjs → chunk-BY2ACZZ6.cjs} +1 -1
  229. package/node_modules/@docx-editor.dev/core/dist/chunk-CAJEXXVG.cjs +4 -0
  230. package/node_modules/@docx-editor.dev/core/dist/chunk-CPWLFPWC.js +30 -0
  231. package/node_modules/@docx-editor.dev/core/dist/{chunk-6APGXLBB.cjs → chunk-D7ZMDMPX.cjs} +2 -2
  232. package/node_modules/@docx-editor.dev/core/dist/chunk-DOHF6FA7.cjs +30 -0
  233. package/node_modules/@docx-editor.dev/core/dist/chunk-DVX32P2P.js +27 -0
  234. package/node_modules/@docx-editor.dev/core/dist/{chunk-6EYYL7FL.js → chunk-E4LOMDNL.js} +1 -1
  235. package/node_modules/@docx-editor.dev/core/dist/chunk-EKLM7NWB.cjs +7 -0
  236. package/node_modules/@docx-editor.dev/core/dist/chunk-G3K63G7P.cjs +27 -0
  237. package/node_modules/@docx-editor.dev/core/dist/{chunk-5CSUYANV.js → chunk-G4HOFIKJ.js} +1 -1
  238. package/node_modules/@docx-editor.dev/core/dist/{chunk-K5U2PLDP.cjs → chunk-JLVBDYVQ.cjs} +1 -1
  239. package/node_modules/@docx-editor.dev/core/dist/chunk-LQX36Z5P.js +7 -0
  240. package/node_modules/@docx-editor.dev/core/dist/{chunk-TSLBZ26X.js → chunk-LSZ6KPKK.js} +1 -1
  241. package/node_modules/@docx-editor.dev/core/dist/{chunk-O2AL2HSJ.cjs → chunk-MM5QBMTE.cjs} +1 -1
  242. package/node_modules/@docx-editor.dev/core/dist/{chunk-ETTO6GK3.js → chunk-OMCG63ZF.js} +1 -1
  243. package/node_modules/@docx-editor.dev/core/dist/chunk-OSFOJTHU.cjs +18 -0
  244. package/node_modules/@docx-editor.dev/core/dist/{chunk-E7BQA6UP.js → chunk-RCLZXP3B.js} +1 -1
  245. package/node_modules/@docx-editor.dev/core/dist/chunk-T6K2QYNZ.cjs +2 -0
  246. package/node_modules/@docx-editor.dev/core/dist/chunk-TRGAVV2Y.js +4 -0
  247. package/node_modules/@docx-editor.dev/core/dist/chunk-U4JZVSOE.js +2 -0
  248. package/node_modules/@docx-editor.dev/core/dist/{chunk-2GO5T2JU.cjs → chunk-UHHYFIDT.cjs} +1 -1
  249. package/node_modules/@docx-editor.dev/core/dist/chunk-V3N4SOAK.cjs +1 -0
  250. package/node_modules/@docx-editor.dev/core/dist/{chunk-6AWEKBLB.cjs → chunk-W35WTWAO.cjs} +1 -1
  251. package/node_modules/@docx-editor.dev/core/dist/chunk-YQ5G6LC7.js +18 -0
  252. package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.cjs +1 -1
  253. package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.d.ts +5 -5
  254. package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.js +1 -1
  255. package/node_modules/@docx-editor.dev/core/dist/collaboration.d.ts +4 -4
  256. package/node_modules/@docx-editor.dev/core/dist/contracts/document.d.ts +3 -3
  257. package/node_modules/@docx-editor.dev/core/dist/contracts/editor.d.ts +9 -10
  258. package/node_modules/@docx-editor.dev/core/dist/contracts/interaction.d.ts +2 -2
  259. package/node_modules/@docx-editor.dev/core/dist/contracts/modules.cjs +1 -1
  260. package/node_modules/@docx-editor.dev/core/dist/contracts/modules.d.ts +33 -9
  261. package/node_modules/@docx-editor.dev/core/dist/contracts/modules.js +1 -1
  262. package/node_modules/@docx-editor.dev/core/dist/contracts/types.d.ts +2 -2
  263. package/node_modules/@docx-editor.dev/core/dist/{custom-node-writes-cvL5rhcD.d.ts → custom-node-writes-Bn6uciLb.d.ts} +2 -2
  264. package/node_modules/@docx-editor.dev/core/dist/diagnostic-context-B8M79cfK.d.ts +30 -0
  265. package/node_modules/@docx-editor.dev/core/dist/diagnostic-hints-BeVjfNOv.d.ts +113 -0
  266. package/node_modules/@docx-editor.dev/core/dist/{document-protection-BAGVGqaP.d.ts → document-protection-CUb55pl_.d.ts} +2 -2
  267. package/node_modules/@docx-editor.dev/core/dist/{editor-Ci7IZGmG.d.ts → editor-CZQZmTIU.d.ts} +386 -9
  268. package/node_modules/@docx-editor.dev/core/dist/{editor-scope-OHPwVQ5l.d.ts → editor-scope-7o9xweiJ.d.ts} +1 -1
  269. package/node_modules/@docx-editor.dev/core/dist/editor.cjs +1 -1
  270. package/node_modules/@docx-editor.dev/core/dist/editor.d.ts +54 -33
  271. package/node_modules/@docx-editor.dev/core/dist/editor.js +1 -1
  272. package/node_modules/@docx-editor.dev/core/dist/export.cjs +2 -2
  273. package/node_modules/@docx-editor.dev/core/dist/export.d.ts +13 -14
  274. package/node_modules/@docx-editor.dev/core/dist/export.js +1 -1
  275. package/node_modules/@docx-editor.dev/core/dist/{font-resolver-BVQB14qT.d.ts → font-resolver-lSBLirLR.d.ts} +3 -3
  276. package/node_modules/@docx-editor.dev/core/dist/{headless-document-view-qH331moE.d.ts → headless-document-view-pp3q7wIh.d.ts} +2 -2
  277. package/node_modules/@docx-editor.dev/core/dist/{image-resources-BN-hUgCn.d.ts → image-resources-tXLQShoC.d.ts} +2 -2
  278. package/node_modules/@docx-editor.dev/core/dist/index.cjs +1 -1
  279. package/node_modules/@docx-editor.dev/core/dist/index.d.ts +65 -20
  280. package/node_modules/@docx-editor.dev/core/dist/index.js +1 -1
  281. package/node_modules/@docx-editor.dev/core/dist/{layout-shaping-BEyuiQOk.d.ts → layout-shaping-BD-dF_rn.d.ts} +1 -1
  282. package/node_modules/@docx-editor.dev/core/dist/layout.cjs +1 -1
  283. package/node_modules/@docx-editor.dev/core/dist/layout.d.ts +17 -20
  284. package/node_modules/@docx-editor.dev/core/dist/layout.js +1 -1
  285. package/node_modules/@docx-editor.dev/core/dist/{note-properties-4Y9o6Gyk.d.ts → note-properties-qQUjO1GQ.d.ts} +3 -3
  286. package/node_modules/@docx-editor.dev/core/dist/{omml-equation-CuzBL5DD.d.ts → omml-equation-BUbU0utM.d.ts} +1 -1
  287. package/node_modules/@docx-editor.dev/core/dist/output.cjs +1 -1
  288. package/node_modules/@docx-editor.dev/core/dist/output.d.ts +8 -9
  289. package/node_modules/@docx-editor.dev/core/dist/output.js +1 -1
  290. package/node_modules/@docx-editor.dev/core/dist/{protocol-Bqk4Izjc.d.ts → protocol-DYzzz2ej.d.ts} +2 -2
  291. package/node_modules/@docx-editor.dev/core/dist/{review-paragraph-order-DT-n6ouC.d.ts → review-paragraph-order-CN_0l2Cb.d.ts} +1 -1
  292. package/node_modules/@docx-editor.dev/core/dist/{semantic-cell-selection-D9D1KSXq.d.ts → semantic-cell-selection-eYag3P47.d.ts} +4 -211
  293. package/node_modules/@docx-editor.dev/core/dist/{semantic-interaction-CIC-PooQ.d.ts → semantic-interaction-kR_QB845.d.ts} +1 -1
  294. package/node_modules/@docx-editor.dev/core/dist/{semantic-paint-BME37OMv.d.ts → semantic-paint-ZayFF3tD.d.ts} +17 -5
  295. package/node_modules/@docx-editor.dev/core/dist/{semantic-record-queries-CBlZqZNa.d.ts → semantic-record-queries-Bsgth6lv.d.ts} +1 -1
  296. package/node_modules/@docx-editor.dev/core/dist/{semantic-records-4B3WwFAi.d.ts → semantic-records-DQmumPgL.d.ts} +1279 -828
  297. package/node_modules/@docx-editor.dev/core/dist/store.cjs +1 -1
  298. package/node_modules/@docx-editor.dev/core/dist/store.d.ts +1466 -1464
  299. package/node_modules/@docx-editor.dev/core/dist/store.js +1 -1
  300. package/node_modules/@docx-editor.dev/core/dist/{tree-package-fragment-BeeKxDw8.d.ts → tree-package-store-CovjNARF.d.ts} +83 -83
  301. package/node_modules/@docx-editor.dev/core/dist/{tree-session-contract-CVbmlMlq.d.ts → tree-session-contract-CZVAGl51.d.ts} +6 -6
  302. package/node_modules/@docx-editor.dev/core/dist/{types-barrel-D3xCgQX6.d.ts → types-barrel-DuC5QBNC.d.ts} +548 -527
  303. package/node_modules/@docx-editor.dev/core/package.json +3 -3
  304. package/node_modules/@docx-editor.dev/react/dist/index.js +3 -3
  305. package/node_modules/@docx-editor.dev/react/dist/index.mjs +3 -3
  306. package/node_modules/@docx-editor.dev/react/package.json +4 -4
  307. package/package.json +8 -8
  308. package/dist/ConnectedStreamedWordArtifact-HLJ5IIOU.js.map +0 -1
  309. package/dist/ConnectedStreamedWordArtifact-JQ34AOUU.cjs.map +0 -1
  310. package/dist/RechartsRenderer-23OF4H6X.js.map +0 -1
  311. package/dist/RechartsRenderer-GIRCW7DB.cjs.map +0 -1
  312. package/dist/ai-ADS6YSS2.cjs.map +0 -1
  313. package/dist/ai-KHWTGBT5.js.map +0 -1
  314. package/dist/chunk-3GFQNJYE.js.map +0 -1
  315. package/dist/chunk-5AC52BHL.cjs.map +0 -1
  316. package/dist/chunk-AVGHTUPE.js.map +0 -1
  317. package/dist/chunk-BAUZUIHB.js.map +0 -1
  318. package/dist/chunk-CHQMVIHR.js.map +0 -1
  319. package/dist/chunk-D35EHOK5.cjs.map +0 -1
  320. package/dist/chunk-FPOKWML2.js.map +0 -1
  321. package/dist/chunk-GX75YCWJ.cjs.map +0 -1
  322. package/dist/chunk-I7CJDF3V.cjs.map +0 -1
  323. package/dist/chunk-OAIOOVFN.cjs.map +0 -1
  324. package/dist/chunk-UQ2OBHMV.js.map +0 -1
  325. package/dist/chunk-ZMVF7EYJ.cjs.map +0 -1
  326. package/node_modules/@docx-editor.dev/core/dist/chunk-4GBTELJV.cjs +0 -28
  327. package/node_modules/@docx-editor.dev/core/dist/chunk-4R3TEXMN.js +0 -18
  328. package/node_modules/@docx-editor.dev/core/dist/chunk-EO4C5QJW.cjs +0 -2
  329. package/node_modules/@docx-editor.dev/core/dist/chunk-FIJZIQXA.cjs +0 -18
  330. package/node_modules/@docx-editor.dev/core/dist/chunk-FRXAOVTB.js +0 -28
  331. package/node_modules/@docx-editor.dev/core/dist/chunk-J6BVWIDB.js +0 -2
  332. package/node_modules/@docx-editor.dev/core/dist/chunk-JGNVNT2A.cjs +0 -2
  333. package/node_modules/@docx-editor.dev/core/dist/chunk-KKIJG3C6.js +0 -2
  334. package/node_modules/@docx-editor.dev/core/dist/chunk-LWDSDCMO.js +0 -27
  335. package/node_modules/@docx-editor.dev/core/dist/chunk-NBCVVZOM.cjs +0 -1
  336. package/node_modules/@docx-editor.dev/core/dist/chunk-O5INAWZQ.js +0 -1
  337. package/node_modules/@docx-editor.dev/core/dist/chunk-RCHS4ZEH.cjs +0 -27
  338. package/node_modules/@docx-editor.dev/core/dist/chunk-VHAVHCQY.js +0 -7
  339. package/node_modules/@docx-editor.dev/core/dist/chunk-VX43VBAX.cjs +0 -7
  340. package/node_modules/@docx-editor.dev/core/dist/review-pane-D9jm8DcY.d.ts +0 -128
  341. package/node_modules/@docx-editor.dev/core/dist/revision-projection-DZ4kKVev.d.ts +0 -242
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/calls/connected/ChatCallCard.tsx","../src/calls/connected/call-person-name.ts","../src/calls/connected/CallConversationParts.tsx","../src/calls/connected/provisional-speakers.ts","../src/calls/connected/ConnectedCallChatHistory.tsx","../src/calls/connected/StartCallButton.tsx","../src/calls/connected/DmCallButton.tsx","../src/calls/connected/call-people.ts","../src/calls/connected/CallPeoplePicker.tsx","../src/calls/connected/GroupCallButton.tsx","../src/calls/connected/NewCallChip.tsx","../src/calls/connected/ScheduleCallButton.tsx","../src/connection/conversation/useMeetingThreadMessages.ts","../src/calls/connected/ThreadCallButton.tsx","../src/calls/connected/MeetingThreadTranscriptAction.tsx","../src/calls/connected/MeetingThreadRecordingsAction.tsx","../src/calls/connected/ConnectedConversationCallActions.tsx"],"names":["useArbi","useCallSession","jsx","useState","useMemo","useEffect","useCall","jsxs","Fragment","Button","Phone","getUserDisplayName","cn","Tooltip","TooltipTrigger","TooltipContent","usePeople","added","useCanHostCalls","isAgent","openCall","useWorkspaces","hasRecordingTranscript","useRecordingWindows","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","useConversationItems"],"mappings":"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","file":"chunk-JUGEFTRC.js","sourcesContent":["/**\n * A `kind=call` chat message (the server posts one into the call's chat — a DM, a group or a\n * meeting chat — when a session starts). The newest card of a call shows its state:\n *\n * live: \"Ada started a call\" · Join\n * ended: \"Call · 12 min · joined Ada, Bob\"\n *\n * Older cards of the same call (earlier sessions) stay a plain \"Call\" line. The call is re-read on\n * `call.started` / `call.ended` (see `refreshCallCards`).\n */\n\nimport { useArbi, useCallSession, useCall, openCall } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { Phone, PhoneOff } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { formatCallDuration, isCallLive } from '../call-cards'\n\nexport function ChatCallCard({\n callExtId,\n senderName,\n latest,\n name,\n time,\n}: {\n callExtId: string\n /** Who started the session (the card's sender). */\n senderName: string | null\n /** The newest card of this call in the chat. */\n latest: boolean\n /** A member's display name by user ext id. */\n name: (userExtId: string) => string\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const { data: call } = useCall(latest ? callExtId : null)\n const liveNow = useCallSession((s) => callExtId in s.liveCalls)\n const inThisCall = useCallSession((s) => s.active?.callExtId === callExtId)\n const inAnotherCall = useCallSession((s) => !!s.active && s.active.callExtId !== callExtId)\n const [busy, setBusy] = useState(false)\n const live = latest && isCallLive(call, liveNow)\n\n let summary: string\n if (live) summary = senderName ? `${senderName} started a call` : 'Call in progress'\n else if (latest && call?.started_at && call.ended_at) {\n const seconds = (Date.parse(call.ended_at) - Date.parse(call.started_at)) / 1000\n const joined = (call.last_participants ?? []).map(name)\n summary = [\n 'Call',\n formatCallDuration(seconds),\n joined.length ? `joined ${joined.join(', ')}` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n } else summary = senderName ? `Call started by ${senderName}` : 'Call'\n\n return (\n <div\n className=\"mx-auto my-2 flex w-fit max-w-full flex-wrap items-center justify-center gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs\"\n data-testid=\"chat-call-card\"\n data-live={live || undefined}\n >\n {live ? (\n <Phone className=\"size-4 animate-pulse text-green-text\" aria-hidden />\n ) : (\n <PhoneOff className=\"size-4 text-muted-foreground\" aria-hidden />\n )}\n <span data-testid=\"chat-call-card-summary\">{summary}</span>\n {time && <time className=\"text-muted-foreground\">{time}</time>}\n {live && (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 bg-green-600 text-white hover:bg-green-700\"\n disabled={busy || inThisCall || inAnotherCall}\n title={inAnotherCall ? 'You are already in a call' : undefined}\n onClick={() => {\n setBusy(true)\n void openCall(arbi, { callExtId }).finally(() => setBusy(false))\n }}\n data-testid=\"chat-call-card-join\"\n >\n {inThisCall ? 'In call' : 'Join'}\n </Button>\n )}\n </div>\n )\n}\n","/** A call participant's name, as the people directory knows them. */\n\nimport { useMemo } from 'react'\nimport { useArbi, usePeople } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\n\n/** The name for an identity (user ext id): mine, a known person's, else the call's name for them. */\nexport function useCallPersonName(identity: string, fallbackName?: string | null): string {\n const arbi = useArbi()\n const { byId } = usePeople()\n const me = arbi.isLoggedIn && arbi.user.identity()?.externalId === identity\n const profile = me ? arbi.user.profile() : null\n return useMemo(() => {\n if (profile)\n return getUserDisplayName({ given_name: profile.givenName, family_name: profile.familyName })\n const user = byId(identity)\n if (user) return getUserDisplayName(user)\n return (fallbackName || identity).trim().split(/\\s+/).join(' ')\n }, [profile, byId, identity, fallbackName])\n}\n","/**\n * A call's conversation (meeting chat or meeting thread), call-aware: its empty state (\"Call in\n * progress — the transcript will appear here\", or \"No transcript\" afterwards) instead of the\n * generic one, and provisional \"<speaker> is speaking…\" rows while a line is on its way.\n */\n\nimport { useCallSession } from '@arbidocs/react'\nimport type { ReactElement } from 'react'\nimport { AudioLines, Captions, CaptionsOff } from 'lucide-react'\nimport { EmptyState } from '../../components/EmptyState'\nimport { ProvisionalTranscriptLine } from '../../chat/TranscriptLine'\nimport { useMyCallStatus } from '../call-status'\nimport { CallUserPill } from './CallUserPill'\nimport { useCallPersonName } from './call-person-name'\n\n/** The empty conversation of a call: live while the call runs, \"No transcript\" after. */\nexport function CallConversationEmpty({ callExtId }: { callExtId: string }): ReactElement {\n const { inCall, transcribing } = useMyCallStatus(callExtId)\n const live = useCallSession((s) => !!s.liveCalls[callExtId]) || inCall\n if (!live) {\n return (\n <EmptyState\n icon={AudioLines}\n title=\"No transcript\"\n description=\"This call was not transcribed. When a call here is transcribed, what people say appears in this conversation.\"\n className=\"mx-auto my-8 max-w-xl\"\n testId=\"call-conversation-empty\"\n />\n )\n }\n return (\n <EmptyState\n icon={transcribing ? Captions : CaptionsOff}\n title=\"Call in progress — the transcript will appear here\"\n description={\n transcribing\n ? 'Transcription is on: what people say shows up here as they speak.'\n : 'Transcription is off. The host can turn it on with CC in the call.'\n }\n className=\"mx-auto my-8 max-w-xl\"\n testId=\"call-conversation-empty\"\n />\n )\n}\n\nfunction ProvisionalRow({ identity }: { identity: string }): ReactElement {\n const name = useCallPersonName(identity)\n return (\n <ProvisionalTranscriptLine\n speakerId={identity}\n speakerName={name}\n speaker={<CallUserPill identity={identity} />}\n />\n )\n}\n\n/** The provisional rows at the bottom of a call's conversation (never stored). */\nexport function ProvisionalSpeakers({ ids }: { ids: string[] }): ReactElement | null {\n if (!ids.length) return null\n return (\n <div className=\"pb-2\" data-testid=\"transcript-provisional-rows\">\n {ids.map((id) => (\n <ProvisionalRow key={id} identity={id} />\n ))}\n </div>\n )\n}\n","/** Who gets a provisional \"is speaking…\" row in a call's conversation. */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useMyCallStatus } from '../call-status'\nimport { useSpeakingIds } from '../voice-levels'\n\n/** A spoken stretch whose line has not arrived yet. */\ninterface Pending {\n startedAt: number\n lastHeardAt: number\n}\n\n/** How long after someone stops a provisional row waits for their line before it gives up. */\nconst LINE_WAIT_MS = 10_000\n/** A burst shorter than this (a cough, a word) gets no row. */\nconst MIN_SPEECH_MS = 800\n\n/**\n * Who should show a provisional row: people talking now, and people who stopped but whose line\n * has not arrived yet (a line started at or after their stretch began replaces the row).\n */\nexport function useProvisionalSpeakers(\n callExtId: string | null | undefined,\n lines: { speakerId: string; at: number }[]\n): string[] {\n const { inCall, transcribing } = useMyCallStatus(callExtId)\n const speaking = useSpeakingIds()\n const pending = useRef(new Map<string, Pending>())\n const [, tick] = useState(0)\n const active = inCall && transcribing\n const now = Date.now()\n if (active) {\n for (const id of speaking) {\n const p = pending.current.get(id)\n if (p) p.lastHeardAt = now\n else pending.current.set(id, { startedAt: now, lastHeardAt: now })\n }\n } else if (pending.current.size) {\n pending.current.clear()\n }\n // A line that began within the stretch (a little slack for clock skew) replaces the row.\n const latest = useMemo(() => {\n const m = new Map<string, number>()\n for (const l of lines) m.set(l.speakerId, Math.max(m.get(l.speakerId) ?? 0, l.at))\n return m\n }, [lines])\n for (const [id, p] of [...pending.current]) {\n const arrived = (latest.get(id) ?? 0) >= p.startedAt - 3000\n const stale = !speaking.includes(id) && now - p.lastHeardAt > LINE_WAIT_MS\n if ((arrived && !speaking.includes(id)) || stale) pending.current.delete(id)\n else if (arrived) p.startedAt = now\n }\n // Re-check while rows wait for their lines.\n const waiting = pending.current.size > 0\n useEffect(() => {\n if (!waiting) return\n const id = setInterval(() => tick((n) => n + 1), 1000)\n return () => clearInterval(id)\n }, [waiting])\n return [...pending.current]\n .filter(([, p]) => p.lastHeardAt - p.startedAt >= MIN_SPEECH_MS)\n .map(([id]) => id)\n}\n","/**\n * A chat thread's history with its call: the messenger kit's `ThreadHistory` (blocks\n * `ConnectedChatThread`). A chat with a call (a meeting chat, or a direct or group chat a call was\n * started from) shows its call cards, live transcript, recordings and the speakers talking right\n * now, and filters between everything, the typed chat, the transcript and the recordings. Typed\n * messages are drawn by the kit (`renderItem`).\n */\n\nimport { Fragment, useEffect, useMemo, useState } from 'react'\nimport {\n DateSeparator,\n useArbi,\n type ChatThreadMessage,\n useCall,\n chatTranscriptRef,\n hasRecordingTranscript,\n sortTranscriptMessages,\n supersededTranscriptLines,\n type TranscriptExportLine,\n useRecordingWindows,\n} from '@arbidocs/react'\nimport { chats } from '@arbidocs/sdk/browser'\nimport { ConversationFilter } from '../../chat/TranscriptLine'\nimport { transcriptRuns } from '../../chat/transcript-runs'\nimport type { ChatHistoryProps } from '../../connection/messenger/types'\nimport { usePendingRecording } from '../recording-link'\nimport { ChatCallCard } from './ChatCallCard'\nimport { TranscriptEntry } from './TranscriptEntry'\nimport { CallConversationEmpty, ProvisionalSpeakers } from './CallConversationParts'\nimport { useProvisionalSpeakers } from './provisional-speakers'\nimport { SaveTranscriptToThread } from './SaveTranscriptToThread'\nimport { RecordingCard, RecordingsList } from './RecordingCard'\n\nconst { isTranscriptMessage, parseTranscriptContent } = chats\n\nexport function ConnectedCallChatHistory({\n chat,\n messages,\n items,\n renderItem,\n loadOlder,\n memberById,\n senderName,\n myExtId,\n formatTime,\n formatDay,\n}: ChatHistoryProps) {\n const arbi = useArbi()\n // A call's chat: everything, typed chat only, the transcript only, or the recordings.\n const [view, setView] = useState<'all' | 'chat' | 'transcript' | 'recordings'>('all')\n useEffect(() => setView('all'), [chat?.external_id])\n // A call's chat (meeting, DM or group with a call) lists the call's recordings.\n const recordingsCallExtId = chat?.call_ext_id ?? null\n // A recording link opened this chat: show its recordings.\n const pendingRecording = usePendingRecording()\n useEffect(() => {\n if (pendingRecording && recordingsCallExtId) setView('recordings')\n }, [pendingRecording, recordingsCallExtId])\n\n // The newest call card of each call shows its live / ended state; older ones are a plain line.\n const latestCallCards = useMemo(() => {\n const latest = new Map<string, string>()\n for (const m of messages)\n if (m.kind === 'call' && m.call_ext_id && !m.deleted) latest.set(m.call_ext_id, m.external_id)\n return new Set(latest.values())\n }, [messages])\n\n // A recording's transcript supersedes the live lines spoken while it recorded (else both show).\n const hasRecTranscript = useMemo(\n () => hasRecordingTranscript(messages, chatTranscriptRef),\n [messages]\n )\n const recordingWindows = useRecordingWindows(recordingsCallExtId, hasRecTranscript)\n const supersededTranscript = useMemo(\n () => supersededTranscriptLines(messages, chatTranscriptRef, recordingWindows),\n [messages, recordingWindows]\n )\n const transcriptMessages = useMemo(\n () =>\n sortTranscriptMessages(\n messages.filter((m) => isTranscriptMessage(m) && !m.deleted && !supersededTranscript.has(m))\n ),\n [messages, supersededTranscript]\n )\n const hasTranscript = transcriptMessages.length > 0\n\n // The host can save the decrypted transcript as one comment into a workspace thread.\n const { data: meetingCall } = useCall(hasTranscript ? chat?.call_ext_id : null)\n const isHost = !!meetingCall?.is_creator\n const [meetingTitle, setMeetingTitle] = useState<string | null>(null)\n useEffect(() => {\n if (!chat || (!isHost && !recordingsCallExtId)) return\n let cancelled = false\n arbi.chats\n .title(chat)\n .then((t) => !cancelled && setMeetingTitle(t))\n .catch(() => undefined)\n return () => {\n cancelled = true\n }\n }, [arbi, isHost, chat, recordingsCallExtId])\n\n const transcriptSpeaker = (msg: ChatThreadMessage) => {\n const parsed = msg.decryptFailed ? null : parseTranscriptContent(msg.content)\n return { parsed, speakerId: parsed?.speaker_identity || msg.sender_ext_id || '' }\n }\n const transcriptExport = useMemo<TranscriptExportLine[]>(\n () =>\n transcriptMessages\n .filter((m) => !m.decryptFailed)\n .map((m) => {\n const parsed = parseTranscriptContent(m.content)\n const speakerId = parsed?.speaker_identity || m.sender_ext_id || ''\n return {\n speaker:\n parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : '') ||\n 'Former member',\n at: parsed?.started_at ?? m.created_at,\n text: parsed?.text ?? m.content ?? '',\n }\n }),\n [transcriptMessages, memberById, senderName]\n )\n // Consecutive lines of one speaker are one run (the name once); each speaker's newest line is\n // highlighted while they talk in the call.\n const transcriptLayout = useMemo(() => {\n const shown = view === 'transcript' ? transcriptMessages : messages\n const continued = transcriptRuns(\n shown,\n (m) =>\n isTranscriptMessage(m) && !supersededTranscript.has(m)\n ? transcriptSpeaker(m).speakerId\n : null,\n (m) => Date.parse(transcriptSpeaker(m).parsed?.started_at ?? m.created_at ?? '') || 0\n )\n return { continued }\n }, [view, messages, transcriptMessages, supersededTranscript])\n const transcriptEntry = (msg: ChatThreadMessage) => {\n const { parsed, speakerId } = transcriptSpeaker(msg)\n return (\n <TranscriptEntry\n key={msg.external_id}\n speakerId={speakerId}\n speakerName={\n speakerId === myExtId\n ? 'Me'\n : parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : senderName(msg.sender_ext_id))\n }\n text={parsed?.text ?? msg.content ?? ''}\n at={parsed?.started_at ?? msg.created_at}\n continued={transcriptLayout.continued.has(msg)}\n />\n )\n }\n // While I am in this chat's call: \"<speaker> is speaking…\" until their line arrives.\n const chatLines = useMemo(\n () =>\n transcriptMessages.map((m) => {\n const { parsed, speakerId } = transcriptSpeaker(m)\n return { speakerId, at: Date.parse(parsed?.started_at ?? m.created_at ?? '') || 0 }\n }),\n\n [transcriptMessages]\n )\n const provisionalSpeakers = useProvisionalSpeakers(recordingsCallExtId, chatLines)\n\n const filterOptions = [\n { value: 'all' as const, label: 'All' },\n { value: 'chat' as const, label: 'Chat', testId: 'chat-filter' },\n {\n value: 'transcript' as const,\n label: 'Transcript',\n count: transcriptMessages.length,\n testId: 'transcript-filter',\n },\n ...(recordingsCallExtId\n ? [{ value: 'recordings' as const, label: 'Recordings', testId: 'recordings-filter' }]\n : []),\n ]\n\n return (\n <>\n {messages.length === 0 && recordingsCallExtId && (\n <CallConversationEmpty callExtId={recordingsCallExtId} />\n )}\n {(hasTranscript || recordingsCallExtId) && (\n <div className=\"sticky top-0 z-10 flex justify-center py-1\">\n <ConversationFilter<typeof view>\n value={view}\n options={filterOptions}\n onChange={setView}\n />\n </div>\n )}\n {view === 'recordings' && recordingsCallExtId && (\n <RecordingsList callExtId={recordingsCallExtId} title={meetingTitle} className=\"py-1\" />\n )}\n {loadOlder}\n {view === 'transcript' && (\n <div className=\"flex flex-col py-1\" data-testid=\"transcript-view\">\n {isHost && (\n <SaveTranscriptToThread\n title={meetingTitle}\n lines={transcriptExport}\n className=\"mx-3 mb-2 self-start\"\n />\n )}\n {transcriptMessages.map((msg) => transcriptEntry(msg))}\n <ProvisionalSpeakers ids={provisionalSpeakers} />\n </div>\n )}\n {(view === 'all' || view === 'chat') &&\n items.map((item, i) => {\n const { message: msg, isFirstOfDay } = item\n const deleted = !!msg.deleted\n // A deleted transcript line is not part of the record (it may be stored again).\n if (deleted && isTranscriptMessage(msg)) return null\n const separator = isFirstOfDay && (\n <DateSeparator>{formatDay(msg.created_at)}</DateSeparator>\n )\n if (isTranscriptMessage(msg)) {\n if (view === 'chat') return null\n // A live line superseded by the recording's transcript is not shown.\n const superseded = supersededTranscript.has(msg)\n if (superseded && !isFirstOfDay) return null\n return (\n <Fragment key={msg.external_id}>\n {separator}\n {!superseded && transcriptEntry(msg)}\n </Fragment>\n )\n }\n if (msg.kind === 'recording' && msg.call_ext_id && !deleted) {\n // The server's Recording card (posted when a recording stops).\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <RecordingCard\n callExtId={msg.call_ext_id}\n recordingExtId={msg.recording_ext_id ?? null}\n title={meetingTitle}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n if (msg.kind === 'call' && msg.call_ext_id && !deleted) {\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <ChatCallCard\n callExtId={msg.call_ext_id}\n senderName={msg.sender_ext_id ? senderName(msg.sender_ext_id) : null}\n latest={latestCallCards.has(msg.external_id)}\n name={senderName}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n return renderItem(item, i)\n })}\n {view === 'all' && <ProvisionalSpeakers ids={provisionalSpeakers} />}\n </>\n )\n}\n","/**\n * Header button that starts (or joins) a call. Renders nothing when calling is\n * not configured on this deployment, and offers only joining a live call to people who may\n * not host calls (Free on the hosted service, external on a Box).\n */\n\nimport { useCallSession, useCallsEnabled, useCanHostCalls } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { Phone } from 'lucide-react'\nimport { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\n\nexport interface StartCallButtonProps {\n /** Starts the call; resolves to whether it opened. */\n onStart(): Promise<boolean>\n /** A call is already running here (the button joins it). */\n isLive?: boolean\n /** Tooltip / accessible label. */\n label?: string\n testId?: string\n}\n\nexport function StartCallButton(props: StartCallButtonProps): ReactElement | null {\n // Gate first so a deployment without calls pays for none of the hooks below.\n const enabled = useCallsEnabled()\n const canHost = useCanHostCalls()\n return enabled && (canHost || props.isLive) ? <EnabledStartCallButton {...props} /> : null\n}\n\nfunction EnabledStartCallButton({\n onStart,\n isLive = false,\n label = 'Start call',\n testId = 'start-call-button',\n}: StartCallButtonProps): ReactElement {\n const [isStarting, setIsStarting] = useState(false)\n const inCall = useCallSession((s) => s.active !== null)\n const text = inCall ? 'Already in a call' : isLive ? 'Join call' : label\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={isLive ? 'Join call' : label}\n data-testid={testId}\n data-live={isLive || undefined}\n disabled={isStarting || inCall}\n onClick={() => {\n setIsStarting(true)\n void onStart().finally(() => setIsStarting(false))\n }}\n className={cn(\n 'text-muted-foreground hover:text-foreground',\n isLive && 'text-green-text hover:text-green-text'\n )}\n >\n <Phone className={cn('size-5', isLive && 'animate-pulse')} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{text}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n","/** Call button for an open DM thread: a new call with the peer as context, ringing the peer. */\n\nimport { useArbi, userDisplayName, startDmCall, type UserResponse } from '@arbidocs/react'\nimport type { ReactElement } from 'react'\nimport { StartCallButton } from './StartCallButton'\n\nexport function DmCallButton({ peer }: { peer: UserResponse }): ReactElement {\n const arbi = useArbi()\n const name = userDisplayName(peer)\n return (\n <StartCallButton\n onStart={() =>\n startDmCall(arbi, {\n external_id: peer.external_id,\n encryption_public_key: peer.encryption_public_key ?? null,\n name,\n })\n }\n label={`Call ${name}`}\n testId=\"dm-call-button\"\n />\n )\n}\n","/**\n * Who a call picker offers, in which order, and what picking them does — pure, so the rules are\n * tested without React (see `CallPeoplePicker`).\n *\n * - `workspace` (a thread call): members of the thread's own workspace only. Nobody else may be\n * rung, admitted or knock on a workspace-locked call.\n * - `chat` (a group's call): the group's members.\n * - `contacts` (\"New call\", calendar): members of the current workspace first, then my other\n * contacts. Only contacts can be picked (the server answers `403 not_a_contact` otherwise): a\n * workspace member who is not one yet offers \"Add contact\". Registered contacts are rung (K\n * sealed to them); unregistered ones (invited / expired / a card with an e-mail) get a personal\n * invite link by e-mail: create an ARBI account, then straight into the call (no anonymous\n * guests).\n *\n * Agents and I are never offered.\n */\n\nimport type { contacts } from '@arbidocs/sdk/browser'\nimport { getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport { type UserResponse } from '@arbidocs/react'\n\ntype Contact = contacts.Contact\n\nexport type CallPickerScope = 'workspace' | 'chat' | 'contacts'\n\n/**\n * - `ring`: an ARBI user, rung in-app.\n * - `invite`: an unregistered contact, e-mailed a personal invite link (register, then join).\n * - `add-contact`: a workspace member who is not my contact yet (add, then pick).\n * - `unavailable`: shown greyed out with `reason`.\n */\ntype CallCandidateStatus = 'ring' | 'invite' | 'add-contact' | 'unavailable'\n\nexport interface CallCandidate {\n /** `usr-…` for a user, `cnt-…` for an unregistered contact. */\n id: string\n name: string\n email: string | null\n section: 'members' | 'contacts'\n status: CallCandidateStatus\n /** Why it cannot be picked (tooltip), or what picking does (\"will get an e-mail link\"). */\n reason?: string\n user: UserResponse | null\n contactExtId: string | null\n}\n\nexport const INVITE_LINK_HINT = 'will get an invitation to create an ARBI account and join'\nconst NO_KEY_REASON = 'Cannot receive encrypted calls yet'\nconst NO_EMAIL_REASON = 'No e-mail address to send a link to'\n\nfunction contactName(contact: Contact): string {\n return (\n contact.card?.name?.trim() ||\n [contact.card?.given_name, contact.card?.family_name].filter(Boolean).join(' ') ||\n (contact.user ? getUserDisplayName(contact.user) : '') ||\n contactEmail(contact) ||\n 'Contact'\n )\n}\n\nfunction contactEmail(contact: Contact): string | null {\n return contact.email ?? contact.user?.email ?? contact.card?.emails?.[0]?.email ?? null\n}\n\n/** One of my contacts, as the picker needs it (from a people search hit, or a contact just added). */\nexport interface CallContact {\n contactExtId: string\n /** The ARBI account; null for a contact not on ARBI yet. */\n user: UserResponse | null\n name: string\n email: string | null\n}\n\n/** A contact row as a {@link CallContact}; null for one that cannot be called (failed, agent, no id). */\nexport function callContactOf(contact: Contact): CallContact | null {\n if (!contact.external_id || contact.status === 'failed') return null\n if (contact.user && isAgent(contact.user)) return null\n return {\n contactExtId: contact.external_id,\n user: contact.user ?? null,\n name: contactName(contact),\n email: contactEmail(contact),\n }\n}\n\nfunction userCandidate(\n user: UserResponse,\n section: CallCandidate['section'],\n status: CallCandidateStatus,\n contactExtId: string | null = null\n): CallCandidate {\n const ringable = status !== 'ring' || !!user.encryption_public_key\n return {\n id: user.external_id,\n name: getUserDisplayName(user) || user.email,\n email: user.email ?? null,\n section,\n status: ringable ? status : 'unavailable',\n reason: ringable ? undefined : NO_KEY_REASON,\n user,\n contactExtId,\n }\n}\n\nexport function buildCallCandidates(opts: {\n scope: CallPickerScope\n /** `workspace` / `contacts`: the workspace's members; `chat`: the chat's members. */\n members: UserResponse[]\n /** `contacts` only: my contacts to offer (the people search's hits). */\n contacts?: CallContact[]\n /** `contacts` only: my contact id for a workspace member, null when they are not my contact. */\n contactIdOf?: (user: UserResponse) => string | null\n me: string | null | undefined\n}): CallCandidate[] {\n const seen = new Set<string>()\n const out: CallCandidate[] = []\n const add = (c: CallCandidate) => {\n if (seen.has(c.id)) return\n seen.add(c.id)\n out.push(c)\n }\n const people = (users: UserResponse[]) =>\n users.filter((u) => !isAgent(u) && u.external_id !== opts.me)\n\n if (opts.scope !== 'contacts') {\n for (const u of people(opts.members)) add(userCandidate(u, 'members', 'ring'))\n return out\n }\n\n const contacts = (opts.contacts ?? []).filter((c) => !(c.user && isAgent(c.user)))\n const contactOf = new Map(\n contacts.filter((c) => c.user).map((c) => [c.user!.external_id, c.contactExtId] as const)\n )\n // Members of the current workspace first: pickable once they are my contacts.\n for (const u of people(opts.members)) {\n const contactId = contactOf.get(u.external_id) ?? opts.contactIdOf?.(u) ?? null\n add(userCandidate(u, 'members', contactId ? 'ring' : 'add-contact', contactId))\n }\n for (const c of contacts) {\n if (c.user) {\n if (c.user.external_id === opts.me) continue\n add(userCandidate(c.user, 'contacts', 'ring', c.contactExtId))\n continue\n }\n const status: CallCandidateStatus = c.email ? 'invite' : 'unavailable'\n add({\n id: c.contactExtId,\n name: c.name,\n email: c.email,\n section: 'contacts',\n status,\n reason: c.email ? INVITE_LINK_HINT : NO_EMAIL_REASON,\n user: null,\n contactExtId: c.contactExtId,\n })\n }\n return out\n}\n\n/** Whether a candidate can be ticked. */\nexport function isPickable(c: CallCandidate): boolean {\n return c.status === 'ring' || c.status === 'invite'\n}\n\n/** Case-insensitive match on name or e-mail. */\nexport function matchesQuery(c: CallCandidate, query: string): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return true\n return c.name.toLowerCase().includes(q) || (c.email ?? '').toLowerCase().includes(q)\n}\n","/**\n * Pick who a call rings — one picker for every way a call starts:\n *\n * - `workspace` (thread call): members of the thread's own workspace, nobody ticked by default;\n * - `chat` (a group's call): the group's members (the caller decides who is pre-ticked);\n * - `contacts` (\"New call\", or adding people to a running call): members of the current\n * workspace first, then my contacts matching the search (the one people search). Only contacts can be picked; \"Add contact…\" creates\n * one inline (and sends the platform invitation) and ticks it. Registered contacts are rung;\n * unregistered ones are marked \"will get an invitation to create an ARBI account and join\" and\n * get a personal invite link by e-mail.\n *\n * With `callExtId` (a running call I host) the invitations already sent are listed with \"Revoke\".\n * Agents are never offered. The rules live in `call-people.ts`.\n */\n\nimport {\n useCallInviteLinks,\n useCreateContact,\n useRevokeCallInviteLink,\n useWorkspaces,\n type CallInviteContact,\n usePeople,\n usePeopleSearch,\n type UserResponse,\n} from '@arbidocs/react'\nimport { useEffect, useMemo, useState, type ReactElement } from 'react'\nimport { ArbiApiError, refusalReason } from '@arbidocs/sdk/browser'\nimport { Mail, UserPlus, X } from 'lucide-react'\nimport {\n Button,\n Checkbox,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport {\n buildCallCandidates,\n callContactOf,\n type CallContact,\n isPickable,\n matchesQuery,\n type CallCandidate,\n type CallPickerScope,\n} from './call-people'\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nexport interface CallPeopleSelection {\n /** ARBI users to ring (K sealed to each). */\n ring: UserResponse[]\n /** Unregistered contacts to e-mail a personal invite link. */\n invites: CallInviteContact[]\n}\n\nexport interface CallPeoplePickerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n scope: CallPickerScope\n /** `workspace`: the thread's workspace; `contacts`: the current one (default: the selected one). */\n workspaceExtId?: string | null\n /** `chat`: the chat's members. */\n members?: UserResponse[]\n /** Ticked when the picker opens. */\n preselected?: string[]\n title?: string\n description?: string\n actionLabel?: string\n /** A running call I host: list its invitations (with revoke). */\n callExtId?: string | null\n /** Start / invite. A rejection keeps the picker open. */\n onSubmit: (selection: CallPeopleSelection) => Promise<unknown>\n}\n\nconst COPY: Record<CallPickerScope, { title: string; description: string; action: string }> = {\n workspace: {\n title: 'Call thread members',\n description:\n 'Only members of this thread’s workspace can join. Pick who to ring — or nobody, and share the call from the thread.',\n action: 'Start call',\n },\n chat: {\n title: 'Call the group',\n description: 'The people you pick are rung.',\n action: 'Start call',\n },\n contacts: {\n title: 'New call',\n description:\n 'Your contacts with an ARBI account are rung. Others get an invitation to create an account and join.',\n action: 'Start call',\n },\n}\n\nfunction CandidateRow({\n candidate,\n checked,\n onToggle,\n onAddContact,\n adding,\n}: {\n candidate: CallCandidate\n checked: boolean\n onToggle: () => void\n onAddContact: () => void\n adding: boolean\n}) {\n const pickable = isPickable(candidate)\n const hint =\n candidate.status === 'invite'\n ? candidate.reason\n : candidate.status === 'add-contact'\n ? 'Not in your contacts'\n : undefined\n const row = (\n <li\n className={cn(\n 'flex items-center gap-3 rounded-md px-2 py-1.5',\n pickable ? 'hover:bg-muted' : 'opacity-60'\n )}\n data-testid={`call-picker-row-${candidate.id}`}\n data-status={candidate.status}\n aria-disabled={!pickable || undefined}\n >\n <Checkbox\n checked={checked}\n disabled={!pickable}\n onCheckedChange={onToggle}\n aria-label={`Invite ${candidate.name}`}\n data-testid={`call-picker-check-${candidate.id}`}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">{candidate.name}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {candidate.email}\n {hint && (\n <span className=\"ml-1 inline-flex items-center gap-1\">\n {candidate.status === 'invite' && <Mail className=\"size-3\" aria-hidden />}\n {candidate.email ? `· ${hint}` : hint}\n </span>\n )}\n </span>\n </span>\n {candidate.status === 'add-contact' && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={adding}\n onClick={onAddContact}\n data-testid={`call-picker-add-${candidate.id}`}\n >\n <UserPlus className=\"mr-1 size-3.5\" />\n Add contact\n </Button>\n )}\n </li>\n )\n if (candidate.status !== 'unavailable' || !candidate.reason) return row\n return (\n <Tooltip>\n <TooltipTrigger asChild>{row}</TooltipTrigger>\n <TooltipContent>\n <p>{candidate.reason}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n\nfunction InviteLinks({ callExtId }: { callExtId: string }) {\n const { notify } = useBlocksEnvironment()\n const revokeLink = useRevokeCallInviteLink(callExtId)\n const { data: invites = [] } = useCallInviteLinks(callExtId)\n const live = invites.filter((i: calls.CallInviteLinkResponse) => !i.revoked_at)\n if (!live.length) return null\n const revoke = async (id: string) => {\n try {\n await revokeLink(id)\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not revoke the link', 'error')\n }\n }\n return (\n <section className=\"flex flex-col gap-1\" data-testid=\"call-picker-invite-links\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">Invitations sent</h3>\n <ul className=\"flex flex-col gap-1\">\n {live.map((invite) => (\n <li key={invite.external_id} className=\"flex items-center gap-2 text-sm\">\n <Mail className=\"size-3.5 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\">{invite.email}</span>\n {invite.used_at && <span className=\"text-xs text-muted-foreground\">joined</span>}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void revoke(invite.external_id)}\n data-testid={`call-picker-revoke-${invite.external_id}`}\n >\n <X className=\"mr-1 size-3.5\" />\n Revoke\n </Button>\n </li>\n ))}\n </ul>\n </section>\n )\n}\n\nexport function CallPeoplePicker({\n open,\n onOpenChange,\n scope,\n workspaceExtId,\n members: chatMembers = [],\n preselected = [],\n title,\n description,\n actionLabel,\n callExtId,\n onSubmit,\n}: CallPeoplePickerProps): ReactElement {\n const { notify } = useBlocksEnvironment()\n const createContact = useCreateContact()\n const { userId: me, workspaceId: selectedWorkspaceId } = useConnectedWorkspace()\n const { data: workspaces = [] } = useWorkspaces({ enabled: scope !== 'chat' })\n const [picked, setPicked] = useState<Set<string>>(() => new Set(preselected))\n const [query, setQuery] = useState('')\n const [newEmail, setNewEmail] = useState<string | null>(null)\n const [newName, setNewName] = useState('')\n const [adding, setAdding] = useState(false)\n const [busy, setBusy] = useState(false)\n // Contacts added here (the search may not have them yet).\n const [added, setAdded] = useState<CallContact[]>([])\n const { byEmail } = usePeople()\n const { people: hits } = usePeopleSearch(open && scope === 'contacts' ? query : '')\n\n const preselectedKey = preselected.join(',')\n useEffect(() => {\n if (open) setPicked(new Set(preselectedKey ? preselectedKey.split(',') : []))\n }, [open, preselectedKey])\n\n const workspaceId = workspaceExtId ?? (scope === 'contacts' ? selectedWorkspaceId : null)\n const workspaceMembers = useMemo(\n () => (workspaces.find((w) => w.external_id === workspaceId)?.users ?? []).map((wu) => wu.user),\n [workspaces, workspaceId]\n )\n const candidates = useMemo(() => {\n // Only my contacts can be picked: the hits that are contacts, and anyone added here.\n const found: CallContact[] = hits.flatMap((p) =>\n p.contactId ? [{ contactExtId: p.contactId, user: p.user, name: p.name, email: p.email }] : []\n )\n return buildCallCandidates({\n scope,\n members: scope === 'chat' ? chatMembers : workspaceMembers,\n contacts: [...added, ...found],\n contactIdOf: (u) => byEmail(u.email)?.contactId ?? null,\n me,\n })\n }, [scope, chatMembers, workspaceMembers, hits, added, byEmail, me])\n const shown = candidates.filter((c) => matchesQuery(c, query))\n const copy = COPY[scope]\n\n const toggle = (id: string) =>\n setPicked((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n\n /**\n * Add a contact (and send the platform invitation), then tick it. `name` (optional) is kept as the\n * contact card's name, so the invitation and the call title show it instead of the e-mail.\n */\n const addContact = async (email: string, name?: string) => {\n setAdding(true)\n try {\n const cardName = name?.trim()\n const contact = await createContact.mutateAsync({\n email,\n invite: true,\n ...(cardName ? { card: { name: cardName, emails: [{ email }] } } : {}),\n })\n if (contact.status === 'failed') {\n throw new Error(contact.outcome_detail || 'Could not add the contact')\n }\n const added = callContactOf(contact)\n if (added) setAdded((prev) => [...prev, added])\n const id = contact.user?.external_id ?? contact.external_id\n const pickable = contact.user ? !!contact.user.encryption_public_key : !!added?.email\n if (id && pickable) setPicked((prev) => new Set(prev).add(id))\n setNewEmail(null)\n setNewName('')\n } catch (err) {\n notify(\n err instanceof ArbiApiError\n ? refusalReason(err, 'Could not add the contact')\n : err instanceof Error\n ? err.message\n : 'Could not add the contact',\n 'error'\n )\n } finally {\n setAdding(false)\n }\n }\n\n const submit = async () => {\n if (busy) return\n const chosen = candidates.filter((c) => picked.has(c.id) && isPickable(c))\n setBusy(true)\n try {\n await onSubmit({\n ring: chosen.filter((c) => c.status === 'ring' && c.user).map((c) => c.user!),\n invites: chosen\n .filter((c) => c.status === 'invite' && c.contactExtId)\n .map((c) => ({ contactExtId: c.contactExtId!, name: c.name })),\n })\n onOpenChange(false)\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Something went wrong', 'error')\n } finally {\n setBusy(false)\n }\n }\n\n const sections: { id: CallCandidate['section']; label: string }[] =\n scope === 'contacts'\n ? [\n { id: 'members', label: 'Workspace members' },\n { id: 'contacts', label: 'Contacts' },\n ]\n : [{ id: 'members', label: scope === 'chat' ? 'Members' : 'Workspace members' }]\n const count = candidates.filter((c) => picked.has(c.id) && isPickable(c)).length\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"call-people-picker\">\n <DialogHeader>\n <DialogTitle>{title ?? copy.title}</DialogTitle>\n <DialogDescription>{description ?? copy.description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex min-h-0 flex-col gap-3\">\n <Input\n placeholder=\"Search people\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n aria-label=\"Search people\"\n data-testid=\"call-picker-search\"\n />\n <div className=\"max-h-80 overflow-y-auto\">\n {sections.map((section) => {\n const rows = shown.filter((c) => c.section === section.id)\n if (!rows.length) return null\n return (\n <section key={section.id} className=\"mb-2\">\n <h3 className=\"px-2 pb-1 text-xs font-medium text-muted-foreground\">\n {section.label}\n </h3>\n <ul data-testid={`call-picker-section-${section.id}`}>\n {rows.map((c) => (\n <CandidateRow\n key={c.id}\n candidate={c}\n checked={picked.has(c.id)}\n onToggle={() => toggle(c.id)}\n adding={adding}\n onAddContact={() => c.email && void addContact(c.email)}\n />\n ))}\n </ul>\n </section>\n )\n })}\n {!shown.length && (\n <p className=\"px-2 py-3 text-sm text-muted-foreground\">\n {scope === 'contacts' && !query.trim()\n ? 'Search your contacts by name or e-mail.'\n : candidates.length\n ? 'Nobody matches.'\n : 'Nobody to call here yet.'}\n </p>\n )}\n </div>\n {scope === 'contacts' &&\n (newEmail === null ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"self-start\"\n onClick={() => setNewEmail(EMAIL_RE.test(query.trim()) ? query.trim() : '')}\n data-testid=\"call-picker-add-contact\"\n >\n <UserPlus className=\"mr-1 size-4\" />\n Add contact…\n </Button>\n ) : (\n <form\n className=\"flex flex-wrap items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (EMAIL_RE.test(newEmail.trim())) void addContact(newEmail.trim(), newName)\n }}\n >\n <Input\n className=\"min-w-[8rem] flex-1\"\n placeholder=\"Name (optional)\"\n value={newName}\n maxLength={200}\n onChange={(e) => setNewName(e.target.value)}\n aria-label=\"New contact's name\"\n autoComplete=\"off\"\n data-testid=\"call-picker-new-name\"\n />\n <Input\n className=\"min-w-[10rem] flex-1\"\n type=\"email\"\n autoFocus\n placeholder=\"name@example.com\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n aria-label=\"New contact's e-mail\"\n data-testid=\"call-picker-new-email\"\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={adding || !EMAIL_RE.test(newEmail.trim())}\n data-testid=\"call-picker-new-submit\"\n >\n Add\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setNewEmail(null)\n setNewName('')\n }}\n >\n Cancel\n </Button>\n </form>\n ))}\n {callExtId && scope === 'contacts' && <InviteLinks callExtId={callExtId} />}\n <p className=\"text-xs text-muted-foreground\">Agents can’t join calls.</p>\n </div>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} disabled={busy}>\n Cancel\n </Button>\n <Button onClick={() => void submit()} disabled={busy} data-testid=\"call-picker-submit\">\n {busy ? 'Working…' : `${actionLabel ?? copy.action}${count ? ` (${count})` : ''}`}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Call button for an open group chat: the group's call (the group is its meeting chat). The\n * members picker opens with everyone ticked; only the people left ticked are rung.\n */\n\nimport {\n useArbi,\n chatLiveCallId,\n useCallSession,\n openCall,\n startChatCall,\n useCanHostCalls,\n type UserResponse,\n} from '@arbidocs/react'\nimport { isAgent } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { StartCallButton } from './StartCallButton'\nimport { CallPeoplePicker } from './CallPeoplePicker'\n\nexport function GroupCallButton({\n chatExtId,\n title,\n members,\n}: {\n chatExtId: string\n title: string | null\n members: UserResponse[]\n}): ReactElement {\n const arbi = useArbi()\n const { userId: me } = useConnectedWorkspace()\n const liveCallId = useCallSession((s) => chatLiveCallId(s, chatExtId))\n const isLive = liveCallId !== null\n const canHost = useCanHostCalls()\n const [picking, setPicking] = useState(false)\n const others = members.filter((u) => u.external_id !== me && !isAgent(u))\n\n return (\n <>\n <StartCallButton\n onStart={async () => {\n // Someone who may not host opens the running call itself (a new create would make them its host).\n if (liveCallId && !canHost) return openCall(arbi, { callExtId: liveCallId })\n if (isLive) return startChatCall(arbi, { chatExtId, title, ring: [] })\n setPicking(true)\n return true\n }}\n isLive={isLive}\n label=\"Call the group\"\n testId=\"group-call-button\"\n />\n {picking && (\n <CallPeoplePicker\n open\n onOpenChange={setPicking}\n scope=\"chat\"\n members={others}\n preselected={others.map((u) => u.external_id)}\n onSubmit={async ({ ring }) => {\n await startChatCall(arbi, { chatExtId, title, ring })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * \"New call\" — a call with people from my contacts (no thread or chat). Registered contacts are\n * rung; unregistered ones get a personal invite link by e-mail (register, then join). Its meeting chat is made on first\n * use. Renders nothing unless the person may host calls (server + Settings → Experimental + entitlement).\n */\n\nimport { useArbi, useCallSession, useCanHostCalls, startContactsCall } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { DmInviteChip } from '../../collaboration/direct-messages/DirectMessages'\nimport { CallPeoplePicker } from './CallPeoplePicker'\nimport { contactsCallTitle } from '../call-cards'\n\nexport function NewCallChip(): ReactElement | null {\n // Gate first so a deployment without calls pays for none of the hooks below.\n return useCanHostCalls() ? <EnabledNewCallChip /> : null\n}\n\nfunction EnabledNewCallChip(): ReactElement {\n const arbi = useArbi()\n const inCall = useCallSession((s) => s.active !== null)\n const [open, setOpen] = useState(false)\n return (\n <>\n <DmInviteChip\n testId=\"dm-new-call-chip\"\n title=\"New call\"\n description={inCall ? 'You are already in a call' : 'Call people from your contacts'}\n onClick={() => !inCall && setOpen(true)}\n />\n {open && (\n <CallPeoplePicker\n open\n onOpenChange={setOpen}\n scope=\"contacts\"\n onSubmit={async ({ ring, invites }) => {\n await startContactsCall(arbi, {\n title: contactsCallTitle([\n ...ring.map((u) => getUserDisplayName(u)),\n ...invites.map((g) => g.name),\n ]),\n ring,\n invites,\n })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * \"Schedule call\": one scheduling system — the calendar. Opens the calendar's event editor prefilled with the\n * context's people (a shared thread's workspace members, or a DM peer), the thread linked, and \"Add ARBI call\"\n * ticked; saving makes the event and its ARBI call (key sealed to the ARBI attendees). The calendar opens\n * where the host shows it (`BlocksEnvironment.openCalendar`).\n */\nimport { CalendarPlus } from 'lucide-react'\nimport { Button, cn, getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport {\n useCanHostCalls,\n useConversationItems,\n useWorkspaces,\n type UserResponse,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { requestCalendarComposer } from '../../connection/calendar/store'\n\nexport interface ScheduleCallButtonProps {\n /** A thread: its workspace members are invited when the thread is shared. */\n conversationId?: string | null\n /** A DM peer to invite. */\n peer?: UserResponse | null\n /** `icon` for headers, `label` for a text button. */\n variant?: 'icon' | 'label'\n className?: string\n}\n\nexport function ScheduleCallButton({\n conversationId,\n peer,\n variant = 'icon',\n className,\n}: ScheduleCallButtonProps) {\n // Scheduling a call is hosting it.\n const callsEnabled = useCanHostCalls()\n const { conversations } = useConversationItems()\n const { data: workspaces = [] } = useWorkspaces()\n const { workspaceId: selectedWorkspaceId, userId: me } = useConnectedWorkspace()\n const { openCalendar } = useBlocksEnvironment()\n if (!callsEnabled) return null\n\n const open = () => {\n const conversation = conversationId\n ? conversations?.find((c) => c.external_id === conversationId)\n : undefined\n let people: UserResponse[] = []\n if (peer) people = [peer]\n else if (conversation?.is_shared) {\n const workspace = workspaces.find((w) => w.external_id === selectedWorkspaceId)\n people = (workspace?.users ?? []).map((wu) => wu.user as UserResponse)\n }\n requestCalendarComposer({\n title: peer\n ? `Call with ${getUserDisplayName(peer) || peer.email}`\n : (conversation?.title ?? ''),\n conversationId: conversationId ?? null,\n attendees: people\n .filter((u) => !isAgent(u) && u.external_id !== me)\n .map((u) => ({\n email: u.email,\n user_id: u.external_id,\n name: getUserDisplayName(u) || null,\n })),\n addCall: true,\n })\n openCalendar()\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={variant === 'icon' ? 'icon' : 'sm'}\n className={cn(variant === 'icon' && 'size-8', className)}\n onClick={open}\n aria-label=\"Schedule call\"\n title=\"Schedule call\"\n data-testid=\"schedule-call-button\"\n >\n <CalendarPlus className=\"size-4\" />\n {variant === 'label' && <span className=\"ml-1.5\">Schedule call</span>}\n </Button>\n )\n}\n","/**\n * A conversation's messages as its thread shows them: in a call's meeting thread, a recording's\n * transcript supersedes the live lines spoken while it recorded (else both would show).\n */\nimport { useMemo } from 'react'\nimport {\n hasRecordingTranscript,\n supersedeLiveTranscript,\n threadTranscriptRef,\n useRecordingWindows,\n} from '@arbidocs/react'\nimport type { ChatMessage } from '@arbidocs/sdk/browser'\n\nexport function useMeetingThreadMessages(\n meetingCallExtId: string | null,\n messageHistory: ChatMessage[]\n): ChatMessage[] {\n const hasRecTranscript = useMemo(\n () => !!meetingCallExtId && hasRecordingTranscript(messageHistory, threadTranscriptRef),\n [meetingCallExtId, messageHistory]\n )\n const recordingWindows = useRecordingWindows(meetingCallExtId, hasRecTranscript)\n return useMemo(\n () =>\n hasRecTranscript\n ? supersedeLiveTranscript(messageHistory, threadTranscriptRef, recordingWindows)\n : messageHistory,\n [hasRecTranscript, messageHistory, recordingWindows]\n )\n}\n","/**\n * Call button for the open thread — shared threads only. A thread call is locked to the thread's\n * workspace and logged in the thread (a log card). The button opens a members-only picker with\n * nobody ticked: only the members picked are rung (never the whole workspace). While the thread's\n * call is live, the button joins it instead.\n */\n\nimport {\n useArbi,\n threadLiveCallId,\n useCallSession,\n useCanHostCalls,\n openCall,\n startThreadCall,\n} from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { useConnectedConversations } from '../../connection/workspaceData'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { StartCallButton } from './StartCallButton'\nimport { CallPeoplePicker } from './CallPeoplePicker'\n\nexport function ThreadCallButton({\n conversationId,\n}: {\n conversationId: string\n}): ReactElement | null {\n const arbi = useArbi()\n const { data: conversations } = useConnectedConversations()\n // The conversation list is the workspace open in this session: the thread's own workspace.\n const { workspaceId: workspaceExtId } = useConnectedWorkspace()\n const liveCallId = useCallSession((s) => threadLiveCallId(s, conversationId))\n const isLive = liveCallId !== null\n const canHost = useCanHostCalls()\n const [picking, setPicking] = useState(false)\n const conversation = conversations.find((c) => c.external_id === conversationId)\n if (!conversation?.is_shared) return null\n const title = conversation.title ?? null\n\n return (\n <>\n <StartCallButton\n onStart={async () => {\n // Live: join the thread's running call (get-or-create), ringing nobody. Someone who may not host\n // opens that call directly: get-or-create would make them the host of a new one.\n if (liveCallId && !canHost) return openCall(arbi, { callExtId: liveCallId })\n if (isLive) return startThreadCall(arbi, { threadExtId: conversationId, title, ring: [] })\n setPicking(true)\n return true\n }}\n isLive={isLive}\n label=\"Call thread members\"\n testId=\"thread-call-button\"\n />\n {picking && (\n <CallPeoplePicker\n open\n onOpenChange={setPicking}\n scope=\"workspace\"\n workspaceExtId={workspaceExtId}\n onSubmit={async ({ ring }) => {\n await startThreadCall(arbi, { threadExtId: conversationId, title, ring })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * \"Save transcript to thread\" in a WORKSPACE meeting thread (a thread call's meeting chat): for the\n * call's creator, the thread's `transcript_segment` comments are posted as one attributed transcript\n * comment into another thread they pick. Renders nothing for anyone else or without a transcript.\n */\n\nimport { useMemo, type ReactElement } from 'react'\nimport { useCall, useWorkspaceUsers, threadTranscriptLines } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\nimport { SaveTranscriptToThread } from './SaveTranscriptToThread'\n\nexport function MeetingThreadTranscriptAction({\n conversationExtId,\n meetingCallExtId,\n title,\n messages,\n}: {\n conversationExtId: string\n /** The thread's call (`meeting_call_ext_id`), or null when it is not a meeting thread. */\n meetingCallExtId: string | null | undefined\n title: string | null | undefined\n messages: { content?: string | null; created_at?: string | null; tools?: unknown }[]\n}): ReactElement | null {\n const { data: call } = useCall(meetingCallExtId)\n const { data: workspaceUsers = [] } = useWorkspaceUsers()\n const lines = useMemo(\n () =>\n threadTranscriptLines(messages, (id) => {\n const user = workspaceUsers.find((wu) => wu.user.external_id === id)?.user\n return user ? getUserDisplayName(user) : null\n }),\n [messages, workspaceUsers]\n )\n if (!meetingCallExtId || !call?.is_creator) return null\n return (\n <SaveTranscriptToThread\n title={title}\n lines={lines}\n excludeConversationExtId={conversationExtId}\n iconOnly\n />\n )\n}\n","/**\n * \"Recordings\" in a WORKSPACE meeting thread (a thread call's meeting chat): the call's recordings\n * in a dialog — for members of the thread's workspace (the recordings are under its key). A\n * recording link (`/<wrk>/<con>?recording=<crc>`) opens it.\n */\n\nimport { useEffect, useState, type ReactElement } from 'react'\nimport { Disc } from 'lucide-react'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { usePendingRecording } from '../recording-link'\nimport { HeaderAction } from '../HeaderAction'\nimport { RecordingsList } from './RecordingCard'\n\nexport function MeetingThreadRecordingsAction({\n meetingCallExtId,\n title,\n}: {\n /** The thread's call (`meeting_call_ext_id`). */\n meetingCallExtId: string\n title: string | null | undefined\n}): ReactElement {\n const [open, setOpen] = useState(false)\n const pending = usePendingRecording()\n useEffect(() => {\n if (pending) setOpen(true)\n }, [pending])\n return (\n <>\n <HeaderAction\n label=\"Recordings\"\n icon={<Disc className=\"size-3.5\" aria-hidden />}\n // Icon only, the label in a tooltip: in a crowded header the thread's title keeps the room.\n iconOnly\n onClick={() => setOpen(true)}\n testId=\"meeting-recordings\"\n />\n {open && (\n <Dialog open onOpenChange={(o) => !o && setOpen(false)}>\n <DialogContent className=\"sm:max-w-2xl\" data-testid=\"meeting-recordings-dialog\">\n <DialogHeader>\n <DialogTitle>Recordings</DialogTitle>\n <DialogDescription>\n Recordings of this meeting, encrypted under the workspace key. Playing or\n downloading one decrypts it in this browser.\n </DialogDescription>\n </DialogHeader>\n <RecordingsList\n callExtId={meetingCallExtId}\n title={title}\n className=\"max-h-[60vh] overflow-y-auto\"\n />\n </DialogContent>\n </Dialog>\n )}\n </>\n )\n}\n","/**\n * The call actions of the open conversation (`ConnectedConversationPage`), for the host's header: call\n * the thread's members (or join its live call), schedule a call, and in a meeting thread the host's\n * \"Save transcript to thread\" and the meeting's Recordings. Renders nothing without an open\n * conversation; each action hides itself when calls are off or it does not apply.\n */\n\nimport { useMemo, type ReactElement } from 'react'\nimport { useArbiSessionState, useConversationData, useConversationItems } from '@arbidocs/react'\nimport { useMeetingThreadMessages } from '../../connection/conversation/useMeetingThreadMessages'\nimport { ThreadCallButton } from './ThreadCallButton'\nimport { ScheduleCallButton } from './ScheduleCallButton'\nimport { MeetingThreadTranscriptAction } from './MeetingThreadTranscriptAction'\nimport { MeetingThreadRecordingsAction } from './MeetingThreadRecordingsAction'\n\nexport function ConnectedConversationCallActions(): ReactElement | null {\n const conversationId = useArbiSessionState((state) => state.conversationId)\n const { conversations } = useConversationItems()\n const conversation = conversationId\n ? conversations.find((c) => c.external_id === conversationId)\n : undefined\n const meetingCallExtId = conversation?.meeting_call_ext_id ?? null\n const { messageHistory } = useConversationData()\n // Its transcript lines (a recording's transcript supersedes the live ones), for the host's save.\n const threadMessages = useMeetingThreadMessages(meetingCallExtId, messageHistory)\n const meetingMessages = useMemo(\n () =>\n meetingCallExtId\n ? threadMessages.map((m) => ({\n content: m.content,\n created_at: m.created_at,\n tools: m.tools ?? m.meta?.tools,\n }))\n : [],\n [meetingCallExtId, threadMessages]\n )\n if (!conversationId) return null\n return (\n <>\n <ThreadCallButton conversationId={conversationId} />\n <ScheduleCallButton conversationId={conversationId} />\n {meetingCallExtId && (\n <MeetingThreadTranscriptAction\n conversationExtId={conversationId}\n meetingCallExtId={meetingCallExtId}\n title={conversation?.title}\n messages={meetingMessages}\n />\n )}\n {meetingCallExtId && (\n <MeetingThreadRecordingsAction\n meetingCallExtId={meetingCallExtId}\n title={conversation?.title}\n />\n )}\n </>\n )\n}\n"]}
@@ -2,44 +2,68 @@
2
2
  import { SPEAKING_LEVEL, nextSpotlight, INITIAL_SPOTLIGHT } from './chunk-H773F7OR.js';
3
3
  import { useSyncExternalStore } from 'react';
4
4
 
5
+ var status = { callExtId: null, transcribing: false };
6
+ var listeners = /* @__PURE__ */ new Set();
7
+ function publishCallStatus(next) {
8
+ if (next.callExtId === status.callExtId && next.transcribing === status.transcribing) return;
9
+ status = next;
10
+ listeners.forEach((fn) => fn());
11
+ }
12
+ function subscribe(fn) {
13
+ listeners.add(fn);
14
+ return () => listeners.delete(fn);
15
+ }
16
+ function useMyCallStatus(callExtId) {
17
+ const inCall = useSyncExternalStore(
18
+ subscribe,
19
+ () => !!callExtId && status.callExtId === callExtId,
20
+ () => false
21
+ );
22
+ const transcribing = useSyncExternalStore(
23
+ subscribe,
24
+ () => !!callExtId && status.callExtId === callExtId && status.transcribing,
25
+ () => false
26
+ );
27
+ return { inCall, transcribing };
28
+ }
5
29
  var LEVEL_TICK_MS = 60;
6
30
  var SPEAKING_RELEASE_MS = 350;
7
31
  var EMPTY = { levels: {}, speaking: [], spotlight: null };
8
32
  var snapshot = EMPTY;
9
- var listeners = /* @__PURE__ */ new Set();
33
+ var listeners2 = /* @__PURE__ */ new Set();
10
34
  function publish(next) {
11
35
  snapshot = next;
12
- listeners.forEach((fn) => fn());
36
+ listeners2.forEach((fn) => fn());
13
37
  }
14
- function subscribe(fn) {
15
- listeners.add(fn);
16
- return () => listeners.delete(fn);
38
+ function subscribe2(fn) {
39
+ listeners2.add(fn);
40
+ return () => listeners2.delete(fn);
17
41
  }
18
42
  var get = () => snapshot;
19
43
  function useVoiceLevel(identity) {
20
44
  return useSyncExternalStore(
21
- subscribe,
45
+ subscribe2,
22
46
  () => identity ? get().levels[identity] ?? 0 : 0,
23
47
  () => 0
24
48
  );
25
49
  }
26
50
  function useVoiceLevels() {
27
51
  return useSyncExternalStore(
28
- subscribe,
52
+ subscribe2,
29
53
  () => get().levels,
30
54
  () => EMPTY.levels
31
55
  );
32
56
  }
33
57
  function useIsSpeaking(identity) {
34
58
  return useSyncExternalStore(
35
- subscribe,
59
+ subscribe2,
36
60
  () => identity ? get().speaking.includes(identity) : false,
37
61
  () => false
38
62
  );
39
63
  }
40
64
  function useSpeakingIds() {
41
65
  const key = useSyncExternalStore(
42
- subscribe,
66
+ subscribe2,
43
67
  () => get().speaking.join("\n"),
44
68
  () => ""
45
69
  );
@@ -47,7 +71,7 @@ function useSpeakingIds() {
47
71
  }
48
72
  function useSpotlightId() {
49
73
  return useSyncExternalStore(
50
- subscribe,
74
+ subscribe2,
51
75
  () => get().spotlight,
52
76
  () => null
53
77
  );
@@ -128,31 +152,7 @@ function startVoiceLevels(sources) {
128
152
  publish(EMPTY);
129
153
  };
130
154
  }
131
- var status = { callExtId: null, transcribing: false };
132
- var listeners2 = /* @__PURE__ */ new Set();
133
- function publishCallStatus(next) {
134
- if (next.callExtId === status.callExtId && next.transcribing === status.transcribing) return;
135
- status = next;
136
- listeners2.forEach((fn) => fn());
137
- }
138
- function subscribe2(fn) {
139
- listeners2.add(fn);
140
- return () => listeners2.delete(fn);
141
- }
142
- function useMyCallStatus(callExtId) {
143
- const inCall = useSyncExternalStore(
144
- subscribe2,
145
- () => !!callExtId && status.callExtId === callExtId,
146
- () => false
147
- );
148
- const transcribing = useSyncExternalStore(
149
- subscribe2,
150
- () => !!callExtId && status.callExtId === callExtId && status.transcribing,
151
- () => false
152
- );
153
- return { inCall, transcribing };
154
- }
155
155
 
156
156
  export { LEVEL_TICK_MS, publishCallStatus, startVoiceLevels, useIsSpeaking, useMyCallStatus, useSpeakingIds, useSpotlightId, useVoiceLevel, useVoiceLevels };
157
- //# sourceMappingURL=chunk-CHQMVIHR.js.map
158
- //# sourceMappingURL=chunk-CHQMVIHR.js.map
157
+ //# sourceMappingURL=chunk-LPGBRMYS.js.map
158
+ //# sourceMappingURL=chunk-LPGBRMYS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/calls/call-status.ts","../src/calls/voice-levels.ts"],"names":["listeners","subscribe","useSyncExternalStore","prev","id"],"mappings":"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","file":"chunk-LPGBRMYS.js","sourcesContent":["/**\n * The call I am in, as the rest of the app needs it (its conversation's empty state and\n * provisional transcript rows): which call, and whether it is being transcribed. Published by the\n * call room; plain data, no LiveKit.\n */\n\nimport { useSyncExternalStore } from 'react'\n\ninterface CallStatus {\n callExtId: string | null\n transcribing: boolean\n}\n\nlet status: CallStatus = { callExtId: null, transcribing: false }\nconst listeners = new Set<() => void>()\n\nexport function publishCallStatus(next: CallStatus): void {\n if (next.callExtId === status.callExtId && next.transcribing === status.transcribing) return\n status = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\n/** Whether I am in this call, and whether it is transcribed. */\nexport function useMyCallStatus(callExtId: string | null | undefined): {\n inCall: boolean\n transcribing: boolean\n} {\n const inCall = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId,\n () => false\n )\n const transcribing = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId && status.transcribing,\n () => false\n )\n return { inCall, transcribing }\n}\n","/**\n * Who is talking, fast: each participant's microphone level, measured in this browser from the\n * audio it already plays (WebAudio analysers, ~60 ms), not from the media server's slower\n * active-speaker events. One store for the whole app, so the call panel (rings, spotlight, live\n * speaker list) and the conversation beside it (the transcript line being spoken) agree.\n *\n * The store is plain data; `startVoiceLevels` (used by the call room) feeds it.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport { INITIAL_SPOTLIGHT, SPEAKING_LEVEL, nextSpotlight, type SpotlightState } from './layout'\n\n/** Sampling period. */\nexport const LEVEL_TICK_MS = 60\n/** A voice stays \"speaking\" this long after it drops below the threshold (no flicker between words). */\nconst SPEAKING_RELEASE_MS = 350\n\ninterface Snapshot {\n /** identity → level 0..1, rounded to 0.05. */\n levels: Readonly<Record<string, number>>\n /** Talking now, loudest first. */\n speaking: readonly string[]\n /** The speaker view's spotlight (with hysteresis). */\n spotlight: string | null\n}\n\nconst EMPTY: Snapshot = { levels: {}, speaking: [], spotlight: null }\nlet snapshot: Snapshot = EMPTY\nconst listeners = new Set<() => void>()\n\nfunction publish(next: Snapshot) {\n snapshot = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\nconst get = () => snapshot\n\n/** My voice level (0..1, in 0.05 steps) — re-renders only when it changes. */\nexport function useVoiceLevel(identity: string | null | undefined): number {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? (get().levels[identity] ?? 0) : 0),\n () => 0\n )\n}\n\n/** Everyone's level (re-renders at the level rate: for small lists). */\nexport function useVoiceLevels(): Readonly<Record<string, number>> {\n return useSyncExternalStore(\n subscribe,\n () => get().levels,\n () => EMPTY.levels\n )\n}\n\nexport function useIsSpeaking(identity: string | null | undefined): boolean {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? get().speaking.includes(identity) : false),\n () => false\n )\n}\n\n/** Identities talking now, loudest first (a stable string key, split by the caller). */\nexport function useSpeakingIds(): string[] {\n const key = useSyncExternalStore(\n subscribe,\n () => get().speaking.join('\\n'),\n () => ''\n )\n return key ? key.split('\\n') : []\n}\n\nexport function useSpotlightId(): string | null {\n return useSyncExternalStore(\n subscribe,\n () => get().spotlight,\n () => null\n )\n}\n\n/** A track to measure: whose it is, and its audio. */\nexport interface VoiceSource {\n identity: string\n track: MediaStreamTrack | null\n /** Mic muted / off: level 0 without measuring. */\n muted: boolean\n /** Me: measured (my ring, \"Speaking: … (me)\") but never put in the spotlight. */\n local?: boolean\n}\n\ninterface Meter {\n track: MediaStreamTrack\n source: MediaStreamAudioSourceNode\n analyser: AnalyserNode\n buf: Float32Array<ArrayBuffer>\n}\n\n/**\n * Measure the given sources every {@link LEVEL_TICK_MS} until stopped. `sources()` is read each\n * tick, so the caller can hand over a ref to its current track list.\n */\nexport function startVoiceLevels(sources: () => VoiceSource[]): () => void {\n let ctx: AudioContext | null = null\n try {\n ctx = typeof AudioContext !== 'undefined' ? new AudioContext() : null\n } catch {\n ctx = null\n }\n const meters = new Map<string, Meter>()\n const smoothed = new Map<string, number>()\n const loudAt = new Map<string, number>()\n let spot: SpotlightState = INITIAL_SPOTLIGHT\n\n const meterFor = (s: VoiceSource): Meter | null => {\n if (!ctx || !s.track || s.track.readyState === 'ended') return null\n const have = meters.get(s.identity)\n if (have && have.track === s.track) return have\n have?.source.disconnect()\n try {\n const source = ctx.createMediaStreamSource(new MediaStream([s.track]))\n const analyser = ctx.createAnalyser()\n analyser.fftSize = 512\n source.connect(analyser)\n const m = { track: s.track, source, analyser, buf: new Float32Array(analyser.fftSize) }\n meters.set(s.identity, m)\n return m\n } catch {\n return null\n }\n }\n\n const tick = () => {\n if (ctx?.state === 'suspended') void ctx.resume().catch(() => undefined)\n const now = Date.now()\n const list = sources()\n const seen = new Set<string>()\n const levels: Record<string, number> = {}\n for (const s of list) {\n seen.add(s.identity)\n let raw = 0\n const m = s.muted ? null : meterFor(s)\n if (m) {\n m.analyser.getFloatTimeDomainData(m.buf)\n let sum = 0\n for (let i = 0; i < m.buf.length; i++) sum += m.buf[i] * m.buf[i]\n raw = Math.min(1, Math.sqrt(sum / m.buf.length) * 5)\n }\n // Fast attack, gentle release.\n const prev = smoothed.get(s.identity) ?? 0\n const level = raw >= prev ? raw : prev * 0.8 + raw * 0.2\n smoothed.set(s.identity, level)\n if (level >= SPEAKING_LEVEL) loudAt.set(s.identity, now)\n levels[s.identity] = Math.round(level * 20) / 20\n }\n for (const id of [...meters.keys()]) {\n if (!seen.has(id)) {\n meters.get(id)?.source.disconnect()\n meters.delete(id)\n smoothed.delete(id)\n loudAt.delete(id)\n }\n }\n const speaking = list\n .map((s) => s.identity)\n .filter((id) => now - (loudAt.get(id) ?? -Infinity) <= SPEAKING_RELEASE_MS)\n .sort((a, b) => (smoothed.get(b) ?? 0) - (smoothed.get(a) ?? 0))\n spot = nextSpotlight(spot, Object.fromEntries(smoothed), now, {\n exclude: list.filter((s) => s.local).map((s) => s.identity),\n })\n if (spot.id && !seen.has(spot.id)) spot = INITIAL_SPOTLIGHT\n const prev = snapshot\n const same =\n prev.spotlight === spot.id &&\n prev.speaking.join('\\n') === speaking.join('\\n') &&\n Object.keys(levels).length === Object.keys(prev.levels).length &&\n Object.entries(levels).every(([k, v]) => prev.levels[k] === v)\n if (!same) publish({ levels, speaking, spotlight: spot.id })\n }\n\n const id = setInterval(tick, LEVEL_TICK_MS)\n return () => {\n clearInterval(id)\n for (const m of meters.values()) m.source.disconnect()\n meters.clear()\n void ctx?.close().catch(() => undefined)\n publish(EMPTY)\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZMVF7EYJ_cjs = require('./chunk-ZMVF7EYJ.cjs');
4
+ var chunkPBPO54KZ_cjs = require('./chunk-PBPO54KZ.cjs');
5
5
  var chunk2VJBIBPE_cjs = require('./chunk-2VJBIBPE.cjs');
6
6
  var chunkOZQ26FNK_cjs = require('./chunk-OZQ26FNK.cjs');
7
7
  var chunkIPSHAMO2_cjs = require('./chunk-IPSHAMO2.cjs');
@@ -54,7 +54,7 @@ function DashboardCell({
54
54
  }
55
55
  );
56
56
  }
57
- var RechartsRenderer = react.lazy(() => import('./RechartsRenderer-GIRCW7DB.cjs'));
57
+ var RechartsRenderer = react.lazy(() => import('./RechartsRenderer-THES2SE5.cjs'));
58
58
  var DEFAULT_CHART_RENDERER_LABELS = {
59
59
  showTable: "Show table",
60
60
  showChart: "Show chart",
@@ -79,7 +79,7 @@ function ChartTable({
79
79
  }
80
80
  function Legend({ model, other }) {
81
81
  const pie = model.type === "pie" || model.type === "donut";
82
- const items = pie ? model.categories.map((label, i) => ({ label, color: chunkZMVF7EYJ_cjs.sliceColors(model, other)[i] })) : model.series.map((s) => ({ label: s.label, color: s.color }));
82
+ const items = pie ? model.categories.map((label, i) => ({ label, color: chunkPBPO54KZ_cjs.sliceColors(model, other)[i] })) : model.series.map((s) => ({ label: s.label, color: s.color }));
83
83
  if (!pie && items.length < 2) return null;
84
84
  return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground", children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "inline-flex items-center gap-1.5", children: [
85
85
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -167,7 +167,7 @@ function cellText(value, field, l, formatters) {
167
167
  if (Array.isArray(value)) return value.join(", ");
168
168
  if (typeof value === "boolean") return value ? l.yes : l.no;
169
169
  if (field.type === "number" && typeof value === "number")
170
- return chunkZMVF7EYJ_cjs.formatterOf(field, formatters)(value);
170
+ return chunkPBPO54KZ_cjs.formatterOf(field, formatters)(value);
171
171
  if (field.type === "date" && typeof value === "string") return chunkIPSHAMO2_cjs.fmtDate(value);
172
172
  return String(value);
173
173
  }
@@ -263,7 +263,7 @@ function PanelView({
263
263
  hint,
264
264
  isLoading: state === "loading",
265
265
  accent: metricAccent,
266
- className: "h-full",
266
+ className: ui.cn("h-full", actions && "pt-11"),
267
267
  testId
268
268
  }
269
269
  ),
@@ -356,7 +356,7 @@ function PanelView({
356
356
  );
357
357
  }
358
358
  var PANEL_FORMATTERS = {
359
- ...chunkZMVF7EYJ_cjs.DEFAULT_UNIT_FORMATTERS,
359
+ ...chunkPBPO54KZ_cjs.DEFAULT_UNIT_FORMATTERS,
360
360
  gbp: (v) => react$1.formatGbp(v),
361
361
  bytes: (v) => chunk2VJBIBPE_cjs.formatBytes(v)
362
362
  };
@@ -395,14 +395,14 @@ function SourcePanel({
395
395
  const op = chart.aggregate ?? "count";
396
396
  return {
397
397
  kind: "metric",
398
- value: chunkZMVF7EYJ_cjs.metricValueOf(dataset) ?? (op === "count" || op === "sum" ? 0 : null),
399
- format: chunkZMVF7EYJ_cjs.formatterOf(valueField, formatters)
398
+ value: chunkPBPO54KZ_cjs.metricValueOf(dataset) ?? (op === "count" || op === "sum" ? 0 : null),
399
+ format: chunkPBPO54KZ_cjs.formatterOf(valueField, formatters)
400
400
  };
401
401
  }
402
402
  if (DRAWN.has(chart.type)) {
403
403
  return {
404
404
  kind: "chart",
405
- model: chunkZMVF7EYJ_cjs.chartModelOf({ ...chart, type: chart.type }, dataset, {
405
+ model: chunkPBPO54KZ_cjs.chartModelOf({ ...chart, type: chart.type }, dataset, {
406
406
  fields,
407
407
  formatters,
408
408
  otherLabel: other
@@ -412,7 +412,7 @@ function SourcePanel({
412
412
  if (chart.x) {
413
413
  return {
414
414
  kind: "groups",
415
- model: chunkZMVF7EYJ_cjs.chartModelOf({ ...chart, type: "bar" }, dataset, {
415
+ model: chunkPBPO54KZ_cjs.chartModelOf({ ...chart, type: "bar" }, dataset, {
416
416
  fields,
417
417
  formatters,
418
418
  otherLabel: other
@@ -956,5 +956,5 @@ exports.PANEL_FORMATTERS = PANEL_FORMATTERS;
956
956
  exports.PanelEditor = PanelEditor;
957
957
  exports.PanelView = PanelView;
958
958
  exports.clampPanelWidth = clampPanelWidth;
959
- //# sourceMappingURL=chunk-D35EHOK5.cjs.map
960
- //# sourceMappingURL=chunk-D35EHOK5.cjs.map
959
+ //# sourceMappingURL=chunk-M23W7IID.cjs.map
960
+ //# sourceMappingURL=chunk-M23W7IID.cjs.map