@arbidocs/blocks 0.5.114 → 0.5.116

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 (166) hide show
  1. package/dist/{ConnectedCallDock-2KXEQENS.cjs → ConnectedCallDock-WER7R222.cjs} +21 -21
  2. package/dist/{ConnectedCallDock-2KXEQENS.cjs.map → ConnectedCallDock-WER7R222.cjs.map} +1 -1
  3. package/dist/{ConnectedCallRoom-MU3NPNXF.cjs → ConnectedCallRoom-T7OBQTYP.cjs} +14 -14
  4. package/dist/{ConnectedCallRoom-MU3NPNXF.cjs.map → ConnectedCallRoom-T7OBQTYP.cjs.map} +1 -1
  5. package/dist/{ConnectedNativeDocxComparison-VH3I65H6.cjs → ConnectedNativeDocxComparison-546ILGLW.cjs} +19 -19
  6. package/dist/{ConnectedNativeDocxComparison-VH3I65H6.cjs.map → ConnectedNativeDocxComparison-546ILGLW.cjs.map} +1 -1
  7. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs → ConnectedProductionSetDialog-LHB4VQWC.cjs} +3 -3
  8. package/dist/{ConnectedProductionSetDialog-4EAY6KAZ.cjs.map → ConnectedProductionSetDialog-LHB4VQWC.cjs.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-KQSHCA75.cjs → ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs} +19 -19
  10. package/dist/{ConnectedStreamedWordArtifact-KQSHCA75.cjs.map → ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map} +1 -1
  11. package/dist/{DocumentReviewCard-OCPFVMLD.cjs → DocumentReviewCard-ZSBZBGFK.cjs} +15 -15
  12. package/dist/{DocumentReviewCard-OCPFVMLD.cjs.map → DocumentReviewCard-ZSBZBGFK.cjs.map} +1 -1
  13. package/dist/{FilesViewerDialog-BAGOEMXW.cjs → FilesViewerDialog-6UKR5WEF.cjs} +44 -44
  14. package/dist/{FilesViewerDialog-BAGOEMXW.cjs.map → FilesViewerDialog-6UKR5WEF.cjs.map} +1 -1
  15. package/dist/{NativeDocxEditor-EJEIJDOC.cjs → NativeDocxEditor-2LQY2CTV.cjs} +6 -6
  16. package/dist/{NativeDocxEditor-EJEIJDOC.cjs.map → NativeDocxEditor-2LQY2CTV.cjs.map} +1 -1
  17. package/dist/{WorkspaceTableView-IMAZICIZ.cjs → WorkspaceTableView-J3C6VH4T.cjs} +8 -8
  18. package/dist/{WorkspaceTableView-IMAZICIZ.cjs.map → WorkspaceTableView-J3C6VH4T.cjs.map} +1 -1
  19. package/dist/agents/index.cjs +297 -297
  20. package/dist/{ai-7U4B4CVF.cjs → ai-IM4A23YT.cjs} +24 -24
  21. package/dist/ai-IM4A23YT.cjs.map +1 -0
  22. package/dist/calls/index.cjs +121 -121
  23. package/dist/chat/DraftingDocChip.d.ts +3 -1
  24. package/dist/chat/DraftingDocChip.js +7 -4
  25. package/dist/chat/DraftingDocChip.js.map +2 -2
  26. package/dist/chat/index.cjs +37 -37
  27. package/dist/{chunk-4ED7CNOX.cjs → chunk-2CSLFAGF.cjs} +430 -150
  28. package/dist/chunk-2CSLFAGF.cjs.map +1 -0
  29. package/dist/{chunk-Q6DQGGP4.cjs → chunk-325GVZE6.cjs} +3 -3
  30. package/dist/{chunk-Q6DQGGP4.cjs.map → chunk-325GVZE6.cjs.map} +1 -1
  31. package/dist/{chunk-LFRNBT2I.cjs → chunk-557MJ4IH.cjs} +20 -20
  32. package/dist/{chunk-LFRNBT2I.cjs.map → chunk-557MJ4IH.cjs.map} +1 -1
  33. package/dist/{chunk-JSQQV23D.cjs → chunk-6UTKM5AB.cjs} +3 -3
  34. package/dist/{chunk-JSQQV23D.cjs.map → chunk-6UTKM5AB.cjs.map} +1 -1
  35. package/dist/{chunk-H5OLHP2U.cjs → chunk-7OPOPYV6.cjs} +3 -3
  36. package/dist/{chunk-H5OLHP2U.cjs.map → chunk-7OPOPYV6.cjs.map} +1 -1
  37. package/dist/{chunk-AHT6DQNI.cjs → chunk-B2HNNG25.cjs} +50 -50
  38. package/dist/{chunk-AHT6DQNI.cjs.map → chunk-B2HNNG25.cjs.map} +1 -1
  39. package/dist/{chunk-WW6LXQY6.cjs → chunk-B3LZITVF.cjs} +12 -12
  40. package/dist/{chunk-WW6LXQY6.cjs.map → chunk-B3LZITVF.cjs.map} +1 -1
  41. package/dist/{chunk-V5IMYLYK.cjs → chunk-BQ5RIWWT.cjs} +3 -3
  42. package/dist/{chunk-V5IMYLYK.cjs.map → chunk-BQ5RIWWT.cjs.map} +1 -1
  43. package/dist/{chunk-INEPPS4H.cjs → chunk-COD5ENHK.cjs} +4 -4
  44. package/dist/{chunk-INEPPS4H.cjs.map → chunk-COD5ENHK.cjs.map} +1 -1
  45. package/dist/{chunk-MC4F2URI.cjs → chunk-CPG7II4E.cjs} +28 -28
  46. package/dist/{chunk-MC4F2URI.cjs.map → chunk-CPG7II4E.cjs.map} +1 -1
  47. package/dist/{chunk-7XT5B2DZ.cjs → chunk-CPR6EHG7.cjs} +47 -47
  48. package/dist/{chunk-7XT5B2DZ.cjs.map → chunk-CPR6EHG7.cjs.map} +1 -1
  49. package/dist/{chunk-3U36VYMD.cjs → chunk-DDIW4HLU.cjs} +27 -27
  50. package/dist/{chunk-3U36VYMD.cjs.map → chunk-DDIW4HLU.cjs.map} +1 -1
  51. package/dist/chunk-HB2O4THB.cjs +18 -0
  52. package/dist/{chunk-ZZA756I4.cjs.map → chunk-HB2O4THB.cjs.map} +1 -1
  53. package/dist/{chunk-IFOGBMAE.cjs → chunk-KLMNCBLY.cjs} +9 -6
  54. package/dist/chunk-KLMNCBLY.cjs.map +1 -0
  55. package/dist/{chunk-TDN33HSK.cjs → chunk-KTQOGT2L.cjs} +6 -6
  56. package/dist/{chunk-TDN33HSK.cjs.map → chunk-KTQOGT2L.cjs.map} +1 -1
  57. package/dist/{chunk-UUENH4BJ.cjs → chunk-KXIRVKCJ.cjs} +3 -3
  58. package/dist/{chunk-UUENH4BJ.cjs.map → chunk-KXIRVKCJ.cjs.map} +1 -1
  59. package/dist/{chunk-436I7PQL.cjs → chunk-NIE3N6OM.cjs} +9 -9
  60. package/dist/{chunk-436I7PQL.cjs.map → chunk-NIE3N6OM.cjs.map} +1 -1
  61. package/dist/{chunk-XKDUPU7B.cjs → chunk-NJCK6V6U.cjs} +4 -4
  62. package/dist/{chunk-XKDUPU7B.cjs.map → chunk-NJCK6V6U.cjs.map} +1 -1
  63. package/dist/{chunk-5QUL5BZO.cjs → chunk-NNUK5ZM7.cjs} +4 -4
  64. package/dist/{chunk-5QUL5BZO.cjs.map → chunk-NNUK5ZM7.cjs.map} +1 -1
  65. package/dist/{chunk-4NPCDS2X.cjs → chunk-NY3YUCOW.cjs} +3 -3
  66. package/dist/{chunk-4NPCDS2X.cjs.map → chunk-NY3YUCOW.cjs.map} +1 -1
  67. package/dist/{chunk-6DCIZA3X.cjs → chunk-OEREKAAP.cjs} +75 -75
  68. package/dist/{chunk-6DCIZA3X.cjs.map → chunk-OEREKAAP.cjs.map} +1 -1
  69. package/dist/{chunk-3ODEWSRO.cjs → chunk-P77YTTJ3.cjs} +4 -4
  70. package/dist/{chunk-3ODEWSRO.cjs.map → chunk-P77YTTJ3.cjs.map} +1 -1
  71. package/dist/{chunk-3R6YHJ3G.cjs → chunk-QHOHDNBU.cjs} +6 -6
  72. package/dist/{chunk-3R6YHJ3G.cjs.map → chunk-QHOHDNBU.cjs.map} +1 -1
  73. package/dist/{chunk-LYTIQQQ2.cjs → chunk-R7CJEIA5.cjs} +3 -3
  74. package/dist/{chunk-LYTIQQQ2.cjs.map → chunk-R7CJEIA5.cjs.map} +1 -1
  75. package/dist/{chunk-MGQSLMTC.cjs → chunk-SB4M3ITT.cjs} +239 -85
  76. package/dist/chunk-SB4M3ITT.cjs.map +1 -0
  77. package/dist/{chunk-2W5E62EY.cjs → chunk-SGYSDABK.cjs} +6 -6
  78. package/dist/{chunk-2W5E62EY.cjs.map → chunk-SGYSDABK.cjs.map} +1 -1
  79. package/dist/{chunk-UNDQYTRF.cjs → chunk-T23UTIRI.cjs} +6 -6
  80. package/dist/{chunk-UNDQYTRF.cjs.map → chunk-T23UTIRI.cjs.map} +1 -1
  81. package/dist/{chunk-E4BLRF2L.cjs → chunk-TDO5UWXF.cjs} +5 -5
  82. package/dist/{chunk-E4BLRF2L.cjs.map → chunk-TDO5UWXF.cjs.map} +1 -1
  83. package/dist/{chunk-4IOYQLKG.cjs → chunk-TP5PGWIO.cjs} +3 -3
  84. package/dist/{chunk-4IOYQLKG.cjs.map → chunk-TP5PGWIO.cjs.map} +1 -1
  85. package/dist/{chunk-7X3FS5HQ.cjs → chunk-TT4IF52H.cjs} +35 -35
  86. package/dist/{chunk-7X3FS5HQ.cjs.map → chunk-TT4IF52H.cjs.map} +1 -1
  87. package/dist/{chunk-NHHEMBXQ.cjs → chunk-VGCTYTEW.cjs} +22 -14
  88. package/dist/chunk-VGCTYTEW.cjs.map +1 -0
  89. package/dist/{chunk-HM5L4SBC.cjs → chunk-VKH3BEZE.cjs} +3 -3
  90. package/dist/{chunk-HM5L4SBC.cjs.map → chunk-VKH3BEZE.cjs.map} +1 -1
  91. package/dist/{chunk-GQXPNIRE.cjs → chunk-WAV762GP.cjs} +6 -6
  92. package/dist/{chunk-GQXPNIRE.cjs.map → chunk-WAV762GP.cjs.map} +1 -1
  93. package/dist/{chunk-MZ2KZXNU.cjs → chunk-WXUU3COI.cjs} +3 -3
  94. package/dist/{chunk-MZ2KZXNU.cjs.map → chunk-WXUU3COI.cjs.map} +1 -1
  95. package/dist/{chunk-BW5MF464.cjs → chunk-XKVPSOKP.cjs} +4 -4
  96. package/dist/{chunk-BW5MF464.cjs.map → chunk-XKVPSOKP.cjs.map} +1 -1
  97. package/dist/{chunk-57EE6CMW.cjs → chunk-Y24V6HPR.cjs} +15 -15
  98. package/dist/{chunk-57EE6CMW.cjs.map → chunk-Y24V6HPR.cjs.map} +1 -1
  99. package/dist/{chunk-ET3NVY27.cjs → chunk-YGBHY67W.cjs} +5 -5
  100. package/dist/{chunk-ET3NVY27.cjs.map → chunk-YGBHY67W.cjs.map} +1 -1
  101. package/dist/{chunk-7TEUGFIL.cjs → chunk-YGXOKB5Z.cjs} +4 -4
  102. package/dist/{chunk-7TEUGFIL.cjs.map → chunk-YGXOKB5Z.cjs.map} +1 -1
  103. package/dist/connect/docx.cjs +23 -23
  104. package/dist/connect/index.cjs +1231 -1069
  105. package/dist/connect/index.cjs.map +1 -1
  106. package/dist/connect/viewer.cjs +33 -33
  107. package/dist/connection/conversation/ConnectedConversation.js +143 -55
  108. package/dist/connection/conversation/ConnectedConversation.js.map +2 -2
  109. package/dist/connection/conversation/ConversationSendButton.d.ts +1 -0
  110. package/dist/connection/conversation/ConversationSendButton.js +3 -2
  111. package/dist/connection/conversation/ConversationSendButton.js.map +2 -2
  112. package/dist/connection/conversation/DocumentTargetNotice.d.ts +7 -0
  113. package/dist/connection/conversation/DocumentTargetNotice.js +45 -0
  114. package/dist/connection/conversation/DocumentTargetNotice.js.map +7 -0
  115. package/dist/connection/conversation/documentSwitch.d.ts +9 -0
  116. package/dist/connection/conversation/documentSwitch.js +40 -0
  117. package/dist/connection/conversation/documentSwitch.js.map +7 -0
  118. package/dist/connection/docx/ConnectedNativeDocxEditor.js +10 -2
  119. package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
  120. package/dist/connection/viewer/ConnectedDocumentViewer.js +124 -21
  121. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  122. package/dist/connection/viewer/VersionDropdown.d.ts +9 -0
  123. package/dist/connection/viewer/VersionDropdown.js +39 -0
  124. package/dist/connection/viewer/VersionDropdown.js.map +7 -0
  125. package/dist/connection/viewer/ViewerPdfPane.js +4 -1
  126. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  127. package/dist/connection/viewer/useViewerBlobs.d.ts +3 -1
  128. package/dist/connection/viewer/useViewerBlobs.js +14 -8
  129. package/dist/connection/viewer/useViewerBlobs.js.map +2 -2
  130. package/dist/connection/viewer/useViewerTabs.js +10 -0
  131. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  132. package/dist/dashboards/index.cjs +1 -1
  133. package/dist/docx/DocxCommandMenu.d.ts +8 -0
  134. package/dist/docx/DocxCommandMenu.js +202 -0
  135. package/dist/docx/DocxCommandMenu.js.map +7 -0
  136. package/dist/docx/NativeDocxEditor.d.ts +4 -2
  137. package/dist/docx/NativeDocxEditor.js +54 -13
  138. package/dist/docx/NativeDocxEditor.js.map +2 -2
  139. package/dist/docx/RibbonMenu.d.ts +3 -1
  140. package/dist/docx/RibbonMenu.js +10 -3
  141. package/dist/docx/RibbonMenu.js.map +2 -2
  142. package/dist/docx/RibbonOverflow.d.ts +3 -0
  143. package/dist/docx/RibbonOverflow.js +24 -1
  144. package/dist/docx/RibbonOverflow.js.map +2 -2
  145. package/dist/docx/index.cjs +38 -38
  146. package/dist/docx/signatures/SignatureFields.d.ts +5 -1
  147. package/dist/docx/signatures/SignatureFields.js +57 -10
  148. package/dist/docx/signatures/SignatureFields.js.map +2 -2
  149. package/dist/embed/index.cjs +38 -38
  150. package/dist/files/index.cjs +224 -224
  151. package/dist/index.cjs +1731 -1731
  152. package/dist/settings/index.cjs +147 -147
  153. package/dist/shell/index.cjs +90 -90
  154. package/dist/site/index.cjs +5 -5
  155. package/dist/studio/index.cjs +27 -27
  156. package/dist/styles.css +1 -1
  157. package/dist/workflow-canvas/index.cjs +54 -54
  158. package/node_modules/@arbidocs/coedit/package.json +1 -1
  159. package/package.json +5 -5
  160. package/src/docx/styles.css +94 -0
  161. package/dist/ai-7U4B4CVF.cjs.map +0 -1
  162. package/dist/chunk-4ED7CNOX.cjs.map +0 -1
  163. package/dist/chunk-IFOGBMAE.cjs.map +0 -1
  164. package/dist/chunk-MGQSLMTC.cjs.map +0 -1
  165. package/dist/chunk-NHHEMBXQ.cjs.map +0 -1
  166. package/dist/chunk-ZZA756I4.cjs +0 -18
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/calls/connected/StartCallButton.tsx","../src/calls/connected/call-people.ts","../src/calls/connected/CallPeoplePicker.tsx","../src/calls/connected/ThreadCallButton.tsx","../src/calls/connected/GroupCallButton.tsx","../src/calls/connected/DmCallButton.tsx","../src/calls/connected/NewCallChip.tsx","../src/calls/connected/ScheduleCallButton.tsx","../src/connection/conversation/useMeetingThreadMessages.ts","../src/calls/connected/MeetingThreadTranscriptAction.tsx","../src/calls/connected/MeetingThreadRecordingsAction.tsx","../src/calls/connected/ConnectedConversationCallActions.tsx","../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"],"names":["useCallsEnabled","useCanHostCalls","useState","useCallSession","Tooltip","jsx","TooltipTrigger","Button","cn","Phone","TooltipContent","getUserDisplayName","isAgent","jsxs","Checkbox","Mail","UserPlus","useBlocksEnvironment","useRevokeCallInviteLink","useCallInviteLinks","X","useCreateContact","useConnectedWorkspace","useWorkspaces","usePeople","usePeopleSearch","useEffect","useMemo","added","ArbiApiError","refusalReason","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","DialogFooter","useArbi","useConnectedConversations","threadLiveCallId","Fragment","openCall","startThreadCall","chatLiveCallId","startChatCall","userDisplayName","startDmCall","DmInviteChip","startContactsCall","contactsCallTitle","useConversationItems","requestCalendarComposer","CalendarPlus","hasRecordingTranscript","threadTranscriptRef","useRecordingWindows","supersedeLiveTranscript","useCall","useWorkspaceUsers","threadTranscriptLines","SaveTranscriptToThread","usePendingRecording","HeaderAction","Disc","RecordingsList","useArbiSessionState","useConversationData","isCallLive","formatCallDuration","PhoneOff","useMyCallStatus","EmptyState","AudioLines","Captions","CaptionsOff","ProvisionalTranscriptLine","CallUserPill","useSpeakingIds","useRef","chats","chatTranscriptRef","supersededTranscriptLines","sortTranscriptMessages","transcriptRuns","TranscriptEntry","ConversationFilter","DateSeparator","RecordingCard"],"mappings":"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","file":"chunk-V5IMYLYK.cjs","sourcesContent":["/**\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","/**\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 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 * 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","/** 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 * \"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 * \"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","/**\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"]}
1
+ {"version":3,"sources":["../src/calls/connected/StartCallButton.tsx","../src/calls/connected/call-people.ts","../src/calls/connected/CallPeoplePicker.tsx","../src/calls/connected/ThreadCallButton.tsx","../src/calls/connected/GroupCallButton.tsx","../src/calls/connected/DmCallButton.tsx","../src/calls/connected/NewCallChip.tsx","../src/calls/connected/ScheduleCallButton.tsx","../src/connection/conversation/useMeetingThreadMessages.ts","../src/calls/connected/MeetingThreadTranscriptAction.tsx","../src/calls/connected/MeetingThreadRecordingsAction.tsx","../src/calls/connected/ConnectedConversationCallActions.tsx","../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"],"names":["useCallsEnabled","useCanHostCalls","useState","useCallSession","Tooltip","jsx","TooltipTrigger","Button","cn","Phone","TooltipContent","getUserDisplayName","isAgent","jsxs","Checkbox","Mail","UserPlus","useBlocksEnvironment","useRevokeCallInviteLink","useCallInviteLinks","X","useCreateContact","useConnectedWorkspace","useWorkspaces","usePeople","usePeopleSearch","useEffect","useMemo","added","ArbiApiError","refusalReason","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","DialogFooter","useArbi","useConnectedConversations","threadLiveCallId","Fragment","openCall","startThreadCall","chatLiveCallId","startChatCall","userDisplayName","startDmCall","DmInviteChip","startContactsCall","contactsCallTitle","useConversationItems","requestCalendarComposer","CalendarPlus","hasRecordingTranscript","threadTranscriptRef","useRecordingWindows","supersedeLiveTranscript","useCall","useWorkspaceUsers","threadTranscriptLines","SaveTranscriptToThread","usePendingRecording","HeaderAction","Disc","RecordingsList","useArbiSessionState","useConversationData","isCallLive","formatCallDuration","PhoneOff","useMyCallStatus","EmptyState","AudioLines","Captions","CaptionsOff","ProvisionalTranscriptLine","CallUserPill","useSpeakingIds","useRef","chats","chatTranscriptRef","supersededTranscriptLines","sortTranscriptMessages","transcriptRuns","TranscriptEntry","ConversationFilter","DateSeparator","RecordingCard"],"mappings":"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","file":"chunk-BQ5RIWWT.cjs","sourcesContent":["/**\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","/**\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 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 * 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","/** 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 * \"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 * \"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","/**\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"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk4ED7CNOX_cjs = require('./chunk-4ED7CNOX.cjs');
4
+ var chunk2CSLFAGF_cjs = require('./chunk-2CSLFAGF.cjs');
5
5
  var react = require('react');
6
6
  var artifacts = require('@arbidocs/react/artifacts');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -115,7 +115,7 @@ function NativeDocxComparison({
115
115
  if (!documentId)
116
116
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "native-docx-error", role: "status", children: "Comparing Word documents\u2026" });
117
117
  return /* @__PURE__ */ jsxRuntime.jsx(
118
- chunk4ED7CNOX_cjs.NativeDocxEditor,
118
+ chunk2CSLFAGF_cjs.NativeDocxEditor,
119
119
  {
120
120
  adapter,
121
121
  documentId,
@@ -126,5 +126,5 @@ function NativeDocxComparison({
126
126
  }
127
127
 
128
128
  exports.NativeDocxComparison = NativeDocxComparison;
129
- //# sourceMappingURL=chunk-INEPPS4H.cjs.map
130
- //# sourceMappingURL=chunk-INEPPS4H.cjs.map
129
+ //# sourceMappingURL=chunk-COD5ENHK.cjs.map
130
+ //# sourceMappingURL=chunk-COD5ENHK.cjs.map