@arbidocs/blocks 0.5.43 → 0.5.45
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.
- package/README.md +14 -0
- package/dist/agents/definitions/agentTasks.d.ts +4 -0
- package/dist/agents/definitions/index.d.ts +1 -0
- package/dist/agents/index.cjs +14 -10
- package/dist/agents/index.js +1 -1
- package/dist/calls/index.cjs +73 -696
- package/dist/calls/index.cjs.map +1 -1
- package/dist/calls/index.js +10 -666
- package/dist/calls/index.js.map +1 -1
- package/dist/{chunk-6AJJJ5HR.cjs → chunk-5R256EMF.cjs} +671 -3
- package/dist/chunk-5R256EMF.cjs.map +1 -0
- package/dist/{chunk-E3IEZMRK.cjs → chunk-ET42AFEJ.cjs} +15 -2
- package/dist/chunk-ET42AFEJ.cjs.map +1 -0
- package/dist/{chunk-FOIDBAZB.js → chunk-OQMWTEM2.js} +15 -3
- package/dist/chunk-OQMWTEM2.js.map +1 -0
- package/dist/{chunk-4U4NXFV5.js → chunk-TKTNXFAB.js} +666 -9
- package/dist/chunk-TKTNXFAB.js.map +1 -0
- package/dist/connect/index.cjs +1736 -482
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +2 -0
- package/dist/connect/index.js +1729 -479
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedFilterDropdown.d.ts +6 -0
- package/dist/connection/agents/useConnectedAgentManagement.d.ts +60 -0
- package/dist/connection/conversation/ConnectedConversation.d.ts +7 -9
- package/dist/connection/conversation/ConnectedConversationPage.d.ts +30 -0
- package/dist/connection/conversation/SemanticSearchButton.d.ts +12 -0
- package/dist/connection/files/imports/ConnectedAccountsImport.d.ts +16 -0
- package/dist/connection/files/imports/DriveImportPanel.d.ts +10 -0
- package/dist/connection/files/imports/EmailImportPanel.d.ts +21 -0
- package/dist/connection/files/imports/ImportHandoff.d.ts +24 -0
- package/dist/connection/files/imports/useDriveSyncTrigger.d.ts +11 -0
- package/dist/connection/files/imports/useEmailSyncTrigger.d.ts +11 -0
- package/dist/connection/files/imports/useImportHandoff.d.ts +20 -0
- package/dist/connection/files/index.d.ts +1 -0
- package/dist/index.cjs +14 -10
- package/dist/index.js +1 -1
- package/dist/workflow-canvas/index.cjs +2 -2
- package/dist/workflow-canvas/index.js +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-4U4NXFV5.js.map +0 -1
- package/dist/chunk-6AJJJ5HR.cjs.map +0 -1
- package/dist/chunk-E3IEZMRK.cjs.map +0 -1
- package/dist/chunk-FOIDBAZB.js.map +0 -1
|
@@ -0,0 +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/ScheduleCallButton.tsx","../src/connection/conversation/useMeetingThreadMessages.ts","../src/calls/connected/SaveTranscriptToThread.tsx","../src/calls/connected/MeetingThreadTranscriptAction.tsx","../src/calls/connected/RecordingCard.tsx","../src/calls/connected/MeetingThreadRecordingsAction.tsx","../src/calls/connected/ConnectedConversationCallActions.tsx","../src/calls/connected/ThreadCallLogCard.tsx","../src/calls/connected/TranscriptEntry.tsx","../src/calls/connected/call-person-name.ts","../src/calls/connected/CallConversationParts.tsx","../src/calls/connected/provisional-speakers.ts","../src/calls/connected/transcript-runs-context.ts"],"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","useConversationItems","requestCalendarComposer","CalendarPlus","hasRecordingTranscript","threadTranscriptRef","useRecordingWindows","supersedeLiveTranscript","HeaderAction","FileText","useSaveToThread","useCall","useWorkspaceUsers","threadTranscriptLines","useCallRecording","useCallRecordings","Loader2","useRecordingActions","speakerTracks","timelineOf","timelineDurationMs","usePendingRecording","useRef","setPendingRecording","useCallback","recordingFiles","downloadBlob","meetingChatRefFrom","recordingLink","MODE_LABEL","formatCallDuration","Video","Mic","CallUserPill","Pause","Play","Download","Link2","Captions","FileUp","Trash2","expiryChoiceOf","expiryFor","compositeTrack","compositeFiles","fetchPart","standalone","schedulePart","playheadAt","partsDue","PLAYBACK_LOOKAHEAD_MS","partKey","Disc","useArbiSessionState","useConversationData","useOpenCallMeetingChat","PhoneOff","MessageSquare","TranscriptLine","useMyCallStatus","EmptyState","AudioLines","CaptionsOff","ProvisionalTranscriptLine","useSpeakingIds","createContext","useContext","transcriptSegmentOf","transcriptRuns"],"mappings":"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","file":"chunk-5R256EMF.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 * \"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 * Host action \"Save transcript to thread\": the meeting chat's transcript is decrypted here, in the\n * host's browser, and posted as ONE attributed transcript comment (title, date, then\n * `Speaker [hh:mm:ss]: text` lines) into a workspace thread the host picks — a shared thread of the\n * current workspace they can post in, or a new one. The thread is encrypted with the workspace key\n * like any comment; the meeting chat itself is unchanged and nobody outside it gains access to it.\n */\n\nimport { useSaveToThread, useWorkspaces, type TranscriptExportLine } from '@arbidocs/react'\nimport { useMemo, useState, type ReactElement, type ReactNode } from 'react'\nimport { FileText } from 'lucide-react'\nimport {\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { useConnectedConversations } from '../../connection/workspaceData'\nimport { HeaderAction } from '../HeaderAction'\n\nconst NEW_THREAD = '__new__'\n\n/** The open workspace and my role in it (the threads I can post in are its shared ones). */\nfunction useCurrentWorkspace() {\n const { workspaceId, userId } = useConnectedWorkspace()\n const { data: workspaces } = useWorkspaces()\n const workspace = workspaces?.find((w) => w.external_id === workspaceId)\n const role = workspace?.users?.find((wu) => wu.user.external_id === userId)?.role ?? null\n return { workspace, role }\n}\n\nexport function SaveTranscriptToThread({\n title,\n lines,\n excludeConversationExtId,\n iconOnly = false,\n className,\n}: {\n /** The meeting's title (decrypted). */\n title: string | null | undefined\n lines: TranscriptExportLine[]\n /** Not offered as a target (the meeting thread itself). */\n excludeConversationExtId?: string | null\n /** Icon only, the label in a tooltip (a crowded header). */\n iconOnly?: boolean\n className?: string\n}): ReactElement | null {\n const [open, setOpen] = useState(false)\n if (!lines.length) return null\n return (\n <>\n <HeaderAction\n label=\"Save transcript to thread\"\n icon={<FileText className=\"size-3.5\" aria-hidden />}\n iconOnly={iconOnly}\n className={className}\n onClick={() => setOpen(true)}\n testId=\"save-transcript-to-thread\"\n />\n {open && (\n <SaveTranscriptDialog\n title={title}\n lines={lines}\n excludeConversationExtId={excludeConversationExtId ?? null}\n onClose={() => setOpen(false)}\n />\n )}\n </>\n )\n}\n\nfunction SaveTranscriptDialog({\n title,\n lines,\n excludeConversationExtId,\n onClose,\n}: {\n title: string | null | undefined\n lines: TranscriptExportLine[]\n excludeConversationExtId: string | null\n onClose(): void\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const save = useSaveToThread()\n const { workspace } = useCurrentWorkspace()\n return (\n <PickThreadDialog\n heading=\"Save transcript to thread\"\n description={\n <>\n The transcript ({lines.length} {lines.length === 1 ? 'line' : 'lines'}) is posted as one\n comment in a thread of {workspace?.name ?? 'the current workspace'}. Only that thread’s\n members can read it there.\n </>\n }\n testIdPrefix=\"save-transcript\"\n excludeConversationExtId={excludeConversationExtId}\n onClose={onClose}\n onConfirm={async (target) => {\n await save.transcript({ conversationExtId: target, title, lines })\n notify('Transcript saved to the thread', 'success')\n }}\n />\n )\n}\n\n/**\n * Pick a shared thread of the current workspace I can post in (or a new one) and act on it: the\n * dialog behind \"Save transcript to thread\" and the recording's \"Save to thread\".\n */\nexport function PickThreadDialog({\n heading,\n description,\n testIdPrefix,\n excludeConversationExtId,\n confirmLabel = 'Save',\n busyLabel = 'Saving…',\n onConfirm,\n onClose,\n}: {\n heading: string\n description: ReactNode\n /** `<prefix>-dialog`, `<prefix>-target-<id>`, `<prefix>-confirm`. */\n testIdPrefix: string\n excludeConversationExtId?: string | null\n confirmLabel?: string\n busyLabel?: string\n /** `target` null: a new thread. Throwing keeps the dialog open and shows the error. */\n onConfirm(target: string | null): Promise<unknown>\n onClose(): void\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const { role } = useCurrentWorkspace()\n const { data: conversations } = useConnectedConversations()\n const canPost = role === 'owner' || role === 'collaborator'\n const threads = useMemo(\n () =>\n canPost\n ? conversations\n .filter((c) => c.is_shared && c.external_id !== excludeConversationExtId)\n .sort((a, b) => Date.parse(b.updated_at) - Date.parse(a.updated_at))\n : [],\n [conversations, canPost, excludeConversationExtId]\n )\n const [target, setTarget] = useState<string>(NEW_THREAD)\n const [busy, setBusy] = useState(false)\n\n const save = async () => {\n setBusy(true)\n try {\n await onConfirm(target === NEW_THREAD ? null : target)\n onClose()\n } catch (err) {\n notify((err as Error).message, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <Dialog open onOpenChange={(o) => !o && !busy && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid={`${testIdPrefix}-dialog`}>\n <DialogHeader>\n <DialogTitle>{heading}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {!canPost ? (\n <p className=\"text-sm text-muted-foreground\">\n Open a workspace you can post in to save here.\n </p>\n ) : (\n <ul className=\"flex max-h-72 flex-col gap-1 overflow-y-auto\" role=\"radiogroup\">\n {[{ external_id: NEW_THREAD, title: 'New thread' }, ...threads].map((t) => (\n <li key={t.external_id}>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={target === t.external_id}\n className={cn(\n 'w-full truncate rounded-md px-2 py-1.5 text-left text-sm hover:bg-muted',\n target === t.external_id && 'bg-muted font-medium'\n )}\n onClick={() => setTarget(t.external_id)}\n data-testid={`${testIdPrefix}-target-${t.external_id}`}\n >\n {t.title || 'Untitled thread'}\n </button>\n </li>\n ))}\n </ul>\n )}\n <DialogFooter>\n <Button variant=\"ghost\" onClick={onClose} disabled={busy}>\n Cancel\n </Button>\n <Button\n onClick={() => void save()}\n disabled={busy || !canPost}\n data-testid={`${testIdPrefix}-confirm`}\n >\n {busy ? busyLabel : confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\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 * The Recording card of a call (ARBI `docs/meeting-chats-plan.md` §6): a `kind = recording` chat\n * message in an E2E meeting chat, a `recording` activity event in a workspace meeting thread, and\n * each entry of a meeting chat's \"Recordings\" list.\n *\n * Everything that touches media happens in this browser: parts are downloaded as ciphertext and\n * decrypted with the track keys (unwrapped under the meeting chat's / workspace's key). Members of\n * the meeting chat can play, download and copy an in-app link; the host can also transcribe, delete\n * the media (keeping the transcript), set an expiry, save the files to a thread, or delete it.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactElement } from 'react'\nimport {\n Captions,\n Download,\n FileUp,\n Link2,\n Loader2,\n Mic,\n Pause,\n Play,\n Trash2,\n Video,\n} from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport {\n useArbi,\n useCallRecording,\n useCallRecordings,\n useCall,\n useRecordingActions,\n useSaveToThread,\n meetingChatRefFrom,\n compositeFiles,\n compositeTrack,\n fetchPart,\n recordingFiles,\n speakerTracks,\n type OpenedRecording,\n PLAYBACK_LOOKAHEAD_MS,\n partKey,\n partsDue,\n playheadAt,\n schedulePart,\n standalone,\n timelineDurationMs,\n timelineOf,\n type TimelinePart,\n} from '@arbidocs/react'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { recordingLink, setPendingRecording, usePendingRecording } from '../recording-link'\nimport { formatCallDuration } from '../call-cards'\nimport { EXPIRY_DAYS, MODE_LABEL, expiryChoiceOf, expiryFor } from '../recording-labels'\nimport { PickThreadDialog } from './SaveTranscriptToThread'\nimport { CallUserPill } from './CallUserPill'\n\n/** A card for one recording (by id), or for each of the call's recordings when no id is known. */\nexport function RecordingCard({\n callExtId,\n recordingExtId,\n title,\n time,\n}: {\n callExtId: string\n recordingExtId?: string | null\n /** The meeting's title (decrypted), for file names. */\n title?: string | null\n time?: string\n}): ReactElement | null {\n const { data: call } = useCall(callExtId)\n const one = useCallRecording(callExtId, recordingExtId)\n const all = useCallRecordings(callExtId, !recordingExtId)\n if (!call) return null\n if (recordingExtId) {\n if (one.isError) return <RecordingUnavailable />\n return one.data ? (\n <RecordingCardBody call={call} recording={one.data} title={title} time={time} />\n ) : null\n }\n return (\n <>\n {(all.data ?? []).map((r) => (\n <RecordingCardBody\n key={r.external_id}\n call={call}\n recording={r}\n title={title}\n time={time}\n />\n ))}\n </>\n )\n}\n\n/** All of a call's recordings (the meeting chat's \"Recordings\" view), newest first. */\nexport function RecordingsList({\n callExtId,\n title,\n className,\n}: {\n callExtId: string\n title?: string | null\n className?: string\n}): ReactElement {\n const { data: call } = useCall(callExtId)\n const { data, isLoading, isError } = useCallRecordings(callExtId)\n const sorted = useMemo(\n () => [...(data ?? [])].sort((a, b) => Date.parse(b.started_at) - Date.parse(a.started_at)),\n [data]\n )\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid=\"recordings-list\">\n {isLoading && <Loader2 className=\"mx-auto size-4 animate-spin text-muted-foreground\" />}\n {isError && (\n <p className=\"text-center text-xs text-muted-foreground\">Could not load the recordings.</p>\n )}\n {!isLoading && !isError && !sorted.length && (\n <p className=\"text-center text-xs text-muted-foreground\">No recordings yet.</p>\n )}\n {call &&\n sorted.map((r) => (\n <RecordingCardBody key={r.external_id} call={call} recording={r} title={title} />\n ))}\n </div>\n )\n}\n\nfunction RecordingUnavailable(): ReactElement {\n return (\n <div\n className=\"mx-auto my-1 w-fit rounded-md border border-border bg-card px-3 py-2 text-xs text-muted-foreground\"\n data-testid=\"recording-card\"\n >\n Recording unavailable\n </div>\n )\n}\n\n/** A two-step destructive button: the first click asks, the second does. */\nfunction ConfirmButton({\n label,\n confirmLabel,\n testId,\n disabled,\n onConfirm,\n icon,\n}: {\n label: string\n confirmLabel: string\n testId: string\n disabled?: boolean\n onConfirm(): Promise<void>\n icon: ReactElement\n}): ReactElement {\n const [asking, setAsking] = useState(false)\n const [busy, setBusy] = useState(false)\n useEffect(() => {\n if (!asking) return\n const t = setTimeout(() => setAsking(false), 5000)\n return () => clearTimeout(t)\n }, [asking])\n return (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={asking ? 'destructive' : 'outline'}\n className=\"h-7\"\n disabled={disabled || busy}\n onClick={() => {\n if (!asking) {\n setAsking(true)\n return\n }\n setAsking(false)\n setBusy(true)\n void onConfirm().finally(() => setBusy(false))\n }}\n data-testid={asking ? `${testId}-confirm` : testId}\n >\n {busy ? <Loader2 className=\"mr-1 size-3.5 animate-spin\" aria-hidden /> : icon}\n {asking ? confirmLabel : label}\n </Button>\n )\n}\n\nfunction RecordingCardBody({\n call,\n recording,\n title,\n time,\n}: {\n call: calls.CallResponse\n recording: calls.CallRecording\n title?: string | null\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const actions = useRecordingActions(call)\n const save = useSaveToThread()\n const { notify, runtimeConfig } = useBlocksEnvironment()\n const isHost = call.is_creator\n const mediaDeleted = !!recording.media_deleted_at\n const live = recording.state === 'recording' || (!recording.stopped_at && !mediaDeleted)\n const speakers = speakerTracks(recording)\n const timeline = useMemo(() => timelineOf(recording.tracks ?? []), [recording.tracks])\n const durationMs = timelineDurationMs(timeline)\n const hasMedia = !mediaDeleted && timeline.length > 0\n const [opened, setOpened] = useState<OpenedRecording | null>(null)\n const [playing, setPlaying] = useState(false)\n const [progress, setProgress] = useState<string | null>(null)\n const [saveOpen, setSaveOpen] = useState(false)\n const { workspaceId: selectedWorkspaceId } = useConnectedWorkspace()\n\n // A link asked to show this recording: bring it into view.\n const pending = usePendingRecording()\n const highlighted = pending === recording.external_id\n const cardRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n if (!highlighted) return\n cardRef.current?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n const t = setTimeout(() => setPendingRecording(null), 4000)\n return () => clearTimeout(t)\n }, [highlighted])\n\n const { refresh } = actions\n\n const open = useCallback(async (): Promise<OpenedRecording> => {\n if (opened && opened.recording === recording) return opened\n const next = await actions.open(recording)\n setOpened(next)\n return next\n }, [actions, opened, recording])\n\n const run = async (label: string, task: () => Promise<void>) => {\n setProgress(label)\n try {\n await task()\n } catch (err) {\n console.warn('[calls] recording action failed', err)\n notify((err as Error).message, 'error')\n } finally {\n setProgress(null)\n }\n }\n\n const download = () =>\n run('Decrypting…', async () => {\n const files = await recordingFiles(arbi, await open(), title, (done, total) =>\n setProgress(`Decrypting ${done}/${total}…`)\n )\n if (!files.length) throw new Error('Nothing to download')\n for (const f of files) downloadBlob(f, f.name)\n })\n\n const transcribe = () =>\n run('Transcribing…', async () => {\n const { stored, failed } = await actions.transcribe(await open(), (done, total) =>\n setProgress(`Transcribing ${done}/${total}…`)\n )\n notify(\n failed\n ? `Transcribed ${stored} lines; ${failed} parts failed`\n : `Transcribed ${stored} lines into the meeting chat`,\n failed ? 'warning' : 'success'\n )\n })\n\n const copyLink = async () => {\n const ref = meetingChatRefFrom(call)\n if (!ref) {\n notify('This recording has no meeting chat to link to', 'error')\n return\n }\n try {\n await navigator.clipboard.writeText(\n recordingLink(ref, recording.external_id, runtimeConfig.deploymentDomain)\n )\n notify('Link copied: it opens for members of the meeting chat', 'success')\n } catch {\n notify('Could not copy the link', 'error')\n }\n }\n\n const saveToThread = async (target: string | null) => {\n if (!selectedWorkspaceId) throw new Error('Open a workspace first')\n const files = await recordingFiles(arbi, await open(), title, (done, total) =>\n setProgress(`Decrypting ${done}/${total}…`)\n )\n if (!files.length) throw new Error('Nothing to save')\n // Re-encrypted under the workspace key, as a direct document upload.\n try {\n await save.recording({\n workspaceExtId: selectedWorkspaceId,\n files,\n conversationExtId: target,\n title,\n onUploading: () => setProgress('Uploading…'),\n })\n } finally {\n setProgress(null)\n }\n notify('Recording saved to the thread', 'success')\n }\n\n const summary = [\n 'Recording',\n MODE_LABEL[recording.mode],\n formatCallDuration(durationMs / 1000),\n speakers.length ? `${speakers.length} ${speakers.length === 1 ? 'speaker' : 'speakers'}` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n\n return (\n <div\n ref={cardRef}\n className={cn(\n 'mx-auto my-1 flex w-full max-w-xl flex-col gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs',\n highlighted && 'ring-2 ring-primary'\n )}\n data-testid=\"recording-card\"\n data-recording={recording.external_id}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n {recording.mode === 'audio_video' ? (\n <Video className=\"size-4 text-red-500\" aria-hidden />\n ) : (\n <Mic className=\"size-4 text-red-500\" aria-hidden />\n )}\n <span className=\"font-medium\" data-testid=\"recording-summary\">\n {summary}\n </span>\n {time && <time className=\"text-muted-foreground\">{time}</time>}\n {live && <span className=\"text-red-500\">recording…</span>}\n {mediaDeleted && (\n <span className=\"text-muted-foreground\">Audio and video deleted — transcript kept</span>\n )}\n {!mediaDeleted && recording.expires_at && (\n <span className=\"text-muted-foreground\">\n Deleted after {new Date(recording.expires_at).toLocaleDateString()}\n </span>\n )}\n </div>\n {speakers.length > 0 && (\n <p className=\"flex flex-wrap items-center gap-1 text-muted-foreground\">\n {speakers.map((t, i) =>\n t.speaker_ext_id ? (\n <CallUserPill\n key={t.speaker_ext_id}\n identity={t.speaker_ext_id}\n name={t.speaker_name}\n />\n ) : (\n <span key={i}>{t.speaker_name || 'Someone'}</span>\n )\n )}\n </p>\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n aria-pressed={playing}\n onClick={() => setPlaying((p) => !p)}\n data-testid=\"recording-play\"\n >\n {playing ? (\n <Pause className=\"mr-1 size-3.5\" aria-hidden />\n ) : (\n <Play className=\"mr-1 size-3.5\" aria-hidden />\n )}\n {playing ? 'Close player' : 'Play'}\n </Button>\n )}\n {hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n disabled={!!progress}\n onClick={() => void download()}\n data-testid=\"recording-download\"\n >\n <Download className=\"mr-1 size-3.5\" aria-hidden />\n Download\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n onClick={() => void copyLink()}\n title=\"Copy an in-app link (only members of the meeting chat can open it)\"\n data-testid=\"recording-copy-link\"\n >\n <Link2 className=\"mr-1 size-3.5\" aria-hidden />\n Copy link\n </Button>\n {isHost && hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n disabled={!!progress || live}\n onClick={() => void transcribe()}\n data-testid=\"recording-transcribe\"\n >\n <Captions className=\"mr-1 size-3.5\" aria-hidden />\n Transcribe\n </Button>\n )}\n {isHost && hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n disabled={!!progress || live}\n onClick={() => setSaveOpen(true)}\n data-testid=\"recording-save-to-thread\"\n >\n <FileUp className=\"mr-1 size-3.5\" aria-hidden />\n Save to thread\n </Button>\n )}\n {isHost && !mediaDeleted && (\n <ConfirmButton\n label=\"Keep transcript, delete audio/video\"\n confirmLabel=\"Delete audio/video now\"\n testId=\"recording-delete-media\"\n disabled={!!progress || live}\n icon={<Trash2 className=\"mr-1 size-3.5\" aria-hidden />}\n onConfirm={async () => {\n try {\n await arbi.calls.recording.deleteMedia(call.external_id, recording.external_id)\n setPlaying(false)\n setOpened(null)\n refresh()\n } catch (err) {\n notify((err as Error).message, 'error')\n }\n }}\n />\n )}\n {isHost && (\n <ConfirmButton\n label=\"Delete\"\n confirmLabel=\"Delete recording\"\n testId=\"recording-delete\"\n disabled={!!progress || live}\n icon={<Trash2 className=\"mr-1 size-3.5\" aria-hidden />}\n onConfirm={async () => {\n try {\n await arbi.calls.recording.delete(call.external_id, recording.external_id)\n refresh()\n } catch (err) {\n notify((err as Error).message, 'error')\n }\n }}\n />\n )}\n {isHost && !mediaDeleted && (\n <label className=\"flex items-center gap-1 text-muted-foreground\">\n Keep\n <select\n className=\"h-7 rounded-sm border border-border bg-background px-1 text-xs text-foreground\"\n value={expiryChoiceOf(recording.expires_at ?? null)}\n onChange={(e) => {\n const days = e.target.value === 'none' ? null : Number(e.target.value)\n void arbi.calls.recording\n .setExpiry(call.external_id, recording.external_id, expiryFor(days))\n .then(refresh)\n .catch((err: unknown) => notify((err as Error).message, 'error'))\n }}\n data-testid=\"recording-expiry\"\n aria-label=\"Keep the audio and video for\"\n >\n {EXPIRY_DAYS.map((d) => (\n <option key={d ?? 'none'} value={d ?? 'none'}>\n {d ? `${d} days` : 'until deleted'}\n </option>\n ))}\n </select>\n </label>\n )}\n {progress && (\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n {progress}\n </span>\n )}\n </div>\n {playing && hasMedia && (\n <RecordingPlayer recording={recording} open={open} durationMs={durationMs} />\n )}\n {saveOpen && (\n <PickThreadDialog\n heading=\"Save recording to thread\"\n description=\"The recording is decrypted here and uploaded as documents (one audio file per speaker, and the video) into a thread of the current workspace, encrypted under its key. Only that workspace’s members can read them there.\"\n testIdPrefix=\"save-recording\"\n confirmLabel=\"Save\"\n busyLabel=\"Saving…\"\n onClose={() => setSaveOpen(false)}\n onConfirm={saveToThread}\n />\n )}\n </div>\n )\n}\n\n/**\n * Plays a recording: the composite video when there is one (it carries the mixed audio the host\n * heard), otherwise the speaker tracks mixed in sync on one WebAudio timeline.\n */\nfunction RecordingPlayer({\n recording,\n open,\n durationMs,\n}: {\n recording: calls.CallRecording\n open(): Promise<OpenedRecording>\n durationMs: number\n}): ReactElement {\n const composite = compositeTrack(recording)\n const [view, setView] = useState<'video' | 'audio'>(composite?.parts?.length ? 'video' : 'audio')\n return (\n <div className=\"flex flex-col gap-2\" data-testid=\"recording-player\">\n {composite?.parts?.length ? (\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Play\">\n {(['video', 'audio'] as const).map((v) => (\n <button\n key={v}\n type=\"button\"\n className={cn(\n 'rounded-full px-2 py-0.5',\n view === v ? 'bg-muted font-medium' : 'text-muted-foreground hover:bg-muted'\n )}\n aria-pressed={view === v}\n onClick={() => setView(v)}\n >\n {v === 'video' ? 'Video' : 'Speakers'}\n </button>\n ))}\n </div>\n ) : null}\n {view === 'video' && composite ? (\n <CompositeVideo open={open} trackExtId={composite.external_id} />\n ) : (\n <MixPlayer recording={recording} open={open} durationMs={durationMs} />\n )}\n </div>\n )\n}\n\nfunction CompositeVideo({\n open,\n trackExtId,\n}: {\n open(): Promise<OpenedRecording>\n trackExtId: string\n}): ReactElement {\n const arbi = useArbi()\n const [urls, setUrls] = useState<string[] | null>(null)\n const [error, setError] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n let made: string[] = []\n void (async () => {\n try {\n const opened = await open()\n const track = (opened.recording.tracks ?? []).find((t) => t.external_id === trackExtId)\n const key = opened.keys.get(trackExtId)\n if (!track || !key) throw new Error('The video does not open with your key')\n const blobs = await compositeFiles(arbi, track, key)\n made = blobs.map((b) => URL.createObjectURL(b))\n if (cancelled) made.forEach((u) => URL.revokeObjectURL(u))\n else setUrls(made)\n } catch (err) {\n if (!cancelled) setError((err as Error).message)\n }\n })()\n return () => {\n cancelled = true\n made.forEach((u) => URL.revokeObjectURL(u))\n }\n }, [arbi, open, trackExtId])\n if (error) return <p className=\"text-destructive\">{error}</p>\n if (!urls) {\n return (\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n Decrypting the video…\n </span>\n )\n }\n return (\n <>\n {urls.map((u, i) => (\n <video\n key={u}\n src={u}\n controls\n className=\"w-full rounded-sm bg-black\"\n aria-label={`Video ${i + 1}`}\n />\n ))}\n </>\n )\n}\n\nconst fmt = (ms: number) => {\n const s = Math.max(0, Math.floor(ms / 1000))\n const h = Math.floor(s / 3600)\n const m = Math.floor((s % 3600) / 60)\n const sec = String(s % 60).padStart(2, '0')\n return h ? `${h}:${String(m).padStart(2, '0')}:${sec}` : `${m}:${sec}`\n}\n\n/**\n * The speaker tracks mixed in sync: parts are fetched, decrypted and decoded a little ahead of the\n * playhead and started on one AudioContext clock at their offsets (see `recording-playback.ts`).\n */\nfunction MixPlayer({\n recording,\n open,\n durationMs,\n}: {\n recording: calls.CallRecording\n open(): Promise<OpenedRecording>\n durationMs: number\n}): ReactElement {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n const parts = useMemo(() => timelineOf(speakerTracks(recording)), [recording])\n const [position, setPosition] = useState(0)\n const [playing, setPlaying] = useState(false)\n const session = useRef<{\n ctx: AudioContext\n ctxStart: number\n seekMs: number\n scheduled: Set<string>\n timer: ReturnType<typeof setInterval>\n } | null>(null)\n\n const halt = useCallback(() => {\n const s = session.current\n session.current = null\n if (!s) return\n clearInterval(s.timer)\n void s.ctx.close().catch(() => undefined)\n }, [])\n\n useEffect(() => halt, [halt])\n\n const play = useCallback(\n async (fromMs: number) => {\n halt()\n const opened = await open()\n const ctx = new AudioContext()\n const s = {\n ctx,\n ctxStart: ctx.currentTime + 0.25,\n seekMs: fromMs,\n scheduled: new Set<string>(),\n timer: 0 as unknown as ReturnType<typeof setInterval>,\n }\n const schedule = async (part: TimelinePart) => {\n const track = (opened.recording.tracks ?? []).find((t) => t.external_id === part.trackExtId)\n const key = opened.keys.get(part.trackExtId)\n const raw = track?.parts?.find((p) => p.seq === part.seq)\n if (!track || !key || !raw) return\n try {\n const bytes = await fetchPart(arbi, raw, key)\n const buffer = await ctx.decodeAudioData(standalone(bytes).buffer)\n if (session.current !== s) return\n const at = schedulePart({\n partOffsetMs: part.offsetMs,\n bufferDurationS: buffer.duration,\n ctxStart: s.ctxStart,\n seekMs: s.seekMs,\n ctxNow: ctx.currentTime,\n })\n if (!at) return\n const source = ctx.createBufferSource()\n source.buffer = buffer\n source.connect(ctx.destination)\n source.start(at.when, at.offset)\n } catch (err) {\n console.warn('[calls] a recording part does not play', err)\n }\n }\n const tick = () => {\n if (session.current !== s) return\n const head = playheadAt(ctx.currentTime, s.ctxStart, s.seekMs)\n setPosition(Math.min(head, durationMs))\n if (head >= durationMs) {\n halt()\n setPlaying(false)\n return\n }\n for (const part of partsDue(parts, head, PLAYBACK_LOOKAHEAD_MS, s.scheduled)) {\n s.scheduled.add(partKey(part))\n void schedule(part)\n }\n }\n s.timer = setInterval(tick, 500)\n session.current = s\n setPlaying(true)\n tick()\n },\n [arbi, open, parts, durationMs, halt]\n )\n\n const toggle = () => {\n if (playing) {\n halt()\n setPlaying(false)\n } else {\n void play(position >= durationMs ? 0 : position).catch((err: unknown) => {\n setPlaying(false)\n notify((err as Error).message, 'error')\n })\n }\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"outline\"\n className=\"size-7\"\n aria-label={playing ? 'Pause' : 'Play'}\n onClick={toggle}\n data-testid=\"recording-mix-toggle\"\n >\n {playing ? <Pause className=\"size-3.5\" /> : <Play className=\"size-3.5\" />}\n </Button>\n <input\n type=\"range\"\n min={0}\n max={Math.max(1, durationMs)}\n step={1000}\n value={position}\n className=\"flex-1\"\n aria-label=\"Position\"\n onChange={(e) => {\n const ms = Number(e.target.value)\n setPosition(ms)\n if (playing) {\n void play(ms).catch((err: unknown) => notify((err as Error).message, 'error'))\n }\n }}\n />\n <span className=\"tabular-nums text-muted-foreground\">\n {fmt(position)} / {fmt(durationMs)}\n </span>\n </div>\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 iconOnly = false,\n}: {\n /** The thread's call (`meeting_call_ext_id`). */\n meetingCallExtId: string\n title: string | null | undefined\n /** Icon only, the label in a tooltip (a crowded header: the thread's title keeps the room). */\n iconOnly?: boolean\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 iconOnly={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 (`ConnectedConversation`), 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 iconOnly\n />\n )}\n </>\n )\n}\n","/**\n * A thread call's log card in the thread transcript: the `convo_events` row of kind `call` the\n * server writes when the call starts and updates when it ends (plaintext ids and times only).\n *\n * live: \"Call started by Ada · invited Bob, Cy\" · Join\n * ended: \"Call · 12 min · joined Ada, Bob\" · Open meeting chat\n *\n * It re-reads on `call.started` / `call.ended` (see `refreshCallCards`).\n */\n\nimport { useArbi, useCallSession, useCall, useOpenCallMeetingChat, openCall } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { MessageSquare, Phone, PhoneOff } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { formatCallDuration, type CallLogDetail } from '../call-cards'\n\nfunction joinNames(people: string[], name: (id: string) => string): string {\n const names = people.map(name)\n return names.length > 4\n ? `${names.slice(0, 4).join(', ')} +${names.length - 4}`\n : names.join(', ')\n}\n\nexport function ThreadCallLogCard({\n detail,\n name,\n workspaceExtId,\n time,\n}: {\n detail: CallLogDetail\n /** A person's display name by user ext id. */\n name: (userExtId: string) => string\n /** The thread's workspace (the meeting thread lives there too). */\n workspaceExtId: string | null\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const openCallMeetingChat = useOpenCallMeetingChat()\n const live = !detail.ended_at\n const inThisCall = useCallSession((s) => s.active?.callExtId === detail.call_ext_id)\n const inAnotherCall = useCallSession(\n (s) => !!s.active && s.active.callExtId !== detail.call_ext_id\n )\n // Only people holding K (the creator and those rung) can join from the card.\n const { data: call } = useCall(live ? detail.call_ext_id : null)\n const invitedOnly = live && !!call && !call.my_sealed_key\n const [busy, setBusy] = useState(false)\n\n const summary = live\n ? [\n detail.started_by ? `Call started by ${name(detail.started_by)}` : 'Call started',\n detail.invited.length ? `invited ${joinNames(detail.invited, name)}` : null,\n ]\n : [\n 'Call',\n formatCallDuration(detail.duration_s),\n detail.joined.length ? `joined ${joinNames(detail.joined, name)}` : null,\n ]\n\n return (\n <div\n className=\"mx-auto my-1 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=\"thread-call-log-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=\"thread-call-log-summary\">{summary.filter(Boolean).join(' · ')}</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 || invitedOnly}\n title={\n invitedOnly\n ? 'Only the people rung into this call can join'\n : inAnotherCall\n ? 'You are already in a call'\n : undefined\n }\n onClick={() => {\n setBusy(true)\n void openCall(arbi, { callExtId: detail.call_ext_id }).finally(() => setBusy(false))\n }}\n data-testid=\"thread-call-log-join\"\n >\n {inThisCall ? 'In call' : 'Join'}\n </Button>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n onClick={() =>\n void openCallMeetingChat({\n callExtId: detail.call_ext_id,\n meetingConversationExtId: detail.meeting_conversation_ext_id,\n workspaceExtId,\n })\n }\n data-testid=\"thread-call-log-open-chat\"\n >\n <MessageSquare className=\"mr-1 size-3.5\" aria-hidden />\n Open meeting chat\n </Button>\n )}\n </div>\n )\n}\n","/**\n * One stored line of a call transcript in its conversation (meeting chat or workspace meeting\n * thread): `TranscriptLine` from `@arbidocs/blocks`, centred for everyone. What someone is saying\n * right now shows as a provisional \"is speaking…\" row below, not as a highlight on a past line.\n */\n\nimport type { ReactElement } from 'react'\nimport { TranscriptLine } from '../../chat/TranscriptLine'\nimport { CallUserPill } from './CallUserPill'\n\nfunction formatTime(iso: string | null | undefined): string {\n if (!iso) return ''\n const at = Date.parse(iso)\n if (Number.isNaN(at)) return ''\n return new Date(at).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n}\n\nexport function TranscriptEntry({\n speakerId,\n speakerName,\n text,\n at,\n continued = false,\n className,\n}: {\n /** The speaker's identity (user ext id), for `data-speaker`. */\n speakerId: string\n /** The name to show (\"Me\" for my own lines). */\n speakerName: string\n text: string\n /** ISO time the segment started (or the message was stored). */\n at: string | null | undefined\n /** A further line of the same speaker's run (no name repeated). */\n continued?: boolean\n className?: string\n}): ReactElement {\n return (\n <TranscriptLine\n speakerId={speakerId}\n speakerName={speakerName}\n speaker={<CallUserPill identity={speakerId} name={speakerName} />}\n time={formatTime(at)}\n text={text}\n continued={continued}\n className={className}\n />\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 * How a meeting thread's transcript lines group: which messages continue their speaker's run (the\n * name is not repeated) and which are each speaker's newest line (highlighted while they talk).\n * Provided by the conversation page, read by each transcript message.\n */\n\nimport { createContext, useContext } from 'react'\nimport { transcriptRuns } from '../../chat/transcript-runs'\nimport { transcriptSegmentOf } from '@arbidocs/react'\n\nexport interface TranscriptRunInfo {\n continued: ReadonlySet<string>\n latest: ReadonlySet<string>\n}\n\nconst EMPTY: TranscriptRunInfo = { continued: new Set(), latest: new Set() }\n\nexport const TranscriptRunsContext = createContext<TranscriptRunInfo>(EMPTY)\n\nexport function useTranscriptRuns(): TranscriptRunInfo {\n return useContext(TranscriptRunsContext)\n}\n\ninterface ThreadMessageLike {\n external_id?: string | null\n created_at?: string | null\n tools?: unknown\n meta?: { tools?: unknown } | null\n}\n\n/** Runs and newest lines of a thread's messages (in display order). */\nexport function threadTranscriptRuns(messages: ThreadMessageLike[]): TranscriptRunInfo {\n const segmentOf = (m: ThreadMessageLike) => transcriptSegmentOf(m.tools ?? m.meta?.tools)\n const continuedItems = transcriptRuns(\n messages,\n (m) => segmentOf(m)?.speaker_ext_id ?? null,\n (m) => Date.parse(segmentOf(m)?.started_at ?? m.created_at ?? '') || 0\n )\n const latest = new Map<string, string>()\n for (const m of messages) {\n const seg = segmentOf(m)\n if (seg && m.external_id) latest.set(seg.speaker_ext_id, m.external_id)\n }\n return {\n continued: new Set(\n [...continuedItems].map((m) => m.external_id).filter((id): id is string => !!id)\n ),\n latest: new Set(latest.values()),\n }\n}\n"]}
|
|
@@ -300,6 +300,18 @@ function AgentGallery({
|
|
|
300
300
|
)
|
|
301
301
|
] });
|
|
302
302
|
}
|
|
303
|
+
|
|
304
|
+
// src/agents/definitions/agentTasks.ts
|
|
305
|
+
function groupAgentTasks(tasks) {
|
|
306
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
307
|
+
for (const task of tasks) {
|
|
308
|
+
if (!task.agent_ext_id) continue;
|
|
309
|
+
const assigned = grouped.get(task.agent_ext_id);
|
|
310
|
+
if (assigned) assigned.push(task);
|
|
311
|
+
else grouped.set(task.agent_ext_id, [task]);
|
|
312
|
+
}
|
|
313
|
+
return grouped;
|
|
314
|
+
}
|
|
303
315
|
var DEFAULT_SKILL_CARD_LABELS = {
|
|
304
316
|
global: "Global",
|
|
305
317
|
globalTitle: "Shared with everyone in the marketplace",
|
|
@@ -502,6 +514,7 @@ exports.DEFAULT_SKILL_CARD_LABELS = DEFAULT_SKILL_CARD_LABELS;
|
|
|
502
514
|
exports.DEFAULT_SKILL_ROW_LABELS = DEFAULT_SKILL_ROW_LABELS;
|
|
503
515
|
exports.SkillCard = SkillCard;
|
|
504
516
|
exports.SkillRow = SkillRow;
|
|
517
|
+
exports.groupAgentTasks = groupAgentTasks;
|
|
505
518
|
exports.useWorkflowPreview = useWorkflowPreview;
|
|
506
|
-
//# sourceMappingURL=chunk-
|
|
507
|
-
//# sourceMappingURL=chunk-
|
|
519
|
+
//# sourceMappingURL=chunk-ET42AFEJ.cjs.map
|
|
520
|
+
//# sourceMappingURL=chunk-ET42AFEJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agents/workflows/useWorkflowPreview.ts","../src/agents/definitions/AgentCard.tsx","../src/agents/definitions/AgentGallery.tsx","../src/agents/definitions/agentTasks.ts","../src/agents/skills/SkillCard.tsx","../src/agents/skills/SkillRow.tsx"],"names":["workflowSteps","useState","initialRunInputs","useRef","useEffect","stepPhase","composeStepPrompt","useWorkflowView","formatCount","jsxs","cn","testIdOr","jsx","ActionLink","Button","MessageSquare","Eye","ClipboardList","Pencil","Copy","Trash2","EmptyState","Bot","Sparkles","Plus","activateOnKey","SkillTypeBadge","SkillGlobalBadge","SkillActionButton","Download","Lock","Globe"],"mappings":"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","file":"chunk-ET42AFEJ.cjs","sourcesContent":["/**\n * A stepped workflow run on screen only (the builder's preview): agent steps run one at a time,\n * the way the server does, and answer with the prompt they would send; action steps just finish.\n * No thread, no agent.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport {\n composeStepPrompt,\n initialRunInputs,\n stepPhase,\n workflowSteps,\n type StepComposeOptions,\n} from './run'\nimport type { WorkflowDefinition, WorkflowInputs, WorkflowStepState } from './types'\nimport { useWorkflowView, type WorkflowRunView } from './useWorkflowView'\n\nexport interface UseWorkflowPreviewOptions extends StepComposeOptions {\n /** What a stand-in agent step answers; `{prompt}` is replaced with the prompt it would send. */\n answer?: string\n /** How long a stand-in step takes. */\n delayMs?: number\n}\n\nexport function useWorkflowPreview(\n workflow: WorkflowDefinition,\n { answer = '{prompt}', delayMs = 400, resolveWorkflow, compose }: UseWorkflowPreviewOptions = {}\n): WorkflowRunView {\n const steps = workflowSteps(workflow)\n const [inputs, setInputs] = useState<WorkflowInputs>(() => initialRunInputs(workflow))\n const [states, setStates] = useState<Record<string, WorkflowStepState>>({})\n const set = (id: string, state: WorkflowStepState) => setStates((s) => ({ ...s, [id]: state }))\n\n // A stand-in step's timer outlives the re-render its start causes; it is cleared on unmount, and\n // a step it cut short starts again (StrictMode mounts twice).\n const timers = useRef(new Map<string, ReturnType<typeof setTimeout>>())\n useEffect(() => {\n const pending = timers.current\n return () => {\n for (const t of pending.values()) clearTimeout(t)\n pending.clear()\n setStates((s) =>\n Object.fromEntries(\n Object.entries(s).map(([id, v]) => [\n id,\n v.status === 'running' ? { status: 'pending' } : v,\n ])\n )\n )\n }\n }, [])\n\n // One turn at a time: start the first ready agent step when nothing is running.\n useEffect(() => {\n if (Object.values(states).some((s) => s.status === 'running')) return\n // An action step (a signature, an email, a review) stands in the same way, with no answer.\n const next = steps.find(\n (s) =>\n (s.kind === 'agent' || s.kind === 'action') && stepPhase(steps, states, s.id) === 'ready'\n )\n if (!next || (next.kind !== 'agent' && next.kind !== 'action')) return\n const prompt =\n next.kind === 'agent'\n ? composeStepPrompt(workflow, next, inputs, { resolveWorkflow, compose })\n : ''\n set(next.id, { status: 'running', startedAt: new Date().toISOString() })\n timers.current.set(\n next.id,\n setTimeout(() => {\n timers.current.delete(next.id)\n set(\n next.id,\n next.kind === 'agent'\n ? { status: 'done', text: answer.replace('{prompt}', prompt) }\n : { status: 'done' }\n )\n }, delayMs)\n )\n // `inputs` are read when a step starts, not watched.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [states, steps, workflow])\n\n return useWorkflowView({\n steps,\n states,\n inputs,\n setInput: (name, value) => setInputs((i) => ({ ...i, [name]: value })),\n complete: async (step) => set(step.id, { status: 'done' }),\n skip: async (id) => set(id, { status: 'skipped' }),\n retry: async (id) => set(id, { status: 'pending' }),\n isLocked: (id) => states[id]?.status === 'done',\n })\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { ClipboardList, Copy, Eye, MessageSquare, Pencil, Trash2 } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../../components/ActionLink'\nimport { testIdOr } from '../../chat/test-id'\nimport { formatCount } from '../../lib/format'\n\nexport interface AgentCardLabels {\n running: string\n /** Pulse indicator aria-label. */\n runningIndicator: string\n /** Chip text; receives the running count. */\n runningCount: (count: number) => string\n /** Chip text; receives the task count (0 -> none yet). */\n taskCount: (count: number) => string\n goalMet: (met: number, total: number) => string\n watch: string\n message: string\n assignTask: string\n edit: string\n copyAddress: string\n deleteAgent: (name: string) => string\n}\n\nexport const DEFAULT_AGENT_CARD_LABELS: AgentCardLabels = {\n running: 'Running',\n runningIndicator: 'Running',\n runningCount: (count) => `${count} running`,\n taskCount: (count) =>\n count > 0 ? formatCount(count, { one: 'task', other: 'tasks' }) : 'no tasks yet',\n goalMet: (met, total) => `✓ ${met}/${total} met`,\n watch: 'Watch',\n message: 'Message',\n assignTask: 'Assign task',\n edit: 'Edit',\n copyAddress: 'Copy address',\n deleteAgent: (name) => `Delete agent ${name}`,\n}\n\nexport interface AgentCardTestIds {\n root: string\n watch: string\n message: string\n assignTask: string\n edit: string\n copyAddress: string\n delete: string\n}\n\nexport interface AgentCardProps {\n /** Display name; also the key in the test ids (`agent-card-{name}`, `agent-edit-{name}`...). */\n name: string\n /** The agent's avatar (the app supplies its entity avatar). */\n avatar: ReactNode\n /** Tasks currently running for this agent; shows a pulse + chip when > 0. */\n runningCount: number\n /** All tasks assigned to this agent. */\n taskCount: number\n /** Extra content under the chips (the app shows what the agent can access). */\n details?: ReactNode\n /** Criteria progress of the agent's most recent goal task. */\n goalProgress?: { met: number; total: number } | null\n /** When set, a Watch action opens the live run. */\n onWatch?: () => void\n /** Each action is optional: the button is omitted when its handler is absent. */\n onMessage?: () => void\n onAssignTask?: () => void\n onEdit?: () => void\n /** When set, a ghost \"Copy address\" action copies the agent's address (it is not shown raw). */\n onCopyAddress?: () => void\n onDelete?: () => void\n /**\n * Destination of the agent; the name becomes a real link. `onSelect` fires on a plain click\n * (modified clicks go to the browser).\n */\n href?: string\n onSelect?: () => void\n labels?: Partial<AgentCardLabels>\n /** Overrides for the default `agent-card-{name}` / `agent-watch-run-{name}` ... ids. */\n testIds?: Partial<AgentCardTestIds>\n testId?: string\n className?: string\n}\n\nconst ACTION = 'h-9 gap-1.5 px-2 text-sm pointer-coarse:h-11'\n\n/** One agent in the gallery: avatar, live task chips, and Watch / Assign task / Edit / Delete. */\nexport function AgentCard({\n name,\n avatar,\n runningCount,\n taskCount,\n goalProgress,\n details,\n onWatch,\n onMessage,\n onAssignTask,\n onEdit,\n onCopyAddress,\n onDelete,\n href,\n onSelect,\n labels,\n testIds,\n testId,\n className,\n ...rest\n}: AgentCardProps & Omit<HTMLAttributes<HTMLDivElement>, keyof AgentCardProps>) {\n const l = { ...DEFAULT_AGENT_CARD_LABELS, ...labels }\n return (\n <div\n {...rest}\n className={cn('rounded-lg bg-muted p-4', className)}\n data-testid={testIdOr(testId ?? testIds?.root, { testId: `agent-card-${name}` })}\n data-slot=\"agent-card\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"relative shrink-0\">\n {avatar}\n {runningCount > 0 && (\n <span\n className=\"absolute -right-0.5 -top-0.5 size-2.5 rounded-full bg-ai-ink\"\n role=\"img\"\n aria-label={l.runningIndicator}\n >\n <span className=\"absolute inset-0 animate-ping rounded-full bg-ai-ink opacity-60\" />\n </span>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n {href ? (\n <ActionLink\n href={href}\n onSelect={onSelect}\n className=\"block max-w-full truncate text-left font-medium hover:underline\"\n >\n {name}\n </ActionLink>\n ) : (\n <p className=\"truncate font-medium\">{name}</p>\n )}\n <div className=\"mt-1.5 flex flex-wrap gap-1 text-xs text-muted-foreground\">\n {runningCount > 0 ? (\n <span className=\"rounded-full bg-ai-soft px-2 py-px text-ai-ink\">\n {l.runningCount(runningCount)}\n </span>\n ) : (\n <span className=\"rounded-full bg-background px-2 py-px\">\n {l.taskCount(taskCount)}\n </span>\n )}\n {goalProgress && (\n <span className=\"rounded-full bg-background px-2 py-px\">\n {l.goalMet(goalProgress.met, goalProgress.total)}\n </span>\n )}\n </div>\n {details}\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-center gap-1 pt-1\">\n {onMessage && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={ACTION}\n onClick={onMessage}\n data-testid={testIdOr(testIds?.message, { testId: `agent-message-${name}` })}\n >\n <MessageSquare size={14} /> {l.message}\n </Button>\n )}\n {onWatch && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(ACTION, 'text-ai-ink hover:text-ai-ink')}\n onClick={onWatch}\n data-testid={testIdOr(testIds?.watch, { testId: `agent-watch-run-${name}` })}\n >\n <Eye size={14} /> {l.watch}\n </Button>\n )}\n {onAssignTask && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={ACTION}\n onClick={onAssignTask}\n data-testid={testIdOr(testIds?.assignTask, { testId: `agent-assign-task-${name}` })}\n >\n <ClipboardList size={14} /> {l.assignTask}\n </Button>\n )}\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={ACTION}\n onClick={onEdit}\n data-testid={testIdOr(testIds?.edit, { testId: `agent-edit-${name}` })}\n >\n <Pencil size={14} /> {l.edit}\n </Button>\n )}\n {onCopyAddress && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(ACTION, 'text-muted-foreground')}\n onClick={onCopyAddress}\n data-testid={testIdOr(testIds?.copyAddress, { testId: `agent-copy-address-${name}` })}\n >\n <Copy size={14} /> {l.copyAddress}\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(ACTION, 'ml-auto text-muted-foreground hover:text-red-text')}\n onClick={onDelete}\n aria-label={l.deleteAgent(name)}\n data-testid={testIdOr(testIds?.delete, { testId: `agent-delete-${name}` })}\n >\n <Trash2 size={14} />\n </Button>\n )}\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Bot, Plus, Sparkles } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\nimport { EmptyState } from '../../components/EmptyState'\n\nexport interface AgentGalleryLabels {\n /** Intro line next to the New agent button. */\n description: string\n emptyTitle: string\n emptyDescription: string\n emptyCta: string\n newAgent: string\n}\n\nexport const DEFAULT_AGENT_GALLERY_LABELS: AgentGalleryLabels = {\n description: 'Personas that work for you, on demand.',\n emptyTitle: 'Create your first agent',\n emptyDescription:\n 'Describe a persona, pick its tools, generate an avatar, then hand it work from an agent card and watch it converge.',\n emptyCta: 'Create an agent',\n newAgent: 'New agent',\n}\n\nexport interface AgentGalleryTestIds {\n emptyCta: string\n createButton: string\n gallery: string\n}\n\nexport interface AgentGalleryProps {\n /** Number of agents; 0 shows the first-run empty state instead of the grid. */\n count: number\n onCreate: () => void\n /** The AgentCard children. */\n children?: ReactNode\n /** Intro line next to the New agent button (wins over `labels.description`). */\n description?: string\n labels?: Partial<AgentGalleryLabels>\n testIds?: Partial<AgentGalleryTestIds>\n className?: string\n}\n\n/** Agents grid with an intro row + New agent action, or a first-run empty state. */\nexport function AgentGallery({\n count,\n onCreate,\n children,\n description,\n labels,\n testIds,\n className,\n}: AgentGalleryProps) {\n const l = { ...DEFAULT_AGENT_GALLERY_LABELS, ...labels }\n if (count === 0) {\n return (\n <div className={cn('mt-8', className)}>\n <EmptyState\n className=\"rounded-lg border-0 bg-muted\"\n icon={Bot}\n title={l.emptyTitle}\n description={l.emptyDescription}\n action={\n <Button\n onClick={onCreate}\n className=\"gap-1.5\"\n data-testid={testIdOr(testIds?.emptyCta, { testId: 'agent-empty-cta' })}\n >\n <Sparkles size={16} /> {l.emptyCta}\n </Button>\n }\n />\n </div>\n )\n }\n return (\n <div className={className}>\n <div className=\"mb-4 flex flex-wrap items-center justify-between gap-x-3 gap-y-2\">\n <p className=\"min-w-0 text-sm text-muted-foreground\">{description ?? l.description}</p>\n <Button\n size=\"sm\"\n onClick={onCreate}\n className=\"h-8 gap-1.5 pointer-coarse:h-11\"\n data-testid={testIdOr(testIds?.createButton, { testId: 'agent-create-button' })}\n >\n <Plus size={16} /> {l.newAgent}\n </Button>\n </div>\n <div\n className=\"grid grid-cols-[repeat(auto-fill,minmax(16rem,1fr))] gap-4\"\n data-testid={testIdOr(testIds?.gallery, { testId: 'agent-gallery' })}\n data-slot=\"agent-gallery\"\n >\n {children}\n </div>\n </div>\n )\n}\n","/** Tasks per assigned agent, retaining server order for latest-goal/watch presentation. */\nexport function groupAgentTasks<T extends { agent_ext_id?: string | null }>(\n tasks: readonly T[]\n): Map<string, T[]> {\n const grouped = new Map<string, T[]>()\n for (const task of tasks) {\n if (!task.agent_ext_id) continue\n const assigned = grouped.get(task.agent_ext_id)\n if (assigned) assigned.push(task)\n else grouped.set(task.agent_ext_id, [task])\n }\n return grouped\n}\n","import type { HTMLAttributes, MouseEvent, ReactNode } from 'react'\nimport { Download, Eye, Globe, Lock, Pencil } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../../components/ActionLink'\nimport { testIdOr } from '../../chat/test-id'\nimport {\n SkillActionButton,\n SkillGlobalBadge,\n SkillTypeBadge,\n activateOnKey,\n type SkillGlobalBadgeLabels,\n} from './SkillParts'\n\nexport interface SkillCardLabels extends SkillGlobalBadgeLabels {\n preview: string\n edit: string\n export: string\n makePrivate: string\n makePrivateTooltip: string\n publish: string\n}\n\nexport const DEFAULT_SKILL_CARD_LABELS: SkillCardLabels = {\n global: 'Global',\n globalTitle: 'Shared with everyone in the marketplace',\n preview: 'Preview skill',\n edit: 'Edit skill',\n export: 'Export skill',\n makePrivate: 'Make private',\n makePrivateTooltip: 'Make private (unpublish)',\n publish: 'Publish to marketplace',\n}\n\nexport interface SkillCardTestIds {\n root: string\n preview: string\n edit: string\n export: string\n toggleVisibility: string\n}\n\nexport interface SkillCardProps {\n name: string\n description: string\n /** Skill type; a small badge is shown when not `markdown`. */\n type?: string\n /** `global` shows a badge and drives the publish toggle. */\n visibility?: 'mine' | 'global'\n /** Only owners see the publish toggle. */\n isOwner?: boolean\n /** Leading icon (the app supplies its skill entity icon). */\n icon?: ReactNode\n /** Invoke the skill (row click / Enter / Space). */\n onClick: () => void\n onPreview: (e: MouseEvent) => void\n onEdit: (e: MouseEvent) => void\n onExport: (e: MouseEvent) => void\n /** Publish / unpublish. Owner-only; omit to hide. */\n onToggleVisibility?: (e: MouseEvent) => void\n /** Destination of the skill; the name becomes a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<SkillCardLabels>\n testId?: string\n testIds?: Partial<SkillCardTestIds>\n className?: string\n}\n\n/**\n * Horizontal skill row: icon + `/name` + badges + description, with preview / edit / export /\n * publish actions. All actions are always visible (nothing is hover-only).\n */\nexport function SkillCard({\n name,\n description,\n type,\n visibility = 'mine',\n isOwner = true,\n icon,\n onClick,\n onPreview,\n onEdit,\n onExport,\n onToggleVisibility,\n href,\n labels,\n testId,\n testIds,\n className,\n ...rest\n}: SkillCardProps & Omit<HTMLAttributes<HTMLDivElement>, keyof SkillCardProps | 'onClick'>) {\n const l = { ...DEFAULT_SKILL_CARD_LABELS, ...labels }\n const isGlobal = visibility === 'global'\n return (\n <div\n {...rest}\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex w-full cursor-pointer flex-wrap items-center gap-x-3 gap-y-1 rounded-lg bg-muted px-4 py-3 transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n onClick={onClick}\n onKeyDown={activateOnKey(onClick)}\n data-skill-name={name}\n data-testid={testIdOr(testId ?? testIds?.root, { testId: 'skill-card' })}\n data-slot=\"skill-card\"\n >\n {icon && <span className=\"shrink-0 text-primary [&>svg]:size-5\">{icon}</span>}\n {href ? (\n // The link owns plain + modified clicks; stop the row handler from double-firing.\n <span onClick={(e) => e.stopPropagation()}>\n <ActionLink\n href={href}\n onSelect={onClick}\n className=\"whitespace-nowrap font-mono text-sm font-medium\"\n >\n /{name}\n </ActionLink>\n </span>\n ) : (\n <span className=\"whitespace-nowrap font-mono text-sm font-medium\">/{name}</span>\n )}\n {type && type !== 'markdown' && <SkillTypeBadge type={type} />}\n {isGlobal && <SkillGlobalBadge labels={l} />}\n <span className=\"min-w-0 text-sm text-muted-foreground max-sm:order-last max-sm:w-full max-sm:line-clamp-2 sm:flex-1 sm:truncate\">\n {description}\n </span>\n <span className=\"ml-auto flex shrink-0 items-center gap-1\" data-slot=\"skill-card-actions\">\n <SkillActionButton\n label={l.preview}\n onClick={onPreview}\n testId={testIdOr(testIds?.preview, { testId: 'preview-skill-button' })}\n >\n <Eye className=\"size-4 text-muted-foreground\" />\n </SkillActionButton>\n <SkillActionButton\n label={l.edit}\n onClick={onEdit}\n testId={testIdOr(testIds?.edit, { testId: 'edit-skill-button' })}\n >\n <Pencil className=\"size-4 text-muted-foreground\" />\n </SkillActionButton>\n <SkillActionButton\n label={l.export}\n onClick={onExport}\n testId={testIdOr(testIds?.export, { testId: 'export-skill-button' })}\n >\n <Download className=\"size-4 text-muted-foreground\" />\n </SkillActionButton>\n {isOwner && onToggleVisibility && (\n <SkillActionButton\n label={isGlobal ? l.makePrivate : l.publish}\n tooltip={isGlobal ? l.makePrivateTooltip : l.publish}\n onClick={onToggleVisibility}\n testId={testIdOr(testIds?.toggleVisibility, {\n testId: 'toggle-skill-visibility-button',\n })}\n >\n {isGlobal ? (\n <Lock className=\"size-4 text-muted-foreground\" />\n ) : (\n <Globe className=\"size-4 text-primary\" />\n )}\n </SkillActionButton>\n )}\n </span>\n </div>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { Eye, Globe, Lock, Pencil, Trash2 } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../../components/ActionLink'\nimport { testIdOr } from '../../chat/test-id'\nimport {\n SkillActionButton,\n SkillGlobalBadge,\n SkillTypeBadge,\n activateOnKey,\n type SkillGlobalBadgeLabels,\n} from './SkillParts'\n\nexport interface SkillRowLabels extends SkillGlobalBadgeLabels {\n preview: string\n edit: string\n makePrivate: string\n publish: string\n delete: string\n /** Row tooltip; receives the skill name. */\n insertTitle: (name: string) => string\n}\n\nexport const DEFAULT_SKILL_ROW_LABELS: SkillRowLabels = {\n global: 'Global',\n globalTitle: 'Shared with everyone in the marketplace',\n preview: 'Preview',\n edit: 'Edit',\n makePrivate: 'Make private',\n publish: 'Publish to marketplace',\n delete: 'Delete',\n insertTitle: (name) => `Insert /${name} into the chat`,\n}\n\nexport interface SkillRowProps {\n name: string\n description?: string\n type?: string\n isGlobal?: boolean\n icon?: ReactNode\n /** Invoke the skill (inserts `/name` into the chat). */\n onInvoke: () => void\n onPreview: () => void\n /** Owner-only actions: omit to hide. */\n onEdit?: () => void\n onTogglePublish?: () => void\n onDelete?: () => void\n /** Destination of the skill; the name becomes a real link (modified clicks go to the browser). */\n href?: string\n labels?: Partial<SkillRowLabels>\n /** Overrides the default `skills-panel-row-{name}` id. */\n testId?: string\n className?: string\n}\n\n/** Compact two-line skill row for side panels. Actions are always visible. */\nexport function SkillRow({\n name,\n description,\n type,\n isGlobal = false,\n icon,\n onInvoke,\n onPreview,\n onEdit,\n onTogglePublish,\n onDelete,\n href,\n labels,\n testId,\n className,\n ...rest\n}: SkillRowProps & Omit<HTMLAttributes<HTMLDivElement>, keyof SkillRowProps | 'onClick'>) {\n const l = { ...DEFAULT_SKILL_ROW_LABELS, ...labels }\n return (\n <div\n {...rest}\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex cursor-pointer items-center gap-2 px-4 py-2 hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring',\n className\n )}\n onClick={onInvoke}\n onKeyDown={activateOnKey(onInvoke)}\n data-testid={testIdOr(testId, { testId: `skills-panel-row-${name}` })}\n data-slot=\"skill-row\"\n title={l.insertTitle(name)}\n >\n {icon && <span className=\"shrink-0 text-primary [&>svg]:size-4\">{icon}</span>}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n {href ? (\n // The link owns plain + modified clicks; stop the row handler from double-firing.\n <span className=\"min-w-0\" onClick={(e) => e.stopPropagation()}>\n <ActionLink href={href} onSelect={onInvoke} className=\"truncate font-mono text-sm\">\n /{name}\n </ActionLink>\n </span>\n ) : (\n <span className=\"truncate font-mono text-sm\">/{name}</span>\n )}\n {type && type !== 'markdown' && <SkillTypeBadge type={type} />}\n {isGlobal && <SkillGlobalBadge labels={l} />}\n </div>\n {description && <div className=\"truncate text-xs text-muted-foreground\">{description}</div>}\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <SkillActionButton label={l.preview} onClick={() => onPreview()}>\n <Eye className=\"size-4\" />\n </SkillActionButton>\n {onEdit && (\n <SkillActionButton label={l.edit} onClick={() => onEdit()}>\n <Pencil className=\"size-4\" />\n </SkillActionButton>\n )}\n {onTogglePublish && (\n <SkillActionButton\n label={isGlobal ? l.makePrivate : l.publish}\n onClick={() => onTogglePublish()}\n >\n {isGlobal ? <Lock className=\"size-4\" /> : <Globe className=\"size-4 text-primary\" />}\n </SkillActionButton>\n )}\n {onDelete && (\n <SkillActionButton label={l.delete} onClick={() => onDelete()}>\n <Trash2 className=\"size-4 text-destructive\" />\n </SkillActionButton>\n )}\n </div>\n </div>\n )\n}\n"]}
|
|
@@ -298,6 +298,18 @@ function AgentGallery({
|
|
|
298
298
|
)
|
|
299
299
|
] });
|
|
300
300
|
}
|
|
301
|
+
|
|
302
|
+
// src/agents/definitions/agentTasks.ts
|
|
303
|
+
function groupAgentTasks(tasks) {
|
|
304
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
305
|
+
for (const task of tasks) {
|
|
306
|
+
if (!task.agent_ext_id) continue;
|
|
307
|
+
const assigned = grouped.get(task.agent_ext_id);
|
|
308
|
+
if (assigned) assigned.push(task);
|
|
309
|
+
else grouped.set(task.agent_ext_id, [task]);
|
|
310
|
+
}
|
|
311
|
+
return grouped;
|
|
312
|
+
}
|
|
301
313
|
var DEFAULT_SKILL_CARD_LABELS = {
|
|
302
314
|
global: "Global",
|
|
303
315
|
globalTitle: "Shared with everyone in the marketplace",
|
|
@@ -492,6 +504,6 @@ function SkillRow({
|
|
|
492
504
|
);
|
|
493
505
|
}
|
|
494
506
|
|
|
495
|
-
export { AgentCard, AgentGallery, DEFAULT_AGENT_CARD_LABELS, DEFAULT_AGENT_GALLERY_LABELS, DEFAULT_SKILL_CARD_LABELS, DEFAULT_SKILL_ROW_LABELS, SkillCard, SkillRow, useWorkflowPreview };
|
|
496
|
-
//# sourceMappingURL=chunk-
|
|
497
|
-
//# sourceMappingURL=chunk-
|
|
507
|
+
export { AgentCard, AgentGallery, DEFAULT_AGENT_CARD_LABELS, DEFAULT_AGENT_GALLERY_LABELS, DEFAULT_SKILL_CARD_LABELS, DEFAULT_SKILL_ROW_LABELS, SkillCard, SkillRow, groupAgentTasks, useWorkflowPreview };
|
|
508
|
+
//# sourceMappingURL=chunk-OQMWTEM2.js.map
|
|
509
|
+
//# sourceMappingURL=chunk-OQMWTEM2.js.map
|