@arbidocs/blocks 0.4.137 → 0.4.138
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/dist/agents/index.cjs +380 -356
- package/dist/agents/index.js +8 -8
- package/dist/agents/skills/SkillLibraryDetail.d.ts +26 -0
- package/dist/agents/skills/index.d.ts +2 -0
- package/dist/agents/skills/skillLibrary.d.ts +46 -0
- package/dist/chat/index.cjs +139 -139
- package/dist/chat/index.js +4 -4
- package/dist/{chunk-CHVCTKF4.cjs → chunk-3BI6EWKP.cjs} +672 -55
- package/dist/chunk-3BI6EWKP.cjs.map +1 -0
- package/dist/{chunk-VMESMX7N.js → chunk-5BXEYYH6.js} +3 -3
- package/dist/{chunk-VMESMX7N.js.map → chunk-5BXEYYH6.js.map} +1 -1
- package/dist/{chunk-EHOPZBAX.cjs → chunk-7YLJHTDC.cjs} +11 -11
- package/dist/{chunk-EHOPZBAX.cjs.map → chunk-7YLJHTDC.cjs.map} +1 -1
- package/dist/{chunk-M33QUNFH.js → chunk-ED4HHTIA.js} +3 -3
- package/dist/{chunk-M33QUNFH.js.map → chunk-ED4HHTIA.js.map} +1 -1
- package/dist/{chunk-HDYWXEQU.cjs → chunk-IE5CUCZK.cjs} +4 -4
- package/dist/{chunk-HDYWXEQU.cjs.map → chunk-IE5CUCZK.cjs.map} +1 -1
- package/dist/{chunk-7M4C6CK7.js → chunk-JO3EMZ4X.js} +3 -3
- package/dist/{chunk-7M4C6CK7.js.map → chunk-JO3EMZ4X.js.map} +1 -1
- package/dist/{chunk-C3ZRLULA.cjs → chunk-JVL7HUIQ.cjs} +5 -5
- package/dist/{chunk-C3ZRLULA.cjs.map → chunk-JVL7HUIQ.cjs.map} +1 -1
- package/dist/{chunk-JY73DJOS.cjs → chunk-MJKBVIV3.cjs} +80 -495
- package/dist/{chunk-KMNZ2RVO.js.map → chunk-MJKBVIV3.cjs.map} +1 -1
- package/dist/{chunk-BUNZWOPX.cjs → chunk-OAL3B2ZU.cjs} +5 -5
- package/dist/{chunk-BUNZWOPX.cjs.map → chunk-OAL3B2ZU.cjs.map} +1 -1
- package/dist/{chunk-6F7SZCVL.cjs → chunk-OWCEQKAR.cjs} +3 -3
- package/dist/{chunk-6F7SZCVL.cjs.map → chunk-OWCEQKAR.cjs.map} +1 -1
- package/dist/{chunk-KMNZ2RVO.js → chunk-UBEI6WFJ.js} +10 -411
- package/dist/{chunk-JY73DJOS.cjs.map → chunk-UBEI6WFJ.js.map} +1 -1
- package/dist/{chunk-ATJUVHVB.js → chunk-XVME4XYD.js} +604 -8
- package/dist/chunk-XVME4XYD.js.map +1 -0
- package/dist/{chunk-YOMPLCP6.js → chunk-Y5KTM3V5.js} +3 -3
- package/dist/{chunk-YOMPLCP6.js.map → chunk-Y5KTM3V5.js.map} +1 -1
- package/dist/{chunk-L3T7OJRX.js → chunk-ZNI4SW2G.js} +3 -3
- package/dist/{chunk-L3T7OJRX.js.map → chunk-ZNI4SW2G.js.map} +1 -1
- package/dist/collaboration/index.cjs +9 -9
- package/dist/collaboration/index.js +1 -1
- package/dist/connect/index.cjs +436 -54
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +1 -0
- package/dist/connect/index.js +399 -18
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedSkillsLibrary.d.ts +26 -0
- package/dist/document-tools/index.cjs +1 -1
- package/dist/document-tools/index.js +1 -1
- package/dist/facts/index.cjs +2 -2
- package/dist/facts/index.js +2 -2
- package/dist/index.cjs +650 -626
- package/dist/index.js +15 -15
- package/dist/settings/index.cjs +10 -10
- package/dist/settings/index.js +2 -2
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +6 -6
- package/dist/studio/index.js +5 -5
- package/dist/workflow-canvas/index.cjs +59 -59
- package/dist/workflow-canvas/index.js +8 -8
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-ATJUVHVB.js.map +0 -1
- package/dist/chunk-CHVCTKF4.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/connection/ArbiAppProvider.tsx","../../src/connection/ConnectedTaskAccessRequest.tsx","../../src/connection/ConnectedWorkspaceActivity.tsx","../../src/connection/ConnectedNotificationRelevance.tsx","../../src/connection/ConnectedWorkflowsTable.tsx","../../src/connection/ConnectedWorkflowLauncher.tsx","../../src/connection/ConnectedSkillUpload.tsx","../../src/connection/StreamedArtifact.tsx","../../src/connection/useWorkflowThread.ts","../../src/connection/WorkflowRunThread.tsx","../../src/connection/WorkflowRunnerDialogs.tsx","../../src/connection/ConnectedWorkflowRunner.tsx","../../src/connection/ConnectedTagTable.tsx","../../src/connection/useConnectedShellWorkspaces.ts","../../src/connection/ConnectedSettings.tsx","../../src/connection/useConnectedDocxNotifications.ts","../../src/connection/useConnectedWorkNotifications.ts","../../src/connection/mail/attachments.ts","../../src/connection/mail/ConnectedMailAccounts.tsx","../../src/connection/mail/useWordBody.ts","../../src/connection/mail/MailComposerForm.tsx","../../src/connection/mail/mailbox.ts","../../src/connection/mail/ConnectedMailComposer.tsx","../../src/connection/mail/ConnectedMailSetup.tsx","../../src/connection/mail/ConnectedMailbox.tsx","../../src/connection/mail/ConnectedMailMessage.tsx","../../src/connection/ConnectedAgentChatPanel.tsx"],"names":["useConnection","jsx","ArbiWebSocketProvider","useState","QueryClient","QueryClientProvider","ArbiProvider","ConnectionProvider","useConversations","useRunConversation","jsxs","Button","useWorkspaceActivity","useWorkspaceUsers","useMemo","WorkspaceActivityList","useWorkspaceNotificationLevel","WorkspaceNotificationMenu","useFollowThread","ThreadFollowMenuItem","ThreadFollowButton","useConnectedWorkspace","workflowTriggerType","fmtDate","useBlocksEnvironment","useWorkflows","useConnectedConversations","useAgents","useUpdateWorkflow","useDeleteWorkflow","useRunWorkflow","useEffect","WorkflowsTable","useConnectedDocuments","useConnectedTags","buildWorkflowScopeSource","documentScopeLabels","useArbi","useThumbnails","useRef","useCallback","Fragment","WorkflowDocumentsField","WorkflowLauncher","useUploadSkillFiles","cn","Label","importSkillFile","Upload","importSkillFromUrl","Input","Link2","lazy","artifacts","useStreamedArtifact","ArtifactCanvas","StreamedArtifactFrame","Suspense","stepFields","useWorkspaceDocs","initialRunInputs","useCreateWork","useActOnStep","workflowSteps","fromPlanSteps","useConversationActivity","stepStatesFromActivity","useConversationThreads","runThreadTitle","toPlanSteps","useWorkflowView","useArbiChat","ChatPage","useOptionalDocumentTools","splitDocRef","fetchDocumentPdf","ModalScaffold","Loader2","SignDocumentDialog","DocumentToolsProvider","ConnectedNativeDocxEditor","useTags","useDocuments","useLayoutEffect","files","MessageSquare","AiAnswer","WorkflowRunner","ExternalLink","WorkflowStepBar","stepLevels","stepDocuments","stepKindOf","useTagKindSchema","useSetTagValues","useUpdateTagKindSchema","useInvalidateTagData","tagTableDocx","DOCX_MIME_TYPE","TagTable","useWorkspaces","useShellWorkspaces","useProfile","useUpdateProfile","useRequestEmailChange","useConfirmEmailChange","useNameEditor","useAvatarCrop","useEmailChange","SettingsSection","UserCircle","ProfileCard","AvatarPicker","initials","ImageCropModal","useIdentityVerification","IdentityVerificationCard","IdentityVerificationDialog","RequireVerified","usePasswordChange","usePasswordChangeForm","PasswordChangeDialog","KeyRound","SettingsCard","SettingsActionRow","EMAIL_NOTIFICATION_CATEGORIES","EMAIL_NOTIFICATION_KEYS","useNotificationPreferences","NotificationCategoryList","toNotificationCategories","useSessions","useCurrentSessionId","useTerminateSession","toActiveSessionViews","SettingsRow","Radio","ActiveSessionsDialog","useSignOut","useIsOnline","LogoutDialog","toLogoutSessionViews","useDeleteAccount","useDeleteAccountFlow","SettingsDangerZone","DeleteAccountDialog","toDeleteBlockerViews","useQueryClient","useQuery","useArbiWebSocket","useNotify","useWorkNotifications","mailDraftIdFromContent","accountPath","client","bytesToBase64","fileAttachment","useMailClient","defaultMailAlias","useClaimNativeAlias","useMailOnline","isAliasTakenError","nextAliasSuggestion","aliasTakenMessage","useConnectMailAccount","useDisconnectMailAccount","Dialog","DialogContent","DialogTitle","DialogDescription","useRegisterOpenDocument","useMailDraftEditor","PlainMailBodyEditor","useMailProjects","parseMailRecipients","useSaveMailDraft","useSendMail","useMailDraftReplaced","X","createPortal","Paperclip","MailDocumentPicker","Tooltip","TooltipTrigger","TooltipContent","Send","useMailPolicy","useMailAccounts","useMailUnlock","useMailFolders","useMailMessages","useMailDraftCompose","draftMailCompose","useMailMessage","replyMailCompose","emptyMailCompose","MailIcon","useMailCache","mailJson","MailOfflineUnavailableError","TabHeader","FilesFilterBar","FilterInput","TriStateFilterMenu","FolderFilterButton","FolderPickerRow","Settings","Plus","MailGrid","error","MailMessageView","ArrowLeft","ConfirmDialog","takeOpenDocumentForTurn","useAgentSession","useStartAgentSession","useCloseAgentSession"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Composition root for a host app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function ArbiAppProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl} deploymentDomain={config.deploymentDomain}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","import { useConversations, useRunConversation } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useConnection } from './ConnectionProvider'\n\n/** Approval for a parked agent run, scoped to the currently selected task. */\nexport function ConnectedTaskAccessRequest({ conversationId }: { conversationId?: string }) {\n const { workspaceId } = useConnection()\n const tasks = useConversations(workspaceId ?? undefined, { live: true })\n const run = useRunConversation()\n const task = tasks.data?.find((item) => item.external_id === conversationId)\n if (!task?.pending_auth_request_id || !task.is_owner) return null\n return (\n <section\n className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-card p-3\"\n data-testid=\"task-chat-access-request\"\n >\n <p className=\"flex-1 text-sm\">This task is waiting for temporary workspace access.</p>\n <Button\n disabled={run.isPending}\n onClick={() => run.mutate(task.external_id)}\n data-testid=\"task-chat-allow-access\"\n >\n {run.isPending ? 'Allowing access…' : 'Allow access and run'}\n </Button>\n {run.error && (\n <p role=\"alert\" className=\"w-full text-sm text-destructive\">\n {run.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { useMemo } from 'react'\nimport { useWorkspaceActivity, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n WorkspaceActivityList,\n type WorkspaceActivityItem,\n type WorkspaceActivityListProps,\n type WorkspaceActivityTarget,\n} from '../activity'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceActivityProps extends Pick<\n WorkspaceActivityListProps,\n 'formatTime' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace to show; default the selected one. */\n workspaceId?: string\n /** Open an entry's thread, document version or run (the host owns its routes). */\n onOpen: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** Entries per page (1–100, server default 30). */\n pageSize?: number\n}\n\n/** The selected workspace's activity feed, newest first, a page at a time. */\nexport function ConnectedWorkspaceActivity({\n workspaceId: workspaceProp,\n onOpen,\n pageSize,\n ...listProps\n}: ConnectedWorkspaceActivityProps) {\n const { workspaceId: selected, status, ensureWorkspaceOpen } = useConnection()\n const workspaceId = workspaceProp ?? selected ?? undefined\n const live = status === 'authenticated' && !!workspaceId\n const feed = useWorkspaceActivity(workspaceId, {\n enabled: live,\n limit: pageSize,\n // Titles and names decrypt only while the session has the workspace open.\n beforeFetch: workspaceId === selected ? ensureWorkspaceOpen : undefined,\n })\n const members = useWorkspaceUsers(workspaceId, {\n enabled: live && workspaceId === selected,\n beforeFetch: ensureWorkspaceOpen,\n })\n const names = useMemo(\n () =>\n new Map(\n (members.data ?? []).map((m) => [\n m.user.external_id,\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n ])\n ),\n [members.data]\n )\n const items = useMemo(\n () => (feed.data?.pages ?? []).flatMap((page) => page.items as WorkspaceActivityItem[]),\n [feed.data]\n )\n return (\n <WorkspaceActivityList\n {...listProps}\n items={items}\n isLoading={feed.isLoading}\n isError={feed.isError}\n hasMore={feed.hasNextPage}\n isLoadingMore={feed.isFetchingNextPage}\n onLoadMore={() => void feed.fetchNextPage()}\n onRetry={() => void feed.refetch()}\n onOpen={onOpen}\n nameOf={(id) => names.get(id)}\n />\n )\n}\n","import { useFollowThread, useWorkspaceNotificationLevel } from '@arbidocs/react'\nimport {\n ThreadFollowButton,\n ThreadFollowMenuItem,\n WorkspaceNotificationMenu,\n type ThreadFollowLabels,\n type WorkspaceNotificationMenuProps,\n} from '../activity'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceNotificationMenuProps extends Pick<\n WorkspaceNotificationMenuProps,\n 'onOpenActivity' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace; default the selected one. */\n workspaceId?: string\n}\n\n/** The bell menu that follows, mutes or resets a workspace, saved to the user settings. */\nexport function ConnectedWorkspaceNotificationMenu({\n workspaceId: workspaceProp,\n ...menuProps\n}: ConnectedWorkspaceNotificationMenuProps) {\n const { workspaceId: selected, status } = useConnection()\n const workspaceId = workspaceProp ?? selected\n const { level, setLevel, isLoading, isSaving } = useWorkspaceNotificationLevel(workspaceId, {\n enabled: status === 'authenticated',\n })\n if (!workspaceId) return null\n return (\n <WorkspaceNotificationMenu\n {...menuProps}\n level={level}\n onLevelChange={setLevel}\n disabled={isLoading || isSaving}\n />\n )\n}\n\nexport interface ConnectedThreadFollowProps {\n conversationId: string | null | undefined\n /** `button` (default): a bell toggle; `menu-item`: an item of a thread's options menu. */\n as?: 'button' | 'menu-item'\n labels?: Partial<ThreadFollowLabels>\n testId?: string\n}\n\n/** Follow or unfollow a thread (pushed everything in it), saved to the user settings. */\nexport function ConnectedThreadFollow({\n conversationId,\n as = 'button',\n ...props\n}: ConnectedThreadFollowProps) {\n const { status } = useConnection()\n const { following, setFollowing, isLoading, isSaving } = useFollowThread(conversationId, {\n enabled: status === 'authenticated',\n })\n if (!conversationId) return null\n const Control = as === 'menu-item' ? ThreadFollowMenuItem : ThreadFollowButton\n return (\n <Control\n {...props}\n following={following}\n onFollowingChange={setFollowing}\n disabled={isLoading || isSaving}\n />\n )\n}\n","/**\n * The saved workflows bound to the connection: when each starts, its last run (a link to the thread\n * it created) and next run, who runs it, pause and resume, share, run now, delete (one or many), and\n * the workflow's history. The host opens a workflow (its builder) and its history; threads open\n * through the environment's `openConversation`, failures are told through its `notify`.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useAgents,\n useDeleteWorkflow,\n useRunWorkflow,\n useUpdateWorkflow,\n useWorkflows,\n useWorkspaceUsers,\n type WorkflowResponse,\n} from '@arbidocs/react'\nimport { WorkflowsTable, type WorkflowsTableProps } from '../agents/tasks/WorkflowsTable'\nimport { workflowTriggerType } from '../agents/tasks/workflowRows'\nimport { fmtDate } from '../lib/format'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedConversations } from './workspaceData'\n\n/** The viewer's role in the open workspace, and the workspace's members. */\nexport function useConnectedWorkspaceRole() {\n const { workspaceId, live, userId, ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: members = [] } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const role = members.find((m) => m.user.external_id === userId)?.role\n return {\n members,\n role,\n /** An owner or a collaborator edits, pauses, resumes and runs what is shared with the workspace. */\n canEditShared: role === 'owner' || role === 'collaborator',\n /** With an item's creator, the only one who deletes it. */\n isWorkspaceOwner: role === 'owner',\n }\n}\n\nexport interface ConnectedWorkflowsTableLabels {\n /** A change (pause, share, delete) that failed without a message. */\n updateFailed: string\n deleteTitle: string\n deleteOne: (name: string) => string\n deleteMany: (count: number) => string\n /** A run that failed: its history has the error report. */\n runFailed: string\n /** A run that created no thread. */\n noThread: string\n /** A document action that started (it has no thread): what is happening. */\n documentAction: (workflow: WorkflowResponse) => string\n untitledTask: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS: ConnectedWorkflowsTableLabels = {\n updateFailed: 'Could not update the workflow',\n deleteTitle: 'Delete workflow',\n deleteOne: (name) => `Delete “${name}”? Threads it already created stay.`,\n deleteMany: (count) => `Delete ${count} workflows? Threads they already created stay.`,\n runFailed: 'The workflow failed. You can send an error report from its history.',\n noThread: 'The workflow did not create a thread.',\n documentAction: (workflow) =>\n workflow.action?.type === 'email_documents'\n ? 'Preparing your document email'\n : 'Reviewing documents',\n untitledTask: 'Untitled thread',\n}\n\ntype TableProps = WorkflowsTableProps<WorkflowResponse>\n\nexport interface ConnectedWorkflowsTableProps extends Omit<\n TableProps,\n | 'workflows'\n | 'isLoading'\n | 'busyId'\n | 'describeTrigger'\n | 'formatDate'\n | 'onToggleActive'\n | 'onToggleShared'\n | 'onDelete'\n | 'onDeleteMany'\n | 'onToggleActiveMany'\n | 'onRun'\n | 'onOpenThread'\n | 'lastRuns'\n | 'agentNames'\n | 'taskNames'\n | 'canEditShared'\n | 'isWorkspaceOwner'\n> {\n /** Which saved workflows to list (e.g. those on a schedule). Default: all. */\n filter?: (workflow: WorkflowResponse) => boolean\n /** When a workflow starts, in the host's words. Default: its trigger type. */\n describeTrigger?: TableProps['describeTrigger']\n formatDate?: TableProps['formatDate']\n connectedLabels?: Partial<ConnectedWorkflowsTableLabels>\n}\n\nconst messageOf = (error: unknown) => (error instanceof Error ? error.message : '')\n\nexport function ConnectedWorkflowsTable({\n filter,\n describeTrigger = (w) => workflowTriggerType(w).replaceAll('_', ' '),\n formatDate = fmtDate,\n onViewRuns,\n connectedLabels,\n ...tableProps\n}: ConnectedWorkflowsTableProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS, ...connectedLabels }\n const { notify, confirm, openConversation } = useBlocksEnvironment()\n const { canEditShared, isWorkspaceOwner } = useConnectedWorkspaceRole()\n const { data: saved = [], isLoading } = useWorkflows({ live: true })\n const { data: conversations, refetch } = useConnectedConversations({ live: true })\n const { data: agents = [] } = useAgents()\n const update = useUpdateWorkflow()\n const remove = useDeleteWorkflow()\n const run = useRunWorkflow()\n const [busyId, setBusyId] = useState<string | null>(null)\n\n const workflows = useMemo(() => (filter ? saved.filter(filter) : saved), [saved, filter])\n // A clock or an event fired a workflow: the thread it created is new to the conversation list.\n const firingStamp = saved.map((w) => `${w.external_id}:${w.last_fired_at ?? ''}`).join('|')\n useEffect(() => {\n void refetch?.()\n }, [firingStamp, refetch])\n\n const lastRuns = useMemo(() => {\n const out: NonNullable<TableProps['lastRuns']> = {}\n for (const c of conversations) {\n const id = c.workflow_ext_id\n if (id && (!out[id] || Date.parse(c.created_at) > Date.parse(out[id].at)))\n out[id] = { conversationId: c.external_id, at: c.created_at, threadStatus: c.status }\n }\n return out\n }, [conversations])\n const agentNames = useMemo(\n () => Object.fromEntries(agents.map((a) => [a.external_id, a.given_name || a.email])),\n [agents]\n )\n const taskNames = useMemo(\n () =>\n Object.fromEntries(\n conversations\n .filter((c) => c.status != null)\n .map((c) => [c.external_id, c.title || l.untitledTask])\n ),\n [conversations, l.untitledTask]\n )\n\n const act = async (workflow: WorkflowResponse, action: () => Promise<unknown>) => {\n setBusyId(workflow.external_id)\n try {\n await action()\n } catch (error) {\n notify(messageOf(error) || l.updateFailed, 'error')\n } finally {\n setBusyId(null)\n }\n }\n const setActive = (workflow: WorkflowResponse, active: boolean) =>\n act(workflow, () => update.mutateAsync({ workflowId: workflow.external_id, patch: { active } }))\n const deleteAll = async (items: WorkflowResponse[]) => {\n if (!items.length) return\n const ok = await confirm({\n title: l.deleteTitle,\n message: items.length === 1 ? l.deleteOne(items[0].name) : l.deleteMany(items.length),\n })\n if (!ok) return\n for (const workflow of items)\n await act(workflow, () => remove.mutateAsync(workflow.external_id))\n }\n\n return (\n <WorkflowsTable\n {...tableProps}\n workflows={workflows}\n isLoading={isLoading}\n busyId={busyId}\n describeTrigger={describeTrigger}\n formatDate={formatDate}\n agentNames={agentNames}\n taskNames={taskNames}\n lastRuns={lastRuns}\n canEditShared={canEditShared}\n isWorkspaceOwner={isWorkspaceOwner}\n onOpenThread={(conversationId) => openConversation(conversationId)}\n onViewRuns={onViewRuns}\n onToggleActive={(workflow, active) => void setActive(workflow, active)}\n onToggleActiveMany={(items, active) => {\n void (async () => {\n for (const workflow of items) await setActive(workflow, active)\n })()\n }}\n onToggleShared={(workflow, shared) =>\n void act(workflow, () =>\n update.mutateAsync({ workflowId: workflow.external_id, patch: { shared } })\n )\n }\n onDelete={(workflow) => void deleteAll([workflow])}\n onDeleteMany={(items) => void deleteAll(items)}\n onRun={(workflow) =>\n void act(workflow, async () => {\n const result = await run.mutateAsync(workflow.external_id)\n if (result.conversation_ext_id) openConversation(result.conversation_ext_id)\n if (result.error) {\n onViewRuns?.(workflow)\n notify(l.runFailed, 'error')\n return\n }\n if (result.execution_id && !result.conversation_ext_id) {\n // A document action runs without a thread: its history shows how it goes.\n onViewRuns?.(workflow)\n notify(l.documentAction(workflow), 'success')\n return\n }\n if (!result.conversation_ext_id) throw new Error(l.noThread)\n })\n }\n />\n )\n}\n","/**\n * The workflow launcher bound to the connection: the open workspace's folders, labels and files\n * behind its scope and `documents` fields (files can be added right there), and the user's agents\n * behind \"Run as\". The host still says what a launch does (`onLaunch`): open a chat, start a task.\n */\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport { useAgents, useArbi, useThumbnails } from '@arbidocs/react'\nimport { WorkflowLauncher, type WorkflowLauncherProps } from '../agents/workflows/WorkflowLauncher'\nimport {\n WorkflowDocumentsField,\n type WorkflowDocumentsFieldLabels,\n type WorkflowFieldDocument,\n} from '../agents/workflows/WorkflowDocumentsField'\nimport type { WorkflowScopeSource } from '../agents/workflows/WorkflowConfigDialog'\nimport { buildWorkflowScopeSource, documentScopeLabels } from '../agents/workflows/workspaceScope'\nimport type { AgentOption } from '../agents/workflows/AgentSelect'\nimport type { WorkflowField, WorkflowScope } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedDocuments, useConnectedTags, type ConnectedDocument } from './workspaceData'\n\nconst IMAGE_FILE_TYPES = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'webp'])\n\n/** A workspace document as a `documents` field offers it. */\nexport function toWorkflowFieldDocument(doc: ConnectedDocument): WorkflowFieldDocument {\n // Pages and tokens are a text-parsing concept: never meaningful for an image.\n const isImage = IMAGE_FILE_TYPES.has((doc.file_type ?? '').toLowerCase())\n return {\n id: doc.external_id,\n title: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n fileName: doc.file_name,\n pages: isImage ? null : (doc.n_pages ?? null),\n tokens: isImage ? null : (doc.tokens ?? null),\n status: doc.status,\n isImage,\n }\n}\n\n/** The open workspace's folders and labels for a workflow's scope field. */\nexport function useConnectedWorkflowScopeSource(): WorkflowScopeSource {\n const { data: docs } = useConnectedDocuments()\n const { data: tags } = useConnectedTags()\n return useMemo(() => buildWorkflowScopeSource(docs, documentScopeLabels(tags)), [docs, tags])\n}\n\n/** The user's agents, for \"Run as\". */\nexport function useConnectedAgentOptions(): AgentOption[] {\n const { data: agents } = useAgents()\n return useMemo(\n () => (agents ?? []).map((a) => ({ id: a.external_id, label: a.given_name || a.email })),\n [agents]\n )\n}\n\nexport interface ConnectedWorkflowDocumentsFieldProps {\n field: WorkflowField\n value: WorkflowScope\n onChange: (value: WorkflowScope) => void\n /** Add files the host's way (its upload dialog). Absent: they are uploaded here. */\n onAddFiles?: (files?: File[]) => void\n labels?: Partial<WorkflowDocumentsFieldLabels>\n}\n\n/**\n * A workflow `documents` field over the open workspace's files: pick, add (or drop) files, see the\n * chosen images. A launcher's or a task composer's `renderDocuments`.\n */\nexport function ConnectedWorkflowDocumentsField({\n field,\n value,\n onChange,\n onAddFiles,\n labels,\n}: ConnectedWorkflowDocumentsFieldProps) {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n const { ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: docs, loaded, refetch } = useConnectedDocuments()\n const documents = useMemo(() => docs.map(toWorkflowFieldDocument), [docs])\n const chosen = value.documents ?? []\n const { data: thumbnails } = useThumbnails(chosen, { enabled: (field.max ?? 1) > 1 })\n const input = useRef<HTMLInputElement>(null)\n const [adding, setAdding] = useState(false)\n\n const upload = useCallback(\n async (files: File[]) => {\n setAdding(true)\n try {\n await ensureWorkspaceOpen()\n for (const file of files) await arbi.documents.uploadFile(file, file.name)\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : String(error), 'error')\n } finally {\n setAdding(false)\n await refetch?.()\n }\n },\n [arbi, ensureWorkspaceOpen, notify, refetch]\n )\n\n return (\n <>\n {!onAddFiles && (\n <input\n ref={input}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Add files\"\n data-testid=\"workflow-add-files-input\"\n onChange={(e) => {\n const files = Array.from(e.target.files ?? [])\n e.target.value = ''\n if (files.length) void upload(files)\n }}\n />\n )}\n <WorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n documents={documents}\n loaded={loaded}\n thumbnailOf={(id) => thumbnails?.[id]}\n onAddFiles={\n onAddFiles ?? ((files) => (files?.length ? void upload(files) : input.current?.click()))\n }\n adding={adding}\n labels={labels}\n />\n </>\n )\n}\n\nexport interface ConnectedWorkflowLauncherProps extends Omit<\n WorkflowLauncherProps,\n 'scopeSource' | 'renderDocuments' | 'agents'\n> {\n /** Add files from a `documents` field the host's way (its upload dialog). Absent: uploaded here. */\n onAddFiles?: (files?: File[]) => void\n}\n\nexport function ConnectedWorkflowLauncher({\n onAddFiles,\n ...props\n}: ConnectedWorkflowLauncherProps) {\n const scopeSource = useConnectedWorkflowScopeSource()\n const agents = useConnectedAgentOptions()\n return (\n <WorkflowLauncher\n {...props}\n scopeSource={scopeSource}\n agents={agents}\n renderDocuments={(field, value, onChange) => (\n <ConnectedWorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n onAddFiles={onAddFiles}\n />\n )}\n />\n )\n}\n","/**\n * Add a skill someone gave you: a file from your computer (`.md` or `.zip`) or a link to one. Both\n * go through the one skill upload (`useUploadSkillFiles`); the skill then appears in every skill\n * list once it is processed.\n */\n\nimport { useRef, useState } from 'react'\nimport { useUploadSkillFiles } from '@arbidocs/react'\nimport { Button, Input, Label, cn } from '@arbidocs/react/ui'\nimport { Link2, Upload } from 'lucide-react'\nimport {\n importSkillFile,\n importSkillFromUrl,\n type SkillImportResult,\n} from '../agents/skills/skillImport'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport interface ConnectedSkillUploadLabels {\n title: string\n description: string\n fromFile: string\n chooseFile: string\n fromLink: string\n linkPlaceholder: string\n add: string\n cancel: string\n /** The notification once a skill is added. */\n added: (slug: string) => string\n failed: string\n}\n\nexport const DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS: ConnectedSkillUploadLabels = {\n title: 'Add a skill',\n description: 'Bring in a skill someone sent you, from a file or a link.',\n fromFile: 'From a file',\n chooseFile: 'Choose a file',\n fromLink: 'From a link',\n linkPlaceholder: 'https://…/SKILL.md',\n add: 'Add',\n cancel: 'Cancel',\n added: (slug) => `${slug} added`,\n failed: 'Could not add the skill',\n}\n\nexport interface ConnectedSkillUploadProps {\n /** Added (its slug) or cancelled (nothing). Absent: no Cancel, and the form stays. */\n onDone?: (addedSlug?: string) => void\n labels?: Partial<ConnectedSkillUploadLabels>\n className?: string\n}\n\nexport function ConnectedSkillUpload({ onDone, labels, className }: ConnectedSkillUploadProps) {\n const l = { ...DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS, ...labels }\n const { notify } = useBlocksEnvironment()\n const upload = useUploadSkillFiles()\n const fileRef = useRef<HTMLInputElement>(null)\n const [url, setUrl] = useState('')\n const [busy, setBusy] = useState(false)\n\n const add = async (read: () => Promise<SkillImportResult>) => {\n setBusy(true)\n try {\n const { slug, entries } = await read()\n await upload.mutateAsync(\n entries.map((e) => ({\n folder: e.folder,\n fileName: e.fileName,\n content: new Blob([e.content], { type: 'text/markdown' }),\n }))\n )\n notify(l.added(slug), 'success')\n setUrl('')\n onDone?.(slug)\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : l.failed, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div\n className={cn('flex flex-col gap-6 overflow-y-auto p-4', className)}\n data-testid=\"skills-add-view\"\n >\n <div className=\"space-y-2\">\n <h3 className=\"text-base font-semibold\">{l.title}</h3>\n <p className=\"text-sm text-muted-foreground\">{l.description}</p>\n </div>\n <div className=\"space-y-2\">\n <Label>{l.fromFile}</Label>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".md,.markdown,.zip\"\n className=\"hidden\"\n data-testid=\"skills-add-file-input\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) void add(() => importSkillFile(file))\n }}\n />\n <div>\n <Button\n variant=\"outline\"\n disabled={busy}\n onClick={() => fileRef.current?.click()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-file\"\n >\n <Upload className=\"mr-1.5 size-4\" />\n {l.chooseFile}\n </Button>\n </div>\n </div>\n <form\n className=\"space-y-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (url.trim()) void add(() => importSkillFromUrl(url))\n }}\n >\n <Label htmlFor=\"skills-add-url\">{l.fromLink}</Label>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input\n id=\"skills-add-url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder={l.linkPlaceholder}\n inputMode=\"url\"\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-input\"\n />\n <Button\n type=\"submit\"\n disabled={busy || !url.trim()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-submit\"\n >\n <Link2 className=\"mr-1.5 size-4\" />\n {l.add}\n </Button>\n </div>\n </form>\n {onDone && (\n <div>\n <Button variant=\"ghost\" onClick={() => onDone()} className=\"pointer-coarse:min-h-11\">\n {l.cancel}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { ArtifactCanvas } from '@arbidocs/react'\nimport { useStreamedArtifact, type UseStreamedArtifactOptions } from '@arbidocs/react/artifacts'\nimport {\n StreamedArtifactFrame,\n type StreamedArtifactFrameLabels,\n type StreamedArtifactFrameTestIds,\n} from '../artifacts/StreamedArtifactFrame'\nimport type { ArtifactEvent } from './ai'\nimport type { StreamedArtifactEditorProps } from './StreamedArtifactEditor'\n\n// The editor (MDXEditor, Lexical) stays out of the bundle until a draft is ready to edit.\nconst StreamedArtifactEditor = lazy(() => import('./StreamedArtifactEditor'))\n\nexport interface StreamedArtifactProps\n extends\n Pick<UseStreamedArtifactOptions, 'configId' | 'parseRetry' | 'clean'>,\n Pick<\n StreamedArtifactEditorProps,\n 'editorProps' | 'onSaved' | 'onSaveError' | 'actions' | 'hideDefaultActions'\n > {\n /** The artifacts of the agent run (`useConnectedAiTask().artifacts`). */\n artifacts: ArtifactEvent[]\n workspaceId: string | undefined\n /** The agent is still working: show the live canvas. */\n busy: boolean\n /** The run failed; with no draft the canvas shows it. */\n error?: string | null\n stepCount?: number\n busyHint?: string\n emptyHint?: string\n className?: string\n /** Root test id of the editor; the preparing state is `${testId}-preparing`. */\n testId?: string\n labels?: Partial<StreamedArtifactFrameLabels>\n testIds?: Partial<StreamedArtifactFrameTestIds>\n}\n\n/**\n * An agent-drafted artifact from stream to editor, in one part. Pass the run's `artifacts` and\n * whether it is `busy`; it shows\n *\n * 1. the live `ArtifactCanvas` while the agent streams;\n * 2. \"Preparing editor...\" (the canvas stays readable underneath) while the finished draft is\n * cleaned (`cleanDraftMarkdown`), stored as version 1 of the artifact (`wpType: 'artifact'`)\n * and parsed by the backend, which can take up to about a minute;\n * 3. `ArtifactEditor` on the stored version (edit, save a new version, version list, compare\n * with track changes) when its text is ready;\n * 4. an error with Retry when storing or parsing fails.\n *\n * Needs `<ArbiProvider>` + React Query. The host imports the editor stylesheet\n * (`@mdxeditor/editor/style.css`) and defines the global `Prism` in a module it imports at app\n * start (see the Artifacts section of docs/design/blocks-package.md).\n *\n * ```tsx\n * const task = useConnectedAiTask()\n * <StreamedArtifact artifacts={task.artifacts} workspaceId={workspaceId} busy={task.status === 'running'} error={task.error} />\n * ```\n */\nexport function StreamedArtifact({\n artifacts,\n workspaceId,\n busy,\n error = null,\n stepCount,\n busyHint,\n emptyHint,\n className,\n testId = 'streamed-artifact',\n configId,\n parseRetry,\n clean,\n editorProps,\n onSaved,\n onSaveError,\n actions,\n hideDefaultActions,\n labels,\n testIds,\n}: StreamedArtifactProps) {\n const streamed = useStreamedArtifact({\n artifacts,\n workspaceId,\n settled: !busy && !error,\n configId,\n parseRetry,\n clean,\n })\n const canvas = (\n <ArtifactCanvas\n artifacts={artifacts}\n className={streamed.phase === 'streaming' ? className : undefined}\n busy={busy}\n busyHint={busyHint}\n stepCount={stepCount}\n error={error}\n emptyHint={emptyHint}\n />\n )\n return (\n <StreamedArtifactFrame\n phase={streamed.phase}\n canvas={canvas}\n className={className}\n error={streamed.error?.message}\n onRetry={streamed.retry}\n labels={labels}\n testIds={{ preparing: `${testId}-preparing`, error: `${testId}-error`, ...testIds }}\n >\n <Suspense fallback={canvas}>\n {streamed.docId && (\n <StreamedArtifactEditor\n key={streamed.docId}\n workspaceId={workspaceId}\n docId={streamed.docId}\n title={streamed.artifact?.title ?? 'Draft'}\n testId={testId}\n className={className}\n editorProps={editorProps}\n onSaved={onSaved}\n onSaveError={onSaveError}\n actions={actions}\n hideDefaultActions={hideDefaultActions}\n />\n )}\n </Suspense>\n </StreamedArtifactFrame>\n )\n}\n","/**\n * A stepped workflow run that lives in a work thread on the server. The thread's plan carries the\n * steps; its activity log says where each step is; the work runner starts each agent step as a\n * turn in the thread. This hook reads all of that and does the person's part: it starts the thread\n * (with the run's inputs and the steps' prompts composed from them), completes forms, uploads and\n * reviews, skips, and retries a failed step. A run whose first open step is an agent or action\n * step starts when the person presses Start: the thread is created and the server starts that\n * step. `WorkflowRunner` shows the result.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useActOnStep,\n useArbi,\n useConversationActivity,\n useConversationThreads,\n useConversations,\n useCreateWork,\n useWorkspaceUsers,\n type ConversationResponse,\n} from '@arbidocs/react'\nimport { fromPlanSteps, toPlanSteps, type TaskPlanStep } from '../agents/workflows/planSteps'\nimport {\n initialRunInputs,\n runThreadTitle,\n stepFields,\n stepStatesFromActivity,\n workflowSteps,\n type StepComposeOptions,\n type WorkflowActivityEvent,\n} from '../agents/workflows/run'\nimport { useWorkflowView, type WorkflowRunView } from '../agents/workflows/useWorkflowView'\nimport type {\n WorkflowDefinition,\n WorkflowInputs,\n WorkflowStep,\n WorkflowStepState,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\n\nexport interface UseWorkflowThreadOptions extends StepComposeOptions {\n /**\n * An existing run to show (its thread). Absent: a new run starts when its first step is done,\n * or, when that is an agent or action step, when the person starts it.\n */\n conversationId?: string\n /** The thread was created (store its id to come back to the run). */\n onStarted?: (conversationId: string) => void\n /**\n * The host's commits, by step id (`commit: true` steps): done before the step is recorded, e.g.\n * create and open the matter the run belongs in (the thread is created in the open workspace).\n * May return inputs to merge into the run.\n */\n commit?: Record<string, (inputs: WorkflowInputs) => Promise<WorkflowInputs | void>>\n /** Prefills for a new run. */\n initialInputs?: WorkflowInputs\n /** The agent that runs the agent steps (`agt-…`); absent = the person's own assistant. */\n agentId?: string\n /**\n * The files added on an upload step in this run (doc ids): sent when it is completed, so the\n * step records exactly them.\n */\n documentsFor?: (stepId: string) => string[]\n}\n\nexport interface WorkflowThread {\n view: WorkflowRunView\n /** The run's thread, once it exists. */\n conversationId: string | undefined\n conversation: ConversationResponse | undefined\n /** A workspace member's name by id. */\n nameOf: (id: string) => string | undefined\n /** The workspace's people (not agents): what a person field offers. */\n people: Array<{ value: string; label: string }>\n}\n\nconst STARTING = new Set(['pending', 'running'])\n\n/**\n * The values a form or a fielded review collected (what is recorded with it on the thread). A\n * review's blank optional fields are left out: the server checks each one given.\n */\nfunction formValues(step: WorkflowStep, inputs: WorkflowInputs): WorkflowInputs | undefined {\n const fields = stepFields(step)\n if (!fields.length) return undefined\n if (step.kind === 'form')\n return Object.fromEntries(fields.map((f) => [f.name, inputs[f.name] ?? '']))\n const given = fields.flatMap((f) => {\n const v = inputs[f.name]\n return v === undefined || v === '' ? [] : [[f.name, v] as const]\n })\n return given.length ? Object.fromEntries(given) : undefined\n}\n\n/** How many times missing answers are fetched again before giving up (about three minutes). */\nexport const ANSWER_RETRY_CAP = 16\n\n/** The wait before the `attempt`th fetch of missing answers: at once, then 1s doubling to 15s. */\nexport function answerRetryDelay(attempt: number): number {\n return attempt === 0 ? 0 : Math.min(1000 * 2 ** (attempt - 1), 15_000)\n}\n\n/**\n * Fetch again, with backoff and a cap, while `missing` (the ids of finished steps' answers not\n * read yet) is not empty. A change in what is missing starts the count again.\n */\nfunction useAnswerRetry(missing: string, refetch: () => Promise<unknown>) {\n const [attempt, setAttempt] = useState(0)\n const [prev, setPrev] = useState(missing)\n if (prev !== missing) {\n setPrev(missing)\n setAttempt(0)\n }\n const refetchRef = useRef(refetch)\n refetchRef.current = refetch\n useEffect(() => {\n if (!missing || attempt >= ANSWER_RETRY_CAP) return\n const t = setTimeout(() => {\n void refetchRef.current()\n setAttempt((a) => a + 1)\n }, answerRetryDelay(attempt))\n return () => clearTimeout(t)\n }, [missing, attempt])\n}\n\nexport function useWorkflowThread(\n workflow: WorkflowDefinition,\n options: UseWorkflowThreadOptions = {}\n): WorkflowThread {\n const arbi = useArbi()\n const { ensureWorkspaceOpen, status } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const [threadId, setThreadId] = useState(options.conversationId)\n const [localInputs, setLocalInputs] = useState<WorkflowInputs>(() =>\n initialRunInputs(workflow, options.initialInputs)\n )\n // What the person typed: it wins over the thread's copy, which only learns a form's values when\n // that step is completed (until then it holds them blank).\n const [edits, setEdits] = useState<WorkflowInputs>({})\n const [localStates, setLocalStates] = useState<Record<string, WorkflowStepState>>({})\n const createWork = useCreateWork()\n const actOnStep = useActOnStep()\n\n const conversations = useConversations(wsId, { enabled: !!threadId, live: true })\n const members = useWorkspaceUsers(wsId, {\n enabled: status === 'authenticated' && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const nameOf = useCallback(\n (id: string) => {\n const u = members.data?.find((m) => m.user.external_id === id)?.user\n return u ? [u.given_name, u.family_name].filter(Boolean).join(' ') || u.email : undefined\n },\n [members.data]\n )\n const conversation = conversations.data?.find((c) => c.external_id === threadId)\n const steps = useMemo(\n () =>\n workflowSteps(workflow).length > 0\n ? workflowSteps(workflow)\n : fromPlanSteps((conversation?.plan?.steps ?? []) as TaskPlanStep[]),\n [workflow, conversation?.plan?.steps]\n )\n\n // Poll while an agent step is on its way (the server starts it, then runs it).\n const activity = useConversationActivity(threadId, { live: !!threadId })\n const serverStates = useMemo(\n () => stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[]),\n [activity.data]\n )\n const working = steps.some(\n (s) =>\n (s.kind === 'agent' || s.kind === 'action') &&\n STARTING.has(serverStates[s.id]?.status ?? 'pending')\n )\n const threads = useConversationThreads(wsId, threadId, { enabled: !!threadId, live: working })\n // Only answers with text: the assistant's message exists (empty) from the moment its turn\n // starts and is filled when the turn ends, which can be after the step is recorded done.\n const answers = useMemo(() => {\n const byId = new Map<string, string>()\n for (const t of threads.data?.threads ?? [])\n for (const m of t.history)\n if (m.role === 'assistant' && m.content?.trim()) byId.set(m.external_id, m.content)\n return byId\n }, [threads.data])\n\n // A step can finish as the run stops (the last one always does): nothing is polled then, and\n // the activity log no longer changes. Fetch the messages again, backing off, until every\n // finished step's answer is in (or the cap is reached; a new missing answer starts again).\n const missing = Object.values(serverStates)\n .flatMap((st) =>\n st.status === 'done' && st.responseId && !answers.has(st.responseId) ? [st.responseId] : []\n )\n .sort()\n .join(' ')\n useAnswerRetry(missing, threads.refetch)\n\n const states = useMemo(() => {\n if (!threadId) return localStates\n const out: Record<string, WorkflowStepState> = {}\n for (const [id, s] of Object.entries(serverStates))\n out[id] = { ...s, text: s.responseId ? answers.get(s.responseId) : undefined }\n return out\n }, [threadId, localStates, serverStates, answers])\n\n const inputs = useMemo(\n () =>\n threadId\n ? { ...localInputs, ...(conversation?.skill_inputs ?? {}), ...edits }\n : { ...localInputs, ...edits },\n [threadId, localInputs, conversation?.skill_inputs, edits]\n ) as WorkflowInputs\n\n const refresh = useCallback(async () => {\n await Promise.all([activity.refetch(), conversations.refetch()])\n }, [activity, conversations])\n\n const act = useCallback(\n async (\n id: string,\n body: {\n step: string\n action: 'complete' | 'skip' | 'send_back' | 'decline'\n inputs?: WorkflowInputs\n documents?: string[]\n to?: string\n note?: string\n }\n ) => {\n await actOnStep.mutateAsync({ conversationId: id, body })\n await refresh()\n },\n [actOnStep, refresh]\n )\n\n // The run starts: its thread, in the workspace now open, with the steps and the inputs so far.\n // Creating it starts the first ready agent step on the server; the steps skipped before it existed\n // are then recorded (which starts what they made ready).\n const createThread = useCallback(\n async (values: WorkflowInputs, done?: string): Promise<string> => {\n await ensureWorkspaceOpen()\n const created = await createWork.mutateAsync({\n title: runThreadTitle(workflow, values).slice(0, 60),\n description: workflow.description || null,\n prompt: null,\n skill_ref: null,\n skill_inputs: values as Record<string, unknown>,\n agent_ext_id: options.agentId ?? null,\n auth_mode: 'run_now_temp',\n plan: {\n goal: '',\n criteria: [],\n max_passes: 3,\n documents: [],\n steps: toPlanSteps(workflow, {\n inputs: values,\n resolveWorkflow: options.resolveWorkflow,\n compose: options.compose,\n }),\n },\n })\n const id = created.external_id\n setThreadId(id)\n if (done) setLocalStates((s) => ({ ...s, [done]: { status: 'done' } }))\n options.onStarted?.(id)\n for (const [stepId, st] of Object.entries(localStates))\n if (st.status === 'skipped')\n await actOnStep.mutateAsync({\n conversationId: id,\n body: { step: stepId, action: 'skip' },\n })\n return id\n },\n [ensureWorkspaceOpen, createWork, workflow, options, localStates, actOnStep]\n )\n\n const complete = useCallback(\n async (step: WorkflowStep) => {\n let values = inputs\n const commit = step.commit ? options.commit?.[step.id] : undefined\n if (commit && localStates[step.id]?.status !== 'done') {\n values = { ...values, ...((await commit(values)) ?? {}) }\n setLocalInputs(values)\n setEdits({})\n }\n const id = threadId ?? (await createThread(values, step.id))\n const documents = step.kind === 'upload' ? options.documentsFor?.(step.id) : undefined\n await act(id, {\n step: step.id,\n action: 'complete',\n inputs: formValues(step, values),\n ...(documents?.length ? { documents } : {}),\n })\n },\n [inputs, options, localStates, threadId, createThread, act]\n )\n\n // Start the ready agent or action step nothing else will start: create the run's thread (the\n // server starts the step), or run the thread again (the server could not start it before).\n const start = useCallback(async () => {\n if (!threadId) {\n await createThread(inputs)\n await refresh()\n return\n }\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n }, [threadId, createThread, inputs, arbi, refresh])\n\n const skip = useCallback(\n async (stepId: string) => {\n if (!threadId) {\n setLocalStates((s) => ({ ...s, [stepId]: { status: 'skipped' } }))\n return\n }\n await act(threadId, { step: stepId, action: 'skip' })\n },\n [threadId, act]\n )\n\n const retry = useCallback(\n async (_stepId: string) => {\n if (!threadId) return\n // Running the thread again retries its failed step.\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n },\n [arbi, threadId, refresh]\n )\n\n const sendBack = useCallback(\n async (stepId: string, to: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'send_back', to, ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n const decline = useCallback(\n async (stepId: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'decline', ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n // A run opened later opens where it is once its log has arrived (not at its first step).\n const loaded = !options.conversationId || activity.isSuccess || activity.isError\n\n // Nothing will start a ready agent or action step unless the person does: there is no thread\n // yet, or the thread's run is not under way (it could not start: `last_error` says why).\n const idle = !!conversation && !conversation.in_progress\n const anyRunning = Object.values(states).some((s) => s.status === 'running')\n const needsStart = !threadId || (idle && !anyRunning)\n const runError = idle ? (conversation?.last_error ?? null) : null\n\n const view = useWorkflowView({\n steps,\n states,\n inputs,\n setInput: (name, value) => setEdits((i) => ({ ...i, [name]: value })),\n complete,\n skip,\n retry,\n start,\n needsStart,\n runError,\n sendBack,\n decline,\n nameOf,\n loaded,\n isLocked: (id) => states[id]?.status === 'done',\n })\n\n const people = useMemo(\n () =>\n (members.data ?? [])\n .filter((m) => !m.user.external_id.startsWith('agt-'))\n .map((m) => ({\n value: m.user.external_id,\n label: nameOf(m.user.external_id) ?? m.user.external_id,\n })),\n [members.data, nameOf]\n )\n\n return { view, conversationId: threadId, conversation, nameOf, people }\n}\n","/**\n * A workflow run's thread, live and interactive: the blocks `ChatPage` held to the run's one\n * conversation (people ask follow-ups, see the answers and their sources, open documents), with\n * the current step's panel beside it (`aside`). Step messages show as their step's chip.\n */\n\nimport { useEffect, type ReactNode } from 'react'\nimport { useArbiChat } from '@arbidocs/react'\nimport { ChatPage } from '../chat/ChatPage'\nimport type { ChatCitationTarget, ChatPageLabels, WorkflowStepView } from '../chat/chat-page-types'\n\nexport interface WorkflowRunThreadProps {\n conversationId: string\n workspaceId: string | undefined\n /** The current step's panel. */\n aside?: ReactNode\n /** A step by id: its title, kind and phase (step messages show as its chip). */\n stepOf?: (stepId: string) => WorkflowStepView | undefined\n /** Scroll to and mark this message (a step's answer). */\n targetMessageId?: string\n onOpenCitation?: (target: ChatCitationTarget) => void\n labels?: Partial<ChatPageLabels>\n className?: string\n}\n\nexport function WorkflowRunThread({\n conversationId,\n workspaceId,\n aside,\n stepOf,\n targetMessageId,\n onOpenCitation,\n labels,\n className,\n}: WorkflowRunThreadProps) {\n const chat = useArbiChat({ workspaceId })\n const listed = chat.threads.some((t) => t.id === conversationId)\n const { selectThread, activeThreadId } = chat\n // The run's conversation, once the workspace's list has it.\n useEffect(() => {\n if (listed && activeThreadId !== conversationId) selectThread(conversationId)\n }, [listed, activeThreadId, conversationId, selectThread])\n\n return (\n <ChatPage\n chat={{ ...chat, threads: chat.threads.filter((t) => t.id === conversationId) }}\n singleThread\n documentsRequired={false}\n aside={aside}\n asideBreakpoint={52}\n workflowStepOf={stepOf}\n targetMessageId={targetMessageId}\n onOpenCitation={onOpenCitation}\n labels={labels}\n className={className ?? 'h-[min(78dvh,860px)] min-h-[480px] rounded-xl border border-border'}\n />\n )\n}\n","/**\n * What the connected runner opens itself when the host does not take over: the sign flow for a\n * signature step (the blocks `SignDocumentDialog` on the document's PDF), the native Word editor\n * for a tracked-changes version, and a tabular review's grid (its documents by its columns).\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useArbi, useDocuments, useTags } from '@arbidocs/react'\nimport {\n DocumentToolsProvider,\n fetchDocumentPdf,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { Loader2 } from 'lucide-react'\nimport { SignDocumentDialog } from '../document-tools/SignDocumentDialog'\nimport { ModalScaffold } from '../settings/ModalScaffold'\nimport { splitDocRef } from '../agents/workflows/run'\nimport { ConnectedNativeDocxEditor } from './ConnectedNativeDocxEditor'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface WorkflowRunnerDialogLabels {\n loadingDocument: string\n preparingDocument: string\n documentFailed: string\n reviewTitle: string\n reviewDescription: string\n document: string\n empty: string\n showMore: string\n showLess: string\n wordTitle: string\n}\n\nexport const DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS: WorkflowRunnerDialogLabels = {\n loadingDocument: 'Opening the document…',\n preparingDocument: 'The PDF is still being prepared…',\n documentFailed: 'The document could not be opened.',\n reviewTitle: 'Review',\n reviewDescription: 'Each document against each review column.',\n document: 'Document',\n empty: '—',\n showMore: 'Show more',\n showLess: 'Show less',\n wordTitle: 'Tracked changes',\n}\n\n/** How often, and how long apart, the PDF is fetched again while it is still being rendered. */\nexport const SIGN_PDF_RETRIES = 4\nexport const SIGN_PDF_RETRY_DELAY_MS = 1500\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\n/**\n * The sign flow on one document version: its PDF is fetched, then the blocks sign dialog.\n *\n * What is signed is the PDF `GET /view?version=` serves (a Word or Markdown document's rendition),\n * never the original's download, so the hash the server checks is of the bytes shown here. A\n * rendition still being written is fetched again a few times; a version superseded since the step\n * was set offers the current one instead.\n */\nexport function WorkflowSignDialog({\n docRef,\n onClose,\n labels,\n}: {\n /** `doc-…` or `doc-…@v3`. */\n docRef: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const arbi = useArbi()\n const { user, ensureWorkspaceOpen } = useConnection()\n const tools = useOptionalDocumentTools()\n const { id, version: stepVersion } = splitDocRef(docRef)\n // The version the step names, until the signer opens the current one instead.\n const [version, setVersion] = useState(stepVersion)\n const [pdf, setPdf] = useState<Blob | null>(null)\n const [preparing, setPreparing] = useState(false)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let live = true\n setPdf(null)\n setFailed(false)\n setPreparing(false)\n void (async () => {\n try {\n await ensureWorkspaceOpen()\n const client = arbi.getClient().fetch\n const ref = version ? `${id}@v${version}` : id\n for (let attempt = 0; ; attempt++) {\n try {\n const blob = await fetchDocumentPdf(client, ref)\n if (live) setPdf(blob)\n return\n } catch (err) {\n if (!live || attempt >= SIGN_PDF_RETRIES) throw err\n setPreparing(true)\n await wait(SIGN_PDF_RETRY_DELAY_MS)\n if (!live) return\n }\n }\n } catch {\n if (live) setFailed(true)\n }\n })()\n return () => {\n live = false\n }\n }, [arbi, id, version, ensureWorkspaceOpen])\n\n if (!pdf)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.loadingDocument}\n size=\"sm\"\n testId=\"workflow-sign-loading\"\n >\n <ModalScaffold.Body>\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {failed ? (\n labels.documentFailed\n ) : (\n <>\n <Loader2 className=\"size-4 animate-spin\" />{' '}\n {preparing ? labels.preparingDocument : labels.loadingDocument}\n </>\n )}\n </p>\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n const dialog = (\n <SignDocumentDialog\n // A new PDF is a new signing: the form starts again on it.\n key={version ?? 'current'}\n open\n onOpenChange={(o) => !o && onClose()}\n documentId={id}\n pdfBlob={pdf}\n version={version}\n // Superseded since the step was set: sign the current version, after seeing it.\n onOpenCurrent={() => setVersion(undefined)}\n />\n )\n // A host with its own document tools keeps them (its notices, its document opening).\n return tools ? (\n dialog\n ) : (\n <DocumentToolsProvider\n client={arbi.getClient().fetch}\n user={user ? { name: user.name, email: user.email } : null}\n >\n {dialog}\n </DocumentToolsProvider>\n )\n}\n\n/** A tracked-changes version in the native Word editor. */\nexport function WorkflowWordDialog({\n docRef,\n title,\n onClose,\n labels,\n}: {\n docRef: string\n title?: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { id } = splitDocRef(docRef)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={title ?? labels.wordTitle}\n size=\"xl\"\n testId=\"workflow-word-dialog\"\n >\n <ModalScaffold.Body className=\"h-[70dvh] p-0\">\n <ConnectedNativeDocxEditor documentId={id} title={title ?? labels.wordTitle} />\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/** A tabular review's grid: each document (row) against each column (label), with its value. */\nexport function WorkflowReviewGridDialog({\n tags,\n documents,\n onClose,\n onOpenDocument,\n labels,\n}: {\n tags: string[]\n documents: string[]\n onClose: () => void\n onOpenDocument?: (docId: string) => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { workspaceId } = useConnection()\n const allTags = useTags(workspaceId ?? undefined)\n // The workspace's documents carry their review values (doctags); the review's rows are its own.\n const all = useDocuments(workspaceId ?? undefined)\n // The grid waits for its column names and for documents fetched since it opened: before, its\n // headers would be the raw tag ids and its cells the values cached before the review ran.\n const isLoading =\n allTags.isLoading || all.isLoading || (all.isFetching && !all.isFetchedAfterMount)\n const docs = (all.data ?? []).filter((d) => documents.includes(d.external_id))\n const columns = useMemo(\n () =>\n tags.map((id) => ({\n id,\n name: allTags.data?.find((t) => t.external_id === id)?.name ?? id,\n })),\n [tags, allTags.data]\n )\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.reviewTitle}\n description={labels.reviewDescription}\n showDescription\n size=\"xl\"\n testId=\"workflow-review-grid\"\n >\n <ModalScaffold.Body className=\"overflow-auto\">\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </p>\n ) : (\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n <th className=\"sticky left-0 z-10 border-b border-border bg-background p-2 text-left align-bottom font-medium\">\n {labels.document}\n </th>\n {columns.map((c) => (\n <th\n key={c.id}\n className=\"border-b border-border p-2 text-left align-bottom font-medium\"\n >\n <div className={`${VALUE_WIDTH} line-clamp-2 break-words`} title={c.name}>\n {c.name}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {docs.map((d) => (\n <tr key={d.external_id} data-testid={`workflow-review-grid-row-${d.external_id}`}>\n <td className=\"sticky left-0 z-10 border-b border-border bg-background p-2 align-top\">\n <DocumentName onClick={onOpenDocument && (() => onOpenDocument(d.external_id))}>\n {d.file_name ?? d.external_id}\n </DocumentName>\n </td>\n {columns.map((c) => {\n const note = d.doctags?.find((t) => t.tag_ext_id === c.id)?.note\n return (\n <td\n key={c.id}\n className=\"border-b border-border p-2 align-top text-muted-foreground\"\n >\n <ReviewValue value={note || labels.empty} labels={labels} />\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/*\n * Widths sit on a block inside each cell: an auto-layout table ignores `max-width` on a cell, so a\n * long file name or answer would otherwise widen its column, or (without wrapping) spill into the\n * next one. The grid scrolls sideways when the columns do not fit.\n */\nconst DOCUMENT_WIDTH = 'w-40 sm:w-56'\nconst VALUE_WIDTH = 'min-w-48 max-w-80'\n\n/** The row's document: its name wraps over two lines at most, the full name on hover. */\nfunction DocumentName({ onClick, children }: { onClick?: () => void; children: string }) {\n const className = `${DOCUMENT_WIDTH} line-clamp-2 break-words text-left font-medium`\n return onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n title={children}\n className={`${className} text-primary hover:underline`}\n >\n {children}\n </button>\n ) : (\n <div title={children} className={className}>\n {children}\n </div>\n )\n}\n\n/** A review value: four lines, then a toggle to read the rest in place. */\nfunction ReviewValue({ value, labels }: { value: string; labels: WorkflowRunnerDialogLabels }) {\n const ref = useRef<HTMLDivElement>(null)\n const [expanded, setExpanded] = useState(false)\n const [clamped, setClamped] = useState(false)\n useLayoutEffect(() => {\n const el = ref.current\n if (el && !expanded) setClamped(el.scrollHeight > el.clientHeight + 1)\n }, [value, expanded])\n return (\n <div className={VALUE_WIDTH}>\n <div\n ref={ref}\n title={clamped && !expanded ? value : undefined}\n className={`whitespace-pre-line break-words ${expanded ? '' : 'line-clamp-4'}`}\n >\n {value}\n </div>\n {(clamped || expanded) && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-1 text-xs font-medium text-primary hover:underline\"\n >\n {expanded ? labels.showLess : labels.showMore}\n </button>\n )}\n </div>\n )\n}\n","/**\n * A stepped workflow run in its work thread, end to end: `useWorkflowThread` keeps the run on the\n * server (the thread's plan, its activity, its turns) and `WorkflowRunner` shows it. Agent answers\n * are the thread's messages; uploads go into the open workspace; a review can notify the people\n * who should approve it, in the run's thread. The host keeps its wording, its commits\n * (`options.commit`) and its finish screen.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AiAnswer, useArbi, useDocuments, useWorkspaceUsers } from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ExternalLink, Loader2, MessageSquare } from 'lucide-react'\nimport {\n WorkflowRunner,\n type WorkflowRunnerFile,\n type WorkflowRunnerProps,\n} from '../agents/workflows/WorkflowRunner'\nimport type { WorkflowRunnerActions } from '../agents/workflows/StepParts'\nimport { WorkflowStepBar } from '../agents/workflows/WorkflowStepBar'\nimport { splitDocRef, stepLevels } from '../agents/workflows/run'\nimport { stepKindOf } from '../agents/workflows/stepKinds'\nimport { stepDocuments } from '../agents/workflows/StepDocuments'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowStepState,\n WorkflowUploadStep,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\nimport { useWorkflowThread, type UseWorkflowThreadOptions } from './useWorkflowThread'\nimport { WorkflowRunThread } from './WorkflowRunThread'\nimport type { ChatCitationTarget } from '../chat/chat-page-types'\nimport {\n DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS,\n WorkflowReviewGridDialog,\n WorkflowSignDialog,\n WorkflowWordDialog,\n type WorkflowRunnerDialogLabels,\n} from './WorkflowRunnerDialogs'\n\nexport interface ConnectedWorkflowRunnerLabels {\n notify: string\n /** An agent step's answer, in the thread layout: a link to it in the thread. */\n showInThread: string\n /** The thread layout's panel toggle, when the panel folds (a narrow container). */\n currentStep: string\n /** A finished step whose answer is still being fetched. */\n loadingAnswer: string\n notified: string\n openThread: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS: ConnectedWorkflowRunnerLabels = {\n notify: 'Ask to approve',\n showInThread: 'Show in the thread',\n currentStep: 'Current step',\n notified: 'Notified.',\n openThread: 'Open the thread',\n loadingAnswer: 'Fetching the answer…',\n}\n\nexport interface ConnectedWorkflowRunnerProps extends Omit<\n WorkflowRunnerProps,\n | 'run'\n | 'renderAgentOutput'\n | 'onUpload'\n | 'uploading'\n | 'files'\n | 'onRetryUpload'\n | 'onRemoveUpload'\n | 'renderReview'\n | 'actions'\n | 'nameOfDoc'\n> {\n workflow: WorkflowDefinition\n /** The run's bindings: an existing thread, commits, prompt wording, workflow lookup. */\n options?: UseWorkflowThreadOptions\n /** Open a conversation (the run's thread): the host navigates. */\n onOpenConversation?: (conversationId: string) => void\n /** The muted line an agent step shows before its answer. */\n emptyHint?: (step: WorkflowAgentStep) => string | undefined\n connectedLabels?: Partial<ConnectedWorkflowRunnerLabels>\n /**\n * Open a document (a version: `version`; at a page: `page`, from a citation): the host\n * navigates. Absent: no document links. In the thread layout a citation opens its document with\n * it too, unless `onOpenCitation` is given.\n */\n onOpenDocument?: (documentId: string, version?: number, page?: number) => void\n /**\n * The thread layout's citation open action, as `ChatPage`'s `onOpenCitation` (the cited\n * document, page and passage). Absent: `onOpenDocument`; neither: citations offer no open.\n */\n onOpenCitation?: (target: ChatCitationTarget) => void\n /** Open an email step's draft in native mail (the host's mail screen). Absent: no button. */\n onOpenDraft?: (draftId: string) => void\n /** Show an answer in the run's thread. Absent: no link. */\n onOpenMessage?: (messageId: string) => void\n /**\n * Take over what the runner otherwise opens itself: the sign flow, the Word editor for a\n * tracked-changes version, a tabular review's grid.\n */\n actions?: Pick<WorkflowRunnerActions, 'sign' | 'openRedline' | 'openReview'>\n dialogLabels?: Partial<WorkflowRunnerDialogLabels>\n /**\n * `thread` (default): once the run has its thread, the page is that thread, live (follow-ups,\n * answers with their sources, documents), with the step bar on top and the current step in a\n * compact panel beside it; steps' answers link to their message instead of being repeated.\n * Before the thread exists (the first form), and with `guided`, it is the stepper: one step at\n * a time, each answer shown in full.\n */\n layout?: 'thread' | 'guided'\n /**\n * Which of the workspace's documents an upload step lists (the files \"in this matter\"): the\n * host hides what is not the matter's own, e.g. skill files kept as workspace documents —\n * `(doc) => !(doc.folder ?? '').startsWith('skills')`. Files added on the run's upload steps are\n * always listed. Absent: every document.\n */\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean\n}\n\n/** A workspace document, as `fileFilter` sees it. */\nexport type WorkflowRunnerDocument = NonNullable<ReturnType<typeof useDocuments>['data']>[number]\n\n/** What the runner has open itself. */\ntype OpenDialog =\n | { kind: 'sign'; docRef: string }\n | { kind: 'word'; docRef: string; title: string }\n | { kind: 'review'; tags: string[]; documents: string[] }\n\nexport function ConnectedWorkflowRunner({\n workflow,\n options,\n onOpenConversation,\n emptyHint,\n connectedLabels,\n onOpenDocument,\n onOpenCitation,\n onOpenDraft,\n onOpenMessage,\n actions: hostActions,\n dialogLabels,\n layout = 'thread',\n fileFilter,\n testIdPrefix = 'workflow-run',\n ...runnerProps\n}: ConnectedWorkflowRunnerProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels }\n const dl = { ...DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS, ...dialogLabels }\n const arbi = useArbi()\n const { ensureWorkspaceOpen, user } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const { data: docs = [], refetch } = useDocuments(wsId)\n // The files being sent on the run's upload steps, and those that did not upload (until retried\n // or removed): the step waits for them.\n const [sending, setSending] = useState<PendingUpload[]>([])\n // The files added on each upload step in this run (doc id -> step id), and their names (listed\n // under them before the workspace's documents catch up).\n const [added, setAdded] = useState<Record<string, string>>({})\n const [addedNames, setAddedNames] = useState<Record<string, string>>({})\n const addedRef = useRef(added)\n addedRef.current = added\n const { view, conversationId, people } = useWorkflowThread(workflow, {\n ...options,\n // An upload step records exactly the files added on it (else the server's guess).\n documentsFor:\n options?.documentsFor ??\n ((stepId) =>\n Object.entries(addedRef.current).flatMap(([doc, step]) => (step === stepId ? [doc] : []))),\n })\n const [dialog, setDialog] = useState<OpenDialog | null>(null)\n const inThread = layout === 'thread' && !!conversationId\n // The message the thread scrolls to (a step's answer, picked from the panel).\n const [target, setTarget] = useState<string | undefined>(undefined)\n const nameOfDoc = useCallback(\n (id: string) => docs.find((d) => d.external_id === id)?.file_name ?? undefined,\n [docs]\n )\n const actions = useMemo<WorkflowRunnerActions>(\n () => ({\n me: user?.externalId,\n openDocument:\n onOpenDocument &&\n ((ref) => {\n const { id, version } = splitDocRef(ref)\n onOpenDocument(id, version)\n }),\n openDraft: onOpenDraft && ((draftId) => onOpenDraft(draftId)),\n // In the thread layout an answer is right there: scroll to it.\n openMessage: inThread ? setTarget : onOpenMessage,\n sign:\n hostActions?.sign ??\n ((_step, state) => {\n const w = state.waiting\n if (w?.doc_ext_id) setDialog({ kind: 'sign', docRef: w.doc_ext_id })\n }),\n openRedline:\n hostActions?.openRedline ??\n ((ref) =>\n setDialog({ kind: 'word', docRef: ref, title: nameOfDoc(splitDocRef(ref).id) ?? '' })),\n openReview:\n hostActions?.openReview ??\n ((tags, documents) => setDialog({ kind: 'review', tags, documents })),\n }),\n [user?.externalId, onOpenDocument, onOpenDraft, onOpenMessage, hostActions, nameOfDoc, inThread]\n )\n\n // A citation in the thread opens its document as the regular chat does (the host's handler).\n const openCitation = useMemo<((target: ChatCitationTarget) => void) | undefined>(\n () =>\n onOpenCitation ??\n (onOpenDocument &&\n ((t) => {\n const docId = t.documentId ?? t.passage?.documentId\n if (docId) onOpenDocument(docId, undefined, t.page ?? t.passage?.page ?? undefined)\n })),\n [onOpenCitation, onOpenDocument]\n )\n\n const uploadSeq = useRef(0)\n const sendingRef = useRef(sending)\n sendingRef.current = sending\n // Send these files for a step, one after another; one that fails stays listed with its error.\n const send = useCallback(\n async (batch: PendingUpload[]) => {\n if (!batch.length) return\n const keys = new Set(batch.map((p) => p.key))\n const mark = (key: string, patch: Partial<PendingUpload> | null) =>\n setSending((all) =>\n patch === null\n ? all.filter((p) => p.key !== key)\n : all.map((p) => (p.key === key ? { ...p, ...patch } : p))\n )\n setSending((all) => [\n ...all.filter((p) => !keys.has(p.key)),\n ...batch.map((p) => ({ ...p, status: 'uploading' as const, error: undefined })),\n ])\n try {\n // The server resolves the target workspace from the session: make sure it is open.\n await ensureWorkspaceOpen()\n } catch (e) {\n for (const p of batch) mark(p.key, { status: 'failed', error: uploadError(e) })\n return\n }\n for (const p of batch) {\n try {\n const { doc_ext_ids = [] } = (await arbi.documents.uploadFile(p.file, p.file.name)) ?? {}\n if (!doc_ext_ids.length) throw new Error('No document came back')\n setAdded((a) => ({\n ...a,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.stepId])),\n }))\n setAddedNames((n) => ({\n ...n,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.file.name])),\n }))\n mark(p.key, null)\n } catch (e) {\n mark(p.key, { status: 'failed', error: uploadError(e) })\n }\n }\n await refetch()\n },\n [arbi, ensureWorkspaceOpen, refetch]\n )\n const onUpload = useCallback(\n (files: File[], step: WorkflowUploadStep) =>\n send(\n files.map((file) => ({\n key: `upload-${++uploadSeq.current}`,\n file,\n stepId: step.id,\n status: 'uploading' as const,\n }))\n ),\n [send]\n )\n const onRetryUpload = useCallback(\n (file: WorkflowRunnerFile) => {\n const p = sendingRef.current.find((x) => x.key === file.id)\n if (p) void send([p])\n },\n [send]\n )\n const onRemoveUpload = useCallback(\n (file: WorkflowRunnerFile) => setSending((all) => all.filter((p) => p.key !== file.id)),\n []\n )\n\n const files = [\n ...sending.map<WorkflowRunnerFile>((p) => ({\n id: p.key,\n name: p.file.name,\n status: p.status === 'failed' ? 'upload-failed' : 'uploading',\n error: p.error,\n addedFor: p.stepId,\n })),\n ...runnerFiles(docs, added, fileFilter, addedNames),\n ]\n // Watch the files just added until they are read (the step waits for them).\n const reading = files.some((f) => f.addedFor && f.status === 'processing')\n useEffect(() => {\n if (!reading) return\n const t = setInterval(() => void refetch(), READ_POLL_MS)\n return () => clearInterval(t)\n }, [reading, refetch])\n\n const renderAgentOutput = (step: WorkflowAgentStep, state: WorkflowStepState | undefined) => {\n const status = state?.status\n // Beside the thread an answer is not repeated: it links to its message.\n if (inThread) {\n const id = state?.responseId\n return id && status === 'done' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setTarget(id)}\n data-testid={`${testIdPrefix}-${step.id}-show-in-thread`}\n >\n <MessageSquare className=\"size-4\" /> {l.showInThread}\n </Button>\n ) : null\n }\n if (!state?.text && status !== 'done') return null\n // Finished, its answer not read yet (the thread is fetched again until it is).\n if (!state?.text && state?.responseId) {\n return (\n <p\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-${step.id}-answer-loading`}\n >\n <Loader2 className=\"size-4 animate-spin\" /> {l.loadingAnswer}\n </p>\n )\n }\n return (\n <AiAnswer\n status={status === 'running' ? 'running' : 'done'}\n text={state?.text ?? ''}\n emptyHint={emptyHint?.(step)}\n testId={`${testIdPrefix}-${step.id}-answer`}\n />\n )\n }\n\n const runner = (compact: boolean) => (\n <WorkflowRunner\n people={people}\n {...runnerProps}\n workflow={workflow}\n run={view}\n renderAgentOutput={renderAgentOutput}\n renderReview={(step) =>\n conversationId ? (\n <ReviewNotify\n conversationId={conversationId}\n workspaceId={wsId}\n labels={l}\n testId={`${testIdPrefix}-${step.id}`}\n />\n ) : null\n }\n onUpload={onUpload}\n uploading={sending.some((p) => p.status === 'uploading')}\n files={files}\n onRetryUpload={onRetryUpload}\n onRemoveUpload={onRemoveUpload}\n actions={actions}\n nameOfDoc={nameOfDoc}\n testIdPrefix={testIdPrefix}\n hideStepBar={compact}\n compact={compact}\n className={compact ? undefined : runnerProps.className}\n />\n )\n\n return (\n <div className=\"space-y-3\">\n {conversationId && onOpenConversation && (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenConversation(conversationId)}\n data-testid={`${testIdPrefix}-open-thread`}\n >\n <ExternalLink className=\"size-4\" /> {l.openThread}\n </Button>\n </div>\n )}\n {inThread && conversationId ? (\n <>\n <WorkflowStepBar\n run={view}\n levels={stepLevels(view.steps)}\n doneTitle={\n (workflow.run.kind === 'steps' ? workflow.run.completion?.title : undefined) ??\n runnerProps.labels?.complete ??\n 'Done'\n }\n icon={(key) =>\n key && runnerProps.renderIcon ? runnerProps.renderIcon(key) : undefined\n }\n tid={(suffix) => `${testIdPrefix}-${suffix}`}\n />\n <WorkflowRunThread\n conversationId={conversationId}\n workspaceId={wsId}\n stepOf={(id) => {\n const step = view.steps.find((s) => s.id === id)\n if (!step) return undefined\n // Its document, one click from its chip: the latest version, in the host's viewer\n // (else the Word dialog).\n const states = Object.fromEntries(\n view.steps.flatMap((s) => {\n const state = view.stateOf(s.id)\n return state ? [[s.id, state]] : []\n })\n )\n const ref = stepDocuments(view.steps, states, id).at(-1)\n const open = actions.openDocument ?? actions.openRedline\n return {\n title: step.title,\n kind: stepKindOf(step),\n phase: view.phaseOf(id),\n document:\n ref && open\n ? { name: nameOfDoc(splitDocRef(ref).id) ?? ref, onOpen: () => open(ref) }\n : undefined,\n }\n }}\n targetMessageId={target}\n onOpenCitation={openCitation}\n labels={{ workflows: l.currentStep }}\n aside={runner(true)}\n />\n </>\n ) : (\n runner(false)\n )}\n {dialog?.kind === 'sign' && (\n <WorkflowSignDialog docRef={dialog.docRef} onClose={() => setDialog(null)} labels={dl} />\n )}\n {dialog?.kind === 'word' && (\n <WorkflowWordDialog\n docRef={dialog.docRef}\n title={dialog.title || undefined}\n onClose={() => setDialog(null)}\n labels={dl}\n />\n )}\n {dialog?.kind === 'review' && (\n <WorkflowReviewGridDialog\n tags={dialog.tags}\n documents={dialog.documents}\n onClose={() => setDialog(null)}\n onOpenDocument={onOpenDocument && ((id) => onOpenDocument(id))}\n labels={dl}\n />\n )}\n </div>\n )\n}\n\nconst READ_POLL_MS = 3000\n\n/** A file being sent on an upload step, or one that did not upload (`error`). */\ninterface PendingUpload {\n key: string\n file: File\n stepId: string\n status: 'uploading' | 'failed'\n error?: string\n}\n\nfunction uploadError(e: unknown): string {\n return e instanceof Error && e.message ? e.message : String(e || 'Upload failed')\n}\n\n/**\n * The upload step's files: the workspace's documents the host's `fileFilter` keeps, plus every\n * file added on one of the run's upload steps (`added`: doc id -> step id), which the step waits on.\n * A file added that the workspace does not list yet is shown as being read (`names` gives its name).\n */\nexport function runnerFiles(\n docs: WorkflowRunnerDocument[],\n added: Record<string, string>,\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean,\n names: Record<string, string> = {}\n): WorkflowRunnerFile[] {\n const listed = new Set(docs.map((d) => d.external_id))\n return [\n ...docs\n .filter((d) => !fileFilter || added[d.external_id] || fileFilter(d))\n .map((d) => ({\n id: d.external_id,\n name: d.file_name ?? d.external_id,\n status: fileStatus(d.status),\n addedFor: added[d.external_id],\n })),\n ...Object.entries(added)\n .filter(([id]) => !listed.has(id))\n .map(([id, stepId]) => ({\n id,\n name: names[id] ?? id,\n status: 'processing' as const,\n addedFor: stepId,\n })),\n ]\n}\n\n/** A document's processing status as the upload step shows it; unknown stays unknown. */\nexport function fileStatus(status: string | null | undefined): WorkflowRunnerFile['status'] {\n const s = status?.toLowerCase()\n if (!s) return undefined\n if (s === 'failed') return 'failed'\n if (s === 'completed' || s === 'empty' || s === 'low-content') return 'ready'\n return 'processing'\n}\n\n/** Who should approve: the workspace's people (not agents), notified about the run's thread. */\nfunction ReviewNotify({\n conversationId,\n workspaceId,\n labels,\n testId,\n}: {\n conversationId: string\n workspaceId: string | undefined\n labels: ConnectedWorkflowRunnerLabels\n testId: string\n}) {\n const arbi = useArbi()\n const { status, user, ensureWorkspaceOpen } = useConnection()\n const { data: members = [] } = useWorkspaceUsers(workspaceId, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const people = members.filter(\n (m) =>\n !m.agent_ext_id &&\n !m.user.external_id.startsWith('agt-') &&\n m.user.external_id !== user?.externalId\n )\n const [picked, setPicked] = useState<string[]>([])\n const [sent, setSent] = useState(false)\n const [busy, setBusy] = useState(false)\n if (people.length === 0) return null\n const toggle = (id: string) =>\n setPicked((p) => (p.includes(id) ? p.filter((x) => x !== id) : [...p, id]))\n\n return (\n <div className=\"space-y-3\" data-testid={`${testId}-notify`}>\n <div className=\"flex flex-wrap gap-1.5\">\n {people.map((m) => {\n const name =\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email\n const on = picked.includes(m.user.external_id)\n return (\n <button\n key={m.user.external_id}\n type=\"button\"\n onClick={() => toggle(m.user.external_id)}\n aria-pressed={on}\n className={cn(\n 'rounded-full border px-2.5 py-1 text-xs',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground'\n )}\n data-testid={`${testId}-person-${m.user.external_id}`}\n >\n {name}\n </button>\n )\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={!picked.length || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await arbi.conversations.notify(conversationId, picked)\n setSent(true)\n } finally {\n setBusy(false)\n }\n }}\n data-testid={`${testId}-notify-send`}\n >\n {labels.notify}\n </Button>\n {sent && <span className=\"text-xs text-muted-foreground\">{labels.notified}</span>}\n </div>\n </div>\n )\n}\n","/**\n * `TagTable` bound to the connection: every tag of a kind in the workspace (`kind=\"issue\"`: every\n * issue), or with `parentId` a label's children. The columns are the kind's fields in the\n * workspace (`useTagKindSchema`), edited in place and saved as the kind's schema\n * (`useUpdateTagKindSchema`); the rows are the tag list filtered by kind with links (`useTags`),\n * their cells saved with `useSetTagValues`. \"Add row\" creates a tag of the kind (issues, people\n * and organisations are flat: no parent). The workspace's people fill person columns, and the\n * snapshot is filed in the workspace as a Word document (`.docx`, so it opens in the Word editor;\n * its id goes to `onExported`, so a host can open it or send it for signature) or downloaded.\n */\n\nimport { useMemo, useState } from 'react'\nimport type { components } from '@arbidocs/client'\nimport {\n useArbi,\n useInvalidateTagData,\n useSetTagValues,\n useTagKindSchema,\n useTags,\n useUpdateTagKindSchema,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { TagTable, type TagTableProps } from '../tags/TagTable'\nimport { DOCX_MIME_TYPE, tagTableDocx } from '../tags/tagTableDocx'\nimport type { TagTableData } from '../tags/tagTableModel'\nimport { useConnection } from './ConnectionProvider'\n\n/** What a tag is: a label, annotation, search, issue, person or organisation. */\ntype TagKind = NonNullable<components['schemas']['TagResponse']['kind']>\n\n/** Kinds that are flat: their tags have no parent. */\nconst FLAT_KINDS: readonly TagKind[] = ['issue', 'person', 'organisation']\n\n/** The title of a table of a kind (its export's default title). */\nconst KIND_TITLES: Record<TagKind, string> = {\n label: 'Labels',\n annotation: 'Annotations',\n search: 'Searches',\n issue: 'Issues',\n person: 'People',\n organisation: 'Organisations',\n}\n\nexport interface ConnectedTagTableProps extends Pick<\n TagTableProps,\n | 'onOpenDocument'\n | 'onOpenFact'\n | 'onOpenThread'\n | 'onOpenRow'\n | 'actions'\n | 'labels'\n | 'className'\n | 'testId'\n> {\n /** The rows are the workspace's tags of this kind, oldest first; the columns its fields. */\n kind: TagKind\n /** Only this tag's children (a label hierarchy; flat kinds have none). */\n parentId?: string\n /** How many documents, facts and threads each row lists (the rest are counted). Default 3. */\n linksLimit?: number\n /** The exported document's title; default the kind's (\"Issues\", \"People\", …). */\n exportTitle?: string\n /** The snapshot was filed: its document id. Absent: no export button. */\n onExported?: (documentId: string) => void\n /** Offer the snapshot as a `.docx` download. Default true. */\n downloadable?: boolean\n /** Read only: no cell edits, no \"Add row\", no column changes. */\n readOnly?: boolean\n}\n\nexport function ConnectedTagTable({\n kind,\n parentId,\n linksLimit = 3,\n exportTitle,\n onExported,\n downloadable = true,\n readOnly,\n ...props\n}: ConnectedTagTableProps) {\n const arbi = useArbi()\n const { workspaceId, status, ensureWorkspaceOpen } = useConnection()\n const schema = useTagKindSchema(kind)\n const rows = useTags(workspaceId ?? undefined, {\n kind,\n ...(parentId ? { parentId } : {}),\n include: ['links'],\n linksLimit,\n })\n // An annotation or a search is defined with its format, not added by name.\n const canAddRows = !readOnly && kind !== 'annotation' && kind !== 'search'\n const setValues = useSetTagValues()\n const updateSchema = useUpdateTagKindSchema()\n const invalidate = useInvalidateTagData()\n const members = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const [error, setError] = useState<string | null>(null)\n const people = (members.data ?? []).map((m) => ({\n value: m.user.external_id,\n label: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n }))\n const table: TagTableData | undefined = useMemo(\n () => (schema.data && rows.data ? { columns: schema.data.fields, rows: rows.data } : undefined),\n [schema.data, rows.data]\n )\n const fail = (e: unknown) => setError(e instanceof Error ? e.message : String(e))\n /** The snapshot as a Word file named `<title> (<date>).docx`. */\n const snapshot = (data: TagTableData) => {\n const title = exportTitle ?? KIND_TITLES[kind]\n const bytes = tagTableDocx(data, {\n title,\n nameOf: (id) => people.find((p) => p.value === id)?.label,\n })\n const stamp = new Date().toISOString().slice(0, 10)\n const name = `${title.replace(/[\\\\/:*?\"<>|]+/g, '-')} (${stamp}).docx`\n return { blob: new Blob([bytes as BlobPart], { type: DOCX_MIME_TYPE }), name }\n }\n\n return (\n <div className=\"space-y-2\">\n <TagTable\n {...props}\n table={table}\n isLoading={schema.isLoading || rows.isLoading}\n people={people}\n onChangeValue={\n readOnly\n ? undefined\n : async (tagId, fieldId, value) => {\n setError(null)\n await setValues.mutateAsync({ tagId, values: { [fieldId]: value } }).catch(fail)\n }\n }\n onChangeColumns={\n readOnly\n ? undefined\n : async (fields) => {\n setError(null)\n await ensureWorkspaceOpen()\n // A refusal (two columns of one name, a type change) stays on screen.\n await updateSchema.mutateAsync({ kind, fields }).catch((e: unknown) => {\n fail(e)\n throw e\n })\n }\n }\n onAddRow={\n !canAddRows\n ? undefined\n : async (name) => {\n setError(null)\n try {\n await ensureWorkspaceOpen()\n await arbi.tags.create({\n name,\n kind,\n ...(parentId && !FLAT_KINDS.includes(kind) ? { parentId } : {}),\n })\n await invalidate()\n } catch (e) {\n fail(e)\n }\n }\n }\n onExport={\n onExported && table\n ? async () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n await ensureWorkspaceOpen()\n const uploaded = await arbi.documents.uploadFile(blob, name)\n const id = uploaded?.doc_ext_ids?.[0]\n if (id) onExported(id)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n onDownload={\n downloadable && table\n ? () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n document.body.appendChild(link)\n link.click()\n link.remove()\n // Revoke after the click is handled: some browsers cancel the download otherwise.\n setTimeout(() => URL.revokeObjectURL(url), 0)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n />\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import {\n useShellWorkspaces,\n useWorkspaces,\n type ShellWorkspaceSource,\n type UseShellWorkspacesOptions,\n type UseShellWorkspacesResult,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type UseConnectedShellWorkspacesOptions = Omit<\n UseShellWorkspacesOptions,\n 'workspaces' | 'isLoading' | 'loadError' | 'selectedId' | 'select'\n>\n\n/**\n * `useShellWorkspaces` wired to the connection layer: the account's live workspaces, the\n * connection's single selection as the active workspace, and `open` = `setWorkspace` (opens it on\n * the server, remembers it for the next login) then `onOpened`.\n *\n * ```tsx\n * const { active, recent, open } = useConnectedShellWorkspaces({\n * seed: { workspaces: demoWorkspaces, activeId: 'demo-1' },\n * onOpened: () => navigate('/app/documents'),\n * })\n * ```\n */\nexport function useConnectedShellWorkspaces(\n options: UseConnectedShellWorkspacesOptions = {}\n): UseShellWorkspacesResult {\n const { workspaceId, setWorkspace } = useConnection()\n const query = useWorkspaces()\n return useShellWorkspaces({\n ...options,\n workspaces: Array.isArray(query.data) ? (query.data as ShellWorkspaceSource[]) : undefined,\n isLoading: query.isLoading,\n loadError: query.error,\n selectedId: workspaceId,\n select: (workspace) => setWorkspace(workspace.id),\n })\n}\n","/**\n * The account area of a settings page, bound to the ARBI SDK: each section is a blocks part wired\n * to its `@arbidocs/react` hook, so a host drops them in a `SettingsPanel` and owns only the\n * layout (see the \"Settings page recipe\" in docs/design/blocks-package.md).\n *\n * Every section toasts and confirms through the blocks environment (`useBlocksEnvironment`) and\n * renders the default test ids of its part. Anything the hooks cannot know (the recovery-key download, the billing link of a blocked\n * deletion, the password policy) is a prop.\n *\n * The hooks talk to the account client in scope (`useAccountClient` from `@arbidocs/react`):\n * `ConnectionProvider` provides one over the SDK; a host with its own session and API client\n * mounts its own `AccountClientProvider` (as ARBI-frontend does), and these sections work alike.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n ImageCropModal,\n useAvatarCrop,\n useConfirmEmailChange,\n useCurrentSessionId,\n useDeleteAccount,\n useDeleteAccountFlow,\n useEmailChange,\n useIdentityVerification,\n useNameEditor,\n useNotificationPreferences,\n usePasswordChange,\n usePasswordChangeForm,\n useProfile,\n useRequestEmailChange,\n useSessions,\n useSignOut,\n useTerminateSession,\n useUpdateProfile,\n type AvatarFileProblem,\n} from '@arbidocs/react'\nimport { useIsOnline } from '@arbidocs/react/document-tools'\nimport { Button, type IdentityStatus } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { AvatarPicker } from '../settings/AvatarPicker'\nimport { ProfileCard } from '../settings/ProfileCard'\nimport {\n IdentityVerificationCard,\n IdentityVerificationDialog,\n RequireVerified,\n type IdentityVerificationLabels,\n} from '../settings/IdentityVerification'\nimport {\n SettingsActionRow,\n SettingsCard,\n SettingsDangerZone,\n SettingsRow,\n SettingsSection,\n} from '../settings/SettingsPanel'\nimport { PasswordChangeDialog } from '../settings/PasswordChangeDialog'\nimport { ActiveSessionsDialog, DeleteAccountDialog } from '../settings/AccountDialogs'\nimport { LogoutDialog } from '../settings/LogoutDialog'\nimport { NotificationCategoryList } from '../settings/NotificationCategoryList'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport {\n EMAIL_NOTIFICATION_CATEGORIES,\n EMAIL_NOTIFICATION_KEYS,\n toActiveSessionViews,\n toDeleteBlockerViews,\n toLogoutSessionViews,\n toNotificationCategories,\n type EmailNotificationCategoryDef,\n} from '../settings/account-views'\n\n/** The error text of a failed call: the backend `detail` when it sent one. */\nfunction errorText(error: unknown, fallback: string): string {\n const body = (error as { apiError?: { detail?: unknown } } | null)?.apiError\n return typeof body?.detail === 'string' ? body.detail : fallback\n}\n\nconst AVATAR_PROBLEMS: Record<AvatarFileProblem, string> = {\n 'not-image': 'Please choose an image file',\n 'too-large': 'Image must be 5 MB or smaller',\n unreadable: \"Couldn't read that image — try a different file\",\n}\n\n// ── Profile ─────────────────────────────────────────────────────────────────\n\nexport interface ConnectedProfileCardProps {\n /** Section heading; default `Profile`. */\n title?: ReactNode\n /** Classes of the initials avatar shown without a picture (e.g. the host's per-user colour). */\n avatarClassName?: string\n /** More of the section under the card (e.g. `ConnectedIdentityVerification`). */\n children?: ReactNode\n}\n\n/** Avatar, editable name and email change of the signed-in user (`ProfileCard`). */\nexport function ConnectedProfileCard({\n title = 'Profile',\n avatarClassName = 'bg-primary text-primary-foreground',\n children,\n}: ConnectedProfileCardProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const updateProfile = useUpdateProfile()\n const requestEmailChange = useRequestEmailChange()\n const confirmEmailChange = useConfirmEmailChange()\n\n const name = useNameEditor({\n givenName: profile?.givenName,\n familyName: profile?.familyName,\n save: async (next) => {\n try {\n await updateProfile.mutateAsync(next)\n notify('Name updated', 'success')\n } catch (e) {\n notify('Failed to update name', 'error')\n throw e\n }\n },\n })\n const avatar = useAvatarCrop({\n upload: async (picture) => {\n try {\n await updateProfile.mutateAsync({ picture })\n notify('Profile picture updated', 'success')\n } catch (e) {\n notify('Failed to update picture', 'error')\n throw e\n }\n },\n onProblem: (problem) => notify(AVATAR_PROBLEMS[problem], 'error'),\n })\n const email = useEmailChange({\n requestCode: async (address) => {\n try {\n await requestEmailChange.mutateAsync(address)\n notify('Verification code sent to your new email', 'success')\n } catch (e) {\n notify(errorText(e, 'Failed to send verification code'), 'error')\n throw e\n }\n },\n confirm: async (args) => {\n try {\n await confirmEmailChange.mutateAsync(args)\n notify('Email address updated', 'success')\n } catch (e) {\n notify(errorText(e, 'Invalid or expired verification code'), 'error')\n throw e\n }\n },\n })\n\n const display = profile?.fullName || 'Unnamed'\n return (\n <SettingsSection icon={<UserCircle />} title={title}>\n <ProfileCard\n avatar={\n <>\n <AvatarPicker\n pictureUrl={profile?.picture}\n initials={initials(display)}\n fallbackClassName={avatarClassName}\n isUploading={avatar.isUploading}\n onFileChosen={avatar.onFileChosen}\n />\n <ImageCropModal\n open={avatar.pendingImage !== null}\n image={avatar.pendingImage}\n title=\"Crop your photo\"\n aspect={1}\n cropShape=\"round\"\n output={{ maxSize: 128, mimeType: 'image/jpeg', quality: 0.85 }}\n onComplete={avatar.onCropComplete}\n onCancel={avatar.onCropCancel}\n />\n </>\n }\n name={{ ...name, display, isSaving: name.isSaving }}\n email={profile?.email ?? ''}\n isSso={profile?.isSso ?? false}\n isVerified={profile?.isIdentityVerified ?? false}\n onStartEmailChange={email.onStart}\n emailChange={email.isOpen ? email : undefined}\n />\n {children}\n </SettingsSection>\n )\n}\n\n// ── Identity verification ───────────────────────────────────────────────────\n\nexport interface ConnectedIdentityVerificationProps {\n labels?: Partial<IdentityVerificationLabels>\n /** Open the host's billing (card, plan) when the fee cannot be charged. */\n onManageBilling?: () => void\n /** The host's price format; default `formatIdentityPrice`. */\n formatPrice?: (status: IdentityStatus) => string\n}\n\n/** The ID check card and its dialog, bound to the account. Renders nothing when not offered. */\nexport function ConnectedIdentityVerification({\n labels,\n onManageBilling,\n formatPrice,\n}: ConnectedIdentityVerificationProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const flow = useIdentityVerification({\n formatPrice,\n onVerifiedChange: (verified) =>\n notify(verified ? 'Identity verified' : 'Verified tick removed', 'success'),\n onNameAccepted: () => notify('Name updated to match your ID', 'success'),\n })\n return (\n <>\n <IdentityVerificationCard flow={flow} labels={labels} onManageBilling={onManageBilling} />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n onManageBilling={onManageBilling}\n />\n </>\n )\n}\n\nexport interface ConnectedRequireVerifiedProps {\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** `RequireVerified` bound to the SDK: gates `children` when the deployment requires an ID check. */\nexport function ConnectedRequireVerified({ children, labels }: ConnectedRequireVerifiedProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification()\n return (\n <RequireVerified flow={flow} accountName={profile?.fullName ?? ''} labels={labels}>\n {children}\n </RequireVerified>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\n/** The default password policy: 8 characters, an uppercase letter or symbol, a digit. */\nexport function defaultUnmetPasswordRequirement(password: string): string | null {\n if (password.length < 8) return 'Minimum 8 characters'\n if (!/[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n return 'At least one uppercase letter or special character'\n }\n if (!/[0-9]/.test(password)) return 'At least one number'\n return null\n}\n\nexport interface ConnectedPasswordChangeDialogProps {\n open: boolean\n onClose: () => void\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** After signing in with a recovery key: set a new password, no current one asked for. */\n recoveryMode?: boolean\n /** Recovery finished: continue into the app (recovery closes itself, with no success screen). */\n onRecoveryComplete?: () => void\n}\n\n/** Change (or, in recovery mode, set) the master password (`PasswordChangeDialog`). */\nexport function ConnectedPasswordChangeDialog({\n open,\n onClose,\n getUnmetRequirement = defaultUnmetPasswordRequirement,\n recoveryMode = false,\n onRecoveryComplete,\n}: ConnectedPasswordChangeDialogProps) {\n const { notify } = useBlocksEnvironment()\n const change = usePasswordChange()\n const form = usePasswordChangeForm({\n recoveryMode,\n getUnmetRequirement,\n submit: async (vars) => {\n await change.mutateAsync(vars)\n notify(\n recoveryMode\n ? 'Account recovered and password set successfully'\n : 'Password changed successfully',\n 'success'\n )\n },\n onClose,\n onRecoveryComplete,\n })\n return (\n <PasswordChangeDialog\n open={open}\n onClose={form.onCancel}\n recoveryMode={recoveryMode}\n currentPassword={form.currentPassword}\n onCurrentPasswordChange={form.onCurrentPasswordChange}\n newPassword={form.newPassword}\n onNewPasswordChange={form.onNewPasswordChange}\n confirmPassword={form.confirmPassword}\n onConfirmPasswordChange={form.onConfirmPasswordChange}\n getUnmetRequirement={getUnmetRequirement}\n error={form.error}\n isProcessing={form.isProcessing}\n isSubmitDisabled={form.isSubmitDisabled}\n onSubmit={form.onSubmit}\n isChanged={form.isChanged}\n onDone={form.onDone}\n />\n )\n}\n\nexport interface ConnectedSecuritySectionProps {\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** Extra rows under \"Change password\" (e.g. \"Save recovery key\"). */\n children?: ReactNode\n}\n\n/** The Security card: \"Change password\" and the dialog behind it. */\nexport function ConnectedSecuritySection({\n getUnmetRequirement,\n children,\n}: ConnectedSecuritySectionProps) {\n const [open, setOpen] = useState(false)\n return (\n <SettingsSection icon={<KeyRound />} title=\"Security\">\n <SettingsCard padding=\"sm\">\n <SettingsActionRow\n title=\"Change password\"\n description=\"Used to sign in and to unlock your account key. Changing it keeps everything readable and re-encrypts nothing.\"\n onClick={() => setOpen(true)}\n testId=\"change-password-button\"\n />\n {children}\n </SettingsCard>\n <ConnectedPasswordChangeDialog\n open={open}\n onClose={() => setOpen(false)}\n getUnmetRequirement={getUnmetRequirement}\n />\n </SettingsSection>\n )\n}\n\n// ── Notifications ───────────────────────────────────────────────────────────\n\nexport interface ConnectedNotificationPreferencesProps {\n /** Categories to offer; default {@link EMAIL_NOTIFICATION_CATEGORIES}. */\n categories?: readonly EmailNotificationCategoryDef[]\n title?: ReactNode\n}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\n title = 'Notifications',\n}: ConnectedNotificationPreferencesProps) {\n const keys = useMemo(\n () =>\n categories === EMAIL_NOTIFICATION_CATEGORIES\n ? EMAIL_NOTIFICATION_KEYS\n : categories.map((c) => c.key),\n [categories]\n )\n const prefs = useNotificationPreferences(keys)\n return (\n <SettingsSection title={title}>\n <SettingsCard className=\"space-y-0\">\n <NotificationCategoryList\n masterId=\"emailNotifications\"\n masterTitle=\"Email Notifications\"\n masterDescription=\"Email me about activity when I’m away\"\n masterChecked={prefs.masterChecked}\n onMasterChange={prefs.setAll}\n categories={toNotificationCategories(prefs.checked, categories)}\n onCategoryChange={prefs.setCategory}\n />\n </SettingsCard>\n </SettingsSection>\n )\n}\n\n// ── Sessions ────────────────────────────────────────────────────────────────\n\nexport interface ConnectedSessionsRowProps {\n /** Glyph per session status. */\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** \"Active sessions\" row with the manage dialog (`ActiveSessionsDialog`); end any but this device. */\nexport function ConnectedSessionsRow({ renderSessionIcon }: ConnectedSessionsRowProps) {\n const { notify, confirm } = useBlocksEnvironment()\n const [open, setOpen] = useState(false)\n const sessions = useSessions({ enabled: open })\n const currentSessionId = useCurrentSessionId()\n const terminate = useTerminateSession()\n const views = toActiveSessionViews(sessions.data ?? [], {\n currentSessionId,\n terminatingId: terminate.isPending ? terminate.variables : null,\n renderIcon: renderSessionIcon,\n })\n return (\n <>\n <SettingsRow\n label=\"Active sessions\"\n description=\"Devices and agents currently signed in to your account.\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className=\"flex items-center gap-2\"\n data-testid=\"active-sessions-button\"\n >\n <Radio className=\"h-4 w-4\" />\n Manage\n </Button>\n </SettingsRow>\n <ActiveSessionsDialog\n open={open}\n onOpenChange={setOpen}\n isLoading={sessions.isLoading}\n sessions={views}\n onTerminate={(id) => {\n void (async () => {\n const view = views.find((v) => v.id === id)\n const label = view?.detail.split(' · ')[0]\n const ok = await confirm({\n title: 'End session',\n message: `End the session on ${label}? It will be signed out immediately.`,\n })\n if (!ok) return\n try {\n await terminate.mutateAsync(id)\n } catch {\n notify('Failed to end session. Please try again.', 'error')\n }\n })()\n }}\n />\n </>\n )\n}\n\nexport interface ConnectedLogoutDialogProps {\n open: boolean\n onClose: () => void\n /** Offer \"All sessions\"; default true (e.g. false for agent accounts). */\n canLogoutAll?: boolean\n /**\n * Ask before signing out (e.g. unsent work kept only on this device); resolve `false` to stay\n * signed in. Default: sign out at once.\n */\n confirmSignOut?: () => Promise<boolean> | boolean\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/**\n * Sign out of this device or all devices (`LogoutDialog`), listing the active sessions. \"All\n * sessions\" must reach the server, so it is disabled offline; \"This session\" always works.\n */\nexport function ConnectedLogoutDialog({\n open,\n onClose,\n canLogoutAll = true,\n confirmSignOut,\n renderSessionIcon,\n}: ConnectedLogoutDialogProps) {\n const sessions = useSessions({ enabled: open })\n const signOut = useSignOut()\n const isOnline = useIsOnline()\n const run = async (everywhere: boolean) => {\n onClose()\n if (confirmSignOut && !(await confirmSignOut())) return\n signOut.mutate({ everywhere, reason: 'manual' })\n }\n return (\n <LogoutDialog\n open={open}\n onClose={onClose}\n onLogoutThis={() => void run(false)}\n onLogoutAll={() => void run(true)}\n canLogoutAll={canLogoutAll}\n isOnline={isOnline}\n sessions={toLogoutSessionViews(sessions.data ?? [])}\n renderSessionIcon={renderSessionIcon}\n />\n )\n}\n\n// ── Danger zone ─────────────────────────────────────────────────────────────\n\nexport interface ConnectedDangerZoneProps {\n /** Link to the billing page for a deletion blocked by an active subscription. */\n renderSubscriptionLink?: () => ReactNode\n}\n\n/** \"Delete your account\": the collapsed danger zone and the two-step dialog (`DeleteAccountDialog`). */\nexport function ConnectedDangerZone({ renderSubscriptionLink }: ConnectedDangerZoneProps) {\n const { notify } = useBlocksEnvironment()\n const [zoneOpen, setZoneOpen] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const { data: profile } = useProfile()\n const userEmail = profile?.email ?? ''\n const remove = useDeleteAccount()\n const signOut = useSignOut()\n const flow = useDeleteAccountFlow({\n userEmail,\n remove: () => remove.mutateAsync(),\n onClose: () => setDialogOpen(false),\n onDeleted: () => signOut.mutate({ reason: 'account-deleted' }),\n onError: () => notify('Failed to delete account. Please try again.', 'error'),\n })\n return (\n <>\n <SettingsDangerZone\n isOpen={zoneOpen}\n onToggle={() => setZoneOpen((o) => !o)}\n title=\"Delete your account\"\n description=\"Once deleted, your account will be immediately closed and you will be logged out. This action cannot be undone.\"\n action={\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={!userEmail}\n onClick={() => setDialogOpen(true)}\n data-testid=\"delete-account-button\"\n >\n Delete Account\n </Button>\n }\n />\n <DeleteAccountDialog\n open={dialogOpen}\n onClose={flow.onClose}\n step={flow.step}\n blockers={toDeleteBlockerViews(flow.blockers, renderSubscriptionLink)}\n onContinue={flow.onContinue}\n onBack={flow.onBack}\n userEmail={userEmail}\n confirmEmail={flow.confirmEmail}\n onConfirmEmailChange={flow.onConfirmEmailChange}\n isDeleting={flow.isDeleting}\n onSubmit={flow.onSubmit}\n />\n </>\n )\n}\n","import { useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, useArbiWebSocket, type AppNotification } from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/** Bridge persisted document mentions to the shared bell; hosts own routing. */\nexport function useConnectedDocxNotifications(\n onOpen: (target: {\n workspaceId: string\n documentId: string\n commentId: string\n }) => void | Promise<void>\n) {\n const arbi = useArbi()\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const queries = useQueryClient()\n const source = `docx-mentions:${apiUrl}:${user?.externalId || ''}`\n const queryKey = ['docx-mentions', apiUrl, user?.externalId]\n const { data = [] } = useQuery({\n queryKey,\n queryFn: () => arbi.notifications.list('docx_mention'),\n enabled: status === 'authenticated',\n refetchInterval: 30_000,\n })\n useArbiWebSocket((message) => {\n if (message.type === 'docx_mention') void queries.invalidateQueries({ queryKey })\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId || !note.workspace_ext_id) continue\n try {\n const target = JSON.parse(note.content || '{}') as {\n document_id?: string\n comment_id?: string\n }\n if (!target.document_id?.startsWith('doc-') || !target.comment_id) continue\n const documentId = target.document_id,\n commentId = target.comment_id,\n workspaceId = note.workspace_ext_id\n items.push({\n id: `docx:${note.external_id}`,\n title: 'Mentioned you in a document comment',\n description: [note.sender.given_name, note.sender.family_name]\n .filter(Boolean)\n .join(' '),\n variant: 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve(onOpen({ documentId, commentId, workspaceId })).catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open the document.',\n 'error'\n )\n )\n },\n })\n } catch {\n /* Ignore invalid legacy payloads. */\n }\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n try {\n await arbi.notifications.markRead(ids)\n await queries.invalidateQueries({ queryKey })\n } catch {\n notify('Could not mark document mentions read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n if (id.startsWith('docx:')) void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter((note) => !note.read && note.recipient.external_id === user?.externalId)\n .map((note) => note.external_id)\n )\n },\n }\n}\n","import { useEffect } from 'react'\nimport { mailDraftIdFromContent, useWorkNotifications, type AppNotification } from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport type { components } from '@arbidocs/client'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport type WorkNotificationTarget =\n | { kind: 'conversation'; workspaceId: string; conversationId: string; messageId?: string }\n | { kind: 'workflow'; workspaceId?: string; workflowId: string }\n /** A draft an agent left for the user (`mail_draft_ready`): open it, e.g. `ConnectedMailbox draftId`. */\n | { kind: 'mail_draft'; draftId: string; mailbox?: string }\n\n/** Persisted work notifications in the shared bell; the consumer owns navigation. */\nexport function useConnectedWorkNotifications(\n onOpen: (target: WorkNotificationTarget) => void | Promise<void>\n) {\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const source = `work-notifications:${apiUrl}:${user?.externalId || ''}`\n const { data = [], markRead: persistRead } = useWorkNotifications({\n apiUrl,\n userId: user?.externalId,\n enabled: status === 'authenticated',\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId) continue\n const mapped = mapWorkNotification(note)\n if (!mapped) continue\n items.push({\n id: `work:${note.external_id}`,\n title: mapped.title,\n variant:\n note.type === 'workflow_failed'\n ? 'error'\n : note.type === 'conversation_done'\n ? 'success'\n : 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve()\n .then(() => onOpen(mapped.target))\n .catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open this notification.',\n 'error'\n )\n )\n },\n })\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n if (!ids.length) return\n try {\n await persistRead(ids)\n } catch {\n notify('Could not mark work notifications read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n // Only received, currently loaded work rows belong to this source.\n if (\n data.some(\n (note) =>\n `work:${note.external_id}` === id &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n )\n void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter(\n (note) =>\n !note.read &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n .map((note) => note.external_id)\n )\n },\n }\n}\n\n/** Route from explicit IDs; encrypted task text is never needed for a link. */\nexport function mapWorkNotification(note: components['schemas']['NotificationResponse']): {\n title: string\n target: WorkNotificationTarget\n} | null {\n const sender =\n [note.sender.given_name, note.sender.family_name].filter(Boolean).join(' ') || note.sender.email\n if (note.type === 'workflow_failed') {\n try {\n const payload = JSON.parse(note.content || '{}') as { workflow_ext_id?: string }\n if (!payload.workflow_ext_id?.match(/^wfl-[a-zA-Z0-9]+$/)) return null\n if (\n note.workspace_ext_id?.match(/^wrk-[a-zA-Z0-9]+$/) &&\n note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/)\n ) {\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n },\n }\n }\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'workflow',\n workflowId: payload.workflow_ext_id,\n workspaceId: note.workspace_ext_id || undefined,\n },\n }\n } catch {\n return null\n }\n }\n if (note.type === 'mail_draft_ready') {\n const draftId = mailDraftIdFromContent(note.content)\n if (!draftId) return null\n // Agent drafts land in the owner's native mailbox.\n return {\n title: `${sender} left a draft email for you to review`,\n target: { kind: 'mail_draft', draftId, mailbox: 'native' },\n }\n }\n const titles: Partial<Record<components['schemas']['NotificationType'], string>> = {\n mention: `${sender} mentioned you in a conversation`,\n workspace_access_request: `${sender} needs workspace access to run a thread`,\n conversation_ready:\n note.sender.external_id === note.recipient.external_id\n ? 'Your thread is ready'\n : `${sender}’s thread is ready`,\n conversation_done: `${sender} marked a thread done`,\n }\n const title = titles[note.type]\n if (!title || !note.workspace_ext_id || !note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/))\n return null\n return {\n title,\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n ...(note.message_ext_id ? { messageId: note.message_ext_id } : {}),\n },\n }\n}\n","import { bytesToBase64 } from '@arbidocs/client'\nimport {\n accountPath,\n fileAttachment,\n type MailAccount,\n type MailAttachment,\n type MailClient,\n} from '@arbidocs/react'\nimport type { MailOfflineSupport } from './types'\n\nexport function attachmentPath(accountId: string, messageId: string, attachmentId: string): string {\n return `${accountPath(accountId)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`\n}\n\n/** Hand a file to the browser as a download. */\nexport function saveFile(blob: Blob, name: string): void {\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n link.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/**\n * A message's attachments with their content, for a forward or a reopened draft. Offline, each\n * comes from this device (or arrives without content, and Send then names the missing file).\n */\nexport function hydrateMailAttachments(\n client: MailClient,\n account: MailAccount,\n messageId: string,\n attachments: MailAttachment[],\n { isOnline, offline }: { isOnline: boolean; offline?: MailOfflineSupport }\n): Promise<MailAttachment[]> {\n return Promise.all(\n attachments.map(async (a) => {\n if (a.content_base64 != null) return a\n if (!isOnline) {\n const file = await offline?.loadAttachment(account.id, messageId, a)\n return file\n ? { ...a, content_base64: bytesToBase64(new Uint8Array(await file.arrayBuffer())) }\n : { ...a, content_base64: null }\n }\n const response = await client.fetch(attachmentPath(account.id, messageId, a.id))\n return fileAttachment(new File([await response.blob()], a.name, { type: a.content_type }))\n })\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useConnectMailAccount,\n useDisconnectMailAccount,\n useMailClient,\n useMailOnline,\n type MailAccount,\n type MailPolicy,\n} from '@arbidocs/react'\n\n/** Whose names suggest the native address (`given.family`). */\nexport interface MailAliasUser {\n given_name?: string | null\n family_name?: string | null\n}\n\nexport interface ConnectedMailAccountsProps {\n policy: MailPolicy\n accounts: MailAccount[]\n onClose: () => void\n /** Render in place (e.g. a settings page) instead of a dialog. */\n embedded?: boolean\n user?: MailAliasUser | null\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** Extra settings under the accounts (e.g. keeping mail on this device). */\n settings?: ReactNode\n}\n\n/** Choose the native address, connect or remove external mailboxes. */\nexport function ConnectedMailAccounts({\n policy,\n accounts,\n onClose,\n embedded = false,\n user,\n oauthReturnPath,\n settings,\n}: ConnectedMailAccountsProps) {\n const { client } = useMailClient()\n const [profileId, setProfileId] = useState(policy.server_profiles[0]?.id ?? '')\n const [email, setEmail] = useState('')\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState('')\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const native = useClaimNativeAlias(onClose)\n const isOnline = useMailOnline()\n // Account changes go to the server; offline they are unavailable, and the note says why.\n const offline = !isOnline\n const onNativeError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n const connect = useConnectMailAccount()\n const disconnect = useDisconnectMailAccount()\n const authorizeOAuth = client.authorizeOAuth\n const oauth = async (vendor: string) => {\n if (!authorizeOAuth) return\n try {\n window.location.assign(\n await authorizeOAuth(\n vendor,\n oauthReturnPath ?? `${window.location.pathname}${window.location.search}`\n )\n )\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not connect account')\n }\n }\n const content = (\n <>\n {offline && (\n <p\n role=\"status\"\n className=\"mb-4 rounded bg-muted/40 px-3 py-2 text-sm text-muted-foreground\"\n >\n {\"You're offline. Creating, connecting or removing accounts needs a connection.\"}\n </p>\n )}\n {policy.native_enabled && !accounts.some((a) => a.provider === 'native') && (\n <form\n className=\"mb-5 grid gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n native.mutate(alias, { onError: onNativeError })\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Choose your email address\n <div className=\"flex items-center gap-2\">\n <input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n className=\"min-w-0 flex-1 rounded border bg-background p-2\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span>@{policy.native_domain}</span>\n </div>\n </label>\n <Button disabled={native.isPending || offline} type=\"submit\">\n Create inbox\n </Button>\n </form>\n )}\n <p className=\"mb-4 text-sm text-muted-foreground\">\n Connect an account using the providers enabled by your administrator.\n </p>\n {authorizeOAuth && (\n <div className=\"mb-4 flex flex-wrap gap-2\">\n {policy.oauth_providers.map((vendor) => (\n <Button\n key={vendor}\n variant=\"outline\"\n disabled={offline}\n onClick={() => void oauth(vendor)}\n >\n Connect {vendor === 'microsoft' ? 'Outlook' : 'Gmail'}\n </Button>\n ))}\n </div>\n )}\n {accounts.map((account) => (\n <div\n key={account.id}\n className=\"mb-2 flex items-center justify-between gap-2 rounded border p-3 text-sm\"\n >\n <div>\n <div>{account.email}</div>\n <div className=\"text-muted-foreground\">{account.display_name}</div>\n </div>\n {account.profile_id ? (\n <Button\n variant=\"ghost\"\n disabled={disconnect.isPending || offline}\n onClick={() =>\n disconnect.mutate(account.id, { onError: (err: Error) => setError(err.message) })\n }\n >\n Disconnect\n </Button>\n ) : account.provider !== 'native' ? (\n authorizeOAuth && (\n <Button\n variant=\"ghost\"\n disabled={offline}\n onClick={() => void oauth(account.provider)}\n >\n Reconnect\n </Button>\n )\n ) : (\n <span className=\"text-muted-foreground\">Native inbox</span>\n )}\n </div>\n ))}\n {policy.server_profiles.length > 0 && (\n <form\n className=\"mt-5 grid gap-3\"\n onSubmit={(event) => {\n event.preventDefault()\n setError('')\n connect.mutate(\n { profileId, email, username, password },\n {\n onSuccess: () => {\n setPassword('')\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Mail server\n <select\n aria-label=\"Mail server\"\n className=\"rounded border bg-background p-2\"\n value={profileId}\n onChange={(e) => setProfileId(e.target.value)}\n >\n {policy.server_profiles.map((profile) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-1 text-sm\">\n Email address\n <input\n required\n type=\"email\"\n autoComplete=\"email\"\n className=\"rounded border bg-background p-2\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Username\n <input\n placeholder=\"Same as email address\"\n autoComplete=\"username\"\n className=\"rounded border bg-background p-2\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Password or app password\n <input\n required\n type=\"password\"\n autoComplete=\"current-password\"\n className=\"rounded border bg-background p-2\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n </label>\n <Button type=\"submit\" disabled={connect.isPending || offline}>\n {connect.isPending ? 'Connecting…' : 'Connect mailbox'}\n </Button>\n </form>\n )}\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {accounts.length > 0 && settings}\n </>\n )\n if (embedded) return <div className=\"max-w-2xl\">{content}</div>\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n >\n <DialogContent className=\"max-h-[90dvh] max-w-lg overflow-auto\">\n <DialogTitle>Mail accounts</DialogTitle>\n <DialogDescription>\n Choose your email address or connect an external mailbox.\n </DialogDescription>\n {content}\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * A composer's body in the Word editor: its draft room (opened, reopened after a reconnect or a\n * remount, shown to the chat while open) and the room's save, send and body calls.\n *\n * The room is the body: it saves itself as it is typed into, ARBI's edits land in it as tracked\n * changes, and the draft's text and HTML are made from it on the server when it is saved or sent.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useMailDraftEditor,\n type MailClient,\n type MailCompose,\n type MailProject,\n} from '@arbidocs/react'\nimport type { NativeDocxAdapter } from '../../docx/NativeDocxEditor'\nimport type { MailWordEditor } from './types'\nimport { useRegisterOpenDocument } from '../../chat/open-document'\n\n// A compose session's room, kept across the composer remounting (docked ↔ overlay), so a new\n// message not saved yet reopens its own room instead of starting an empty one.\nconst sessionRooms = new Map<string, string>()\n\nexport interface WordBody {\n adapter: NativeDocxAdapter\n /** The editor's document key: stable for this compose session. */\n documentKey: string\n stateRef: React.MutableRefObject<(() => string | undefined) | null>\n /** Opened: saving and sending can go through the room. */\n ready: boolean\n save(compose: MailCompose): Promise<{ id: string }>\n /** Send it (`request_id`: the send's idempotency key, as `/send` takes). */\n send(compose: MailCompose & { request_id: string }): Promise<{ id: string; status: string }>\n /** The body as text and HTML (`final`: refused while suggestions wait). */\n body(final: boolean): Promise<{ text: string; html: string }>\n /** The project ARBI's work on this email is billed to (known once the room opens). */\n project?: MailProject | null\n /** Bill another project the person may bill (null: their own). */\n chooseProject(projectExtId: string | null): Promise<void>\n}\n\nexport function useWordBody({\n word,\n client,\n initial,\n sessionKey,\n roomId: givenRoomId,\n onBodyChange,\n}: {\n word: MailWordEditor\n client: MailClient\n initial: MailCompose\n /** This compose session (stable across remounts); absent: one per mount. */\n sessionKey?: string\n /** An existing room to open as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** The person changed the body (it is not in Drafts until saved). */\n onBodyChange: () => void\n}): WordBody {\n const [documentKey] = useState(\n () => `mail-${sessionKey ?? initial.draft_id ?? crypto.randomUUID()}`\n )\n const roomRef = useRef<string | undefined>(sessionRooms.get(documentKey) ?? givenRoomId)\n const [roomId, setRoomId] = useState(roomRef.current)\n const [project, setProject] = useState<MailProject | null>()\n const stateRef = useRef<(() => string | undefined) | null>(null)\n const changed = useRef(onBodyChange)\n useEffect(() => {\n changed.current = onBodyChange\n })\n // The first open, while it runs: a second one (the editor remounting, a token renewal) must join it, or a new\n // message would get a second, empty room.\n const opening = useRef<ReturnType<NonNullable<MailClient['openDraftEditor']>> | null>(null)\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...word.adapter,\n open: async () => {\n if (!roomRef.current && opening.current) return opening.current\n const request = client.openDraftEditor!(\n roomRef.current\n ? { roomId: roomRef.current }\n : { draftId: initial.draft_id ?? undefined, text: initial.text, html: initial.html }\n )\n if (!roomRef.current) opening.current = request\n try {\n const session = await request\n roomRef.current = session.room_id\n sessionRooms.set(documentKey, session.room_id)\n setRoomId(session.room_id)\n setProject(session.project ?? null)\n return session\n } finally {\n opening.current = null\n }\n },\n save: async () => {\n throw new Error('Save the draft from the composer')\n },\n onDirtyChange: (dirty) => {\n if (dirty) changed.current()\n },\n }),\n // The editor keeps its adapter for the session; the seed matters only when it first opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [word.adapter, client, documentKey]\n )\n // The open draft's room is the chat's open document, so ARBI edits it there as tracked changes.\n useRegisterOpenDocument({ documentId: roomId })\n const editor = useMailDraftEditor()\n const state = () => stateRef.current?.() ?? null\n return {\n adapter,\n documentKey,\n stateRef,\n ready: !!roomId,\n save: (compose) => editor.save(roomRef.current!, compose, state()),\n send: async (compose) => {\n const result = await editor.send(roomRef.current!, compose, state())\n sessionRooms.delete(documentKey) // sent: the room is gone\n return result\n },\n body: (final) => editor.body(roomRef.current!, final, state()),\n project,\n chooseProject: async (projectExtId) => {\n setProject(await editor.setProject(roomRef.current!, projectExtId))\n },\n }\n}\n","import { lazy, Suspense, useEffect, useMemo, useRef, useState, type RefObject } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Paperclip, Send, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n DialogDescription,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '@arbidocs/react/ui'\nimport {\n fileAttachment,\n useMailClient,\n useMailDraftReplaced,\n useMailProjects,\n useSaveMailDraft,\n useSendMail,\n useMailOnline,\n type MailAccount,\n type MailCompose,\n type MailDeliveryStatus,\n type MailMessage,\n} from '@arbidocs/react'\nimport { MailDocumentPicker } from '../../collaboration/mail/MailDocumentPicker'\nimport { PlainMailBodyEditor } from '../../collaboration/mail/PlainMailBodyEditor'\nimport { parseMailRecipients } from '../../collaboration/mail/mailCompose'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\nimport { useBlocksEnvironment, type BlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useWordBody } from './useWordBody'\n\n// The rich editor is its own chunk, on the optional peer `lexical`. If it is not installed or can't\n// be downloaded (offline before the app finished caching itself), write in plain text instead.\nconst MailBodyEditor = lazy(() =>\n import('../../collaboration/mail/MailBodyEditor').catch(() => ({\n default: PlainMailBodyEditor,\n }))\n)\n// The Word editor (a native draft's body, see MailWordEditor) is its own chunk too.\nconst NativeDocxEditor = lazy(() =>\n import('../../docx/NativeDocxEditor').then((m) => ({ default: m.NativeDocxEditor }))\n)\nconst NO_WORD: MailWordEditor = {\n adapter: {\n request: () => Promise.reject(new Error('No Word editor')),\n loadFonts: () => Promise.reject(new Error('No Word editor')),\n },\n}\n\nexport interface MailComposerFormProps {\n account?: MailAccount\n initial: MailCompose\n maxBytes: number\n ready: boolean\n /** The account's saved drafts: a new message with a draft's subject points to it. */\n drafts: MailMessage[]\n onClose: () => void\n /** Open a saved draft (from the \"already in Drafts\" notice). Absent: the notice has no button. */\n onOpenDraft?: (id: string) => void\n /** Reopen this form on a newer version of its draft, saved elsewhere (by ARBI, or in another tab). */\n onReload?: (draftId: string) => void\n /** Reports every edit so the parent can re-seed this form if it remounts (e.g. docked → overlay). */\n onChange?: (value: MailCompose) => void\n embedded?: boolean\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (saved offline): saves update it, sending removes it. */\n localDraftId?: string\n offline?: MailOfflineSupport\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor. Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote) instead of a new one. */\n roomId?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\n/**\n * Say how a send went. A mailbox on the same deployment is delivered to (or refused) before the send\n * returns, so a bounce is reported at once. Mail handed to the relay is only queued: its delivery\n * reports arrive later, in Sent.\n */\nfunction notifySent(notify: BlocksEnvironment['notify'], result: unknown) {\n const status =\n result && typeof result === 'object' && 'delivery_status' in result\n ? (result as { delivery_status?: MailDeliveryStatus | null }).delivery_status\n : null\n if (status === 'bounced')\n notify(\"Email couldn't be delivered\", 'error', { description: 'Open it in Sent to see why.' })\n else if (status === 'partially_bounced')\n notify(\"Email couldn't be delivered to every recipient\", 'error', {\n description: 'Open it in Sent to see which and why.',\n })\n else if (status === 'delivered') notify('Email delivered', 'success')\n else notify('Email queued for delivery', 'success')\n}\n\n/** Write, save and send one message. */\nexport function MailComposerForm({\n account,\n initial,\n maxBytes,\n ready,\n drafts,\n onClose,\n onOpenDraft,\n onReload,\n onChange,\n embedded = false,\n closeRequestRef,\n localDraftId: initialLocalDraftId,\n offline,\n documents,\n word,\n sessionKey,\n roomId,\n headerSlot,\n}: MailComposerFormProps) {\n const { client } = useMailClient()\n const { notify, confirm } = useBlocksEnvironment()\n const [to, setTo] = useState(initial.to.map((r) => r.email).join('; '))\n const [cc, setCc] = useState(initial.cc.map((r) => r.email).join('; '))\n const [showCc, setShowCc] = useState(initial.cc.length > 0)\n const [showBcc, setShowBcc] = useState(initial.bcc.length > 0)\n const [bcc, setBcc] = useState(initial.bcc.map((r) => r.email).join('; '))\n const [subject, setSubject] = useState(initial.subject)\n const [text, setText] = useState(initial.text)\n const [html, setHtml] = useState(initial.html)\n const [attachments, setAttachments] = useState(initial.attachments)\n const [draftId, setDraftId] = useState(initial.draft_id)\n const [error, setError] = useState('')\n const [dirty, setDirty] = useState(false)\n const [attaching, setAttaching] = useState(false)\n const [saved, setSaved] = useState(false)\n // A newer version of this draft saved elsewhere while this form had unsaved changes.\n const [replacedBy, setReplacedBy] = useState<string>()\n const isOnline = useMailOnline()\n // A native message's body opens in the Word editor when the host offers it and the server is reachable\n // (decided once: the editor is never swapped mid-message). Its room is the body; ARBI's edits are suggestions.\n const [usesWord] = useState(\n () =>\n !!word &&\n !!client.openDraftEditor &&\n account?.provider === 'native' &&\n isOnline &&\n !initialLocalDraftId\n )\n const [bodyChanged, setBodyChanged] = useState(false)\n const [wordPending, setWordPending] = useState(false)\n // The matters ARBI's work on this email can be billed to (the person's own project first).\n const projects = useMailProjects({ enabled: usesWord })\n const wordBody = useWordBody({\n word: word ?? NO_WORD,\n client,\n initial,\n sessionKey,\n roomId,\n onBodyChange: () => {\n setBodyChanged(true)\n setSaved(false)\n setDirty(true)\n },\n })\n // A draft saved while offline lives on this device until it reaches the server's Drafts.\n const [localDraftId, setLocalDraftId] = useState(initialLocalDraftId)\n const [savedLocally, setSavedLocally] = useState(false)\n const [secure, setSecure] = useState(initial.secure_delivery ?? false)\n const securePayload = useRef<unknown>(null)\n const requestId = useRef(crypto.randomUUID())\n const attemptedPayload = useRef<MailCompose | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n // Drafts are separate messages, so a new compose never replaces one on send; point to it instead.\n const sameSubjectDraft = useMemo(() => {\n const key = subject.trim().toLowerCase()\n return key\n ? drafts.find((d) => d.id !== draftId && d.subject.trim().toLowerCase() === key)\n : undefined\n }, [drafts, draftId, subject])\n const body = (): MailCompose => ({\n ...initial,\n to: parseMailRecipients(to),\n cc: parseMailRecipients(cc),\n bcc: parseMailRecipients(bcc),\n subject,\n text,\n html,\n attachments,\n draft_id: draftId,\n secure_delivery: secure,\n })\n /** Keep the draft on this device (updating the copy already there). */\n const saveOnDevice = async (compose: MailCompose) => {\n const draft = await offline!.saveDraft(account!.id, compose, localDraftId)\n setLocalDraftId(draft.id)\n }\n const save = useSaveMailDraft(\n offline && { keep: saveOnDevice, isNetworkFailure: offline.isNetworkFailure }\n )\n /** Put the message in the Outbox (with this send's request_id, so it can only go out once). */\n const queueInOutbox = async (compose: MailCompose) => {\n await offline!.queueSend({\n account: account!,\n compose,\n requestId: requestId.current,\n secure,\n securePayload: securePayload.current ?? undefined,\n })\n if (localDraftId) await offline!.deleteDraft(localDraftId)\n }\n const send = useSendMail(\n offline && { keep: queueInOutbox, isNetworkFailure: offline.isNetworkFailure }\n )\n const onSaved = (result: Awaited<ReturnType<typeof save.mutateAsync>>) => {\n setSaved(true)\n setDirty(false)\n if ('onDevice' in result) {\n setSavedLocally(true)\n return\n }\n setSavedLocally(false)\n setDraftId(result.id)\n setReplacedBy(undefined) // this version replaced the one saved elsewhere\n // The server has it now; the device copy (if this started offline) is no longer needed.\n if (localDraftId) {\n void offline?.deleteDraft(localDraftId)\n setLocalDraftId(undefined)\n }\n }\n const saveDraft = () => {\n if (usesWord) {\n // The body comes from the Word room on the server; ARBI's pending suggestions stay out of Drafts.\n if (!wordBody.ready) return setError('The editor is still opening')\n setWordPending(true)\n void wordBody\n .save(body())\n .then(\n (result) => {\n onSaved(result)\n setBodyChanged(false)\n },\n (err: Error) => setError(err.message)\n )\n .finally(() => setWordPending(false))\n return\n }\n save.mutate(\n { accountId: account!.id, compose: body() },\n { onSuccess: onSaved, onError: (err: Error) => setError(err.message) }\n )\n }\n // Saving a draft replaces it under a new id. Saved elsewhere (ARBI editing it in a private chat, another tab),\n // follow it: saves now replace the newer version; an unchanged form reopens on it, an edited one offers to.\n useMailDraftReplaced(draftId, (newId) => {\n if (save.isPending || wordPending) return // this form's own save: its answer carries the new id\n setDraftId(newId)\n if (!dirty && onReload) onReload(newId)\n else setReplacedBy(newId)\n })\n const sendMessage = async () => {\n let value = attemptedPayload.current\n if (value === null) {\n value = body()\n const recipients = [...value.to, ...value.cc, ...value.bcc]\n const problem =\n !recipients.length || recipients.length > 100\n ? 'Enter between 1 and 100 recipients'\n : recipients.some((r) => !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(r.email))\n ? 'Check the recipient email addresses'\n : value.attachments.reduce((total, a) => total + a.size, 0) > maxBytes\n ? 'Attachments exceed the email size limit'\n : null\n if (problem) return setError(problem)\n // Offline it waits in the Outbox; online the attempt is kept, so a retry resends it as is.\n if (!(offline && !isOnline)) attemptedPayload.current = value\n }\n if (usesWord) {\n if (!wordBody.ready) return setError('The editor is still opening')\n // A suggestion is never sent unreviewed: the server refuses (409) until each is accepted or rejected,\n // which is a definite refusal, so the message can be sent again once they are.\n const refused = (err: Error) => {\n setError(err.message)\n if ((err as { status?: number }).status === 409) attemptedPayload.current = null\n }\n setWordPending(true)\n try {\n if (!secure) {\n notifySent(notify, await wordBody.send({ ...value, request_id: requestId.current }))\n onClose()\n return\n }\n // Secure delivery encrypts in the browser, so it takes the body as text and HTML first.\n value = { ...value, ...(await wordBody.body(true)) }\n attemptedPayload.current = value\n } catch (err) {\n return refused(err as Error)\n } finally {\n setWordPending(false)\n }\n }\n const sending = account\n const message = value\n send.mutate(\n {\n accountId: account!.id,\n compose: message,\n requestId: requestId.current,\n // Secure delivery prepares its encrypted payload once.\n secure: secure\n ? async () => {\n if (sending?.provider !== 'native' || !client.prepareSecureMail)\n throw new Error('Choose your native inbox to send securely')\n securePayload.current ??= await client.prepareSecureMail(\n message,\n sending,\n requestId.current\n )\n return securePayload.current\n }\n : undefined,\n },\n {\n onSuccess: (result) => {\n if (result && typeof result === 'object' && 'onDevice' in result) {\n notify('Saved to your Outbox', 'info', {\n description: \"It will be sent automatically when you're back online.\",\n })\n onClose()\n return\n }\n notifySent(notify, result)\n if (localDraftId) void offline?.deleteDraft(localDraftId)\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }\n const busy = attaching || save.isPending || send.isPending || wordPending\n const locked = busy || attemptedPayload.current !== null\n const addFiles = async (files: FileList | null) => {\n if (!files) return\n const selected = Array.from(files)\n if (\n attachments.reduce((n, a) => n + a.size, 0) + selected.reduce((n, f) => n + f.size, 0) >\n maxBytes\n ) {\n setError(`Attachments must total less than ${Math.round(maxBytes / 1024 / 1024)} MB`)\n return\n }\n setAttaching(true)\n try {\n const added = await Promise.all(selected.map(fileAttachment))\n setAttachments((previous) => [...previous, ...added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach files')\n } finally {\n setAttaching(false)\n }\n }\n // A document of the open workspace, attached as its original file.\n const addDocument = async (documentId: string) => {\n if (!documents) return\n const used = attachments.reduce((n, a) => n + a.size, 0)\n setError('')\n setAttaching(true)\n try {\n const added = await documents.toAttachment(documentId, maxBytes - used)\n setAttachments((previous) => [...previous, added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach the document')\n } finally {\n setAttaching(false)\n }\n }\n const close = () => {\n if (busy) return\n const unsaved =\n !saved &&\n (dirty || !draftId) &&\n (text || subject || to || cc || bcc || attachments.length || bodyChanged)\n if (!unsaved) return onClose()\n void confirm({\n title: 'Discard changes',\n message: 'Close this message without saving your latest changes?',\n }).then((ok) => {\n if (ok) onClose()\n })\n }\n useEffect(() => {\n if (closeRequestRef) closeRequestRef.current = close\n })\n // Moving the panel between docked and overlay remounts this form, so the parent keeps the latest\n // content and the remounted form starts from it instead of the original seed.\n useEffect(() => {\n onChange?.(body())\n // eslint-disable-next-line react-hooks/exhaustive-deps -- body() is rebuilt each render; the fields are its inputs\n }, [to, cc, bcc, subject, text, html, attachments, draftId, secure])\n // Who ARBI's work on this email is billed to: a property of the message, shown in its header, not a field of it.\n const billTo = wordBody.project && (\n <label\n className=\"flex items-center gap-1 text-xs text-muted-foreground\"\n title=\"ARBI's work on this email is billed to this project\"\n >\n Billed to\n <select\n aria-label=\"Bill to\"\n className=\"max-w-[12rem] truncate rounded bg-transparent py-0.5 text-foreground hover:bg-muted/60 focus:bg-muted/60 focus:outline-none\"\n value={wordBody.project.external_id}\n disabled={busy}\n onChange={(e) => {\n const chosen = projects.data?.find((p) => p.external_id === e.target.value)\n void wordBody\n .chooseProject(chosen && !chosen.personal ? chosen.external_id : null)\n .catch((err: Error) => setError(err.message))\n }}\n >\n {(projects.data ?? [wordBody.project]).map((p) => (\n <option key={p.external_id} value={p.external_id}>\n {p.personal ? `${p.name} (personal)` : p.name}\n </option>\n ))}\n </select>\n </label>\n )\n const form = (\n <form\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n if (ready && !busy) event.currentTarget.requestSubmit()\n } else if (event.target instanceof HTMLInputElement) {\n // Recipient/subject Enter must never send an unfinished message.\n event.preventDefault()\n }\n }}\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n void sendMessage()\n }}\n className={\n embedded\n ? 'flex h-full min-h-0 w-full flex-col bg-background'\n : 'flex max-h-[95dvh] w-full max-w-3xl flex-col rounded-xl border bg-background shadow-2xl'\n }\n >\n {!embedded && (\n <header className=\"flex items-center justify-between border-b px-5 py-3\">\n <h2 className=\"font-semibold\">New message</h2>\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-label=\"Close message\"\n disabled={busy}\n onClick={close}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto px-5 py-3\">\n {sameSubjectDraft && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n A draft with this subject is already in Drafts.\n {onOpenDraft && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n onClick={() => onOpenDraft(sameSubjectDraft.id)}\n >\n Open draft\n </Button>\n )}\n </div>\n )}\n {replacedBy && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n This draft was changed elsewhere (by ARBI or in another tab). Saving keeps your version.\n {onReload && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n disabled={busy}\n onClick={() => {\n void confirm({\n title: 'Load changes',\n message: 'Discard your unsaved changes and load the changed draft?',\n }).then((ok) => {\n if (ok) onReload(replacedBy)\n })\n }}\n >\n Load changes\n </Button>\n )}\n </div>\n )}\n <p className=\"mb-2 flex items-center gap-3 border-b border-border/60 pb-3 text-xs text-muted-foreground\">\n <span className=\"w-14 shrink-0\">From</span>\n <span className=\"rounded bg-muted/50 px-2 py-1 text-foreground\">\n {account?.email ?? 'Connect a mailbox to send'}\n </span>\n </p>\n {usesWord && wordBody.project && !headerSlot && <p className=\"mb-2\">{billTo}</p>}\n {usesWord && wordBody.project && headerSlot && createPortal(billTo, headerSlot)}\n {(\n [\n ['To', to, setTo],\n ['Cc', cc, setCc],\n ['Bcc', bcc, setBcc],\n ] as const\n )\n .filter(\n ([label]) =>\n label === 'To' || (label === 'Cc' && showCc) || (label === 'Bcc' && showBcc)\n )\n .map(([label, value, setter]) => (\n <label\n key={label}\n className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\"\n >\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">{label}</span>\n <input\n aria-label={label}\n required={label === 'To' && !cc && !bcc}\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={value}\n placeholder={label === 'To' ? 'Add recipients' : ''}\n onChange={(e) => {\n setter(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n {label === 'To' && (\n <span className=\"flex shrink-0 gap-2\">\n {!showCc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowCc(true)}\n >\n Cc\n </button>\n )}\n {!showBcc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowBcc(true)}\n >\n Bcc\n </button>\n )}\n </span>\n )}\n </label>\n ))}\n <label className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\">\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">Subject</span>\n <input\n aria-label=\"Subject\"\n placeholder=\"Add a subject\"\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={subject}\n onChange={(e) => {\n setSubject(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n </label>\n <Suspense fallback={<p className=\"py-4 text-sm text-muted-foreground\">Loading editor…</p>}>\n {usesWord ? (\n <div\n // The body is the rest of the composer, edge to edge: no box around the letter.\n className=\"-mx-5 -mb-3 flex min-h-[22rem] flex-1 flex-col border-t border-border/60\"\n data-testid=\"mail-word-body\"\n // The editor's own forms (a comment, a reply) submit there: never as this message (that would send it).\n onSubmit={(event) => event.stopPropagation()}\n >\n <NativeDocxEditor\n compact\n adapter={wordBody.adapter}\n documentId={wordBody.documentKey}\n title=\"Email\"\n stateRef={wordBody.stateRef}\n />\n </div>\n ) : (\n <MailBodyEditor\n text={text}\n html={html}\n disabled={locked}\n onChange={(nextText, nextHtml) => {\n setText(nextText)\n setHtml(nextHtml)\n setSaved(false)\n }}\n />\n )}\n </Suspense>\n <div className=\"flex flex-wrap gap-2\">\n {attachments.map((attachment, index) => (\n <span\n key={`${attachment.name}-${index}`}\n className=\"flex items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-3 py-2 text-xs\"\n >\n <Paperclip className=\"size-3\" />\n {attachment.name}\n <button\n type=\"button\"\n disabled={locked}\n aria-label={`Remove ${attachment.name}`}\n onClick={() => {\n setAttachments((a) => a.filter((_, i) => i !== index))\n setSaved(false)\n setDirty(true)\n }}\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n <footer className=\"flex flex-wrap items-center gap-1 border-t border-border/60 bg-muted/20 px-4 py-2 [&_button]:h-8 [&_button]:text-xs\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!ready || locked}\n onClick={() => {\n setError('')\n saveDraft()\n }}\n >\n {save.isPending ? 'Saving…' : 'Save draft'}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={locked}\n onClick={() => fileInput.current?.click()}\n >\n <Paperclip className=\"mr-2 size-4\" />\n Attach\n </Button>\n {documents && (\n <MailDocumentPicker\n documents={documents.documents}\n disabled={locked}\n onAttach={(doc) => void addDocument(doc.id)}\n />\n )}\n <input\n ref={fileInput}\n type=\"file\"\n multiple\n hidden\n onChange={(e) => {\n void addFiles(e.target.files)\n e.target.value = ''\n }}\n />\n {saved && (\n <span className=\"whitespace-nowrap text-xs text-muted-foreground\">\n {savedLocally\n ? 'Saved on this device · syncs to Drafts when online'\n : 'Saved to Drafts'}\n </span>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n {account?.provider === 'native' && client.prepareSecureMail && (\n <Tooltip>\n <TooltipTrigger asChild showWithText>\n <label className=\"flex h-8 shrink-0 cursor-pointer items-center gap-1.5 rounded border border-border/70 px-2 text-xs text-primary\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 accent-primary\"\n checked={secure}\n disabled={locked}\n onChange={(e) => setSecure(e.target.checked)}\n />\n Secure\n </label>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n The recipient will receive a secure link to access the message through the platform.\n </TooltipContent>\n </Tooltip>\n )}\n <Button\n type=\"submit\"\n className=\"h-8 rounded bg-primary px-4 text-primary-foreground shadow-none hover:bg-primary/90\"\n disabled={!ready || busy}\n >\n <Send className=\"mr-2 size-4\" />\n {send.isPending ? 'Sending…' : attemptedPayload.current ? 'Check send result' : 'Send'}\n </Button>\n </div>\n {offline && !isOnline && (\n <p\n className=\"w-full text-[11px] text-muted-foreground\"\n data-testid=\"compose-offline-hint\"\n >\n {\n \"You're offline. Send puts this message in your Outbox; it goes out when you reconnect.\"\n }\n </p>\n )}\n </footer>\n </form>\n )\n if (embedded)\n return (\n <div role=\"dialog\" aria-label=\"Compose email\" className=\"h-full min-h-0\">\n {form}\n </div>\n )\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) close()\n }}\n >\n <DialogContent className=\"max-h-[95dvh] max-w-3xl overflow-auto p-0\">\n <DialogTitle className=\"sr-only\">Compose email</DialogTitle>\n <DialogDescription className=\"sr-only\">Write a message and attach files.</DialogDescription>\n {form}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { MailAccount } from '@arbidocs/react'\n\n/** The account a `mailbox` choice names: an account id, or `'native'` for the user's own inbox. */\nexport function resolveMailbox(\n accounts: MailAccount[] | undefined,\n mailbox: string | undefined\n): MailAccount | undefined {\n if (!accounts) return undefined\n if (mailbox === 'native') return accounts.find((a) => a.provider === 'native')\n return mailbox ? accounts.find((a) => a.id === mailbox) : undefined\n}\n","/**\n * The mail composer bound to the mail client in scope: write a new message, or open a saved draft\n * (`draftId`), save it to Drafts and send it, with files and workspace documents attached.\n *\n * Inside `ConnectedMailbox` everything is passed in; on its own it finds what it needs: the account\n * (`mailbox`, default the native inbox), the attachment limit, the unlock and the saved drafts.\n */\n\nimport { useMemo, useState, type RefObject } from 'react'\nimport {\n useMailAccounts,\n useMailClient,\n useMailDraftCompose,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAccount,\n type MailCompose,\n type MailMessage,\n} from '@arbidocs/react'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { hydrateMailAttachments } from './attachments'\nimport { MailComposerForm } from './MailComposerForm'\nimport { resolveMailbox } from './mailbox'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\n\nconst DEFAULT_MAX_BYTES = 15 * 1024 * 1024\n\nexport interface ConnectedMailComposerProps {\n /** Open this saved draft (from the account's Drafts) instead of a new message. */\n draftId?: string\n /** The message to start from (new, reply, forward). Default: empty, or the draft. */\n initial?: MailCompose\n /** Send from this account. Default: the `mailbox` account. */\n account?: MailAccount\n /** Which account to send from when `account` is not given: an id, or `'native'` (default). */\n mailbox?: string\n /** The attachment limit. Default: the deployment's. */\n maxBytes?: number\n /** Whether saving and sending can run. Default: once the account is unlocked (or offline). */\n ready?: boolean\n /** Saved drafts, for the \"already in Drafts\" notice. Default: the account's Drafts. */\n drafts?: MailMessage[]\n onClose: () => void\n onOpenDraft?: (id: string) => void\n onChange?: (value: MailCompose) => void\n /** Fill the parent (a panel) instead of opening as a dialog. */\n embedded?: boolean\n /** Receives the close request (asks before discarding unsaved changes). */\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (see {@link MailOfflineSupport}). */\n localDraftId?: string\n offline?: MailOfflineSupport\n /** Workspace documents to attach (\"From workspace\"). Absent: not offered. */\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor (see {@link MailWordEditor}). Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** A reply to this email (its id): the composer starts addressed and threaded as one; the body is `roomId`. */\n replyTo?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\nexport function ConnectedMailComposer({\n draftId,\n initial,\n account: accountProp,\n mailbox = 'native',\n maxBytes: maxBytesProp,\n ready: readyProp,\n drafts: draftsProp,\n offline,\n replyTo,\n ...rest\n}: ConnectedMailComposerProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const policy = useMailPolicy()\n const accounts = useMailAccounts({ enabled: !accountProp && !!policy.data?.enabled })\n const account = accountProp ?? resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(readyProp === undefined ? account : undefined)\n const ready = readyProp ?? (!!account && (!!unlock.data || !isOnline))\n const folders = useMailFolders(account, { enabled: !draftsProp && ready })\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const draftsList = useMailMessages(account, draftsFolderId, '', null, {\n enabled: !draftsProp && ready,\n })\n // A newer version of the draft, saved elsewhere (see MailComposerForm's onReload): reopen on it.\n const [reloaded, setReloaded] = useState<string>()\n const openId = reloaded ?? draftId\n const draft = useMailDraftCompose(\n account,\n openId,\n async (from, id) => {\n const message = await client.getMessage(from, id)\n return draftMailCompose(\n message,\n await hydrateMailAttachments(client, from, message.id, message.attachments, {\n isOnline,\n offline,\n })\n )\n },\n { enabled: (!initial || !!reloaded) && ready }\n )\n const original = useMailMessage(account, replyTo, { enabled: !!replyTo && ready })\n const start = useMemo(() => {\n if (replyTo)\n return original.data && account\n ? {\n ...replyMailCompose(original.data, { account, folderRole: 'inbox' }),\n text: '',\n html: '',\n }\n : undefined\n return reloaded ? draft.data : (initial ?? (openId ? draft.data : emptyMailCompose()))\n }, [replyTo, original.data, account, reloaded, initial, openId, draft.data])\n if (!start)\n return (draft.error ?? original.error) ? (\n <p role=\"alert\" className=\"p-4 text-sm text-destructive\">\n {(draft.error ?? original.error)?.message}\n </p>\n ) : (\n <p className=\"p-4 text-sm text-muted-foreground\">Loading draft…</p>\n )\n return (\n <MailComposerForm\n key={`${account?.id}-${openId ?? ''}`}\n account={account}\n initial={start}\n maxBytes={maxBytesProp ?? policy.data?.max_attachment_bytes ?? DEFAULT_MAX_BYTES}\n ready={ready}\n drafts={draftsProp ?? draftsList.data?.messages ?? []}\n offline={offline}\n onReload={setReloaded}\n {...rest}\n />\n )\n}\n","import { useState } from 'react'\nimport { Mail as MailIcon } from 'lucide-react'\nimport { Button, Input } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useMailOnline,\n type MailPolicy,\n} from '@arbidocs/react'\nimport type { MailAliasUser } from './ConnectedMailAccounts'\n\n/**\n * First run of Mail, in the main screen rather than a dialog: the user confirms the suggested\n * address and is straight into their inbox. External accounts (Gmail, Outlook, IMAP) stay one\n * click away, in the accounts dialog, for deployments that enable them.\n */\nexport function ConnectedMailSetup({\n policy,\n user,\n productName,\n onClaimed,\n onConnectExisting,\n}: {\n policy: MailPolicy\n user?: MailAliasUser | null\n /** The product's name in the copy (\"Set up your ARBI email\"). Default: none. */\n productName?: string\n /** The inbox exists now (the alias that was claimed). */\n onClaimed: (alias: string) => void\n onConnectExisting: () => void\n}) {\n const isOnline = useMailOnline()\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const [error, setError] = useState('')\n const claim = useClaimNativeAlias(onClaimed)\n const hasExternal = policy.oauth_providers.length > 0 || policy.server_profiles.length > 0\n const onClaimError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n\n return (\n <div\n data-testid=\"mail-setup\"\n className=\"mx-auto flex max-w-xl flex-col items-center gap-6 px-6 py-16 text-center\"\n >\n <MailIcon className=\"size-10 text-muted-foreground\" aria-hidden />\n {policy.native_enabled ? (\n <>\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">\n Set up your {productName ? `${productName} ` : ''}email\n </h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Confirm your address and you are ready to go: you can send and receive email as\n </p>\n </div>\n <form\n className=\"flex w-full flex-col items-center gap-4\"\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n claim.mutate(alias, { onError: onClaimError })\n }}\n >\n <div className=\"flex w-full items-center justify-center gap-2 text-base\">\n <Input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n autoFocus\n className=\"max-w-60 text-right\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span className=\"text-foreground\">@{policy.native_domain}</span>\n </div>\n <Button\n type=\"submit\"\n disabled={claim.isPending || !alias || !isOnline}\n title={isOnline ? undefined : 'Available when you are back online'}\n >\n {claim.isPending ? 'Setting up…' : 'Confirm'}\n </Button>\n </form>\n </>\n ) : (\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">Connect your email</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Connect an existing account to read and send email{' '}\n {productName ? `from ${productName}` : 'here'}.\n </p>\n </div>\n )}\n {hasExternal && (\n <Button\n variant={policy.native_enabled ? 'ghost' : 'default'}\n onClick={onConnectExisting}\n className={policy.native_enabled ? 'text-muted-foreground' : undefined}\n >\n {policy.native_enabled\n ? 'Connect an existing email account instead'\n : 'Connect an email account'}\n </Button>\n )}\n {!policy.native_enabled && !hasExternal && (\n <p className=\"text-sm text-muted-foreground\">\n Mail is not set up for this deployment yet. Ask your administrator.\n </p>\n )}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","/**\n * The whole mail screen bound to the mail client in scope (`MailClientProvider`, else the\n * `ArbiProvider` session): first-run setup or the accounts, the folder picker and filter, the message\n * list, the reader and the composer.\n *\n * The host owns navigation: it can ask for a draft (`draftId`), a folder (`folder`) or a new message\n * with attachments (`composeAttachments`); each is taken once and reported back (`on…Opened`), so\n * asking again for the same thing works. Device storage (offline reading, the Outbox), workspace\n * documents and saving to a workspace are optional host capabilities passed as props.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { GridState } from 'ag-grid-community'\nimport { ArrowLeft, Mail as MailIcon, Plus, Settings, X } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n accountPath,\n mailJson,\n useMailCache,\n MailOfflineUnavailableError,\n useMailAccounts,\n useMailClient,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAddress,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailFolder,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { FilterInput } from '../../shell/FilterInput'\nimport { TabHeader } from '../../shell/TabHeader'\nimport { FolderPickerRow } from '../../files/FolderPicker'\nimport { FolderFilterButton } from '../../files/bulk/FolderFilterButton'\nimport { FilesFilterBar } from '../../files/page/FilesPageParts'\nimport { TriStateFilterMenu, type TriState } from '../../settings/TriStateFilterMenu'\nimport { ConfirmDialog } from '../../settings/ConfirmDialog'\nimport { MailGrid } from '../../collaboration/mail/MailGrid'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { ConnectedMailAccounts, type MailAliasUser } from './ConnectedMailAccounts'\nimport { ConnectedMailComposer } from './ConnectedMailComposer'\nimport { resolveMailbox } from './mailbox'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { ConnectedMailSetup } from './ConnectedMailSetup'\nimport type {\n MailDocumentSource,\n MailLocalDraft,\n MailOutboxEntry,\n MailOfflineSupport,\n MailPanelProps,\n MailSaveToWorkspace,\n MailWordEditor,\n} from './types'\n\ntype MailQuickFilter = 'unread' | 'attachments' | 'secure'\n\nconst NO_DRAFTS: MailLocalDraft[] = []\nconst NO_OUTBOX: MailOutboxEntry[] = []\n\n/** Row ids of drafts kept on this device, in the Drafts list. */\nconst LOCAL_DRAFT_PREFIX = 'local-draft:'\n/** Offline with no folders saved on this device: Drafts (kept here) and the Outbox still work. */\nconst OFFLINE_FOLDERS: MailFolder[] = [\n { id: 'device:drafts', name: 'Drafts', role: 'drafts', unread: 0 },\n]\n\n/** A draft kept on this device, as a row of the Drafts folder. */\nfunction localDraftRow(draft: MailLocalDraft): MailMessage {\n return {\n id: LOCAL_DRAFT_PREFIX + draft.id,\n subject: draft.compose.subject,\n sender: [],\n to: draft.compose.to,\n cc: draft.compose.cc,\n bcc: draft.compose.bcc,\n received_at: new Date(draft.updatedAt).toISOString(),\n preview: draft.error\n ? `Saved on this device only: ${draft.error}`\n : 'Saved on this device · syncs to Drafts when online',\n unread: false,\n text: '',\n references: [],\n attachments: draft.compose.attachments.map((a) => ({ ...a, content_base64: null })),\n }\n}\n\n/** Excluded wins; with any included, an item needs one of them. */\nfunction applyQuickFilters(\n messages: MailMessage[],\n filters: Map<MailQuickFilter, TriState>\n): MailMessage[] {\n const included = [...filters].filter(([, s]) => s === 'include').map(([k]) => k)\n const excluded = [...filters].filter(([, s]) => s === 'exclude').map(([k]) => k)\n if (!included.length && !excluded.length) return messages\n return messages.filter((m) => {\n const has: Record<MailQuickFilter, boolean> = {\n unread: m.unread,\n attachments: m.attachments.length > 0,\n secure: !!m.secure_delivery,\n }\n if (excluded.some((k) => has[k])) return false\n return !included.length || included.some((k) => has[k])\n })\n}\n\n/** The default panel: the reader and composer beside the list. */\nfunction SidePanel({ isOpen, title, onClose, children }: MailPanelProps) {\n if (!isOpen) return null\n return (\n <aside\n aria-label={title}\n className=\"flex min-h-0 w-full max-w-2xl shrink-0 flex-col border-l border-border bg-background\"\n >\n <header className=\"flex items-center justify-between gap-2 border-b px-3 py-2\">\n <h2 className=\"truncate text-sm font-semibold\">{title}</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Close\"\n data-testid=\"close-mail-viewer\"\n onClick={onClose}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n <div className=\"flex min-h-0 flex-1\">{children}</div>\n </aside>\n )\n}\n\nexport interface ConnectedMailboxProps {\n /** Which mailbox: an account id, or `'native'` for the user's own inbox. Default: the first. */\n mailbox?: string\n /** Open this draft (in the native mailbox's Drafts); taken once, then `onDraftOpened`. */\n draftId?: string | null\n onDraftOpened?: () => void\n /** Open this folder (a role such as `inbox`, or an id); taken once, then `onFolderOpened`. */\n folder?: string | null\n onFolderOpened?: () => void\n /** Start a new message with these attachments; taken once, then `onComposeOpened`. */\n composeAttachments?: MailAttachment[] | null\n onComposeOpened?: () => void\n /**\n * Open a document: offered as \"Open\" on the notice after an email is saved into a workspace\n * (when `saveToWorkspace.save` resolves with the new document's id).\n */\n onOpenDocument?: (documentId: string, workspaceId: string) => void\n /** The user, for the suggested native address (`given.family`). */\n user?: MailAliasUser | null\n /** The product's name in the setup copy (\"Set up your ARBI email\"). */\n productName?: string\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** How a person is named (e.g. from contacts). Default: the name on the message, else the address. */\n personLabel?: (person: MailAddress) => string\n /** Device storage: offline reading, the Outbox, drafts written offline. Absent: online only. */\n offline?: MailOfflineSupport\n /** The open workspace's documents, attachable in the composer. */\n documents?: MailDocumentSource\n /** Saving an email into a workspace (\"Save to workspace\" on native mail). */\n saveToWorkspace?: MailSaveToWorkspace\n /** Native drafts' bodies in the Word editor, where ARBI's edits are suggestions. Absent: rich text. */\n word?: MailWordEditor\n /** \"Reply with ARBI\" on a native message: the host starts the chat that drafts it. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n /** A calendar invite card for a message with an .ics part. */\n renderInvite?: (props: {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n }) => ReactNode\n /** Where the reader and composer open. Default: a panel beside the list. */\n renderPanel?: (props: MailPanelProps) => ReactNode\n /** The reader or composer opened or closed. */\n onViewerOpenChange?: (open: boolean) => void\n /** The message list's column state, and where to persist it. */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n /** The message opened first (e.g. restored after a redirect). */\n initialMessageId?: string | null\n}\n\nexport function ConnectedMailbox({\n mailbox,\n draftId,\n onDraftOpened,\n folder: requestedFolder,\n onFolderOpened,\n composeAttachments,\n onComposeOpened,\n onOpenDocument,\n user,\n productName,\n oauthReturnPath,\n personLabel,\n offline,\n documents,\n saveToWorkspace,\n word,\n onReplyWithArbi,\n renderInvite,\n renderPanel = SidePanel,\n onViewerOpenChange,\n gridState,\n onGridStateChange,\n initialMessageId = null,\n}: ConnectedMailboxProps) {\n const { notify } = useBlocksEnvironment()\n const cache = useMailCache()\n const { client } = useMailClient()\n const [savingToWorkspace, setSavingToWorkspace] = useState(false)\n const [savePending, setSavePending] = useState(false)\n const [saveWorkspaceId, setSaveWorkspaceId] = useState('')\n const { data: policy, error: policyError } = useMailPolicy()\n const isOnline = useMailOnline()\n // Mail queries run offline too (networkMode 'always'): a host's client answers from this device,\n // or says plainly that something isn't saved here, instead of waiting forever for a connection.\n const accounts = useMailAccounts({ enabled: !!policy?.enabled })\n const [accountId, setAccountId] = useState('')\n const account =\n accounts.data?.find((a) => a.id === accountId) ??\n resolveMailbox(accounts.data, mailbox) ??\n accounts.data?.[0]\n const unlock = useMailUnlock(account)\n const [folder, setFolder] = useState('inbox')\n const [folderMenuOpen, setFolderMenuOpen] = useState(false)\n const [filterMenuOpen, setFilterMenuOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [mailFilters, setMailFilters] = useState<Map<MailQuickFilter, TriState>>(new Map())\n const [cursor, setCursor] = useState<string | null>(null)\n const [selected, setSelected] = useState<string | null>(initialMessageId)\n const [compose, setCompose] = useState<MailCompose | null>(null)\n // Set when the open compose is a draft kept on this device.\n const [composeLocalDraftId, setComposeLocalDraftId] = useState<string | undefined>()\n // Each compose the user opens (new, reply, forward, a draft) gets a fresh form. Edits reported by\n // the form (onChange) keep the same one, so moving the panel never resets what was typed.\n const [composeSession, setComposeSession] = useState(0)\n // Unique to this mailbox, so a compose session's key (which keeps its Word room) never repeats.\n const [mailboxKey] = useState(() => crypto.randomUUID())\n const openCompose = (value: MailCompose, localDraftId?: string) => {\n setComposeSession((n) => n + 1)\n setComposeLocalDraftId(localDraftId)\n setCompose(value)\n }\n const composeClose = useRef<(() => void) | null>(null)\n useEffect(() => {\n onViewerOpenChange?.(!!selected || !!compose)\n }, [selected, compose, onViewerOpenChange])\n useEffect(() => () => onViewerOpenChange?.(false), [onViewerOpenChange])\n const [settings, setSettings] = useState(false)\n // Set once the user has just created their inbox, to greet them with their new address.\n const [justCreated, setJustCreated] = useState(false)\n const [actionError, setActionError] = useState('')\n // Offline the account can't be unlocked, and needn't be: reads come from this device and sends\n // wait in the Outbox. Unlocking runs as soon as the connection is back.\n const ready = !!account && (!!unlock.data || !isOnline)\n useEffect(() => {\n // Reads that ran before the unlock finished (e.g. right after reconnecting) get another go.\n if (unlock.data) void cache.refreshFolders()\n }, [unlock.data, cache])\n const folders = useMailFolders(account, { enabled: ready })\n const outbox = offline?.useOutbox() ?? NO_OUTBOX\n const outboxRole = offline?.outboxRole\n const waitingInOutbox = outbox.filter(\n (item) => item.account.id === account?.id && item.status !== 'sent'\n ).length\n // The server's folders, plus the Outbox (the server's own when it has one, else this device's).\n const folderList = useMemo(() => {\n const base =\n folders.data ?? (offline && !isOnline && folders.error ? OFFLINE_FOLDERS : undefined)\n if (!base || !outboxRole) return base\n const withCount = (f: MailFolder) =>\n f.role === outboxRole ? { ...f, unread: f.unread + waitingInOutbox } : f\n return base.some((f) => f.role === outboxRole)\n ? base.map(withCount)\n : [...base, withCount({ id: 'device:outbox', name: 'Outbox', role: outboxRole, unread: 0 })]\n }, [folders.data, folders.error, isOnline, waitingInOutbox, offline, outboxRole])\n const folderId =\n folderList?.find((f) => f.role === folder || f.id === folder)?.id ?? folderList?.[0]?.id\n const folderRole = folderList?.find((f) => f.id === folderId)?.role ?? folder\n // Folders that exist only on this device have no server list.\n const deviceFolder = !!folderId?.startsWith('device:')\n const list = useMailMessages(account, folderId, query, cursor, {\n enabled: ready && !deviceFolder,\n refetchInterval: 60_000,\n })\n const localDrafts = offline?.useLocalDrafts(account?.id) ?? NO_DRAFTS\n // Same key as the list above when Drafts is open, so the cache is shared.\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const drafts = useMailMessages(account, draftsFolderId, '', null, {\n enabled: ready && !!compose,\n })\n // Quick filters (the dropdown inside the filter box) narrow the messages already loaded.\n const loadedMessages = useMemo(() => {\n if (folderRole !== 'drafts') return list.data?.messages\n const words = query.toLowerCase()\n const mine = localDrafts\n .map(localDraftRow)\n .filter(\n (m) =>\n !words ||\n `${m.subject} ${m.to.map((r) => r.email).join(' ')}`.toLowerCase().includes(words)\n )\n return [...mine, ...(list.data?.messages ?? [])]\n }, [folderRole, list.data, localDrafts, query])\n const filteredMessages = useMemo(\n () => applyQuickFilters(loadedMessages ?? [], mailFilters),\n [loadedMessages, mailFilters]\n )\n const mailFilterOptions = useMemo(\n () => [\n {\n id: 'unread' as const,\n label: 'Unread',\n count: (loadedMessages ?? []).filter((m) => m.unread).length,\n },\n {\n id: 'attachments' as const,\n label: 'Has attachments',\n count: (loadedMessages ?? []).filter((m) => m.attachments.length > 0).length,\n },\n {\n id: 'secure' as const,\n label: 'Secure delivery',\n count: (loadedMessages ?? []).filter((m) => m.secure_delivery).length,\n },\n ],\n [loadedMessages]\n )\n const hasActiveFilters = !!query || [...mailFilters.values()].some(Boolean)\n const detail = useMailMessage(account, selected, { enabled: ready && !compose })\n const message = detail.data\n // A new message with attachments asked for by the host (e.g. \"Email\" on a document).\n useEffect(() => {\n if (!composeAttachments?.length) return\n openCompose({ ...emptyMailCompose(), attachments: composeAttachments })\n onComposeOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [composeAttachments])\n useEffect(() => {\n if (!requestedFolder) return\n setFolder(requestedFolder)\n setCursor(null)\n setSelected(null)\n onFolderOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [requestedFolder])\n // A draft asked for by the host: it is in the native mailbox's Drafts, so it is selected once the\n // accounts are known and that account is chosen (never read from another).\n const [pendingDraft, setPendingDraft] = useState<string | null>(null)\n useEffect(() => {\n if (!draftId) return\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(null)\n setPendingDraft(draftId)\n onDraftOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [draftId])\n useEffect(() => {\n if (!pendingDraft || !accounts.data) return\n const native = accounts.data.find((a) => a.provider === 'native')\n if (native) setAccountId(native.id)\n setSelected(pendingDraft)\n setPendingDraft(null)\n }, [pendingDraft, accounts.data])\n // The host switched mailbox.\n useEffect(() => {\n const chosen = resolveMailbox(accounts.data, mailbox)\n if (!chosen) return\n setAccountId(chosen.id)\n // eslint-disable-next-line react-hooks/exhaustive-deps -- follows the host's choice only\n }, [mailbox, !!accounts.data])\n const patch = (messageId: string, body: MailMessageUpdate) =>\n mailJson(\n client.fetch,\n `${accountPath(account!.id)}/messages/${encodeURIComponent(messageId)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n // ARBI mail's Trash: Restore (back where it came from), Delete forever, Empty Trash. Mail in the Trash\n // still counts against the person's storage until it is deleted or purged.\n const nativeTrash = account?.provider === 'native' && folderRole === 'trash'\n const [confirmDelete, setConfirmDelete] = useState<'message' | 'trash' | null>(null)\n const [deleting, setDeleting] = useState(false)\n const deleteForever = async () => {\n if (!account || !isOnline || !confirmDelete) return\n setDeleting(true)\n try {\n if (confirmDelete === 'message' && selected) {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(selected)}`,\n { method: 'DELETE' }\n )\n setSelected(null)\n } else if (confirmDelete === 'trash') {\n await mailJson(client.fetch, `${accountPath(account.id)}/messages?folder=trash`, {\n method: 'DELETE',\n })\n setSelected(null)\n }\n await cache.refreshAll()\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not delete')\n } finally {\n setDeleting(false)\n setConfirmDelete(null)\n }\n }\n const update = async (body: MailMessageUpdate) => {\n if (!selected || !account || !isOnline) return\n try {\n await patch(selected, body)\n await cache.refreshAll()\n if (body.folder_id || body.action) setSelected(null)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n const response = await client.fetch(path)\n saveFile(await response.blob(), name)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const downloadAttachment = async (a: MailAttachment) => {\n if (!message || !account) return\n if (isOnline) {\n await download(attachmentPath(account.id, message.id, a.id), a.name)\n return\n }\n const file = await offline?.loadAttachment(account.id, message.id, a)\n if (!file) {\n setActionError(`${a.name} isn't saved on this device. Open it when you're back online.`)\n return\n }\n saveFile(file, a.name)\n }\n const saveEmail = async () => {\n if (!message || !account || !saveWorkspaceId || !saveToWorkspace) return\n setSavePending(true)\n try {\n const response = await client.fetch(\n `${accountPath(account.id)}/messages/${message.id}/original`\n )\n const fileName = `${message.subject.replace(/[^a-zA-Z0-9 ._-]/g, '').slice(0, 80) || 'email'}.eml`\n const workspaceId = saveWorkspaceId\n const documentId = await saveToWorkspace.save(\n workspaceId,\n new File([await response.blob()], fileName, { type: 'message/rfc822' })\n )\n setSavingToWorkspace(false)\n notify(\n 'Email saved to workspace',\n 'success',\n documentId && onOpenDocument\n ? { action: { label: 'Open', onClick: () => onOpenDocument(documentId, workspaceId) } }\n : undefined\n )\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not save email to workspace')\n } finally {\n setSavePending(false)\n }\n }\n const hydrate = (attachments: MailAttachment[]) =>\n message && account\n ? hydrateMailAttachments(client, account, message.id, attachments, { isOnline, offline })\n : Promise.resolve([])\n const editDraft = async () => {\n if (!message) return\n try {\n openCompose(draftMailCompose(message, await hydrate(message.attachments)))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not load draft attachments')\n }\n }\n const reply = async (forward = false, all = false) => {\n if (!message || !account) return\n try {\n const attachments = forward ? await hydrate(message.attachments) : []\n openCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n const failures = [policyError, accounts.error, unlock.error, folders.error, list.error]\n const offlineNotice = failures.find((e) => e instanceof MailOfflineUnavailableError)?.message\n const error =\n actionError ||\n failures.find((e) => e && !(e instanceof MailOfflineUnavailableError))?.message ||\n (detail.error instanceof MailOfflineUnavailableError ? undefined : detail.error?.message)\n return (\n <section className=\"flex h-full min-h-0 flex-col bg-background\" aria-label=\"Mail\">\n <header className=\"sticky top-0 z-10 bg-background\">\n <TabHeader\n testId=\"mail-tab-header\"\n tabs={[\n {\n id: 'mail',\n // Icon + count only, like the Files, Facts and Threads headers.\n label: '',\n count: filteredMessages.length,\n countIcon: <MailIcon className=\"size-3.5\" />,\n countPlacement: 'leading',\n presentation: 'count',\n hasActiveFilters,\n testId: 'mail-tab',\n },\n ]}\n activeTabId=\"mail\"\n onTabChange={() => {}}\n compactBreakpoint={360}\n firstTabContent={\n account ? (\n <FilesFilterBar>\n <FilterInput\n value={query}\n onChange={(q) => {\n setQuery(q)\n setCursor(null)\n }}\n hideFieldPicker\n fields={['text']}\n onFieldsChange={() => {}}\n ariaLabel=\"Filter mail\"\n labels={{ placeholder: 'Filter...' }}\n testIds={{ root: 'mail-search', input: 'mail-filter-input' }}\n className=\"min-w-28 flex-1 sm:max-w-72\"\n filter={\n <TriStateFilterMenu\n testId=\"mail-bar-filter-button\"\n open={filterMenuOpen}\n onOpenChange={setFilterMenuOpen}\n filterStates={mailFilters}\n onFiltersChange={setMailFilters}\n options={mailFilterOptions}\n groups={[{ label: 'Messages', options: ['unread', 'attachments', 'secure'] }]}\n renderChevron\n disableHoverOpen\n triggerClassName=\"inline-flex items-center gap-0.5 h-6 rounded px-1 text-muted-foreground hover:bg-foreground/10 cursor-pointer transition-colors pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n />\n }\n />\n {folderList && (\n <div className=\"flex shrink-0 items-center gap-2\">\n <FolderFilterButton\n label={folderList.find((f) => f.id === folderId)?.name ?? 'Folders'}\n isActive={false}\n open={folderMenuOpen}\n onOpenChange={setFolderMenuOpen}\n testId=\"mail-folder-button\"\n >\n {folderList.map((item) => (\n <FolderPickerRow\n key={item.id}\n label={item.name}\n count={item.unread > 0 ? item.unread : undefined}\n depth={0}\n isActive={item.id === folderId}\n onClick={() => {\n setFolder(item.id)\n setCursor(null)\n setSelected(null)\n setFolderMenuOpen(false)\n }}\n />\n ))}\n </FolderFilterButton>\n </div>\n )}\n </FilesFilterBar>\n ) : undefined\n }\n rightContent={\n <span className=\"flex items-center gap-1\">\n {account && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label=\"Mail settings\"\n data-testid=\"mail-settings-button\"\n onClick={() => setSettings(true)}\n >\n <Settings className=\"size-4\" />\n </Button>\n )}\n {nativeTrash && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!isOnline}\n data-testid=\"mail-empty-trash-button\"\n onClick={() => setConfirmDelete('trash')}\n >\n Empty Trash\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={!ready || !!compose}\n onClick={() => openCompose(emptyMailCompose())}\n >\n <Plus className=\"mr-1.5 size-4\" />\n Email\n </Button>\n </span>\n }\n />\n {/* No refresh button: native mail refreshes the moment the server pushes `native_mail_received`,\n and the list re-polls every minute (and on window focus) for every other provider. */}\n {(accounts.data?.length ?? 0) > 1 && (\n <div className=\"flex items-center gap-2 px-3 py-1\">\n <select\n aria-label=\"Mail account\"\n disabled={!!compose}\n className=\"min-w-0 max-w-64 rounded border-0 bg-transparent px-2 py-1.5 text-xs text-muted-foreground\"\n value={account?.id ?? ''}\n onChange={(e) => {\n setAccountId(e.target.value)\n setFolder('inbox')\n setCursor(null)\n setSelected(null)\n }}\n >\n {accounts.data?.map((a) => (\n <option key={a.id} value={a.id}>\n {a.email}\n </option>\n ))}\n </select>\n </div>\n )}\n </header>\n {account && offline?.renderStatus?.()}\n {error && (\n <p role=\"alert\" className=\"border-b p-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {!error && offlineNotice && (\n <p role=\"status\" className=\"border-b p-3 text-sm text-muted-foreground\">\n {offlineNotice}\n </p>\n )}\n {policy && !policy.enabled && (\n <p className=\"p-6 text-muted-foreground\">Mail is not enabled on this deployment.</p>\n )}\n {/* Setting up an inbox needs the server; offline (accounts unknown) the notice above says why. */}\n {policy?.enabled && accounts.isSuccess && !account && (\n <ConnectedMailSetup\n policy={policy}\n user={user}\n productName={productName}\n onClaimed={() => setJustCreated(true)}\n onConnectExisting={() => setSettings(true)}\n />\n )}\n {account && justCreated && (\n <div\n role=\"status\"\n data-testid=\"mail-ready-banner\"\n className=\"flex items-start justify-between gap-3 border-b bg-accent/40 px-4 py-3 text-sm\"\n >\n <p>\n <span className=\"font-semibold\">\n Your {productName ? `${productName} ` : ''}email is ready to go.\n </span>{' '}\n You can send and receive email as <span className=\"font-medium\">{account.email}</span>.\n </p>\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => setJustCreated(false)}\n >\n ×\n </button>\n </div>\n )}\n {account && (\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex min-h-0 w-full flex-col\">\n {outboxRole &&\n folderRole === outboxRole &&\n offline?.renderOutbox({\n accountId: account.id,\n onEdit: (value) => openCompose({ ...value }),\n })}\n <div className={deviceFolder ? 'hidden' : 'min-h-0 flex-1'}>\n <MailGrid\n messages={filteredMessages}\n loading={list.isPending && list.fetchStatus !== 'idle'}\n selected={selected}\n outgoing={\n folderRole === 'sent' || folderRole === 'drafts' || folderRole === outboxRole\n }\n personLabel={personLabel}\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n onSelect={(id) => {\n if (id.startsWith(LOCAL_DRAFT_PREFIX)) {\n const draft = localDrafts.find((d) => LOCAL_DRAFT_PREFIX + d.id === id)\n if (draft) openCompose({ ...draft.compose }, draft.id)\n return\n }\n setSelected(id)\n if (isOnline && list.data?.messages.find((m) => m.id === id)?.unread) {\n void patch(id, { unread: false })\n // An initial read can finish after the PATCH with the old unread flag.\n .then(() => cache.settleMessage(account.id, id))\n .catch((error: Error) => setActionError(error.message))\n }\n }}\n />\n </div>\n {(cursor || list.data?.next_cursor) && (\n <footer className=\"flex gap-2 p-2\">\n {cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(null)}>\n First page\n </Button>\n )}\n {list.data?.next_cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(list.data!.next_cursor!)}>\n Next page\n </Button>\n )}\n </footer>\n )}\n </div>\n {renderPanel({\n isOpen: !!selected || !!compose,\n title: compose ? 'New message' : message?.subject || 'Mail',\n onClose: () => {\n if (compose) composeClose.current?.()\n else setSelected(null)\n },\n children: compose ? (\n <ConnectedMailComposer\n key={`${account?.id}-${composeSession}`}\n account={account}\n initial={compose}\n maxBytes={policy?.max_attachment_bytes ?? 15 * 1024 * 1024}\n ready={ready}\n drafts={drafts.data?.messages ?? []}\n embedded\n localDraftId={composeLocalDraftId}\n offline={offline}\n documents={documents}\n word={word}\n sessionKey={`${mailboxKey}-${composeSession}`}\n onChange={setCompose}\n closeRequestRef={composeClose}\n onClose={() => {\n setCompose(null)\n if (compose.draft_id) setSelected(null)\n }}\n onOpenDraft={(id) => {\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(id)\n }}\n />\n ) : message && selected ? (\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={folders.data}\n isOnline={isOnline}\n loading={detail.isFetching}\n uploadPending={savePending}\n personLabel={personLabel}\n renderInvite={\n renderInvite &&\n (() =>\n renderInvite({\n accountId: account.id,\n messageId: message.id,\n attachments: message.attachments,\n isOnline,\n }))\n }\n onBack={() => setSelected(null)}\n onEditDraft={() => void editDraft()}\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onRestore={nativeTrash ? () => void update({ action: 'restore' }) : undefined}\n onDeleteForever={nativeTrash ? () => setConfirmDelete('message') : undefined}\n onDownloadAttachment={(a) => void downloadAttachment(a)}\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n onSaveToWorkspace={\n saveToWorkspace &&\n (() => {\n setSaveWorkspaceId(\n saveToWorkspace.defaultWorkspaceId ?? saveToWorkspace.workspaces[0]?.id ?? ''\n )\n setSavingToWorkspace(true)\n })\n }\n />\n ) : (\n <article className=\"min-w-0 flex-1 overflow-auto p-4 sm:p-5\">\n {selected && (\n <Button className=\"mb-3\" variant=\"ghost\" onClick={() => setSelected(null)}>\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n )}\n {detail.isFetching && selected && (\n <p className=\"text-muted-foreground\">Loading message…</p>\n )}\n {detail.error instanceof MailOfflineUnavailableError && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {detail.error.message}\n </p>\n )}\n </article>\n ),\n })}\n </div>\n )}\n {saveToWorkspace && (\n <Dialog open={savingToWorkspace} onOpenChange={setSavingToWorkspace}>\n <DialogContent>\n <DialogTitle>Save email to workspace</DialogTitle>\n <DialogDescription>\n Save a copy as an .eml file. Members with access to the file can read it.\n </DialogDescription>\n <select\n aria-label=\"Destination workspace\"\n value={saveWorkspaceId}\n onChange={(e) => setSaveWorkspaceId(e.target.value)}\n className=\"rounded border bg-background p-2\"\n >\n <option value=\"\" disabled>\n Choose a workspace\n </option>\n {saveToWorkspace.workspaces.map((w) => (\n <option key={w.id} value={w.id}>\n {w.name}\n </option>\n ))}\n </select>\n <Button disabled={!saveWorkspaceId || savePending} onClick={() => void saveEmail()}>\n {savePending ? 'Saving…' : 'Save email'}\n </Button>\n {actionError && <p role=\"alert\">{actionError}</p>}\n </DialogContent>\n </Dialog>\n )}\n {settings && policy && (\n <ConnectedMailAccounts\n policy={policy}\n accounts={accounts.data ?? []}\n user={user}\n oauthReturnPath={oauthReturnPath}\n settings={offline?.renderSettings?.()}\n onClose={() => setSettings(false)}\n />\n )}\n <ConfirmDialog\n isOpen={confirmDelete !== null}\n onClose={() => setConfirmDelete(null)}\n onConfirm={() => void deleteForever()}\n isLoading={deleting}\n title={confirmDelete === 'trash' ? 'Empty Trash?' : 'Delete forever?'}\n description={\n confirmDelete === 'trash'\n ? 'Every message in the Trash is deleted permanently and stops using your storage. This cannot be undone.'\n : 'This message is deleted permanently and stops using your storage. This cannot be undone.'\n }\n confirmText={confirmDelete === 'trash' ? 'Empty Trash' : 'Delete forever'}\n testId=\"mail-delete-forever-dialog\"\n />\n </section>\n )\n}\n","/**\n * One email of the mail client in scope, shown on its own (e.g. in a panel beside a chat): its actions,\n * sender, recipients, attachments and body, as the mailbox shows it. Replying hands the new message to\n * the host (`onCompose`), and so does asking ARBI to draft the reply (`onReplyWithArbi`).\n */\n\nimport { useState } from 'react'\nimport {\n accountPath,\n mailJson,\n useMailAccounts,\n useMailCache,\n useMailClient,\n useMailMessage,\n useMailOnline,\n useMailUnlock,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport { draftMailCompose, replyMailCompose } from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { resolveMailbox } from './mailbox'\n\nexport interface ConnectedMailMessageProps {\n messageId: string\n /** The account the message is in: an id, or `'native'` (default). */\n mailbox?: string\n /** The folder it is in (replying from Sent goes to its recipients). Default: the inbox. */\n folderRole?: string\n onClose: () => void\n /** Reply / reply all / forward: the new message, to open in a composer. */\n onCompose: (initial: MailCompose) => void\n /** Ask ARBI to draft the reply. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n}\n\nexport function ConnectedMailMessage({\n messageId,\n mailbox = 'native',\n folderRole = 'inbox',\n onClose,\n onCompose,\n onReplyWithArbi,\n}: ConnectedMailMessageProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const cache = useMailCache()\n const accounts = useMailAccounts()\n const account = resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(account)\n const detail = useMailMessage(account, messageId, { enabled: !!unlock.data || !isOnline })\n const [error, setError] = useState('')\n const message = detail.data\n if (!account || !message)\n return (\n <p role={detail.error ? 'alert' : 'status'} className=\"p-4 text-sm text-muted-foreground\">\n {detail.error?.message ?? 'Loading message…'}\n </p>\n )\n const update = async (body: MailMessageUpdate) => {\n try {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(message.id)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n await cache.refreshAll()\n if (body.folder_id || body.action) onClose()\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n saveFile(await (await client.fetch(path)).blob(), name)\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const reply = async (forward = false, all = false) => {\n try {\n const attachments = forward\n ? await hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n : []\n onCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {error && (\n <p role=\"alert\" className=\"px-4 pt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={undefined}\n isOnline={isOnline}\n loading={detail.isFetching}\n onBack={onClose}\n onEditDraft={() =>\n void hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n .then((attachments) => onCompose(draftMailCompose(message, attachments)))\n .catch((e: Error) => setError(e.message))\n }\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onDownloadAttachment={(a: MailAttachment) =>\n void download(attachmentPath(account.id, message.id, a.id), a.name)\n }\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n />\n </div>\n )\n}\n","import {\n useAgentSession,\n useStartAgentSession,\n useCloseAgentSession,\n useArbiChat,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ChatPage } from '../chat/ChatPage'\nimport { takeOpenDocumentForTurn } from '../chat/open-document'\n\nexport interface ConnectedAgentChatPanelProps {\n agentId: string\n workspaceId: string\n agentName?: string\n}\n\nfunction ActiveChat({ agentId, workspaceId }: ConnectedAgentChatPanelProps) {\n // The agent drafts in the open document too, when it is in the agent's workspace.\n const chat = useArbiChat({\n agentId,\n workspaceId,\n activeArtifact: () => takeOpenDocumentForTurn({ workspaceId }),\n })\n return (\n <ChatPage\n chat={{ ...chat, assistantMode: undefined, setAssistantMode: undefined }}\n documentsRequired={false}\n compactHeader\n surface=\"dock\"\n emptyTitle=\"What would you like me to do?\"\n emptyDescription=\"This agent works through its own login. Upload files here to stage them in its sandbox.\"\n className=\"h-[min(65vh,650px)] min-h-[380px]\"\n />\n )\n}\n\n/** An owned agent's independent login and chat, using the shared controller and chat surface. */\nexport function ConnectedAgentChatPanel({\n agentId,\n workspaceId,\n agentName = 'Agent',\n}: ConnectedAgentChatPanelProps) {\n const session = useAgentSession(agentId)\n const start = useStartAgentSession()\n const close = useCloseAgentSession()\n const ready = session.data?.active && session.data.workspace_ext_id === workspaceId\n const busy = start.isPending || close.isPending\n const error = start.error ?? close.error ?? session.error\n return (\n <section className=\"space-y-3\" data-testid=\"agent-chat-panel\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <p className=\"text-sm\" data-testid=\"agent-chat-session-status\">\n {agentName} ·{' '}\n {ready\n ? 'Signed in to this workspace'\n : session.data?.active\n ? `Signed in to ${session.data.workspace_name ?? 'another workspace'}`\n : 'Signed out'}\n </p>\n <div className=\"flex gap-2\">\n {!ready && (\n <Button\n type=\"button\"\n disabled={busy || session.isLoading}\n onClick={() => start.mutate({ agentId, workspaceId })}\n data-testid=\"agent-chat-login\"\n >\n {start.isPending ? 'Signing in…' : 'Sign in here'}\n </Button>\n )}\n {session.data?.active && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => close.mutate(agentId)}\n data-testid=\"agent-chat-logout\"\n >\n {close.isPending ? 'Signing out…' : 'Sign out agent'}\n </Button>\n )}\n </div>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error.message}\n </p>\n )}\n {ready && (\n <ActiveChat key={`${agentId}:${workspaceId}`} agentId={agentId} workspaceId={workspaceId} />\n )}\n </section>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/connection/ArbiAppProvider.tsx","../../src/connection/ConnectedTaskAccessRequest.tsx","../../src/connection/ConnectedWorkspaceActivity.tsx","../../src/connection/ConnectedNotificationRelevance.tsx","../../src/connection/ConnectedWorkflowsTable.tsx","../../src/connection/ConnectedWorkflowLauncher.tsx","../../src/connection/ConnectedSkillUpload.tsx","../../src/connection/ConnectedSkillsLibrary.tsx","../../src/connection/StreamedArtifact.tsx","../../src/connection/useWorkflowThread.ts","../../src/connection/WorkflowRunThread.tsx","../../src/connection/WorkflowRunnerDialogs.tsx","../../src/connection/ConnectedWorkflowRunner.tsx","../../src/connection/ConnectedTagTable.tsx","../../src/connection/useConnectedShellWorkspaces.ts","../../src/connection/ConnectedSettings.tsx","../../src/connection/useConnectedDocxNotifications.ts","../../src/connection/useConnectedWorkNotifications.ts","../../src/connection/mail/attachments.ts","../../src/connection/mail/ConnectedMailAccounts.tsx","../../src/connection/mail/useWordBody.ts","../../src/connection/mail/MailComposerForm.tsx","../../src/connection/mail/mailbox.ts","../../src/connection/mail/ConnectedMailComposer.tsx","../../src/connection/mail/ConnectedMailSetup.tsx","../../src/connection/mail/ConnectedMailbox.tsx","../../src/connection/mail/ConnectedMailMessage.tsx","../../src/connection/ConnectedAgentChatPanel.tsx"],"names":["useConnection","jsx","ArbiWebSocketProvider","useState","QueryClient","QueryClientProvider","ArbiProvider","ConnectionProvider","useConversations","useRunConversation","jsxs","Button","useWorkspaceActivity","useWorkspaceUsers","useMemo","WorkspaceActivityList","useWorkspaceNotificationLevel","WorkspaceNotificationMenu","useFollowThread","ThreadFollowMenuItem","ThreadFollowButton","useConnectedWorkspace","workflowTriggerType","fmtDate","useBlocksEnvironment","useWorkflows","useConnectedConversations","useAgents","useUpdateWorkflow","useDeleteWorkflow","useRunWorkflow","useEffect","WorkflowsTable","useConnectedDocuments","useConnectedTags","buildWorkflowScopeSource","documentScopeLabels","useArbi","useThumbnails","useRef","useCallback","Fragment","WorkflowDocumentsField","WorkflowLauncher","useUploadSkillFiles","cn","Label","importSkillFile","Upload","importSkillFromUrl","Input","Link2","EntityIcon","useSkills","useSetSkillVisibility","useDeleteSkill","buildLibrarySkills","filterLibrarySkills","useSkillSource","SKILL_SOURCE_LABELS","SKILL_TYPE_LABELS","workflowToSkillMarkdown","SKILL_MAIN_FILENAME","downloadBlob","Search","SkillViewToggle","SkillFilterChips","Plus","SkillTile","ArrowLeft","SkillGenerateForm","SkillLibraryDetail","parseSkillFrontmatter","skillSlug","serializeSkill","SkillEditForm","Textarea","lazy","artifacts","useStreamedArtifact","ArtifactCanvas","StreamedArtifactFrame","Suspense","stepFields","useWorkspaceDocs","initialRunInputs","useCreateWork","useActOnStep","workflowSteps","fromPlanSteps","useConversationActivity","stepStatesFromActivity","useConversationThreads","runThreadTitle","toPlanSteps","useWorkflowView","useArbiChat","ChatPage","useOptionalDocumentTools","splitDocRef","fetchDocumentPdf","ModalScaffold","Loader2","SignDocumentDialog","DocumentToolsProvider","ConnectedNativeDocxEditor","useTags","useDocuments","useLayoutEffect","files","MessageSquare","AiAnswer","WorkflowRunner","ExternalLink","WorkflowStepBar","stepLevels","stepDocuments","stepKindOf","useTagKindSchema","useSetTagValues","useUpdateTagKindSchema","useInvalidateTagData","tagTableDocx","DOCX_MIME_TYPE","TagTable","useWorkspaces","useShellWorkspaces","errorText","useProfile","useUpdateProfile","useRequestEmailChange","useConfirmEmailChange","useNameEditor","useAvatarCrop","useEmailChange","SettingsSection","UserCircle","ProfileCard","AvatarPicker","initials","ImageCropModal","useIdentityVerification","IdentityVerificationCard","IdentityVerificationDialog","RequireVerified","usePasswordChange","usePasswordChangeForm","PasswordChangeDialog","KeyRound","SettingsCard","SettingsActionRow","EMAIL_NOTIFICATION_CATEGORIES","EMAIL_NOTIFICATION_KEYS","useNotificationPreferences","NotificationCategoryList","toNotificationCategories","useSessions","useCurrentSessionId","useTerminateSession","toActiveSessionViews","SettingsRow","Radio","ActiveSessionsDialog","useSignOut","useIsOnline","LogoutDialog","toLogoutSessionViews","useDeleteAccount","useDeleteAccountFlow","SettingsDangerZone","DeleteAccountDialog","toDeleteBlockerViews","useQueryClient","useQuery","useArbiWebSocket","useNotify","useWorkNotifications","mailDraftIdFromContent","accountPath","client","bytesToBase64","fileAttachment","useMailClient","defaultMailAlias","useClaimNativeAlias","useMailOnline","isAliasTakenError","nextAliasSuggestion","aliasTakenMessage","useConnectMailAccount","useDisconnectMailAccount","Dialog","DialogContent","DialogTitle","DialogDescription","useRegisterOpenDocument","useMailDraftEditor","PlainMailBodyEditor","useMailProjects","parseMailRecipients","useSaveMailDraft","useSendMail","useMailDraftReplaced","X","createPortal","Paperclip","MailDocumentPicker","Tooltip","TooltipTrigger","TooltipContent","Send","useMailPolicy","useMailAccounts","useMailUnlock","useMailFolders","useMailMessages","useMailDraftCompose","draftMailCompose","useMailMessage","replyMailCompose","emptyMailCompose","MailIcon","useMailCache","mailJson","MailOfflineUnavailableError","TabHeader","FilesFilterBar","FilterInput","TriStateFilterMenu","FolderFilterButton","FolderPickerRow","Settings","MailGrid","error","MailMessageView","ConfirmDialog","takeOpenDocumentForTurn","useAgentSession","useStartAgentSession","useCloseAgentSession"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Composition root for a host app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function ArbiAppProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl} deploymentDomain={config.deploymentDomain}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","import { useConversations, useRunConversation } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useConnection } from './ConnectionProvider'\n\n/** Approval for a parked agent run, scoped to the currently selected task. */\nexport function ConnectedTaskAccessRequest({ conversationId }: { conversationId?: string }) {\n const { workspaceId } = useConnection()\n const tasks = useConversations(workspaceId ?? undefined, { live: true })\n const run = useRunConversation()\n const task = tasks.data?.find((item) => item.external_id === conversationId)\n if (!task?.pending_auth_request_id || !task.is_owner) return null\n return (\n <section\n className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-card p-3\"\n data-testid=\"task-chat-access-request\"\n >\n <p className=\"flex-1 text-sm\">This task is waiting for temporary workspace access.</p>\n <Button\n disabled={run.isPending}\n onClick={() => run.mutate(task.external_id)}\n data-testid=\"task-chat-allow-access\"\n >\n {run.isPending ? 'Allowing access…' : 'Allow access and run'}\n </Button>\n {run.error && (\n <p role=\"alert\" className=\"w-full text-sm text-destructive\">\n {run.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { useMemo } from 'react'\nimport { useWorkspaceActivity, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n WorkspaceActivityList,\n type WorkspaceActivityItem,\n type WorkspaceActivityListProps,\n type WorkspaceActivityTarget,\n} from '../activity'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceActivityProps extends Pick<\n WorkspaceActivityListProps,\n 'formatTime' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace to show; default the selected one. */\n workspaceId?: string\n /** Open an entry's thread, document version or run (the host owns its routes). */\n onOpen: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** Entries per page (1–100, server default 30). */\n pageSize?: number\n}\n\n/** The selected workspace's activity feed, newest first, a page at a time. */\nexport function ConnectedWorkspaceActivity({\n workspaceId: workspaceProp,\n onOpen,\n pageSize,\n ...listProps\n}: ConnectedWorkspaceActivityProps) {\n const { workspaceId: selected, status, ensureWorkspaceOpen } = useConnection()\n const workspaceId = workspaceProp ?? selected ?? undefined\n const live = status === 'authenticated' && !!workspaceId\n const feed = useWorkspaceActivity(workspaceId, {\n enabled: live,\n limit: pageSize,\n // Titles and names decrypt only while the session has the workspace open.\n beforeFetch: workspaceId === selected ? ensureWorkspaceOpen : undefined,\n })\n const members = useWorkspaceUsers(workspaceId, {\n enabled: live && workspaceId === selected,\n beforeFetch: ensureWorkspaceOpen,\n })\n const names = useMemo(\n () =>\n new Map(\n (members.data ?? []).map((m) => [\n m.user.external_id,\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n ])\n ),\n [members.data]\n )\n const items = useMemo(\n () => (feed.data?.pages ?? []).flatMap((page) => page.items as WorkspaceActivityItem[]),\n [feed.data]\n )\n return (\n <WorkspaceActivityList\n {...listProps}\n items={items}\n isLoading={feed.isLoading}\n isError={feed.isError}\n hasMore={feed.hasNextPage}\n isLoadingMore={feed.isFetchingNextPage}\n onLoadMore={() => void feed.fetchNextPage()}\n onRetry={() => void feed.refetch()}\n onOpen={onOpen}\n nameOf={(id) => names.get(id)}\n />\n )\n}\n","import { useFollowThread, useWorkspaceNotificationLevel } from '@arbidocs/react'\nimport {\n ThreadFollowButton,\n ThreadFollowMenuItem,\n WorkspaceNotificationMenu,\n type ThreadFollowLabels,\n type WorkspaceNotificationMenuProps,\n} from '../activity'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceNotificationMenuProps extends Pick<\n WorkspaceNotificationMenuProps,\n 'onOpenActivity' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace; default the selected one. */\n workspaceId?: string\n}\n\n/** The bell menu that follows, mutes or resets a workspace, saved to the user settings. */\nexport function ConnectedWorkspaceNotificationMenu({\n workspaceId: workspaceProp,\n ...menuProps\n}: ConnectedWorkspaceNotificationMenuProps) {\n const { workspaceId: selected, status } = useConnection()\n const workspaceId = workspaceProp ?? selected\n const { level, setLevel, isLoading, isSaving } = useWorkspaceNotificationLevel(workspaceId, {\n enabled: status === 'authenticated',\n })\n if (!workspaceId) return null\n return (\n <WorkspaceNotificationMenu\n {...menuProps}\n level={level}\n onLevelChange={setLevel}\n disabled={isLoading || isSaving}\n />\n )\n}\n\nexport interface ConnectedThreadFollowProps {\n conversationId: string | null | undefined\n /** `button` (default): a bell toggle; `menu-item`: an item of a thread's options menu. */\n as?: 'button' | 'menu-item'\n labels?: Partial<ThreadFollowLabels>\n testId?: string\n}\n\n/** Follow or unfollow a thread (pushed everything in it), saved to the user settings. */\nexport function ConnectedThreadFollow({\n conversationId,\n as = 'button',\n ...props\n}: ConnectedThreadFollowProps) {\n const { status } = useConnection()\n const { following, setFollowing, isLoading, isSaving } = useFollowThread(conversationId, {\n enabled: status === 'authenticated',\n })\n if (!conversationId) return null\n const Control = as === 'menu-item' ? ThreadFollowMenuItem : ThreadFollowButton\n return (\n <Control\n {...props}\n following={following}\n onFollowingChange={setFollowing}\n disabled={isLoading || isSaving}\n />\n )\n}\n","/**\n * The saved workflows bound to the connection: when each starts, its last run (a link to the thread\n * it created) and next run, who runs it, pause and resume, share, run now, delete (one or many), and\n * the workflow's history. The host opens a workflow (its builder) and its history; threads open\n * through the environment's `openConversation`, failures are told through its `notify`.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useAgents,\n useDeleteWorkflow,\n useRunWorkflow,\n useUpdateWorkflow,\n useWorkflows,\n useWorkspaceUsers,\n type WorkflowResponse,\n} from '@arbidocs/react'\nimport { WorkflowsTable, type WorkflowsTableProps } from '../agents/tasks/WorkflowsTable'\nimport { workflowTriggerType } from '../agents/tasks/workflowRows'\nimport { fmtDate } from '../lib/format'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedConversations } from './workspaceData'\n\n/** The viewer's role in the open workspace, and the workspace's members. */\nexport function useConnectedWorkspaceRole() {\n const { workspaceId, live, userId, ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: members = [] } = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const role = members.find((m) => m.user.external_id === userId)?.role\n return {\n members,\n role,\n /** An owner or a collaborator edits, pauses, resumes and runs what is shared with the workspace. */\n canEditShared: role === 'owner' || role === 'collaborator',\n /** With an item's creator, the only one who deletes it. */\n isWorkspaceOwner: role === 'owner',\n }\n}\n\nexport interface ConnectedWorkflowsTableLabels {\n /** A change (pause, share, delete) that failed without a message. */\n updateFailed: string\n deleteTitle: string\n deleteOne: (name: string) => string\n deleteMany: (count: number) => string\n /** A run that failed: its history has the error report. */\n runFailed: string\n /** A run that created no thread. */\n noThread: string\n /** A document action that started (it has no thread): what is happening. */\n documentAction: (workflow: WorkflowResponse) => string\n untitledTask: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS: ConnectedWorkflowsTableLabels = {\n updateFailed: 'Could not update the workflow',\n deleteTitle: 'Delete workflow',\n deleteOne: (name) => `Delete “${name}”? Threads it already created stay.`,\n deleteMany: (count) => `Delete ${count} workflows? Threads they already created stay.`,\n runFailed: 'The workflow failed. You can send an error report from its history.',\n noThread: 'The workflow did not create a thread.',\n documentAction: (workflow) =>\n workflow.action?.type === 'email_documents'\n ? 'Preparing your document email'\n : 'Reviewing documents',\n untitledTask: 'Untitled thread',\n}\n\ntype TableProps = WorkflowsTableProps<WorkflowResponse>\n\nexport interface ConnectedWorkflowsTableProps extends Omit<\n TableProps,\n | 'workflows'\n | 'isLoading'\n | 'busyId'\n | 'describeTrigger'\n | 'formatDate'\n | 'onToggleActive'\n | 'onToggleShared'\n | 'onDelete'\n | 'onDeleteMany'\n | 'onToggleActiveMany'\n | 'onRun'\n | 'onOpenThread'\n | 'lastRuns'\n | 'agentNames'\n | 'taskNames'\n | 'canEditShared'\n | 'isWorkspaceOwner'\n> {\n /** Which saved workflows to list (e.g. those on a schedule). Default: all. */\n filter?: (workflow: WorkflowResponse) => boolean\n /** When a workflow starts, in the host's words. Default: its trigger type. */\n describeTrigger?: TableProps['describeTrigger']\n formatDate?: TableProps['formatDate']\n connectedLabels?: Partial<ConnectedWorkflowsTableLabels>\n}\n\nconst messageOf = (error: unknown) => (error instanceof Error ? error.message : '')\n\nexport function ConnectedWorkflowsTable({\n filter,\n describeTrigger = (w) => workflowTriggerType(w).replaceAll('_', ' '),\n formatDate = fmtDate,\n onViewRuns,\n connectedLabels,\n ...tableProps\n}: ConnectedWorkflowsTableProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS, ...connectedLabels }\n const { notify, confirm, openConversation } = useBlocksEnvironment()\n const { canEditShared, isWorkspaceOwner } = useConnectedWorkspaceRole()\n const { data: saved = [], isLoading } = useWorkflows({ live: true })\n const { data: conversations, refetch } = useConnectedConversations({ live: true })\n const { data: agents = [] } = useAgents()\n const update = useUpdateWorkflow()\n const remove = useDeleteWorkflow()\n const run = useRunWorkflow()\n const [busyId, setBusyId] = useState<string | null>(null)\n\n const workflows = useMemo(() => (filter ? saved.filter(filter) : saved), [saved, filter])\n // A clock or an event fired a workflow: the thread it created is new to the conversation list.\n const firingStamp = saved.map((w) => `${w.external_id}:${w.last_fired_at ?? ''}`).join('|')\n useEffect(() => {\n void refetch?.()\n }, [firingStamp, refetch])\n\n const lastRuns = useMemo(() => {\n const out: NonNullable<TableProps['lastRuns']> = {}\n for (const c of conversations) {\n const id = c.workflow_ext_id\n if (id && (!out[id] || Date.parse(c.created_at) > Date.parse(out[id].at)))\n out[id] = { conversationId: c.external_id, at: c.created_at, threadStatus: c.status }\n }\n return out\n }, [conversations])\n const agentNames = useMemo(\n () => Object.fromEntries(agents.map((a) => [a.external_id, a.given_name || a.email])),\n [agents]\n )\n const taskNames = useMemo(\n () =>\n Object.fromEntries(\n conversations\n .filter((c) => c.status != null)\n .map((c) => [c.external_id, c.title || l.untitledTask])\n ),\n [conversations, l.untitledTask]\n )\n\n const act = async (workflow: WorkflowResponse, action: () => Promise<unknown>) => {\n setBusyId(workflow.external_id)\n try {\n await action()\n } catch (error) {\n notify(messageOf(error) || l.updateFailed, 'error')\n } finally {\n setBusyId(null)\n }\n }\n const setActive = (workflow: WorkflowResponse, active: boolean) =>\n act(workflow, () => update.mutateAsync({ workflowId: workflow.external_id, patch: { active } }))\n const deleteAll = async (items: WorkflowResponse[]) => {\n if (!items.length) return\n const ok = await confirm({\n title: l.deleteTitle,\n message: items.length === 1 ? l.deleteOne(items[0].name) : l.deleteMany(items.length),\n })\n if (!ok) return\n for (const workflow of items)\n await act(workflow, () => remove.mutateAsync(workflow.external_id))\n }\n\n return (\n <WorkflowsTable\n {...tableProps}\n workflows={workflows}\n isLoading={isLoading}\n busyId={busyId}\n describeTrigger={describeTrigger}\n formatDate={formatDate}\n agentNames={agentNames}\n taskNames={taskNames}\n lastRuns={lastRuns}\n canEditShared={canEditShared}\n isWorkspaceOwner={isWorkspaceOwner}\n onOpenThread={(conversationId) => openConversation(conversationId)}\n onViewRuns={onViewRuns}\n onToggleActive={(workflow, active) => void setActive(workflow, active)}\n onToggleActiveMany={(items, active) => {\n void (async () => {\n for (const workflow of items) await setActive(workflow, active)\n })()\n }}\n onToggleShared={(workflow, shared) =>\n void act(workflow, () =>\n update.mutateAsync({ workflowId: workflow.external_id, patch: { shared } })\n )\n }\n onDelete={(workflow) => void deleteAll([workflow])}\n onDeleteMany={(items) => void deleteAll(items)}\n onRun={(workflow) =>\n void act(workflow, async () => {\n const result = await run.mutateAsync(workflow.external_id)\n if (result.conversation_ext_id) openConversation(result.conversation_ext_id)\n if (result.error) {\n onViewRuns?.(workflow)\n notify(l.runFailed, 'error')\n return\n }\n if (result.execution_id && !result.conversation_ext_id) {\n // A document action runs without a thread: its history shows how it goes.\n onViewRuns?.(workflow)\n notify(l.documentAction(workflow), 'success')\n return\n }\n if (!result.conversation_ext_id) throw new Error(l.noThread)\n })\n }\n />\n )\n}\n","/**\n * The workflow launcher bound to the connection: the open workspace's folders, labels and files\n * behind its scope and `documents` fields (files can be added right there), and the user's agents\n * behind \"Run as\". The host still says what a launch does (`onLaunch`): open a chat, start a task.\n */\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport { useAgents, useArbi, useThumbnails } from '@arbidocs/react'\nimport { WorkflowLauncher, type WorkflowLauncherProps } from '../agents/workflows/WorkflowLauncher'\nimport {\n WorkflowDocumentsField,\n type WorkflowDocumentsFieldLabels,\n type WorkflowFieldDocument,\n} from '../agents/workflows/WorkflowDocumentsField'\nimport type { WorkflowScopeSource } from '../agents/workflows/WorkflowConfigDialog'\nimport { buildWorkflowScopeSource, documentScopeLabels } from '../agents/workflows/workspaceScope'\nimport type { AgentOption } from '../agents/workflows/AgentSelect'\nimport type { WorkflowField, WorkflowScope } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedDocuments, useConnectedTags, type ConnectedDocument } from './workspaceData'\n\nconst IMAGE_FILE_TYPES = new Set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tiff', 'webp'])\n\n/** A workspace document as a `documents` field offers it. */\nexport function toWorkflowFieldDocument(doc: ConnectedDocument): WorkflowFieldDocument {\n // Pages and tokens are a text-parsing concept: never meaningful for an image.\n const isImage = IMAGE_FILE_TYPES.has((doc.file_type ?? '').toLowerCase())\n return {\n id: doc.external_id,\n title: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n fileName: doc.file_name,\n pages: isImage ? null : (doc.n_pages ?? null),\n tokens: isImage ? null : (doc.tokens ?? null),\n status: doc.status,\n isImage,\n }\n}\n\n/** The open workspace's folders and labels for a workflow's scope field. */\nexport function useConnectedWorkflowScopeSource(): WorkflowScopeSource {\n const { data: docs } = useConnectedDocuments()\n const { data: tags } = useConnectedTags()\n return useMemo(() => buildWorkflowScopeSource(docs, documentScopeLabels(tags)), [docs, tags])\n}\n\n/** The user's agents, for \"Run as\". */\nexport function useConnectedAgentOptions(): AgentOption[] {\n const { data: agents } = useAgents()\n return useMemo(\n () => (agents ?? []).map((a) => ({ id: a.external_id, label: a.given_name || a.email })),\n [agents]\n )\n}\n\nexport interface ConnectedWorkflowDocumentsFieldProps {\n field: WorkflowField\n value: WorkflowScope\n onChange: (value: WorkflowScope) => void\n /** Add files the host's way (its upload dialog). Absent: they are uploaded here. */\n onAddFiles?: (files?: File[]) => void\n labels?: Partial<WorkflowDocumentsFieldLabels>\n}\n\n/**\n * A workflow `documents` field over the open workspace's files: pick, add (or drop) files, see the\n * chosen images. A launcher's or a task composer's `renderDocuments`.\n */\nexport function ConnectedWorkflowDocumentsField({\n field,\n value,\n onChange,\n onAddFiles,\n labels,\n}: ConnectedWorkflowDocumentsFieldProps) {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n const { ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: docs, loaded, refetch } = useConnectedDocuments()\n const documents = useMemo(() => docs.map(toWorkflowFieldDocument), [docs])\n const chosen = value.documents ?? []\n const { data: thumbnails } = useThumbnails(chosen, { enabled: (field.max ?? 1) > 1 })\n const input = useRef<HTMLInputElement>(null)\n const [adding, setAdding] = useState(false)\n\n const upload = useCallback(\n async (files: File[]) => {\n setAdding(true)\n try {\n await ensureWorkspaceOpen()\n for (const file of files) await arbi.documents.uploadFile(file, file.name)\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : String(error), 'error')\n } finally {\n setAdding(false)\n await refetch?.()\n }\n },\n [arbi, ensureWorkspaceOpen, notify, refetch]\n )\n\n return (\n <>\n {!onAddFiles && (\n <input\n ref={input}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Add files\"\n data-testid=\"workflow-add-files-input\"\n onChange={(e) => {\n const files = Array.from(e.target.files ?? [])\n e.target.value = ''\n if (files.length) void upload(files)\n }}\n />\n )}\n <WorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n documents={documents}\n loaded={loaded}\n thumbnailOf={(id) => thumbnails?.[id]}\n onAddFiles={\n onAddFiles ?? ((files) => (files?.length ? void upload(files) : input.current?.click()))\n }\n adding={adding}\n labels={labels}\n />\n </>\n )\n}\n\nexport interface ConnectedWorkflowLauncherProps extends Omit<\n WorkflowLauncherProps,\n 'scopeSource' | 'renderDocuments' | 'agents'\n> {\n /** Add files from a `documents` field the host's way (its upload dialog). Absent: uploaded here. */\n onAddFiles?: (files?: File[]) => void\n}\n\nexport function ConnectedWorkflowLauncher({\n onAddFiles,\n ...props\n}: ConnectedWorkflowLauncherProps) {\n const scopeSource = useConnectedWorkflowScopeSource()\n const agents = useConnectedAgentOptions()\n return (\n <WorkflowLauncher\n {...props}\n scopeSource={scopeSource}\n agents={agents}\n renderDocuments={(field, value, onChange) => (\n <ConnectedWorkflowDocumentsField\n field={field}\n value={value}\n onChange={onChange}\n onAddFiles={onAddFiles}\n />\n )}\n />\n )\n}\n","/**\n * Add a skill someone gave you: a file from your computer (`.md` or `.zip`) or a link to one. Both\n * go through the one skill upload (`useUploadSkillFiles`); the skill then appears in every skill\n * list once it is processed.\n */\n\nimport { useRef, useState } from 'react'\nimport { useUploadSkillFiles } from '@arbidocs/react'\nimport { Button, Input, Label, cn } from '@arbidocs/react/ui'\nimport { Link2, Upload } from 'lucide-react'\nimport {\n importSkillFile,\n importSkillFromUrl,\n type SkillImportResult,\n} from '../agents/skills/skillImport'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport interface ConnectedSkillUploadLabels {\n title: string\n description: string\n fromFile: string\n chooseFile: string\n fromLink: string\n linkPlaceholder: string\n add: string\n cancel: string\n /** The notification once a skill is added. */\n added: (slug: string) => string\n failed: string\n}\n\nexport const DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS: ConnectedSkillUploadLabels = {\n title: 'Add a skill',\n description: 'Bring in a skill someone sent you, from a file or a link.',\n fromFile: 'From a file',\n chooseFile: 'Choose a file',\n fromLink: 'From a link',\n linkPlaceholder: 'https://…/SKILL.md',\n add: 'Add',\n cancel: 'Cancel',\n added: (slug) => `${slug} added`,\n failed: 'Could not add the skill',\n}\n\nexport interface ConnectedSkillUploadProps {\n /** Added (its slug) or cancelled (nothing). Absent: no Cancel, and the form stays. */\n onDone?: (addedSlug?: string) => void\n labels?: Partial<ConnectedSkillUploadLabels>\n className?: string\n}\n\nexport function ConnectedSkillUpload({ onDone, labels, className }: ConnectedSkillUploadProps) {\n const l = { ...DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS, ...labels }\n const { notify } = useBlocksEnvironment()\n const upload = useUploadSkillFiles()\n const fileRef = useRef<HTMLInputElement>(null)\n const [url, setUrl] = useState('')\n const [busy, setBusy] = useState(false)\n\n const add = async (read: () => Promise<SkillImportResult>) => {\n setBusy(true)\n try {\n const { slug, entries } = await read()\n await upload.mutateAsync(\n entries.map((e) => ({\n folder: e.folder,\n fileName: e.fileName,\n content: new Blob([e.content], { type: 'text/markdown' }),\n }))\n )\n notify(l.added(slug), 'success')\n setUrl('')\n onDone?.(slug)\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : l.failed, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div\n className={cn('flex flex-col gap-6 overflow-y-auto p-4', className)}\n data-testid=\"skills-add-view\"\n >\n <div className=\"space-y-2\">\n <h3 className=\"text-base font-semibold\">{l.title}</h3>\n <p className=\"text-sm text-muted-foreground\">{l.description}</p>\n </div>\n <div className=\"space-y-2\">\n <Label>{l.fromFile}</Label>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".md,.markdown,.zip\"\n className=\"hidden\"\n data-testid=\"skills-add-file-input\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) void add(() => importSkillFile(file))\n }}\n />\n <div>\n <Button\n variant=\"outline\"\n disabled={busy}\n onClick={() => fileRef.current?.click()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-file\"\n >\n <Upload className=\"mr-1.5 size-4\" />\n {l.chooseFile}\n </Button>\n </div>\n </div>\n <form\n className=\"space-y-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (url.trim()) void add(() => importSkillFromUrl(url))\n }}\n >\n <Label htmlFor=\"skills-add-url\">{l.fromLink}</Label>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input\n id=\"skills-add-url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder={l.linkPlaceholder}\n inputMode=\"url\"\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-input\"\n />\n <Button\n type=\"submit\"\n disabled={busy || !url.trim()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-submit\"\n >\n <Link2 className=\"mr-1.5 size-4\" />\n {l.add}\n </Button>\n </div>\n </form>\n {onDone && (\n <div>\n <Button variant=\"ghost\" onClick={() => onDone()} className=\"pointer-coarse:min-h-11\">\n {l.cancel}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * The skills library bound to the connection: one place to find, read, copy, change, share, export\n * and add skills. The host's built-in skills, your own and the ones others shared sit in one list\n * with search, filter chips and a gallery or list view; picking one opens its detail beside the\n * list (over it on a phone). Running a skill and drafting a new one with the assistant are the\n * host's (`onRun`, `onDraft`): the library has no run UI of its own.\n *\n * \"Make a copy\" needs no server feature: a shared skill is read and saved again as your own (the\n * same path as adding a skill from a file); a built-in is written out as a SKILL.md first. Your copy\n * has the original's name, so it is used instead of the original until you delete it.\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport {\n useArbi,\n useDeleteSkill,\n useSetSkillVisibility,\n useSkillSource,\n useSkills,\n useUploadSkillFiles,\n} from '@arbidocs/react'\nimport { Button, EntityIcon, Input, Textarea, cn } from '@arbidocs/react/ui'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport { ArrowLeft, Plus, Search, Upload } from 'lucide-react'\nimport {\n SkillFilterChips,\n SkillTile,\n SkillViewToggle,\n type SkillBrowserView,\n} from '../agents/skills/SkillBrowserParts'\nimport { SkillEditForm, SkillGenerateForm } from '../agents/skills/SkillForms'\nimport { SkillLibraryDetail } from '../agents/skills/SkillLibraryDetail'\nimport {\n SKILL_SOURCE_LABELS,\n SKILL_TYPE_LABELS,\n buildLibrarySkills,\n filterLibrarySkills,\n type LibrarySkill,\n type SkillSource,\n} from '../agents/skills/skillLibrary'\nimport {\n parseSkillFrontmatter,\n serializeSkill,\n SKILL_MAIN_FILENAME,\n} from '../agents/skills/skillFiles'\nimport { skillSlug, workflowToSkillMarkdown } from '../agents/workflows/skillMarkdown'\nimport type { WorkflowDefinition } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { ConnectedSkillUpload } from './ConnectedSkillUpload'\n\ntype Mode = 'detail' | 'new' | 'edit' | 'add'\n\nconst SKILL_FOLDER = 'skills/'\nconst NAME_PATTERN = /^[a-z0-9-]{1,64}$/\nconst icon = <EntityIcon entityType=\"SKILL\" />\n\nconst errorText = (error: unknown, fallback: string) =>\n error instanceof Error && error.message ? error.message : fallback\nconst statusOf = (error: unknown) =>\n error && typeof error === 'object' && 'status' in error\n ? (error as { status?: number }).status\n : undefined\n\nexport interface ConnectedSkillsLibraryProps {\n /** The host's built-in skills (prompt workflows with their own forms). */\n builtins?: WorkflowDefinition[]\n /** Open on this skill. */\n initialSlug?: string\n /** Run a skill: the host opens its run dialog with it selected. */\n onRun: (slug: string) => void\n /** \"New skill\", described: the host hands the text to the assistant (e.g. as a chat draft). */\n onDraft: (text: string) => void\n /** The instructions editor. Default: a plain text area. */\n renderEditor?: (markdown: string, onChange: (markdown: string) => void) => ReactNode\n}\n\nexport function ConnectedSkillsLibrary({\n builtins = [],\n initialSlug,\n onRun,\n onDraft,\n renderEditor,\n}: ConnectedSkillsLibraryProps) {\n const arbi = useArbi()\n const { confirm, notify } = useBlocksEnvironment()\n const { data: listings } = useSkills()\n const upload = useUploadSkillFiles()\n const setVisibility = useSetSkillVisibility()\n const deleteSkill = useDeleteSkill()\n\n const [mode, setMode] = useState<Mode>('detail')\n const [selected, setSelected] = useState<string | null>(initialSlug ?? null)\n const [query, setQuery] = useState('')\n const [source, setSource] = useState<SkillSource | 'all'>('all')\n const [type, setType] = useState('all')\n const [view, setView] = useState<SkillBrowserView>('gallery')\n const [isBusy, setIsBusy] = useState(false)\n\n const all = useMemo(() => buildLibrarySkills(builtins, listings ?? []), [builtins, listings])\n const shown = useMemo(\n () => filterLibrarySkills(all, { query, source, type }),\n [all, query, source, type]\n )\n const current = all.find((s) => s.slug === selected) ?? null\n const { data: currentText, isLoading: textLoading } = useSkillSource(current?.docExtId)\n\n // A skill that is gone (deleted) leaves nothing selected.\n useEffect(() => {\n if (selected && !current && all.length > 0) setSelected(null)\n }, [selected, current, all.length])\n\n const count = (s: SkillSource) => all.filter((x) => x.source === s).length\n const sourceOptions = [\n { id: 'all', label: 'All', count: all.length },\n { id: 'builtin', label: SKILL_SOURCE_LABELS.builtin, count: count('builtin') },\n { id: 'mine', label: SKILL_SOURCE_LABELS.mine, count: count('mine') },\n { id: 'shared', label: SKILL_SOURCE_LABELS.shared, count: count('shared') },\n ]\n const types = [...new Set(all.map((s) => s.type))]\n const typeOptions = [\n { id: 'all', label: 'Any kind' },\n ...types.map((t) => ({ id: t, label: SKILL_TYPE_LABELS[t] ?? t })),\n ]\n\n const pick = (slug: string) => {\n setSelected(slug)\n setMode('detail')\n }\n\n /** A stored skill's SKILL.md, or a built-in written out as one. */\n const markdownOf = async (skill: LibrarySkill): Promise<string> => {\n if (!skill.docExtId) return workflowToSkillMarkdown(skill.workflow)\n const response = await arbi.documents.download(skill.docExtId)\n if (!response.ok) throw new Error(`Could not read the skill (${response.status})`)\n return response.text()\n }\n\n /**\n * Save `markdown` as the user's own skill of this name (it then replaces any original): private,\n * unless it is a shared skill of theirs being changed (it stays shared).\n */\n const saveAs = (slug: string, markdown: string, shared = false) =>\n upload.mutateAsync([\n {\n folder: `${SKILL_FOLDER}${slug}`,\n fileName: SKILL_MAIN_FILENAME,\n content: new Blob([markdown], { type: 'text/markdown' }),\n shared,\n },\n ])\n\n const busy = async (work: () => Promise<void>) => {\n setIsBusy(true)\n try {\n await work()\n } finally {\n setIsBusy(false)\n }\n }\n\n const makeCopy = (skill: LibrarySkill) =>\n busy(async () => {\n try {\n await saveAs(skill.slug, await markdownOf(skill))\n notify(\n 'Your copy is ready. It is used instead of the original; delete it to go back.',\n 'success'\n )\n setSelected(skill.slug)\n } catch (error) {\n notify(errorText(error, 'Could not make a copy'), 'error')\n }\n })\n\n const toggleShare = (skill: LibrarySkill) => {\n if (!skill.docExtId) return\n const docExtId = skill.docExtId\n const next = skill.isShared ? 'mine' : 'global'\n return busy(async () => {\n try {\n await setVisibility.mutateAsync({ docExtId, visibility: next })\n notify(next === 'global' ? 'Shared with everyone' : 'Made private', 'success')\n } catch (error) {\n notify(\n statusOf(error) === 409 || errorText(error, '').includes('409')\n ? 'Someone has already shared a skill with this name. Rename yours first.'\n : 'Could not change who can see this skill',\n 'error'\n )\n }\n })\n }\n\n const remove = async (skill: LibrarySkill) => {\n if (!skill.docExtId) return\n const docExtId = skill.docExtId\n const ok = await confirm({\n message: skill.replacesBuiltin\n ? `Delete your copy of \"${skill.title}\"? The original will be used again.`\n : `Delete \"${skill.title}\"? This cannot be undone.`,\n title: 'Delete skill',\n })\n if (!ok) return\n await busy(async () => {\n try {\n await deleteSkill.mutateAsync(docExtId)\n notify(`${skill.title} deleted`, 'success')\n setSelected(null)\n } catch {\n notify('Could not delete the skill', 'error')\n }\n })\n }\n\n const exportFile = async (skill: LibrarySkill) => {\n try {\n downloadBlob(\n new Blob([await markdownOf(skill)], { type: 'text/markdown' }),\n SKILL_MAIN_FILENAME\n )\n } catch (error) {\n notify(errorText(error, 'Could not export the skill'), 'error')\n }\n }\n\n const rightVisible = mode !== 'detail' || current !== null\n const backToList = () => {\n setMode('detail')\n setSelected(null)\n }\n const done = (slug?: string) => {\n if (slug) setSelected(slug)\n setMode('detail')\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 border-t border-border\">\n <div\n className={cn(\n 'flex min-h-0 w-full flex-col md:w-[26rem] md:shrink-0 md:border-r md:border-border',\n rightVisible && 'max-md:hidden'\n )}\n data-testid=\"skills-list-pane\"\n >\n <div className=\"flex flex-col gap-3 p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search skills\"\n aria-label=\"Search skills\"\n className=\"pl-9 pointer-coarse:min-h-11\"\n data-testid=\"skills-browser-search\"\n />\n </div>\n <SkillViewToggle value={view} onChange={setView} />\n </div>\n <SkillFilterChips\n label=\"Show\"\n value={source}\n onChange={(id) => setSource(id as SkillSource | 'all')}\n options={sourceOptions}\n />\n {types.length > 1 && (\n <SkillFilterChips\n label=\"Kind\"\n value={type}\n onChange={setType}\n options={typeOptions}\n testIdPrefix=\"skills-type\"\n />\n )}\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n onClick={() => setMode('new')}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-new\"\n >\n <Plus className=\"mr-1 size-4\" />\n New skill\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setMode('add')}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add\"\n >\n <Upload className=\"mr-1 size-4\" />\n Add a skill\n </Button>\n </div>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 pb-3\" data-testid=\"skills-list\">\n {shown.length === 0 ? (\n <p className=\"py-10 text-center text-sm text-muted-foreground\">\n No skills match. Try another word or filter.\n </p>\n ) : (\n <div\n className={cn(\n 'gap-2',\n view === 'gallery'\n ? 'grid grid-cols-[repeat(auto-fill,minmax(9.5rem,1fr))]'\n : 'flex flex-col'\n )}\n >\n {shown.map((skill) => (\n <SkillTile\n key={skill.slug}\n name={skill.title}\n testId={`skill-tile-${skill.slug}`}\n description={skill.description}\n sourceLabel={\n skill.isShared\n ? `${SKILL_SOURCE_LABELS.mine}, shared`\n : SKILL_SOURCE_LABELS[skill.source]\n }\n type={skill.type}\n icon={icon}\n layout={view}\n selected={skill.slug === selected}\n onSelect={() => pick(skill.slug)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div\n className={cn('flex min-h-0 min-w-0 flex-1 flex-col', !rightVisible && 'max-md:hidden')}\n data-testid=\"skills-detail-pane\"\n >\n {rightVisible && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={backToList}\n className=\"m-2 self-start pointer-coarse:min-h-11 md:hidden\"\n data-testid=\"skills-back\"\n >\n <ArrowLeft className=\"mr-1 size-4\" />\n All skills\n </Button>\n )}\n {mode === 'new' && (\n <SkillGenerateForm\n icon={icon}\n onGenerate={(desc) => {\n onDraft(`/create-skill ${desc}`.trim() + ' ')\n notify('Sent to the chat: the assistant will draft your skill.', 'info')\n }}\n onManual={() => setMode('edit')}\n />\n )}\n {mode === 'edit' && (\n <SkillEditor\n skill={current?.source === 'mine' ? current : null}\n text={current?.source === 'mine' ? currentText : undefined}\n renderEditor={renderEditor}\n onSave={async (slug, markdown, isEditing) => {\n await saveAs(slug, markdown, isEditing && !!current?.isShared)\n notify(isEditing ? `${slug} saved` : `${slug} added`, 'success')\n done(slug)\n }}\n onCancel={() => done()}\n isSaving={upload.isPending}\n />\n )}\n {mode === 'add' && <ConnectedSkillUpload onDone={done} />}\n {mode === 'detail' && current && (\n <SkillLibraryDetail\n skill={current}\n icon={icon}\n instructions={\n current.docExtId\n ? currentText\n ? parseSkillFrontmatter(currentText, SKILL_MAIN_FILENAME).content\n : ''\n : current.workflow.run.kind === 'prompt'\n ? current.workflow.run.promptTemplate\n : ''\n }\n isLoading={!!current.docExtId && textLoading}\n actions={{\n onRun: () => onRun(current.slug),\n onCopy: () => void makeCopy(current),\n onEdit: () => setMode('edit'),\n onToggleShare: () => void toggleShare(current),\n onExport: () => void exportFile(current),\n onDelete: () => void remove(current),\n isBusy,\n }}\n />\n )}\n {mode === 'detail' && !current && (\n <div className=\"flex flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground max-md:hidden\">\n Pick a skill to read it, run it or make a copy.\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Write or change a skill: a name, a short description and the instructions. Saving a skill of the\n * same name replaces it.\n */\nfunction SkillEditor({\n skill,\n text,\n renderEditor,\n onSave,\n onCancel,\n isSaving,\n}: {\n /** The skill being changed (yours); absent when writing a new one. */\n skill: LibrarySkill | null\n /** Its SKILL.md, once read. */\n text: string | undefined\n renderEditor?: ConnectedSkillsLibraryProps['renderEditor']\n onSave: (slug: string, markdown: string, isEditing: boolean) => Promise<void>\n onCancel: () => void\n isSaving: boolean\n}) {\n const { notify } = useBlocksEnvironment()\n const isEditing = !!skill\n const [name, setName] = useState(skill?.slug ?? '')\n const [description, setDescription] = useState('')\n const [body, setBody] = useState('')\n const [seeded, setSeeded] = useState(!isEditing)\n const [nameError, setNameError] = useState<string | null>(null)\n\n // Seed from the existing content once it has been read.\n if (isEditing && !seeded && text !== undefined) {\n const parsed = parseSkillFrontmatter(text, SKILL_MAIN_FILENAME)\n setDescription(parsed.description ?? '')\n setBody(parsed.content ?? '')\n setSeeded(true)\n }\n\n const save = async () => {\n if (!NAME_PATTERN.test(name)) {\n setNameError('Use 1–64 lowercase letters, numbers or hyphens.')\n return\n }\n if (description.trim().length < 1) {\n notify('Add a short description.', 'error')\n return\n }\n const slug = skillSlug(name)\n try {\n await onSave(slug, serializeSkill({ name: slug, description, body }), isEditing)\n } catch (err) {\n notify(errorText(err, 'Could not save the skill'), 'error')\n }\n }\n\n return (\n <SkillEditForm\n name={name}\n onNameChange={setName}\n isNameLocked={isEditing}\n nameError={nameError}\n description={description}\n onDescriptionChange={setDescription}\n editor={\n renderEditor ? (\n renderEditor(body, setBody)\n ) : (\n <Textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n className=\"min-h-64 flex-1 font-mono text-sm\"\n aria-label=\"Instructions\"\n />\n )\n }\n isSaving={isSaving}\n isEditing={isEditing}\n onSave={save}\n onCancel={onCancel}\n labels={{ create: 'Add skill' }}\n testIds={{\n name: 'skill-edit-name',\n description: 'skill-edit-description',\n save: 'skill-edit-save',\n }}\n />\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { ArtifactCanvas } from '@arbidocs/react'\nimport { useStreamedArtifact, type UseStreamedArtifactOptions } from '@arbidocs/react/artifacts'\nimport {\n StreamedArtifactFrame,\n type StreamedArtifactFrameLabels,\n type StreamedArtifactFrameTestIds,\n} from '../artifacts/StreamedArtifactFrame'\nimport type { ArtifactEvent } from './ai'\nimport type { StreamedArtifactEditorProps } from './StreamedArtifactEditor'\n\n// The editor (MDXEditor, Lexical) stays out of the bundle until a draft is ready to edit.\nconst StreamedArtifactEditor = lazy(() => import('./StreamedArtifactEditor'))\n\nexport interface StreamedArtifactProps\n extends\n Pick<UseStreamedArtifactOptions, 'configId' | 'parseRetry' | 'clean'>,\n Pick<\n StreamedArtifactEditorProps,\n 'editorProps' | 'onSaved' | 'onSaveError' | 'actions' | 'hideDefaultActions'\n > {\n /** The artifacts of the agent run (`useConnectedAiTask().artifacts`). */\n artifacts: ArtifactEvent[]\n workspaceId: string | undefined\n /** The agent is still working: show the live canvas. */\n busy: boolean\n /** The run failed; with no draft the canvas shows it. */\n error?: string | null\n stepCount?: number\n busyHint?: string\n emptyHint?: string\n className?: string\n /** Root test id of the editor; the preparing state is `${testId}-preparing`. */\n testId?: string\n labels?: Partial<StreamedArtifactFrameLabels>\n testIds?: Partial<StreamedArtifactFrameTestIds>\n}\n\n/**\n * An agent-drafted artifact from stream to editor, in one part. Pass the run's `artifacts` and\n * whether it is `busy`; it shows\n *\n * 1. the live `ArtifactCanvas` while the agent streams;\n * 2. \"Preparing editor...\" (the canvas stays readable underneath) while the finished draft is\n * cleaned (`cleanDraftMarkdown`), stored as version 1 of the artifact (`wpType: 'artifact'`)\n * and parsed by the backend, which can take up to about a minute;\n * 3. `ArtifactEditor` on the stored version (edit, save a new version, version list, compare\n * with track changes) when its text is ready;\n * 4. an error with Retry when storing or parsing fails.\n *\n * Needs `<ArbiProvider>` + React Query. The host imports the editor stylesheet\n * (`@mdxeditor/editor/style.css`) and defines the global `Prism` in a module it imports at app\n * start (see the Artifacts section of docs/design/blocks-package.md).\n *\n * ```tsx\n * const task = useConnectedAiTask()\n * <StreamedArtifact artifacts={task.artifacts} workspaceId={workspaceId} busy={task.status === 'running'} error={task.error} />\n * ```\n */\nexport function StreamedArtifact({\n artifacts,\n workspaceId,\n busy,\n error = null,\n stepCount,\n busyHint,\n emptyHint,\n className,\n testId = 'streamed-artifact',\n configId,\n parseRetry,\n clean,\n editorProps,\n onSaved,\n onSaveError,\n actions,\n hideDefaultActions,\n labels,\n testIds,\n}: StreamedArtifactProps) {\n const streamed = useStreamedArtifact({\n artifacts,\n workspaceId,\n settled: !busy && !error,\n configId,\n parseRetry,\n clean,\n })\n const canvas = (\n <ArtifactCanvas\n artifacts={artifacts}\n className={streamed.phase === 'streaming' ? className : undefined}\n busy={busy}\n busyHint={busyHint}\n stepCount={stepCount}\n error={error}\n emptyHint={emptyHint}\n />\n )\n return (\n <StreamedArtifactFrame\n phase={streamed.phase}\n canvas={canvas}\n className={className}\n error={streamed.error?.message}\n onRetry={streamed.retry}\n labels={labels}\n testIds={{ preparing: `${testId}-preparing`, error: `${testId}-error`, ...testIds }}\n >\n <Suspense fallback={canvas}>\n {streamed.docId && (\n <StreamedArtifactEditor\n key={streamed.docId}\n workspaceId={workspaceId}\n docId={streamed.docId}\n title={streamed.artifact?.title ?? 'Draft'}\n testId={testId}\n className={className}\n editorProps={editorProps}\n onSaved={onSaved}\n onSaveError={onSaveError}\n actions={actions}\n hideDefaultActions={hideDefaultActions}\n />\n )}\n </Suspense>\n </StreamedArtifactFrame>\n )\n}\n","/**\n * A stepped workflow run that lives in a work thread on the server. The thread's plan carries the\n * steps; its activity log says where each step is; the work runner starts each agent step as a\n * turn in the thread. This hook reads all of that and does the person's part: it starts the thread\n * (with the run's inputs and the steps' prompts composed from them), completes forms, uploads and\n * reviews, skips, and retries a failed step. A run whose first open step is an agent or action\n * step starts when the person presses Start: the thread is created and the server starts that\n * step. `WorkflowRunner` shows the result.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useActOnStep,\n useArbi,\n useConversationActivity,\n useConversationThreads,\n useConversations,\n useCreateWork,\n useWorkspaceUsers,\n type ConversationResponse,\n} from '@arbidocs/react'\nimport { fromPlanSteps, toPlanSteps, type TaskPlanStep } from '../agents/workflows/planSteps'\nimport {\n initialRunInputs,\n runThreadTitle,\n stepFields,\n stepStatesFromActivity,\n workflowSteps,\n type StepComposeOptions,\n type WorkflowActivityEvent,\n} from '../agents/workflows/run'\nimport { useWorkflowView, type WorkflowRunView } from '../agents/workflows/useWorkflowView'\nimport type {\n WorkflowDefinition,\n WorkflowInputs,\n WorkflowStep,\n WorkflowStepState,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\n\nexport interface UseWorkflowThreadOptions extends StepComposeOptions {\n /**\n * An existing run to show (its thread). Absent: a new run starts when its first step is done,\n * or, when that is an agent or action step, when the person starts it.\n */\n conversationId?: string\n /** The thread was created (store its id to come back to the run). */\n onStarted?: (conversationId: string) => void\n /**\n * The host's commits, by step id (`commit: true` steps): done before the step is recorded, e.g.\n * create and open the matter the run belongs in (the thread is created in the open workspace).\n * May return inputs to merge into the run.\n */\n commit?: Record<string, (inputs: WorkflowInputs) => Promise<WorkflowInputs | void>>\n /** Prefills for a new run. */\n initialInputs?: WorkflowInputs\n /** The agent that runs the agent steps (`agt-…`); absent = the person's own assistant. */\n agentId?: string\n /**\n * The files added on an upload step in this run (doc ids): sent when it is completed, so the\n * step records exactly them.\n */\n documentsFor?: (stepId: string) => string[]\n}\n\nexport interface WorkflowThread {\n view: WorkflowRunView\n /** The run's thread, once it exists. */\n conversationId: string | undefined\n conversation: ConversationResponse | undefined\n /** A workspace member's name by id. */\n nameOf: (id: string) => string | undefined\n /** The workspace's people (not agents): what a person field offers. */\n people: Array<{ value: string; label: string }>\n}\n\nconst STARTING = new Set(['pending', 'running'])\n\n/**\n * The values a form or a fielded review collected (what is recorded with it on the thread). A\n * review's blank optional fields are left out: the server checks each one given.\n */\nfunction formValues(step: WorkflowStep, inputs: WorkflowInputs): WorkflowInputs | undefined {\n const fields = stepFields(step)\n if (!fields.length) return undefined\n if (step.kind === 'form')\n return Object.fromEntries(fields.map((f) => [f.name, inputs[f.name] ?? '']))\n const given = fields.flatMap((f) => {\n const v = inputs[f.name]\n return v === undefined || v === '' ? [] : [[f.name, v] as const]\n })\n return given.length ? Object.fromEntries(given) : undefined\n}\n\n/** How many times missing answers are fetched again before giving up (about three minutes). */\nexport const ANSWER_RETRY_CAP = 16\n\n/** The wait before the `attempt`th fetch of missing answers: at once, then 1s doubling to 15s. */\nexport function answerRetryDelay(attempt: number): number {\n return attempt === 0 ? 0 : Math.min(1000 * 2 ** (attempt - 1), 15_000)\n}\n\n/**\n * Fetch again, with backoff and a cap, while `missing` (the ids of finished steps' answers not\n * read yet) is not empty. A change in what is missing starts the count again.\n */\nfunction useAnswerRetry(missing: string, refetch: () => Promise<unknown>) {\n const [attempt, setAttempt] = useState(0)\n const [prev, setPrev] = useState(missing)\n if (prev !== missing) {\n setPrev(missing)\n setAttempt(0)\n }\n const refetchRef = useRef(refetch)\n refetchRef.current = refetch\n useEffect(() => {\n if (!missing || attempt >= ANSWER_RETRY_CAP) return\n const t = setTimeout(() => {\n void refetchRef.current()\n setAttempt((a) => a + 1)\n }, answerRetryDelay(attempt))\n return () => clearTimeout(t)\n }, [missing, attempt])\n}\n\nexport function useWorkflowThread(\n workflow: WorkflowDefinition,\n options: UseWorkflowThreadOptions = {}\n): WorkflowThread {\n const arbi = useArbi()\n const { ensureWorkspaceOpen, status } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const [threadId, setThreadId] = useState(options.conversationId)\n const [localInputs, setLocalInputs] = useState<WorkflowInputs>(() =>\n initialRunInputs(workflow, options.initialInputs)\n )\n // What the person typed: it wins over the thread's copy, which only learns a form's values when\n // that step is completed (until then it holds them blank).\n const [edits, setEdits] = useState<WorkflowInputs>({})\n const [localStates, setLocalStates] = useState<Record<string, WorkflowStepState>>({})\n const createWork = useCreateWork()\n const actOnStep = useActOnStep()\n\n const conversations = useConversations(wsId, { enabled: !!threadId, live: true })\n const members = useWorkspaceUsers(wsId, {\n enabled: status === 'authenticated' && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const nameOf = useCallback(\n (id: string) => {\n const u = members.data?.find((m) => m.user.external_id === id)?.user\n return u ? [u.given_name, u.family_name].filter(Boolean).join(' ') || u.email : undefined\n },\n [members.data]\n )\n const conversation = conversations.data?.find((c) => c.external_id === threadId)\n const steps = useMemo(\n () =>\n workflowSteps(workflow).length > 0\n ? workflowSteps(workflow)\n : fromPlanSteps((conversation?.plan?.steps ?? []) as TaskPlanStep[]),\n [workflow, conversation?.plan?.steps]\n )\n\n // Poll while an agent step is on its way (the server starts it, then runs it).\n const activity = useConversationActivity(threadId, { live: !!threadId })\n const serverStates = useMemo(\n () => stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[]),\n [activity.data]\n )\n const working = steps.some(\n (s) =>\n (s.kind === 'agent' || s.kind === 'action') &&\n STARTING.has(serverStates[s.id]?.status ?? 'pending')\n )\n const threads = useConversationThreads(wsId, threadId, { enabled: !!threadId, live: working })\n // Only answers with text: the assistant's message exists (empty) from the moment its turn\n // starts and is filled when the turn ends, which can be after the step is recorded done.\n const answers = useMemo(() => {\n const byId = new Map<string, string>()\n for (const t of threads.data?.threads ?? [])\n for (const m of t.history)\n if (m.role === 'assistant' && m.content?.trim()) byId.set(m.external_id, m.content)\n return byId\n }, [threads.data])\n\n // A step can finish as the run stops (the last one always does): nothing is polled then, and\n // the activity log no longer changes. Fetch the messages again, backing off, until every\n // finished step's answer is in (or the cap is reached; a new missing answer starts again).\n const missing = Object.values(serverStates)\n .flatMap((st) =>\n st.status === 'done' && st.responseId && !answers.has(st.responseId) ? [st.responseId] : []\n )\n .sort()\n .join(' ')\n useAnswerRetry(missing, threads.refetch)\n\n const states = useMemo(() => {\n if (!threadId) return localStates\n const out: Record<string, WorkflowStepState> = {}\n for (const [id, s] of Object.entries(serverStates))\n out[id] = { ...s, text: s.responseId ? answers.get(s.responseId) : undefined }\n return out\n }, [threadId, localStates, serverStates, answers])\n\n const inputs = useMemo(\n () =>\n threadId\n ? { ...localInputs, ...(conversation?.skill_inputs ?? {}), ...edits }\n : { ...localInputs, ...edits },\n [threadId, localInputs, conversation?.skill_inputs, edits]\n ) as WorkflowInputs\n\n const refresh = useCallback(async () => {\n await Promise.all([activity.refetch(), conversations.refetch()])\n }, [activity, conversations])\n\n const act = useCallback(\n async (\n id: string,\n body: {\n step: string\n action: 'complete' | 'skip' | 'send_back' | 'decline'\n inputs?: WorkflowInputs\n documents?: string[]\n to?: string\n note?: string\n }\n ) => {\n await actOnStep.mutateAsync({ conversationId: id, body })\n await refresh()\n },\n [actOnStep, refresh]\n )\n\n // The run starts: its thread, in the workspace now open, with the steps and the inputs so far.\n // Creating it starts the first ready agent step on the server; the steps skipped before it existed\n // are then recorded (which starts what they made ready).\n const createThread = useCallback(\n async (values: WorkflowInputs, done?: string): Promise<string> => {\n await ensureWorkspaceOpen()\n const created = await createWork.mutateAsync({\n title: runThreadTitle(workflow, values).slice(0, 60),\n description: workflow.description || null,\n prompt: null,\n skill_ref: null,\n skill_inputs: values as Record<string, unknown>,\n agent_ext_id: options.agentId ?? null,\n auth_mode: 'run_now_temp',\n plan: {\n goal: '',\n criteria: [],\n max_passes: 3,\n documents: [],\n steps: toPlanSteps(workflow, {\n inputs: values,\n resolveWorkflow: options.resolveWorkflow,\n compose: options.compose,\n }),\n },\n })\n const id = created.external_id\n setThreadId(id)\n if (done) setLocalStates((s) => ({ ...s, [done]: { status: 'done' } }))\n options.onStarted?.(id)\n for (const [stepId, st] of Object.entries(localStates))\n if (st.status === 'skipped')\n await actOnStep.mutateAsync({\n conversationId: id,\n body: { step: stepId, action: 'skip' },\n })\n return id\n },\n [ensureWorkspaceOpen, createWork, workflow, options, localStates, actOnStep]\n )\n\n const complete = useCallback(\n async (step: WorkflowStep) => {\n let values = inputs\n const commit = step.commit ? options.commit?.[step.id] : undefined\n if (commit && localStates[step.id]?.status !== 'done') {\n values = { ...values, ...((await commit(values)) ?? {}) }\n setLocalInputs(values)\n setEdits({})\n }\n const id = threadId ?? (await createThread(values, step.id))\n const documents = step.kind === 'upload' ? options.documentsFor?.(step.id) : undefined\n await act(id, {\n step: step.id,\n action: 'complete',\n inputs: formValues(step, values),\n ...(documents?.length ? { documents } : {}),\n })\n },\n [inputs, options, localStates, threadId, createThread, act]\n )\n\n // Start the ready agent or action step nothing else will start: create the run's thread (the\n // server starts the step), or run the thread again (the server could not start it before).\n const start = useCallback(async () => {\n if (!threadId) {\n await createThread(inputs)\n await refresh()\n return\n }\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n }, [threadId, createThread, inputs, arbi, refresh])\n\n const skip = useCallback(\n async (stepId: string) => {\n if (!threadId) {\n setLocalStates((s) => ({ ...s, [stepId]: { status: 'skipped' } }))\n return\n }\n await act(threadId, { step: stepId, action: 'skip' })\n },\n [threadId, act]\n )\n\n const retry = useCallback(\n async (_stepId: string) => {\n if (!threadId) return\n // Running the thread again retries its failed step.\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n },\n [arbi, threadId, refresh]\n )\n\n const sendBack = useCallback(\n async (stepId: string, to: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'send_back', to, ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n const decline = useCallback(\n async (stepId: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'decline', ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n // A run opened later opens where it is once its log has arrived (not at its first step).\n const loaded = !options.conversationId || activity.isSuccess || activity.isError\n\n // Nothing will start a ready agent or action step unless the person does: there is no thread\n // yet, or the thread's run is not under way (it could not start: `last_error` says why).\n const idle = !!conversation && !conversation.in_progress\n const anyRunning = Object.values(states).some((s) => s.status === 'running')\n const needsStart = !threadId || (idle && !anyRunning)\n const runError = idle ? (conversation?.last_error ?? null) : null\n\n const view = useWorkflowView({\n steps,\n states,\n inputs,\n setInput: (name, value) => setEdits((i) => ({ ...i, [name]: value })),\n complete,\n skip,\n retry,\n start,\n needsStart,\n runError,\n sendBack,\n decline,\n nameOf,\n loaded,\n isLocked: (id) => states[id]?.status === 'done',\n })\n\n const people = useMemo(\n () =>\n (members.data ?? [])\n .filter((m) => !m.user.external_id.startsWith('agt-'))\n .map((m) => ({\n value: m.user.external_id,\n label: nameOf(m.user.external_id) ?? m.user.external_id,\n })),\n [members.data, nameOf]\n )\n\n return { view, conversationId: threadId, conversation, nameOf, people }\n}\n","/**\n * A workflow run's thread, live and interactive: the blocks `ChatPage` held to the run's one\n * conversation (people ask follow-ups, see the answers and their sources, open documents), with\n * the current step's panel beside it (`aside`). Step messages show as their step's chip.\n */\n\nimport { useEffect, type ReactNode } from 'react'\nimport { useArbiChat } from '@arbidocs/react'\nimport { ChatPage } from '../chat/ChatPage'\nimport type { ChatCitationTarget, ChatPageLabels, WorkflowStepView } from '../chat/chat-page-types'\n\nexport interface WorkflowRunThreadProps {\n conversationId: string\n workspaceId: string | undefined\n /** The current step's panel. */\n aside?: ReactNode\n /** A step by id: its title, kind and phase (step messages show as its chip). */\n stepOf?: (stepId: string) => WorkflowStepView | undefined\n /** Scroll to and mark this message (a step's answer). */\n targetMessageId?: string\n onOpenCitation?: (target: ChatCitationTarget) => void\n labels?: Partial<ChatPageLabels>\n className?: string\n}\n\nexport function WorkflowRunThread({\n conversationId,\n workspaceId,\n aside,\n stepOf,\n targetMessageId,\n onOpenCitation,\n labels,\n className,\n}: WorkflowRunThreadProps) {\n const chat = useArbiChat({ workspaceId })\n const listed = chat.threads.some((t) => t.id === conversationId)\n const { selectThread, activeThreadId } = chat\n // The run's conversation, once the workspace's list has it.\n useEffect(() => {\n if (listed && activeThreadId !== conversationId) selectThread(conversationId)\n }, [listed, activeThreadId, conversationId, selectThread])\n\n return (\n <ChatPage\n chat={{ ...chat, threads: chat.threads.filter((t) => t.id === conversationId) }}\n singleThread\n documentsRequired={false}\n aside={aside}\n asideBreakpoint={52}\n workflowStepOf={stepOf}\n targetMessageId={targetMessageId}\n onOpenCitation={onOpenCitation}\n labels={labels}\n className={className ?? 'h-[min(78dvh,860px)] min-h-[480px] rounded-xl border border-border'}\n />\n )\n}\n","/**\n * What the connected runner opens itself when the host does not take over: the sign flow for a\n * signature step (the blocks `SignDocumentDialog` on the document's PDF), the native Word editor\n * for a tracked-changes version, and a tabular review's grid (its documents by its columns).\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useArbi, useDocuments, useTags } from '@arbidocs/react'\nimport {\n DocumentToolsProvider,\n fetchDocumentPdf,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { Loader2 } from 'lucide-react'\nimport { SignDocumentDialog } from '../document-tools/SignDocumentDialog'\nimport { ModalScaffold } from '../settings/ModalScaffold'\nimport { splitDocRef } from '../agents/workflows/run'\nimport { ConnectedNativeDocxEditor } from './ConnectedNativeDocxEditor'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface WorkflowRunnerDialogLabels {\n loadingDocument: string\n preparingDocument: string\n documentFailed: string\n reviewTitle: string\n reviewDescription: string\n document: string\n empty: string\n showMore: string\n showLess: string\n wordTitle: string\n}\n\nexport const DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS: WorkflowRunnerDialogLabels = {\n loadingDocument: 'Opening the document…',\n preparingDocument: 'The PDF is still being prepared…',\n documentFailed: 'The document could not be opened.',\n reviewTitle: 'Review',\n reviewDescription: 'Each document against each review column.',\n document: 'Document',\n empty: '—',\n showMore: 'Show more',\n showLess: 'Show less',\n wordTitle: 'Tracked changes',\n}\n\n/** How often, and how long apart, the PDF is fetched again while it is still being rendered. */\nexport const SIGN_PDF_RETRIES = 4\nexport const SIGN_PDF_RETRY_DELAY_MS = 1500\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\n/**\n * The sign flow on one document version: its PDF is fetched, then the blocks sign dialog.\n *\n * What is signed is the PDF `GET /view?version=` serves (a Word or Markdown document's rendition),\n * never the original's download, so the hash the server checks is of the bytes shown here. A\n * rendition still being written is fetched again a few times; a version superseded since the step\n * was set offers the current one instead.\n */\nexport function WorkflowSignDialog({\n docRef,\n onClose,\n labels,\n}: {\n /** `doc-…` or `doc-…@v3`. */\n docRef: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const arbi = useArbi()\n const { user, ensureWorkspaceOpen } = useConnection()\n const tools = useOptionalDocumentTools()\n const { id, version: stepVersion } = splitDocRef(docRef)\n // The version the step names, until the signer opens the current one instead.\n const [version, setVersion] = useState(stepVersion)\n const [pdf, setPdf] = useState<Blob | null>(null)\n const [preparing, setPreparing] = useState(false)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let live = true\n setPdf(null)\n setFailed(false)\n setPreparing(false)\n void (async () => {\n try {\n await ensureWorkspaceOpen()\n const client = arbi.getClient().fetch\n const ref = version ? `${id}@v${version}` : id\n for (let attempt = 0; ; attempt++) {\n try {\n const blob = await fetchDocumentPdf(client, ref)\n if (live) setPdf(blob)\n return\n } catch (err) {\n if (!live || attempt >= SIGN_PDF_RETRIES) throw err\n setPreparing(true)\n await wait(SIGN_PDF_RETRY_DELAY_MS)\n if (!live) return\n }\n }\n } catch {\n if (live) setFailed(true)\n }\n })()\n return () => {\n live = false\n }\n }, [arbi, id, version, ensureWorkspaceOpen])\n\n if (!pdf)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.loadingDocument}\n size=\"sm\"\n testId=\"workflow-sign-loading\"\n >\n <ModalScaffold.Body>\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {failed ? (\n labels.documentFailed\n ) : (\n <>\n <Loader2 className=\"size-4 animate-spin\" />{' '}\n {preparing ? labels.preparingDocument : labels.loadingDocument}\n </>\n )}\n </p>\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n const dialog = (\n <SignDocumentDialog\n // A new PDF is a new signing: the form starts again on it.\n key={version ?? 'current'}\n open\n onOpenChange={(o) => !o && onClose()}\n documentId={id}\n pdfBlob={pdf}\n version={version}\n // Superseded since the step was set: sign the current version, after seeing it.\n onOpenCurrent={() => setVersion(undefined)}\n />\n )\n // A host with its own document tools keeps them (its notices, its document opening).\n return tools ? (\n dialog\n ) : (\n <DocumentToolsProvider\n client={arbi.getClient().fetch}\n user={user ? { name: user.name, email: user.email } : null}\n >\n {dialog}\n </DocumentToolsProvider>\n )\n}\n\n/** A tracked-changes version in the native Word editor. */\nexport function WorkflowWordDialog({\n docRef,\n title,\n onClose,\n labels,\n}: {\n docRef: string\n title?: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { id } = splitDocRef(docRef)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={title ?? labels.wordTitle}\n size=\"xl\"\n testId=\"workflow-word-dialog\"\n >\n <ModalScaffold.Body className=\"h-[70dvh] p-0\">\n <ConnectedNativeDocxEditor documentId={id} title={title ?? labels.wordTitle} />\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/** A tabular review's grid: each document (row) against each column (label), with its value. */\nexport function WorkflowReviewGridDialog({\n tags,\n documents,\n onClose,\n onOpenDocument,\n labels,\n}: {\n tags: string[]\n documents: string[]\n onClose: () => void\n onOpenDocument?: (docId: string) => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { workspaceId } = useConnection()\n const allTags = useTags(workspaceId ?? undefined)\n // The workspace's documents carry their review values (doctags); the review's rows are its own.\n const all = useDocuments(workspaceId ?? undefined)\n // The grid waits for its column names and for documents fetched since it opened: before, its\n // headers would be the raw tag ids and its cells the values cached before the review ran.\n const isLoading =\n allTags.isLoading || all.isLoading || (all.isFetching && !all.isFetchedAfterMount)\n const docs = (all.data ?? []).filter((d) => documents.includes(d.external_id))\n const columns = useMemo(\n () =>\n tags.map((id) => ({\n id,\n name: allTags.data?.find((t) => t.external_id === id)?.name ?? id,\n })),\n [tags, allTags.data]\n )\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.reviewTitle}\n description={labels.reviewDescription}\n showDescription\n size=\"xl\"\n testId=\"workflow-review-grid\"\n >\n <ModalScaffold.Body className=\"overflow-auto\">\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </p>\n ) : (\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n <th className=\"sticky left-0 z-10 border-b border-border bg-background p-2 text-left align-bottom font-medium\">\n {labels.document}\n </th>\n {columns.map((c) => (\n <th\n key={c.id}\n className=\"border-b border-border p-2 text-left align-bottom font-medium\"\n >\n <div className={`${VALUE_WIDTH} line-clamp-2 break-words`} title={c.name}>\n {c.name}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {docs.map((d) => (\n <tr key={d.external_id} data-testid={`workflow-review-grid-row-${d.external_id}`}>\n <td className=\"sticky left-0 z-10 border-b border-border bg-background p-2 align-top\">\n <DocumentName onClick={onOpenDocument && (() => onOpenDocument(d.external_id))}>\n {d.file_name ?? d.external_id}\n </DocumentName>\n </td>\n {columns.map((c) => {\n const note = d.doctags?.find((t) => t.tag_ext_id === c.id)?.note\n return (\n <td\n key={c.id}\n className=\"border-b border-border p-2 align-top text-muted-foreground\"\n >\n <ReviewValue value={note || labels.empty} labels={labels} />\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/*\n * Widths sit on a block inside each cell: an auto-layout table ignores `max-width` on a cell, so a\n * long file name or answer would otherwise widen its column, or (without wrapping) spill into the\n * next one. The grid scrolls sideways when the columns do not fit.\n */\nconst DOCUMENT_WIDTH = 'w-40 sm:w-56'\nconst VALUE_WIDTH = 'min-w-48 max-w-80'\n\n/** The row's document: its name wraps over two lines at most, the full name on hover. */\nfunction DocumentName({ onClick, children }: { onClick?: () => void; children: string }) {\n const className = `${DOCUMENT_WIDTH} line-clamp-2 break-words text-left font-medium`\n return onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n title={children}\n className={`${className} text-primary hover:underline`}\n >\n {children}\n </button>\n ) : (\n <div title={children} className={className}>\n {children}\n </div>\n )\n}\n\n/** A review value: four lines, then a toggle to read the rest in place. */\nfunction ReviewValue({ value, labels }: { value: string; labels: WorkflowRunnerDialogLabels }) {\n const ref = useRef<HTMLDivElement>(null)\n const [expanded, setExpanded] = useState(false)\n const [clamped, setClamped] = useState(false)\n useLayoutEffect(() => {\n const el = ref.current\n if (el && !expanded) setClamped(el.scrollHeight > el.clientHeight + 1)\n }, [value, expanded])\n return (\n <div className={VALUE_WIDTH}>\n <div\n ref={ref}\n title={clamped && !expanded ? value : undefined}\n className={`whitespace-pre-line break-words ${expanded ? '' : 'line-clamp-4'}`}\n >\n {value}\n </div>\n {(clamped || expanded) && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-1 text-xs font-medium text-primary hover:underline\"\n >\n {expanded ? labels.showLess : labels.showMore}\n </button>\n )}\n </div>\n )\n}\n","/**\n * A stepped workflow run in its work thread, end to end: `useWorkflowThread` keeps the run on the\n * server (the thread's plan, its activity, its turns) and `WorkflowRunner` shows it. Agent answers\n * are the thread's messages; uploads go into the open workspace; a review can notify the people\n * who should approve it, in the run's thread. The host keeps its wording, its commits\n * (`options.commit`) and its finish screen.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AiAnswer, useArbi, useDocuments, useWorkspaceUsers } from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ExternalLink, Loader2, MessageSquare } from 'lucide-react'\nimport {\n WorkflowRunner,\n type WorkflowRunnerFile,\n type WorkflowRunnerProps,\n} from '../agents/workflows/WorkflowRunner'\nimport type { WorkflowRunnerActions } from '../agents/workflows/StepParts'\nimport { WorkflowStepBar } from '../agents/workflows/WorkflowStepBar'\nimport { splitDocRef, stepLevels } from '../agents/workflows/run'\nimport { stepKindOf } from '../agents/workflows/stepKinds'\nimport { stepDocuments } from '../agents/workflows/StepDocuments'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowStepState,\n WorkflowUploadStep,\n} from '../agents/workflows/types'\nimport { useConnection } from './ConnectionProvider'\nimport { useWorkspaceDocs } from './ai'\nimport { useWorkflowThread, type UseWorkflowThreadOptions } from './useWorkflowThread'\nimport { WorkflowRunThread } from './WorkflowRunThread'\nimport type { ChatCitationTarget } from '../chat/chat-page-types'\nimport {\n DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS,\n WorkflowReviewGridDialog,\n WorkflowSignDialog,\n WorkflowWordDialog,\n type WorkflowRunnerDialogLabels,\n} from './WorkflowRunnerDialogs'\n\nexport interface ConnectedWorkflowRunnerLabels {\n notify: string\n /** An agent step's answer, in the thread layout: a link to it in the thread. */\n showInThread: string\n /** The thread layout's panel toggle, when the panel folds (a narrow container). */\n currentStep: string\n /** A finished step whose answer is still being fetched. */\n loadingAnswer: string\n notified: string\n openThread: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS: ConnectedWorkflowRunnerLabels = {\n notify: 'Ask to approve',\n showInThread: 'Show in the thread',\n currentStep: 'Current step',\n notified: 'Notified.',\n openThread: 'Open the thread',\n loadingAnswer: 'Fetching the answer…',\n}\n\nexport interface ConnectedWorkflowRunnerProps extends Omit<\n WorkflowRunnerProps,\n | 'run'\n | 'renderAgentOutput'\n | 'onUpload'\n | 'uploading'\n | 'files'\n | 'onRetryUpload'\n | 'onRemoveUpload'\n | 'renderReview'\n | 'actions'\n | 'nameOfDoc'\n> {\n workflow: WorkflowDefinition\n /** The run's bindings: an existing thread, commits, prompt wording, workflow lookup. */\n options?: UseWorkflowThreadOptions\n /** Open a conversation (the run's thread): the host navigates. */\n onOpenConversation?: (conversationId: string) => void\n /** The muted line an agent step shows before its answer. */\n emptyHint?: (step: WorkflowAgentStep) => string | undefined\n connectedLabels?: Partial<ConnectedWorkflowRunnerLabels>\n /**\n * Open a document (a version: `version`; at a page: `page`, from a citation): the host\n * navigates. Absent: no document links. In the thread layout a citation opens its document with\n * it too, unless `onOpenCitation` is given.\n */\n onOpenDocument?: (documentId: string, version?: number, page?: number) => void\n /**\n * The thread layout's citation open action, as `ChatPage`'s `onOpenCitation` (the cited\n * document, page and passage). Absent: `onOpenDocument`; neither: citations offer no open.\n */\n onOpenCitation?: (target: ChatCitationTarget) => void\n /** Open an email step's draft in native mail (the host's mail screen). Absent: no button. */\n onOpenDraft?: (draftId: string) => void\n /** Show an answer in the run's thread. Absent: no link. */\n onOpenMessage?: (messageId: string) => void\n /**\n * Take over what the runner otherwise opens itself: the sign flow, the Word editor for a\n * tracked-changes version, a tabular review's grid.\n */\n actions?: Pick<WorkflowRunnerActions, 'sign' | 'openRedline' | 'openReview'>\n dialogLabels?: Partial<WorkflowRunnerDialogLabels>\n /**\n * `thread` (default): once the run has its thread, the page is that thread, live (follow-ups,\n * answers with their sources, documents), with the step bar on top and the current step in a\n * compact panel beside it; steps' answers link to their message instead of being repeated.\n * Before the thread exists (the first form), and with `guided`, it is the stepper: one step at\n * a time, each answer shown in full.\n */\n layout?: 'thread' | 'guided'\n /**\n * Which of the workspace's documents an upload step lists (the files \"in this matter\"): the\n * host hides what is not the matter's own, e.g. skill files kept as workspace documents —\n * `(doc) => !(doc.folder ?? '').startsWith('skills')`. Files added on the run's upload steps are\n * always listed. Absent: every document.\n */\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean\n}\n\n/** A workspace document, as `fileFilter` sees it. */\nexport type WorkflowRunnerDocument = NonNullable<ReturnType<typeof useDocuments>['data']>[number]\n\n/** What the runner has open itself. */\ntype OpenDialog =\n | { kind: 'sign'; docRef: string }\n | { kind: 'word'; docRef: string; title: string }\n | { kind: 'review'; tags: string[]; documents: string[] }\n\nexport function ConnectedWorkflowRunner({\n workflow,\n options,\n onOpenConversation,\n emptyHint,\n connectedLabels,\n onOpenDocument,\n onOpenCitation,\n onOpenDraft,\n onOpenMessage,\n actions: hostActions,\n dialogLabels,\n layout = 'thread',\n fileFilter,\n testIdPrefix = 'workflow-run',\n ...runnerProps\n}: ConnectedWorkflowRunnerProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels }\n const dl = { ...DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS, ...dialogLabels }\n const arbi = useArbi()\n const { ensureWorkspaceOpen, user } = useConnection()\n const { wsId } = useWorkspaceDocs()\n const { data: docs = [], refetch } = useDocuments(wsId)\n // The files being sent on the run's upload steps, and those that did not upload (until retried\n // or removed): the step waits for them.\n const [sending, setSending] = useState<PendingUpload[]>([])\n // The files added on each upload step in this run (doc id -> step id), and their names (listed\n // under them before the workspace's documents catch up).\n const [added, setAdded] = useState<Record<string, string>>({})\n const [addedNames, setAddedNames] = useState<Record<string, string>>({})\n const addedRef = useRef(added)\n addedRef.current = added\n const { view, conversationId, people } = useWorkflowThread(workflow, {\n ...options,\n // An upload step records exactly the files added on it (else the server's guess).\n documentsFor:\n options?.documentsFor ??\n ((stepId) =>\n Object.entries(addedRef.current).flatMap(([doc, step]) => (step === stepId ? [doc] : []))),\n })\n const [dialog, setDialog] = useState<OpenDialog | null>(null)\n const inThread = layout === 'thread' && !!conversationId\n // The message the thread scrolls to (a step's answer, picked from the panel).\n const [target, setTarget] = useState<string | undefined>(undefined)\n const nameOfDoc = useCallback(\n (id: string) => docs.find((d) => d.external_id === id)?.file_name ?? undefined,\n [docs]\n )\n const actions = useMemo<WorkflowRunnerActions>(\n () => ({\n me: user?.externalId,\n openDocument:\n onOpenDocument &&\n ((ref) => {\n const { id, version } = splitDocRef(ref)\n onOpenDocument(id, version)\n }),\n openDraft: onOpenDraft && ((draftId) => onOpenDraft(draftId)),\n // In the thread layout an answer is right there: scroll to it.\n openMessage: inThread ? setTarget : onOpenMessage,\n sign:\n hostActions?.sign ??\n ((_step, state) => {\n const w = state.waiting\n if (w?.doc_ext_id) setDialog({ kind: 'sign', docRef: w.doc_ext_id })\n }),\n openRedline:\n hostActions?.openRedline ??\n ((ref) =>\n setDialog({ kind: 'word', docRef: ref, title: nameOfDoc(splitDocRef(ref).id) ?? '' })),\n openReview:\n hostActions?.openReview ??\n ((tags, documents) => setDialog({ kind: 'review', tags, documents })),\n }),\n [user?.externalId, onOpenDocument, onOpenDraft, onOpenMessage, hostActions, nameOfDoc, inThread]\n )\n\n // A citation in the thread opens its document as the regular chat does (the host's handler).\n const openCitation = useMemo<((target: ChatCitationTarget) => void) | undefined>(\n () =>\n onOpenCitation ??\n (onOpenDocument &&\n ((t) => {\n const docId = t.documentId ?? t.passage?.documentId\n if (docId) onOpenDocument(docId, undefined, t.page ?? t.passage?.page ?? undefined)\n })),\n [onOpenCitation, onOpenDocument]\n )\n\n const uploadSeq = useRef(0)\n const sendingRef = useRef(sending)\n sendingRef.current = sending\n // Send these files for a step, one after another; one that fails stays listed with its error.\n const send = useCallback(\n async (batch: PendingUpload[]) => {\n if (!batch.length) return\n const keys = new Set(batch.map((p) => p.key))\n const mark = (key: string, patch: Partial<PendingUpload> | null) =>\n setSending((all) =>\n patch === null\n ? all.filter((p) => p.key !== key)\n : all.map((p) => (p.key === key ? { ...p, ...patch } : p))\n )\n setSending((all) => [\n ...all.filter((p) => !keys.has(p.key)),\n ...batch.map((p) => ({ ...p, status: 'uploading' as const, error: undefined })),\n ])\n try {\n // The server resolves the target workspace from the session: make sure it is open.\n await ensureWorkspaceOpen()\n } catch (e) {\n for (const p of batch) mark(p.key, { status: 'failed', error: uploadError(e) })\n return\n }\n for (const p of batch) {\n try {\n const { doc_ext_ids = [] } = (await arbi.documents.uploadFile(p.file, p.file.name)) ?? {}\n if (!doc_ext_ids.length) throw new Error('No document came back')\n setAdded((a) => ({\n ...a,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.stepId])),\n }))\n setAddedNames((n) => ({\n ...n,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.file.name])),\n }))\n mark(p.key, null)\n } catch (e) {\n mark(p.key, { status: 'failed', error: uploadError(e) })\n }\n }\n await refetch()\n },\n [arbi, ensureWorkspaceOpen, refetch]\n )\n const onUpload = useCallback(\n (files: File[], step: WorkflowUploadStep) =>\n send(\n files.map((file) => ({\n key: `upload-${++uploadSeq.current}`,\n file,\n stepId: step.id,\n status: 'uploading' as const,\n }))\n ),\n [send]\n )\n const onRetryUpload = useCallback(\n (file: WorkflowRunnerFile) => {\n const p = sendingRef.current.find((x) => x.key === file.id)\n if (p) void send([p])\n },\n [send]\n )\n const onRemoveUpload = useCallback(\n (file: WorkflowRunnerFile) => setSending((all) => all.filter((p) => p.key !== file.id)),\n []\n )\n\n const files = [\n ...sending.map<WorkflowRunnerFile>((p) => ({\n id: p.key,\n name: p.file.name,\n status: p.status === 'failed' ? 'upload-failed' : 'uploading',\n error: p.error,\n addedFor: p.stepId,\n })),\n ...runnerFiles(docs, added, fileFilter, addedNames),\n ]\n // Watch the files just added until they are read (the step waits for them).\n const reading = files.some((f) => f.addedFor && f.status === 'processing')\n useEffect(() => {\n if (!reading) return\n const t = setInterval(() => void refetch(), READ_POLL_MS)\n return () => clearInterval(t)\n }, [reading, refetch])\n\n const renderAgentOutput = (step: WorkflowAgentStep, state: WorkflowStepState | undefined) => {\n const status = state?.status\n // Beside the thread an answer is not repeated: it links to its message.\n if (inThread) {\n const id = state?.responseId\n return id && status === 'done' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setTarget(id)}\n data-testid={`${testIdPrefix}-${step.id}-show-in-thread`}\n >\n <MessageSquare className=\"size-4\" /> {l.showInThread}\n </Button>\n ) : null\n }\n if (!state?.text && status !== 'done') return null\n // Finished, its answer not read yet (the thread is fetched again until it is).\n if (!state?.text && state?.responseId) {\n return (\n <p\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-${step.id}-answer-loading`}\n >\n <Loader2 className=\"size-4 animate-spin\" /> {l.loadingAnswer}\n </p>\n )\n }\n return (\n <AiAnswer\n status={status === 'running' ? 'running' : 'done'}\n text={state?.text ?? ''}\n emptyHint={emptyHint?.(step)}\n testId={`${testIdPrefix}-${step.id}-answer`}\n />\n )\n }\n\n const runner = (compact: boolean) => (\n <WorkflowRunner\n people={people}\n {...runnerProps}\n workflow={workflow}\n run={view}\n renderAgentOutput={renderAgentOutput}\n renderReview={(step) =>\n conversationId ? (\n <ReviewNotify\n conversationId={conversationId}\n workspaceId={wsId}\n labels={l}\n testId={`${testIdPrefix}-${step.id}`}\n />\n ) : null\n }\n onUpload={onUpload}\n uploading={sending.some((p) => p.status === 'uploading')}\n files={files}\n onRetryUpload={onRetryUpload}\n onRemoveUpload={onRemoveUpload}\n actions={actions}\n nameOfDoc={nameOfDoc}\n testIdPrefix={testIdPrefix}\n hideStepBar={compact}\n compact={compact}\n className={compact ? undefined : runnerProps.className}\n />\n )\n\n return (\n <div className=\"space-y-3\">\n {conversationId && onOpenConversation && (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenConversation(conversationId)}\n data-testid={`${testIdPrefix}-open-thread`}\n >\n <ExternalLink className=\"size-4\" /> {l.openThread}\n </Button>\n </div>\n )}\n {inThread && conversationId ? (\n <>\n <WorkflowStepBar\n run={view}\n levels={stepLevels(view.steps)}\n doneTitle={\n (workflow.run.kind === 'steps' ? workflow.run.completion?.title : undefined) ??\n runnerProps.labels?.complete ??\n 'Done'\n }\n icon={(key) =>\n key && runnerProps.renderIcon ? runnerProps.renderIcon(key) : undefined\n }\n tid={(suffix) => `${testIdPrefix}-${suffix}`}\n />\n <WorkflowRunThread\n conversationId={conversationId}\n workspaceId={wsId}\n stepOf={(id) => {\n const step = view.steps.find((s) => s.id === id)\n if (!step) return undefined\n // Its document, one click from its chip: the latest version, in the host's viewer\n // (else the Word dialog).\n const states = Object.fromEntries(\n view.steps.flatMap((s) => {\n const state = view.stateOf(s.id)\n return state ? [[s.id, state]] : []\n })\n )\n const ref = stepDocuments(view.steps, states, id).at(-1)\n const open = actions.openDocument ?? actions.openRedline\n return {\n title: step.title,\n kind: stepKindOf(step),\n phase: view.phaseOf(id),\n document:\n ref && open\n ? { name: nameOfDoc(splitDocRef(ref).id) ?? ref, onOpen: () => open(ref) }\n : undefined,\n }\n }}\n targetMessageId={target}\n onOpenCitation={openCitation}\n labels={{ workflows: l.currentStep }}\n aside={runner(true)}\n />\n </>\n ) : (\n runner(false)\n )}\n {dialog?.kind === 'sign' && (\n <WorkflowSignDialog docRef={dialog.docRef} onClose={() => setDialog(null)} labels={dl} />\n )}\n {dialog?.kind === 'word' && (\n <WorkflowWordDialog\n docRef={dialog.docRef}\n title={dialog.title || undefined}\n onClose={() => setDialog(null)}\n labels={dl}\n />\n )}\n {dialog?.kind === 'review' && (\n <WorkflowReviewGridDialog\n tags={dialog.tags}\n documents={dialog.documents}\n onClose={() => setDialog(null)}\n onOpenDocument={onOpenDocument && ((id) => onOpenDocument(id))}\n labels={dl}\n />\n )}\n </div>\n )\n}\n\nconst READ_POLL_MS = 3000\n\n/** A file being sent on an upload step, or one that did not upload (`error`). */\ninterface PendingUpload {\n key: string\n file: File\n stepId: string\n status: 'uploading' | 'failed'\n error?: string\n}\n\nfunction uploadError(e: unknown): string {\n return e instanceof Error && e.message ? e.message : String(e || 'Upload failed')\n}\n\n/**\n * The upload step's files: the workspace's documents the host's `fileFilter` keeps, plus every\n * file added on one of the run's upload steps (`added`: doc id -> step id), which the step waits on.\n * A file added that the workspace does not list yet is shown as being read (`names` gives its name).\n */\nexport function runnerFiles(\n docs: WorkflowRunnerDocument[],\n added: Record<string, string>,\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean,\n names: Record<string, string> = {}\n): WorkflowRunnerFile[] {\n const listed = new Set(docs.map((d) => d.external_id))\n return [\n ...docs\n .filter((d) => !fileFilter || added[d.external_id] || fileFilter(d))\n .map((d) => ({\n id: d.external_id,\n name: d.file_name ?? d.external_id,\n status: fileStatus(d.status),\n addedFor: added[d.external_id],\n })),\n ...Object.entries(added)\n .filter(([id]) => !listed.has(id))\n .map(([id, stepId]) => ({\n id,\n name: names[id] ?? id,\n status: 'processing' as const,\n addedFor: stepId,\n })),\n ]\n}\n\n/** A document's processing status as the upload step shows it; unknown stays unknown. */\nexport function fileStatus(status: string | null | undefined): WorkflowRunnerFile['status'] {\n const s = status?.toLowerCase()\n if (!s) return undefined\n if (s === 'failed') return 'failed'\n if (s === 'completed' || s === 'empty' || s === 'low-content') return 'ready'\n return 'processing'\n}\n\n/** Who should approve: the workspace's people (not agents), notified about the run's thread. */\nfunction ReviewNotify({\n conversationId,\n workspaceId,\n labels,\n testId,\n}: {\n conversationId: string\n workspaceId: string | undefined\n labels: ConnectedWorkflowRunnerLabels\n testId: string\n}) {\n const arbi = useArbi()\n const { status, user, ensureWorkspaceOpen } = useConnection()\n const { data: members = [] } = useWorkspaceUsers(workspaceId, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const people = members.filter(\n (m) =>\n !m.agent_ext_id &&\n !m.user.external_id.startsWith('agt-') &&\n m.user.external_id !== user?.externalId\n )\n const [picked, setPicked] = useState<string[]>([])\n const [sent, setSent] = useState(false)\n const [busy, setBusy] = useState(false)\n if (people.length === 0) return null\n const toggle = (id: string) =>\n setPicked((p) => (p.includes(id) ? p.filter((x) => x !== id) : [...p, id]))\n\n return (\n <div className=\"space-y-3\" data-testid={`${testId}-notify`}>\n <div className=\"flex flex-wrap gap-1.5\">\n {people.map((m) => {\n const name =\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email\n const on = picked.includes(m.user.external_id)\n return (\n <button\n key={m.user.external_id}\n type=\"button\"\n onClick={() => toggle(m.user.external_id)}\n aria-pressed={on}\n className={cn(\n 'rounded-full border px-2.5 py-1 text-xs',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground'\n )}\n data-testid={`${testId}-person-${m.user.external_id}`}\n >\n {name}\n </button>\n )\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={!picked.length || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await arbi.conversations.notify(conversationId, picked)\n setSent(true)\n } finally {\n setBusy(false)\n }\n }}\n data-testid={`${testId}-notify-send`}\n >\n {labels.notify}\n </Button>\n {sent && <span className=\"text-xs text-muted-foreground\">{labels.notified}</span>}\n </div>\n </div>\n )\n}\n","/**\n * `TagTable` bound to the connection: every tag of a kind in the workspace (`kind=\"issue\"`: every\n * issue), or with `parentId` a label's children. The columns are the kind's fields in the\n * workspace (`useTagKindSchema`), edited in place and saved as the kind's schema\n * (`useUpdateTagKindSchema`); the rows are the tag list filtered by kind with links (`useTags`),\n * their cells saved with `useSetTagValues`. \"Add row\" creates a tag of the kind (issues, people\n * and organisations are flat: no parent). The workspace's people fill person columns, and the\n * snapshot is filed in the workspace as a Word document (`.docx`, so it opens in the Word editor;\n * its id goes to `onExported`, so a host can open it or send it for signature) or downloaded.\n */\n\nimport { useMemo, useState } from 'react'\nimport type { components } from '@arbidocs/client'\nimport {\n useArbi,\n useInvalidateTagData,\n useSetTagValues,\n useTagKindSchema,\n useTags,\n useUpdateTagKindSchema,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { TagTable, type TagTableProps } from '../tags/TagTable'\nimport { DOCX_MIME_TYPE, tagTableDocx } from '../tags/tagTableDocx'\nimport type { TagTableData } from '../tags/tagTableModel'\nimport { useConnection } from './ConnectionProvider'\n\n/** What a tag is: a label, annotation, search, issue, person or organisation. */\ntype TagKind = NonNullable<components['schemas']['TagResponse']['kind']>\n\n/** Kinds that are flat: their tags have no parent. */\nconst FLAT_KINDS: readonly TagKind[] = ['issue', 'person', 'organisation']\n\n/** The title of a table of a kind (its export's default title). */\nconst KIND_TITLES: Record<TagKind, string> = {\n label: 'Labels',\n annotation: 'Annotations',\n search: 'Searches',\n issue: 'Issues',\n person: 'People',\n organisation: 'Organisations',\n}\n\nexport interface ConnectedTagTableProps extends Pick<\n TagTableProps,\n | 'onOpenDocument'\n | 'onOpenFact'\n | 'onOpenThread'\n | 'onOpenRow'\n | 'actions'\n | 'labels'\n | 'className'\n | 'testId'\n> {\n /** The rows are the workspace's tags of this kind, oldest first; the columns its fields. */\n kind: TagKind\n /** Only this tag's children (a label hierarchy; flat kinds have none). */\n parentId?: string\n /** How many documents, facts and threads each row lists (the rest are counted). Default 3. */\n linksLimit?: number\n /** The exported document's title; default the kind's (\"Issues\", \"People\", …). */\n exportTitle?: string\n /** The snapshot was filed: its document id. Absent: no export button. */\n onExported?: (documentId: string) => void\n /** Offer the snapshot as a `.docx` download. Default true. */\n downloadable?: boolean\n /** Read only: no cell edits, no \"Add row\", no column changes. */\n readOnly?: boolean\n}\n\nexport function ConnectedTagTable({\n kind,\n parentId,\n linksLimit = 3,\n exportTitle,\n onExported,\n downloadable = true,\n readOnly,\n ...props\n}: ConnectedTagTableProps) {\n const arbi = useArbi()\n const { workspaceId, status, ensureWorkspaceOpen } = useConnection()\n const schema = useTagKindSchema(kind)\n const rows = useTags(workspaceId ?? undefined, {\n kind,\n ...(parentId ? { parentId } : {}),\n include: ['links'],\n linksLimit,\n })\n // An annotation or a search is defined with its format, not added by name.\n const canAddRows = !readOnly && kind !== 'annotation' && kind !== 'search'\n const setValues = useSetTagValues()\n const updateSchema = useUpdateTagKindSchema()\n const invalidate = useInvalidateTagData()\n const members = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const [error, setError] = useState<string | null>(null)\n const people = (members.data ?? []).map((m) => ({\n value: m.user.external_id,\n label: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n }))\n const table: TagTableData | undefined = useMemo(\n () => (schema.data && rows.data ? { columns: schema.data.fields, rows: rows.data } : undefined),\n [schema.data, rows.data]\n )\n const fail = (e: unknown) => setError(e instanceof Error ? e.message : String(e))\n /** The snapshot as a Word file named `<title> (<date>).docx`. */\n const snapshot = (data: TagTableData) => {\n const title = exportTitle ?? KIND_TITLES[kind]\n const bytes = tagTableDocx(data, {\n title,\n nameOf: (id) => people.find((p) => p.value === id)?.label,\n })\n const stamp = new Date().toISOString().slice(0, 10)\n const name = `${title.replace(/[\\\\/:*?\"<>|]+/g, '-')} (${stamp}).docx`\n return { blob: new Blob([bytes as BlobPart], { type: DOCX_MIME_TYPE }), name }\n }\n\n return (\n <div className=\"space-y-2\">\n <TagTable\n {...props}\n table={table}\n isLoading={schema.isLoading || rows.isLoading}\n people={people}\n onChangeValue={\n readOnly\n ? undefined\n : async (tagId, fieldId, value) => {\n setError(null)\n await setValues.mutateAsync({ tagId, values: { [fieldId]: value } }).catch(fail)\n }\n }\n onChangeColumns={\n readOnly\n ? undefined\n : async (fields) => {\n setError(null)\n await ensureWorkspaceOpen()\n // A refusal (two columns of one name, a type change) stays on screen.\n await updateSchema.mutateAsync({ kind, fields }).catch((e: unknown) => {\n fail(e)\n throw e\n })\n }\n }\n onAddRow={\n !canAddRows\n ? undefined\n : async (name) => {\n setError(null)\n try {\n await ensureWorkspaceOpen()\n await arbi.tags.create({\n name,\n kind,\n ...(parentId && !FLAT_KINDS.includes(kind) ? { parentId } : {}),\n })\n await invalidate()\n } catch (e) {\n fail(e)\n }\n }\n }\n onExport={\n onExported && table\n ? async () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n await ensureWorkspaceOpen()\n const uploaded = await arbi.documents.uploadFile(blob, name)\n const id = uploaded?.doc_ext_ids?.[0]\n if (id) onExported(id)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n onDownload={\n downloadable && table\n ? () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n document.body.appendChild(link)\n link.click()\n link.remove()\n // Revoke after the click is handled: some browsers cancel the download otherwise.\n setTimeout(() => URL.revokeObjectURL(url), 0)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n />\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import {\n useShellWorkspaces,\n useWorkspaces,\n type ShellWorkspaceSource,\n type UseShellWorkspacesOptions,\n type UseShellWorkspacesResult,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type UseConnectedShellWorkspacesOptions = Omit<\n UseShellWorkspacesOptions,\n 'workspaces' | 'isLoading' | 'loadError' | 'selectedId' | 'select'\n>\n\n/**\n * `useShellWorkspaces` wired to the connection layer: the account's live workspaces, the\n * connection's single selection as the active workspace, and `open` = `setWorkspace` (opens it on\n * the server, remembers it for the next login) then `onOpened`.\n *\n * ```tsx\n * const { active, recent, open } = useConnectedShellWorkspaces({\n * seed: { workspaces: demoWorkspaces, activeId: 'demo-1' },\n * onOpened: () => navigate('/app/documents'),\n * })\n * ```\n */\nexport function useConnectedShellWorkspaces(\n options: UseConnectedShellWorkspacesOptions = {}\n): UseShellWorkspacesResult {\n const { workspaceId, setWorkspace } = useConnection()\n const query = useWorkspaces()\n return useShellWorkspaces({\n ...options,\n workspaces: Array.isArray(query.data) ? (query.data as ShellWorkspaceSource[]) : undefined,\n isLoading: query.isLoading,\n loadError: query.error,\n selectedId: workspaceId,\n select: (workspace) => setWorkspace(workspace.id),\n })\n}\n","/**\n * The account area of a settings page, bound to the ARBI SDK: each section is a blocks part wired\n * to its `@arbidocs/react` hook, so a host drops them in a `SettingsPanel` and owns only the\n * layout (see the \"Settings page recipe\" in docs/design/blocks-package.md).\n *\n * Every section toasts and confirms through the blocks environment (`useBlocksEnvironment`) and\n * renders the default test ids of its part. Anything the hooks cannot know (the recovery-key download, the billing link of a blocked\n * deletion, the password policy) is a prop.\n *\n * The hooks talk to the account client in scope (`useAccountClient` from `@arbidocs/react`):\n * `ConnectionProvider` provides one over the SDK; a host with its own session and API client\n * mounts its own `AccountClientProvider` (as ARBI-frontend does), and these sections work alike.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n ImageCropModal,\n useAvatarCrop,\n useConfirmEmailChange,\n useCurrentSessionId,\n useDeleteAccount,\n useDeleteAccountFlow,\n useEmailChange,\n useIdentityVerification,\n useNameEditor,\n useNotificationPreferences,\n usePasswordChange,\n usePasswordChangeForm,\n useProfile,\n useRequestEmailChange,\n useSessions,\n useSignOut,\n useTerminateSession,\n useUpdateProfile,\n type AvatarFileProblem,\n} from '@arbidocs/react'\nimport { useIsOnline } from '@arbidocs/react/document-tools'\nimport { Button, type IdentityStatus } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { AvatarPicker } from '../settings/AvatarPicker'\nimport { ProfileCard } from '../settings/ProfileCard'\nimport {\n IdentityVerificationCard,\n IdentityVerificationDialog,\n RequireVerified,\n type IdentityVerificationLabels,\n} from '../settings/IdentityVerification'\nimport {\n SettingsActionRow,\n SettingsCard,\n SettingsDangerZone,\n SettingsRow,\n SettingsSection,\n} from '../settings/SettingsPanel'\nimport { PasswordChangeDialog } from '../settings/PasswordChangeDialog'\nimport { ActiveSessionsDialog, DeleteAccountDialog } from '../settings/AccountDialogs'\nimport { LogoutDialog } from '../settings/LogoutDialog'\nimport { NotificationCategoryList } from '../settings/NotificationCategoryList'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport {\n EMAIL_NOTIFICATION_CATEGORIES,\n EMAIL_NOTIFICATION_KEYS,\n toActiveSessionViews,\n toDeleteBlockerViews,\n toLogoutSessionViews,\n toNotificationCategories,\n type EmailNotificationCategoryDef,\n} from '../settings/account-views'\n\n/** The error text of a failed call: the backend `detail` when it sent one. */\nfunction errorText(error: unknown, fallback: string): string {\n const body = (error as { apiError?: { detail?: unknown } } | null)?.apiError\n return typeof body?.detail === 'string' ? body.detail : fallback\n}\n\nconst AVATAR_PROBLEMS: Record<AvatarFileProblem, string> = {\n 'not-image': 'Please choose an image file',\n 'too-large': 'Image must be 5 MB or smaller',\n unreadable: \"Couldn't read that image — try a different file\",\n}\n\n// ── Profile ─────────────────────────────────────────────────────────────────\n\nexport interface ConnectedProfileCardProps {\n /** Section heading; default `Profile`. */\n title?: ReactNode\n /** Classes of the initials avatar shown without a picture (e.g. the host's per-user colour). */\n avatarClassName?: string\n /** More of the section under the card (e.g. `ConnectedIdentityVerification`). */\n children?: ReactNode\n}\n\n/** Avatar, editable name and email change of the signed-in user (`ProfileCard`). */\nexport function ConnectedProfileCard({\n title = 'Profile',\n avatarClassName = 'bg-primary text-primary-foreground',\n children,\n}: ConnectedProfileCardProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const updateProfile = useUpdateProfile()\n const requestEmailChange = useRequestEmailChange()\n const confirmEmailChange = useConfirmEmailChange()\n\n const name = useNameEditor({\n givenName: profile?.givenName,\n familyName: profile?.familyName,\n save: async (next) => {\n try {\n await updateProfile.mutateAsync(next)\n notify('Name updated', 'success')\n } catch (e) {\n notify('Failed to update name', 'error')\n throw e\n }\n },\n })\n const avatar = useAvatarCrop({\n upload: async (picture) => {\n try {\n await updateProfile.mutateAsync({ picture })\n notify('Profile picture updated', 'success')\n } catch (e) {\n notify('Failed to update picture', 'error')\n throw e\n }\n },\n onProblem: (problem) => notify(AVATAR_PROBLEMS[problem], 'error'),\n })\n const email = useEmailChange({\n requestCode: async (address) => {\n try {\n await requestEmailChange.mutateAsync(address)\n notify('Verification code sent to your new email', 'success')\n } catch (e) {\n notify(errorText(e, 'Failed to send verification code'), 'error')\n throw e\n }\n },\n confirm: async (args) => {\n try {\n await confirmEmailChange.mutateAsync(args)\n notify('Email address updated', 'success')\n } catch (e) {\n notify(errorText(e, 'Invalid or expired verification code'), 'error')\n throw e\n }\n },\n })\n\n const display = profile?.fullName || 'Unnamed'\n return (\n <SettingsSection icon={<UserCircle />} title={title}>\n <ProfileCard\n avatar={\n <>\n <AvatarPicker\n pictureUrl={profile?.picture}\n initials={initials(display)}\n fallbackClassName={avatarClassName}\n isUploading={avatar.isUploading}\n onFileChosen={avatar.onFileChosen}\n />\n <ImageCropModal\n open={avatar.pendingImage !== null}\n image={avatar.pendingImage}\n title=\"Crop your photo\"\n aspect={1}\n cropShape=\"round\"\n output={{ maxSize: 128, mimeType: 'image/jpeg', quality: 0.85 }}\n onComplete={avatar.onCropComplete}\n onCancel={avatar.onCropCancel}\n />\n </>\n }\n name={{ ...name, display, isSaving: name.isSaving }}\n email={profile?.email ?? ''}\n isSso={profile?.isSso ?? false}\n isVerified={profile?.isIdentityVerified ?? false}\n onStartEmailChange={email.onStart}\n emailChange={email.isOpen ? email : undefined}\n />\n {children}\n </SettingsSection>\n )\n}\n\n// ── Identity verification ───────────────────────────────────────────────────\n\nexport interface ConnectedIdentityVerificationProps {\n labels?: Partial<IdentityVerificationLabels>\n /** Open the host's billing (card, plan) when the fee cannot be charged. */\n onManageBilling?: () => void\n /** The host's price format; default `formatIdentityPrice`. */\n formatPrice?: (status: IdentityStatus) => string\n}\n\n/** The ID check card and its dialog, bound to the account. Renders nothing when not offered. */\nexport function ConnectedIdentityVerification({\n labels,\n onManageBilling,\n formatPrice,\n}: ConnectedIdentityVerificationProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const flow = useIdentityVerification({\n formatPrice,\n onVerifiedChange: (verified) =>\n notify(verified ? 'Identity verified' : 'Verified tick removed', 'success'),\n onNameAccepted: () => notify('Name updated to match your ID', 'success'),\n })\n return (\n <>\n <IdentityVerificationCard flow={flow} labels={labels} onManageBilling={onManageBilling} />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n onManageBilling={onManageBilling}\n />\n </>\n )\n}\n\nexport interface ConnectedRequireVerifiedProps {\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** `RequireVerified` bound to the SDK: gates `children` when the deployment requires an ID check. */\nexport function ConnectedRequireVerified({ children, labels }: ConnectedRequireVerifiedProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification()\n return (\n <RequireVerified flow={flow} accountName={profile?.fullName ?? ''} labels={labels}>\n {children}\n </RequireVerified>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\n/** The default password policy: 8 characters, an uppercase letter or symbol, a digit. */\nexport function defaultUnmetPasswordRequirement(password: string): string | null {\n if (password.length < 8) return 'Minimum 8 characters'\n if (!/[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n return 'At least one uppercase letter or special character'\n }\n if (!/[0-9]/.test(password)) return 'At least one number'\n return null\n}\n\nexport interface ConnectedPasswordChangeDialogProps {\n open: boolean\n onClose: () => void\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** After signing in with a recovery key: set a new password, no current one asked for. */\n recoveryMode?: boolean\n /** Recovery finished: continue into the app (recovery closes itself, with no success screen). */\n onRecoveryComplete?: () => void\n}\n\n/** Change (or, in recovery mode, set) the master password (`PasswordChangeDialog`). */\nexport function ConnectedPasswordChangeDialog({\n open,\n onClose,\n getUnmetRequirement = defaultUnmetPasswordRequirement,\n recoveryMode = false,\n onRecoveryComplete,\n}: ConnectedPasswordChangeDialogProps) {\n const { notify } = useBlocksEnvironment()\n const change = usePasswordChange()\n const form = usePasswordChangeForm({\n recoveryMode,\n getUnmetRequirement,\n submit: async (vars) => {\n await change.mutateAsync(vars)\n notify(\n recoveryMode\n ? 'Account recovered and password set successfully'\n : 'Password changed successfully',\n 'success'\n )\n },\n onClose,\n onRecoveryComplete,\n })\n return (\n <PasswordChangeDialog\n open={open}\n onClose={form.onCancel}\n recoveryMode={recoveryMode}\n currentPassword={form.currentPassword}\n onCurrentPasswordChange={form.onCurrentPasswordChange}\n newPassword={form.newPassword}\n onNewPasswordChange={form.onNewPasswordChange}\n confirmPassword={form.confirmPassword}\n onConfirmPasswordChange={form.onConfirmPasswordChange}\n getUnmetRequirement={getUnmetRequirement}\n error={form.error}\n isProcessing={form.isProcessing}\n isSubmitDisabled={form.isSubmitDisabled}\n onSubmit={form.onSubmit}\n isChanged={form.isChanged}\n onDone={form.onDone}\n />\n )\n}\n\nexport interface ConnectedSecuritySectionProps {\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** Extra rows under \"Change password\" (e.g. \"Save recovery key\"). */\n children?: ReactNode\n}\n\n/** The Security card: \"Change password\" and the dialog behind it. */\nexport function ConnectedSecuritySection({\n getUnmetRequirement,\n children,\n}: ConnectedSecuritySectionProps) {\n const [open, setOpen] = useState(false)\n return (\n <SettingsSection icon={<KeyRound />} title=\"Security\">\n <SettingsCard padding=\"sm\">\n <SettingsActionRow\n title=\"Change password\"\n description=\"Used to sign in and to unlock your account key. Changing it keeps everything readable and re-encrypts nothing.\"\n onClick={() => setOpen(true)}\n testId=\"change-password-button\"\n />\n {children}\n </SettingsCard>\n <ConnectedPasswordChangeDialog\n open={open}\n onClose={() => setOpen(false)}\n getUnmetRequirement={getUnmetRequirement}\n />\n </SettingsSection>\n )\n}\n\n// ── Notifications ───────────────────────────────────────────────────────────\n\nexport interface ConnectedNotificationPreferencesProps {\n /** Categories to offer; default {@link EMAIL_NOTIFICATION_CATEGORIES}. */\n categories?: readonly EmailNotificationCategoryDef[]\n title?: ReactNode\n}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\n title = 'Notifications',\n}: ConnectedNotificationPreferencesProps) {\n const keys = useMemo(\n () =>\n categories === EMAIL_NOTIFICATION_CATEGORIES\n ? EMAIL_NOTIFICATION_KEYS\n : categories.map((c) => c.key),\n [categories]\n )\n const prefs = useNotificationPreferences(keys)\n return (\n <SettingsSection title={title}>\n <SettingsCard className=\"space-y-0\">\n <NotificationCategoryList\n masterId=\"emailNotifications\"\n masterTitle=\"Email Notifications\"\n masterDescription=\"Email me about activity when I’m away\"\n masterChecked={prefs.masterChecked}\n onMasterChange={prefs.setAll}\n categories={toNotificationCategories(prefs.checked, categories)}\n onCategoryChange={prefs.setCategory}\n />\n </SettingsCard>\n </SettingsSection>\n )\n}\n\n// ── Sessions ────────────────────────────────────────────────────────────────\n\nexport interface ConnectedSessionsRowProps {\n /** Glyph per session status. */\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** \"Active sessions\" row with the manage dialog (`ActiveSessionsDialog`); end any but this device. */\nexport function ConnectedSessionsRow({ renderSessionIcon }: ConnectedSessionsRowProps) {\n const { notify, confirm } = useBlocksEnvironment()\n const [open, setOpen] = useState(false)\n const sessions = useSessions({ enabled: open })\n const currentSessionId = useCurrentSessionId()\n const terminate = useTerminateSession()\n const views = toActiveSessionViews(sessions.data ?? [], {\n currentSessionId,\n terminatingId: terminate.isPending ? terminate.variables : null,\n renderIcon: renderSessionIcon,\n })\n return (\n <>\n <SettingsRow\n label=\"Active sessions\"\n description=\"Devices and agents currently signed in to your account.\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className=\"flex items-center gap-2\"\n data-testid=\"active-sessions-button\"\n >\n <Radio className=\"h-4 w-4\" />\n Manage\n </Button>\n </SettingsRow>\n <ActiveSessionsDialog\n open={open}\n onOpenChange={setOpen}\n isLoading={sessions.isLoading}\n sessions={views}\n onTerminate={(id) => {\n void (async () => {\n const view = views.find((v) => v.id === id)\n const label = view?.detail.split(' · ')[0]\n const ok = await confirm({\n title: 'End session',\n message: `End the session on ${label}? It will be signed out immediately.`,\n })\n if (!ok) return\n try {\n await terminate.mutateAsync(id)\n } catch {\n notify('Failed to end session. Please try again.', 'error')\n }\n })()\n }}\n />\n </>\n )\n}\n\nexport interface ConnectedLogoutDialogProps {\n open: boolean\n onClose: () => void\n /** Offer \"All sessions\"; default true (e.g. false for agent accounts). */\n canLogoutAll?: boolean\n /**\n * Ask before signing out (e.g. unsent work kept only on this device); resolve `false` to stay\n * signed in. Default: sign out at once.\n */\n confirmSignOut?: () => Promise<boolean> | boolean\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/**\n * Sign out of this device or all devices (`LogoutDialog`), listing the active sessions. \"All\n * sessions\" must reach the server, so it is disabled offline; \"This session\" always works.\n */\nexport function ConnectedLogoutDialog({\n open,\n onClose,\n canLogoutAll = true,\n confirmSignOut,\n renderSessionIcon,\n}: ConnectedLogoutDialogProps) {\n const sessions = useSessions({ enabled: open })\n const signOut = useSignOut()\n const isOnline = useIsOnline()\n const run = async (everywhere: boolean) => {\n onClose()\n if (confirmSignOut && !(await confirmSignOut())) return\n signOut.mutate({ everywhere, reason: 'manual' })\n }\n return (\n <LogoutDialog\n open={open}\n onClose={onClose}\n onLogoutThis={() => void run(false)}\n onLogoutAll={() => void run(true)}\n canLogoutAll={canLogoutAll}\n isOnline={isOnline}\n sessions={toLogoutSessionViews(sessions.data ?? [])}\n renderSessionIcon={renderSessionIcon}\n />\n )\n}\n\n// ── Danger zone ─────────────────────────────────────────────────────────────\n\nexport interface ConnectedDangerZoneProps {\n /** Link to the billing page for a deletion blocked by an active subscription. */\n renderSubscriptionLink?: () => ReactNode\n}\n\n/** \"Delete your account\": the collapsed danger zone and the two-step dialog (`DeleteAccountDialog`). */\nexport function ConnectedDangerZone({ renderSubscriptionLink }: ConnectedDangerZoneProps) {\n const { notify } = useBlocksEnvironment()\n const [zoneOpen, setZoneOpen] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const { data: profile } = useProfile()\n const userEmail = profile?.email ?? ''\n const remove = useDeleteAccount()\n const signOut = useSignOut()\n const flow = useDeleteAccountFlow({\n userEmail,\n remove: () => remove.mutateAsync(),\n onClose: () => setDialogOpen(false),\n onDeleted: () => signOut.mutate({ reason: 'account-deleted' }),\n onError: () => notify('Failed to delete account. Please try again.', 'error'),\n })\n return (\n <>\n <SettingsDangerZone\n isOpen={zoneOpen}\n onToggle={() => setZoneOpen((o) => !o)}\n title=\"Delete your account\"\n description=\"Once deleted, your account will be immediately closed and you will be logged out. This action cannot be undone.\"\n action={\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={!userEmail}\n onClick={() => setDialogOpen(true)}\n data-testid=\"delete-account-button\"\n >\n Delete Account\n </Button>\n }\n />\n <DeleteAccountDialog\n open={dialogOpen}\n onClose={flow.onClose}\n step={flow.step}\n blockers={toDeleteBlockerViews(flow.blockers, renderSubscriptionLink)}\n onContinue={flow.onContinue}\n onBack={flow.onBack}\n userEmail={userEmail}\n confirmEmail={flow.confirmEmail}\n onConfirmEmailChange={flow.onConfirmEmailChange}\n isDeleting={flow.isDeleting}\n onSubmit={flow.onSubmit}\n />\n </>\n )\n}\n","import { useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, useArbiWebSocket } from '@arbidocs/react'\nimport { useNotify, type AppNotification } from '@arbidocs/react/shell'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/** Bridge persisted document mentions to the shared bell; hosts own routing. */\nexport function useConnectedDocxNotifications(\n onOpen: (target: {\n workspaceId: string\n documentId: string\n commentId: string\n }) => void | Promise<void>\n) {\n const arbi = useArbi()\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const queries = useQueryClient()\n const source = `docx-mentions:${apiUrl}:${user?.externalId || ''}`\n const queryKey = ['docx-mentions', apiUrl, user?.externalId]\n const { data = [] } = useQuery({\n queryKey,\n queryFn: () => arbi.notifications.list('docx_mention'),\n enabled: status === 'authenticated',\n refetchInterval: 30_000,\n })\n useArbiWebSocket((message) => {\n if (message.type === 'docx_mention') void queries.invalidateQueries({ queryKey })\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId || !note.workspace_ext_id) continue\n try {\n const target = JSON.parse(note.content || '{}') as {\n document_id?: string\n comment_id?: string\n }\n if (!target.document_id?.startsWith('doc-') || !target.comment_id) continue\n const documentId = target.document_id,\n commentId = target.comment_id,\n workspaceId = note.workspace_ext_id\n items.push({\n id: `docx:${note.external_id}`,\n title: 'Mentioned you in a document comment',\n description: [note.sender.given_name, note.sender.family_name]\n .filter(Boolean)\n .join(' '),\n variant: 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve(onOpen({ documentId, commentId, workspaceId })).catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open the document.',\n 'error'\n )\n )\n },\n })\n } catch {\n /* Ignore invalid legacy payloads. */\n }\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n try {\n await arbi.notifications.markRead(ids)\n await queries.invalidateQueries({ queryKey })\n } catch {\n notify('Could not mark document mentions read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n if (id.startsWith('docx:')) void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter((note) => !note.read && note.recipient.external_id === user?.externalId)\n .map((note) => note.external_id)\n )\n },\n }\n}\n","import { useEffect } from 'react'\nimport { mailDraftIdFromContent, useWorkNotifications } from '@arbidocs/react'\nimport { useNotify, type AppNotification } from '@arbidocs/react/shell'\nimport type { components } from '@arbidocs/client'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport type WorkNotificationTarget =\n | { kind: 'conversation'; workspaceId: string; conversationId: string; messageId?: string }\n | { kind: 'workflow'; workspaceId?: string; workflowId: string }\n /** A draft an agent left for the user (`mail_draft_ready`): open it, e.g. `ConnectedMailbox draftId`. */\n | { kind: 'mail_draft'; draftId: string; mailbox?: string }\n\n/** Persisted work notifications in the shared bell; the consumer owns navigation. */\nexport function useConnectedWorkNotifications(\n onOpen: (target: WorkNotificationTarget) => void | Promise<void>\n) {\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const source = `work-notifications:${apiUrl}:${user?.externalId || ''}`\n const { data = [], markRead: persistRead } = useWorkNotifications({\n apiUrl,\n userId: user?.externalId,\n enabled: status === 'authenticated',\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId) continue\n const mapped = mapWorkNotification(note)\n if (!mapped) continue\n items.push({\n id: `work:${note.external_id}`,\n title: mapped.title,\n variant:\n note.type === 'workflow_failed'\n ? 'error'\n : note.type === 'conversation_done'\n ? 'success'\n : 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve()\n .then(() => onOpen(mapped.target))\n .catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open this notification.',\n 'error'\n )\n )\n },\n })\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n if (!ids.length) return\n try {\n await persistRead(ids)\n } catch {\n notify('Could not mark work notifications read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n // Only received, currently loaded work rows belong to this source.\n if (\n data.some(\n (note) =>\n `work:${note.external_id}` === id &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n )\n void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter(\n (note) =>\n !note.read &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n .map((note) => note.external_id)\n )\n },\n }\n}\n\n/** Route from explicit IDs; encrypted task text is never needed for a link. */\nexport function mapWorkNotification(note: components['schemas']['NotificationResponse']): {\n title: string\n target: WorkNotificationTarget\n} | null {\n const sender =\n [note.sender.given_name, note.sender.family_name].filter(Boolean).join(' ') || note.sender.email\n if (note.type === 'workflow_failed') {\n try {\n const payload = JSON.parse(note.content || '{}') as { workflow_ext_id?: string }\n if (!payload.workflow_ext_id?.match(/^wfl-[a-zA-Z0-9]+$/)) return null\n if (\n note.workspace_ext_id?.match(/^wrk-[a-zA-Z0-9]+$/) &&\n note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/)\n ) {\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n },\n }\n }\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'workflow',\n workflowId: payload.workflow_ext_id,\n workspaceId: note.workspace_ext_id || undefined,\n },\n }\n } catch {\n return null\n }\n }\n if (note.type === 'mail_draft_ready') {\n const draftId = mailDraftIdFromContent(note.content)\n if (!draftId) return null\n // Agent drafts land in the owner's native mailbox.\n return {\n title: `${sender} left a draft email for you to review`,\n target: { kind: 'mail_draft', draftId, mailbox: 'native' },\n }\n }\n const titles: Partial<Record<components['schemas']['NotificationType'], string>> = {\n mention: `${sender} mentioned you in a conversation`,\n workspace_access_request: `${sender} needs workspace access to run a thread`,\n conversation_ready:\n note.sender.external_id === note.recipient.external_id\n ? 'Your thread is ready'\n : `${sender}’s thread is ready`,\n conversation_done: `${sender} marked a thread done`,\n }\n const title = titles[note.type]\n if (!title || !note.workspace_ext_id || !note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/))\n return null\n return {\n title,\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n ...(note.message_ext_id ? { messageId: note.message_ext_id } : {}),\n },\n }\n}\n","import { bytesToBase64 } from '@arbidocs/client'\nimport {\n accountPath,\n fileAttachment,\n type MailAccount,\n type MailAttachment,\n type MailClient,\n} from '@arbidocs/react'\nimport type { MailOfflineSupport } from './types'\n\nexport function attachmentPath(accountId: string, messageId: string, attachmentId: string): string {\n return `${accountPath(accountId)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`\n}\n\n/** Hand a file to the browser as a download. */\nexport function saveFile(blob: Blob, name: string): void {\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n link.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/**\n * A message's attachments with their content, for a forward or a reopened draft. Offline, each\n * comes from this device (or arrives without content, and Send then names the missing file).\n */\nexport function hydrateMailAttachments(\n client: MailClient,\n account: MailAccount,\n messageId: string,\n attachments: MailAttachment[],\n { isOnline, offline }: { isOnline: boolean; offline?: MailOfflineSupport }\n): Promise<MailAttachment[]> {\n return Promise.all(\n attachments.map(async (a) => {\n if (a.content_base64 != null) return a\n if (!isOnline) {\n const file = await offline?.loadAttachment(account.id, messageId, a)\n return file\n ? { ...a, content_base64: bytesToBase64(new Uint8Array(await file.arrayBuffer())) }\n : { ...a, content_base64: null }\n }\n const response = await client.fetch(attachmentPath(account.id, messageId, a.id))\n return fileAttachment(new File([await response.blob()], a.name, { type: a.content_type }))\n })\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useConnectMailAccount,\n useDisconnectMailAccount,\n useMailClient,\n useMailOnline,\n type MailAccount,\n type MailPolicy,\n} from '@arbidocs/react'\n\n/** Whose names suggest the native address (`given.family`). */\nexport interface MailAliasUser {\n given_name?: string | null\n family_name?: string | null\n}\n\nexport interface ConnectedMailAccountsProps {\n policy: MailPolicy\n accounts: MailAccount[]\n onClose: () => void\n /** Render in place (e.g. a settings page) instead of a dialog. */\n embedded?: boolean\n user?: MailAliasUser | null\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** Extra settings under the accounts (e.g. keeping mail on this device). */\n settings?: ReactNode\n}\n\n/** Choose the native address, connect or remove external mailboxes. */\nexport function ConnectedMailAccounts({\n policy,\n accounts,\n onClose,\n embedded = false,\n user,\n oauthReturnPath,\n settings,\n}: ConnectedMailAccountsProps) {\n const { client } = useMailClient()\n const [profileId, setProfileId] = useState(policy.server_profiles[0]?.id ?? '')\n const [email, setEmail] = useState('')\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState('')\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const native = useClaimNativeAlias(onClose)\n const isOnline = useMailOnline()\n // Account changes go to the server; offline they are unavailable, and the note says why.\n const offline = !isOnline\n const onNativeError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n const connect = useConnectMailAccount()\n const disconnect = useDisconnectMailAccount()\n const authorizeOAuth = client.authorizeOAuth\n const oauth = async (vendor: string) => {\n if (!authorizeOAuth) return\n try {\n window.location.assign(\n await authorizeOAuth(\n vendor,\n oauthReturnPath ?? `${window.location.pathname}${window.location.search}`\n )\n )\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not connect account')\n }\n }\n const content = (\n <>\n {offline && (\n <p\n role=\"status\"\n className=\"mb-4 rounded bg-muted/40 px-3 py-2 text-sm text-muted-foreground\"\n >\n {\"You're offline. Creating, connecting or removing accounts needs a connection.\"}\n </p>\n )}\n {policy.native_enabled && !accounts.some((a) => a.provider === 'native') && (\n <form\n className=\"mb-5 grid gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n native.mutate(alias, { onError: onNativeError })\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Choose your email address\n <div className=\"flex items-center gap-2\">\n <input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n className=\"min-w-0 flex-1 rounded border bg-background p-2\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span>@{policy.native_domain}</span>\n </div>\n </label>\n <Button disabled={native.isPending || offline} type=\"submit\">\n Create inbox\n </Button>\n </form>\n )}\n <p className=\"mb-4 text-sm text-muted-foreground\">\n Connect an account using the providers enabled by your administrator.\n </p>\n {authorizeOAuth && (\n <div className=\"mb-4 flex flex-wrap gap-2\">\n {policy.oauth_providers.map((vendor) => (\n <Button\n key={vendor}\n variant=\"outline\"\n disabled={offline}\n onClick={() => void oauth(vendor)}\n >\n Connect {vendor === 'microsoft' ? 'Outlook' : 'Gmail'}\n </Button>\n ))}\n </div>\n )}\n {accounts.map((account) => (\n <div\n key={account.id}\n className=\"mb-2 flex items-center justify-between gap-2 rounded border p-3 text-sm\"\n >\n <div>\n <div>{account.email}</div>\n <div className=\"text-muted-foreground\">{account.display_name}</div>\n </div>\n {account.profile_id ? (\n <Button\n variant=\"ghost\"\n disabled={disconnect.isPending || offline}\n onClick={() =>\n disconnect.mutate(account.id, { onError: (err: Error) => setError(err.message) })\n }\n >\n Disconnect\n </Button>\n ) : account.provider !== 'native' ? (\n authorizeOAuth && (\n <Button\n variant=\"ghost\"\n disabled={offline}\n onClick={() => void oauth(account.provider)}\n >\n Reconnect\n </Button>\n )\n ) : (\n <span className=\"text-muted-foreground\">Native inbox</span>\n )}\n </div>\n ))}\n {policy.server_profiles.length > 0 && (\n <form\n className=\"mt-5 grid gap-3\"\n onSubmit={(event) => {\n event.preventDefault()\n setError('')\n connect.mutate(\n { profileId, email, username, password },\n {\n onSuccess: () => {\n setPassword('')\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Mail server\n <select\n aria-label=\"Mail server\"\n className=\"rounded border bg-background p-2\"\n value={profileId}\n onChange={(e) => setProfileId(e.target.value)}\n >\n {policy.server_profiles.map((profile) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-1 text-sm\">\n Email address\n <input\n required\n type=\"email\"\n autoComplete=\"email\"\n className=\"rounded border bg-background p-2\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Username\n <input\n placeholder=\"Same as email address\"\n autoComplete=\"username\"\n className=\"rounded border bg-background p-2\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Password or app password\n <input\n required\n type=\"password\"\n autoComplete=\"current-password\"\n className=\"rounded border bg-background p-2\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n </label>\n <Button type=\"submit\" disabled={connect.isPending || offline}>\n {connect.isPending ? 'Connecting…' : 'Connect mailbox'}\n </Button>\n </form>\n )}\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {accounts.length > 0 && settings}\n </>\n )\n if (embedded) return <div className=\"max-w-2xl\">{content}</div>\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n >\n <DialogContent className=\"max-h-[90dvh] max-w-lg overflow-auto\">\n <DialogTitle>Mail accounts</DialogTitle>\n <DialogDescription>\n Choose your email address or connect an external mailbox.\n </DialogDescription>\n {content}\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * A composer's body in the Word editor: its draft room (opened, reopened after a reconnect or a\n * remount, shown to the chat while open) and the room's save, send and body calls.\n *\n * The room is the body: it saves itself as it is typed into, ARBI's edits land in it as tracked\n * changes, and the draft's text and HTML are made from it on the server when it is saved or sent.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useMailDraftEditor,\n type MailClient,\n type MailCompose,\n type MailProject,\n} from '@arbidocs/react'\nimport type { NativeDocxAdapter } from '../../docx/NativeDocxEditor'\nimport type { MailWordEditor } from './types'\nimport { useRegisterOpenDocument } from '../../chat/open-document'\n\n// A compose session's room, kept across the composer remounting (docked ↔ overlay), so a new\n// message not saved yet reopens its own room instead of starting an empty one.\nconst sessionRooms = new Map<string, string>()\n\nexport interface WordBody {\n adapter: NativeDocxAdapter\n /** The editor's document key: stable for this compose session. */\n documentKey: string\n stateRef: React.MutableRefObject<(() => string | undefined) | null>\n /** Opened: saving and sending can go through the room. */\n ready: boolean\n save(compose: MailCompose): Promise<{ id: string }>\n /** Send it (`request_id`: the send's idempotency key, as `/send` takes). */\n send(compose: MailCompose & { request_id: string }): Promise<{ id: string; status: string }>\n /** The body as text and HTML (`final`: refused while suggestions wait). */\n body(final: boolean): Promise<{ text: string; html: string }>\n /** The project ARBI's work on this email is billed to (known once the room opens). */\n project?: MailProject | null\n /** Bill another project the person may bill (null: their own). */\n chooseProject(projectExtId: string | null): Promise<void>\n}\n\nexport function useWordBody({\n word,\n client,\n initial,\n sessionKey,\n roomId: givenRoomId,\n onBodyChange,\n}: {\n word: MailWordEditor\n client: MailClient\n initial: MailCompose\n /** This compose session (stable across remounts); absent: one per mount. */\n sessionKey?: string\n /** An existing room to open as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** The person changed the body (it is not in Drafts until saved). */\n onBodyChange: () => void\n}): WordBody {\n const [documentKey] = useState(\n () => `mail-${sessionKey ?? initial.draft_id ?? crypto.randomUUID()}`\n )\n const roomRef = useRef<string | undefined>(sessionRooms.get(documentKey) ?? givenRoomId)\n const [roomId, setRoomId] = useState(roomRef.current)\n const [project, setProject] = useState<MailProject | null>()\n const stateRef = useRef<(() => string | undefined) | null>(null)\n const changed = useRef(onBodyChange)\n useEffect(() => {\n changed.current = onBodyChange\n })\n // The first open, while it runs: a second one (the editor remounting, a token renewal) must join it, or a new\n // message would get a second, empty room.\n const opening = useRef<ReturnType<NonNullable<MailClient['openDraftEditor']>> | null>(null)\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...word.adapter,\n open: async () => {\n if (!roomRef.current && opening.current) return opening.current\n const request = client.openDraftEditor!(\n roomRef.current\n ? { roomId: roomRef.current }\n : { draftId: initial.draft_id ?? undefined, text: initial.text, html: initial.html }\n )\n if (!roomRef.current) opening.current = request\n try {\n const session = await request\n roomRef.current = session.room_id\n sessionRooms.set(documentKey, session.room_id)\n setRoomId(session.room_id)\n setProject(session.project ?? null)\n return session\n } finally {\n opening.current = null\n }\n },\n save: async () => {\n throw new Error('Save the draft from the composer')\n },\n onDirtyChange: (dirty) => {\n if (dirty) changed.current()\n },\n }),\n // The editor keeps its adapter for the session; the seed matters only when it first opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [word.adapter, client, documentKey]\n )\n // The open draft's room is the chat's open document, so ARBI edits it there as tracked changes.\n useRegisterOpenDocument({ documentId: roomId })\n const editor = useMailDraftEditor()\n const state = () => stateRef.current?.() ?? null\n return {\n adapter,\n documentKey,\n stateRef,\n ready: !!roomId,\n save: (compose) => editor.save(roomRef.current!, compose, state()),\n send: async (compose) => {\n const result = await editor.send(roomRef.current!, compose, state())\n sessionRooms.delete(documentKey) // sent: the room is gone\n return result\n },\n body: (final) => editor.body(roomRef.current!, final, state()),\n project,\n chooseProject: async (projectExtId) => {\n setProject(await editor.setProject(roomRef.current!, projectExtId))\n },\n }\n}\n","import { lazy, Suspense, useEffect, useMemo, useRef, useState, type RefObject } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Paperclip, Send, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n DialogDescription,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '@arbidocs/react/ui'\nimport {\n fileAttachment,\n useMailClient,\n useMailDraftReplaced,\n useMailProjects,\n useSaveMailDraft,\n useSendMail,\n useMailOnline,\n type MailAccount,\n type MailCompose,\n type MailDeliveryStatus,\n type MailMessage,\n} from '@arbidocs/react'\nimport { MailDocumentPicker } from '../../collaboration/mail/MailDocumentPicker'\nimport { PlainMailBodyEditor } from '../../collaboration/mail/PlainMailBodyEditor'\nimport { parseMailRecipients } from '../../collaboration/mail/mailCompose'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\nimport { useBlocksEnvironment, type BlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useWordBody } from './useWordBody'\n\n// The rich editor is its own chunk, on the optional peer `lexical`. If it is not installed or can't\n// be downloaded (offline before the app finished caching itself), write in plain text instead.\nconst MailBodyEditor = lazy(() =>\n import('../../collaboration/mail/MailBodyEditor').catch(() => ({\n default: PlainMailBodyEditor,\n }))\n)\n// The Word editor (a native draft's body, see MailWordEditor) is its own chunk too.\nconst NativeDocxEditor = lazy(() =>\n import('../../docx/NativeDocxEditor').then((m) => ({ default: m.NativeDocxEditor }))\n)\nconst NO_WORD: MailWordEditor = {\n adapter: {\n request: () => Promise.reject(new Error('No Word editor')),\n loadFonts: () => Promise.reject(new Error('No Word editor')),\n },\n}\n\nexport interface MailComposerFormProps {\n account?: MailAccount\n initial: MailCompose\n maxBytes: number\n ready: boolean\n /** The account's saved drafts: a new message with a draft's subject points to it. */\n drafts: MailMessage[]\n onClose: () => void\n /** Open a saved draft (from the \"already in Drafts\" notice). Absent: the notice has no button. */\n onOpenDraft?: (id: string) => void\n /** Reopen this form on a newer version of its draft, saved elsewhere (by ARBI, or in another tab). */\n onReload?: (draftId: string) => void\n /** Reports every edit so the parent can re-seed this form if it remounts (e.g. docked → overlay). */\n onChange?: (value: MailCompose) => void\n embedded?: boolean\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (saved offline): saves update it, sending removes it. */\n localDraftId?: string\n offline?: MailOfflineSupport\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor. Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote) instead of a new one. */\n roomId?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\n/**\n * Say how a send went. A mailbox on the same deployment is delivered to (or refused) before the send\n * returns, so a bounce is reported at once. Mail handed to the relay is only queued: its delivery\n * reports arrive later, in Sent.\n */\nfunction notifySent(notify: BlocksEnvironment['notify'], result: unknown) {\n const status =\n result && typeof result === 'object' && 'delivery_status' in result\n ? (result as { delivery_status?: MailDeliveryStatus | null }).delivery_status\n : null\n if (status === 'bounced')\n notify(\"Email couldn't be delivered\", 'error', { description: 'Open it in Sent to see why.' })\n else if (status === 'partially_bounced')\n notify(\"Email couldn't be delivered to every recipient\", 'error', {\n description: 'Open it in Sent to see which and why.',\n })\n else if (status === 'delivered') notify('Email delivered', 'success')\n else notify('Email queued for delivery', 'success')\n}\n\n/** Write, save and send one message. */\nexport function MailComposerForm({\n account,\n initial,\n maxBytes,\n ready,\n drafts,\n onClose,\n onOpenDraft,\n onReload,\n onChange,\n embedded = false,\n closeRequestRef,\n localDraftId: initialLocalDraftId,\n offline,\n documents,\n word,\n sessionKey,\n roomId,\n headerSlot,\n}: MailComposerFormProps) {\n const { client } = useMailClient()\n const { notify, confirm } = useBlocksEnvironment()\n const [to, setTo] = useState(initial.to.map((r) => r.email).join('; '))\n const [cc, setCc] = useState(initial.cc.map((r) => r.email).join('; '))\n const [showCc, setShowCc] = useState(initial.cc.length > 0)\n const [showBcc, setShowBcc] = useState(initial.bcc.length > 0)\n const [bcc, setBcc] = useState(initial.bcc.map((r) => r.email).join('; '))\n const [subject, setSubject] = useState(initial.subject)\n const [text, setText] = useState(initial.text)\n const [html, setHtml] = useState(initial.html)\n const [attachments, setAttachments] = useState(initial.attachments)\n const [draftId, setDraftId] = useState(initial.draft_id)\n const [error, setError] = useState('')\n const [dirty, setDirty] = useState(false)\n const [attaching, setAttaching] = useState(false)\n const [saved, setSaved] = useState(false)\n // A newer version of this draft saved elsewhere while this form had unsaved changes.\n const [replacedBy, setReplacedBy] = useState<string>()\n const isOnline = useMailOnline()\n // A native message's body opens in the Word editor when the host offers it and the server is reachable\n // (decided once: the editor is never swapped mid-message). Its room is the body; ARBI's edits are suggestions.\n const [usesWord] = useState(\n () =>\n !!word &&\n !!client.openDraftEditor &&\n account?.provider === 'native' &&\n isOnline &&\n !initialLocalDraftId\n )\n const [bodyChanged, setBodyChanged] = useState(false)\n const [wordPending, setWordPending] = useState(false)\n // The matters ARBI's work on this email can be billed to (the person's own project first).\n const projects = useMailProjects({ enabled: usesWord })\n const wordBody = useWordBody({\n word: word ?? NO_WORD,\n client,\n initial,\n sessionKey,\n roomId,\n onBodyChange: () => {\n setBodyChanged(true)\n setSaved(false)\n setDirty(true)\n },\n })\n // A draft saved while offline lives on this device until it reaches the server's Drafts.\n const [localDraftId, setLocalDraftId] = useState(initialLocalDraftId)\n const [savedLocally, setSavedLocally] = useState(false)\n const [secure, setSecure] = useState(initial.secure_delivery ?? false)\n const securePayload = useRef<unknown>(null)\n const requestId = useRef(crypto.randomUUID())\n const attemptedPayload = useRef<MailCompose | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n // Drafts are separate messages, so a new compose never replaces one on send; point to it instead.\n const sameSubjectDraft = useMemo(() => {\n const key = subject.trim().toLowerCase()\n return key\n ? drafts.find((d) => d.id !== draftId && d.subject.trim().toLowerCase() === key)\n : undefined\n }, [drafts, draftId, subject])\n const body = (): MailCompose => ({\n ...initial,\n to: parseMailRecipients(to),\n cc: parseMailRecipients(cc),\n bcc: parseMailRecipients(bcc),\n subject,\n text,\n html,\n attachments,\n draft_id: draftId,\n secure_delivery: secure,\n })\n /** Keep the draft on this device (updating the copy already there). */\n const saveOnDevice = async (compose: MailCompose) => {\n const draft = await offline!.saveDraft(account!.id, compose, localDraftId)\n setLocalDraftId(draft.id)\n }\n const save = useSaveMailDraft(\n offline && { keep: saveOnDevice, isNetworkFailure: offline.isNetworkFailure }\n )\n /** Put the message in the Outbox (with this send's request_id, so it can only go out once). */\n const queueInOutbox = async (compose: MailCompose) => {\n await offline!.queueSend({\n account: account!,\n compose,\n requestId: requestId.current,\n secure,\n securePayload: securePayload.current ?? undefined,\n })\n if (localDraftId) await offline!.deleteDraft(localDraftId)\n }\n const send = useSendMail(\n offline && { keep: queueInOutbox, isNetworkFailure: offline.isNetworkFailure }\n )\n const onSaved = (result: Awaited<ReturnType<typeof save.mutateAsync>>) => {\n setSaved(true)\n setDirty(false)\n if ('onDevice' in result) {\n setSavedLocally(true)\n return\n }\n setSavedLocally(false)\n setDraftId(result.id)\n setReplacedBy(undefined) // this version replaced the one saved elsewhere\n // The server has it now; the device copy (if this started offline) is no longer needed.\n if (localDraftId) {\n void offline?.deleteDraft(localDraftId)\n setLocalDraftId(undefined)\n }\n }\n const saveDraft = () => {\n if (usesWord) {\n // The body comes from the Word room on the server; ARBI's pending suggestions stay out of Drafts.\n if (!wordBody.ready) return setError('The editor is still opening')\n setWordPending(true)\n void wordBody\n .save(body())\n .then(\n (result) => {\n onSaved(result)\n setBodyChanged(false)\n },\n (err: Error) => setError(err.message)\n )\n .finally(() => setWordPending(false))\n return\n }\n save.mutate(\n { accountId: account!.id, compose: body() },\n { onSuccess: onSaved, onError: (err: Error) => setError(err.message) }\n )\n }\n // Saving a draft replaces it under a new id. Saved elsewhere (ARBI editing it in a private chat, another tab),\n // follow it: saves now replace the newer version; an unchanged form reopens on it, an edited one offers to.\n useMailDraftReplaced(draftId, (newId) => {\n if (save.isPending || wordPending) return // this form's own save: its answer carries the new id\n setDraftId(newId)\n if (!dirty && onReload) onReload(newId)\n else setReplacedBy(newId)\n })\n const sendMessage = async () => {\n let value = attemptedPayload.current\n if (value === null) {\n value = body()\n const recipients = [...value.to, ...value.cc, ...value.bcc]\n const problem =\n !recipients.length || recipients.length > 100\n ? 'Enter between 1 and 100 recipients'\n : recipients.some((r) => !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(r.email))\n ? 'Check the recipient email addresses'\n : value.attachments.reduce((total, a) => total + a.size, 0) > maxBytes\n ? 'Attachments exceed the email size limit'\n : null\n if (problem) return setError(problem)\n // Offline it waits in the Outbox; online the attempt is kept, so a retry resends it as is.\n if (!(offline && !isOnline)) attemptedPayload.current = value\n }\n if (usesWord) {\n if (!wordBody.ready) return setError('The editor is still opening')\n // A suggestion is never sent unreviewed: the server refuses (409) until each is accepted or rejected,\n // which is a definite refusal, so the message can be sent again once they are.\n const refused = (err: Error) => {\n setError(err.message)\n if ((err as { status?: number }).status === 409) attemptedPayload.current = null\n }\n setWordPending(true)\n try {\n if (!secure) {\n notifySent(notify, await wordBody.send({ ...value, request_id: requestId.current }))\n onClose()\n return\n }\n // Secure delivery encrypts in the browser, so it takes the body as text and HTML first.\n value = { ...value, ...(await wordBody.body(true)) }\n attemptedPayload.current = value\n } catch (err) {\n return refused(err as Error)\n } finally {\n setWordPending(false)\n }\n }\n const sending = account\n const message = value\n send.mutate(\n {\n accountId: account!.id,\n compose: message,\n requestId: requestId.current,\n // Secure delivery prepares its encrypted payload once.\n secure: secure\n ? async () => {\n if (sending?.provider !== 'native' || !client.prepareSecureMail)\n throw new Error('Choose your native inbox to send securely')\n securePayload.current ??= await client.prepareSecureMail(\n message,\n sending,\n requestId.current\n )\n return securePayload.current\n }\n : undefined,\n },\n {\n onSuccess: (result) => {\n if (result && typeof result === 'object' && 'onDevice' in result) {\n notify('Saved to your Outbox', 'info', {\n description: \"It will be sent automatically when you're back online.\",\n })\n onClose()\n return\n }\n notifySent(notify, result)\n if (localDraftId) void offline?.deleteDraft(localDraftId)\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }\n const busy = attaching || save.isPending || send.isPending || wordPending\n const locked = busy || attemptedPayload.current !== null\n const addFiles = async (files: FileList | null) => {\n if (!files) return\n const selected = Array.from(files)\n if (\n attachments.reduce((n, a) => n + a.size, 0) + selected.reduce((n, f) => n + f.size, 0) >\n maxBytes\n ) {\n setError(`Attachments must total less than ${Math.round(maxBytes / 1024 / 1024)} MB`)\n return\n }\n setAttaching(true)\n try {\n const added = await Promise.all(selected.map(fileAttachment))\n setAttachments((previous) => [...previous, ...added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach files')\n } finally {\n setAttaching(false)\n }\n }\n // A document of the open workspace, attached as its original file.\n const addDocument = async (documentId: string) => {\n if (!documents) return\n const used = attachments.reduce((n, a) => n + a.size, 0)\n setError('')\n setAttaching(true)\n try {\n const added = await documents.toAttachment(documentId, maxBytes - used)\n setAttachments((previous) => [...previous, added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach the document')\n } finally {\n setAttaching(false)\n }\n }\n const close = () => {\n if (busy) return\n const unsaved =\n !saved &&\n (dirty || !draftId) &&\n (text || subject || to || cc || bcc || attachments.length || bodyChanged)\n if (!unsaved) return onClose()\n void confirm({\n title: 'Discard changes',\n message: 'Close this message without saving your latest changes?',\n }).then((ok) => {\n if (ok) onClose()\n })\n }\n useEffect(() => {\n if (closeRequestRef) closeRequestRef.current = close\n })\n // Moving the panel between docked and overlay remounts this form, so the parent keeps the latest\n // content and the remounted form starts from it instead of the original seed.\n useEffect(() => {\n onChange?.(body())\n // eslint-disable-next-line react-hooks/exhaustive-deps -- body() is rebuilt each render; the fields are its inputs\n }, [to, cc, bcc, subject, text, html, attachments, draftId, secure])\n // Who ARBI's work on this email is billed to: a property of the message, shown in its header, not a field of it.\n const billTo = wordBody.project && (\n <label\n className=\"flex items-center gap-1 text-xs text-muted-foreground\"\n title=\"ARBI's work on this email is billed to this project\"\n >\n Billed to\n <select\n aria-label=\"Bill to\"\n className=\"max-w-[12rem] truncate rounded bg-transparent py-0.5 text-foreground hover:bg-muted/60 focus:bg-muted/60 focus:outline-none\"\n value={wordBody.project.external_id}\n disabled={busy}\n onChange={(e) => {\n const chosen = projects.data?.find((p) => p.external_id === e.target.value)\n void wordBody\n .chooseProject(chosen && !chosen.personal ? chosen.external_id : null)\n .catch((err: Error) => setError(err.message))\n }}\n >\n {(projects.data ?? [wordBody.project]).map((p) => (\n <option key={p.external_id} value={p.external_id}>\n {p.personal ? `${p.name} (personal)` : p.name}\n </option>\n ))}\n </select>\n </label>\n )\n const form = (\n <form\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n if (ready && !busy) event.currentTarget.requestSubmit()\n } else if (event.target instanceof HTMLInputElement) {\n // Recipient/subject Enter must never send an unfinished message.\n event.preventDefault()\n }\n }}\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n void sendMessage()\n }}\n className={\n embedded\n ? 'flex h-full min-h-0 w-full flex-col bg-background'\n : 'flex max-h-[95dvh] w-full max-w-3xl flex-col rounded-xl border bg-background shadow-2xl'\n }\n >\n {!embedded && (\n <header className=\"flex items-center justify-between border-b px-5 py-3\">\n <h2 className=\"font-semibold\">New message</h2>\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-label=\"Close message\"\n disabled={busy}\n onClick={close}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto px-5 py-3\">\n {sameSubjectDraft && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n A draft with this subject is already in Drafts.\n {onOpenDraft && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n onClick={() => onOpenDraft(sameSubjectDraft.id)}\n >\n Open draft\n </Button>\n )}\n </div>\n )}\n {replacedBy && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n This draft was changed elsewhere (by ARBI or in another tab). Saving keeps your version.\n {onReload && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n disabled={busy}\n onClick={() => {\n void confirm({\n title: 'Load changes',\n message: 'Discard your unsaved changes and load the changed draft?',\n }).then((ok) => {\n if (ok) onReload(replacedBy)\n })\n }}\n >\n Load changes\n </Button>\n )}\n </div>\n )}\n <p className=\"mb-2 flex items-center gap-3 border-b border-border/60 pb-3 text-xs text-muted-foreground\">\n <span className=\"w-14 shrink-0\">From</span>\n <span className=\"rounded bg-muted/50 px-2 py-1 text-foreground\">\n {account?.email ?? 'Connect a mailbox to send'}\n </span>\n </p>\n {usesWord && wordBody.project && !headerSlot && <p className=\"mb-2\">{billTo}</p>}\n {usesWord && wordBody.project && headerSlot && createPortal(billTo, headerSlot)}\n {(\n [\n ['To', to, setTo],\n ['Cc', cc, setCc],\n ['Bcc', bcc, setBcc],\n ] as const\n )\n .filter(\n ([label]) =>\n label === 'To' || (label === 'Cc' && showCc) || (label === 'Bcc' && showBcc)\n )\n .map(([label, value, setter]) => (\n <label\n key={label}\n className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\"\n >\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">{label}</span>\n <input\n aria-label={label}\n required={label === 'To' && !cc && !bcc}\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={value}\n placeholder={label === 'To' ? 'Add recipients' : ''}\n onChange={(e) => {\n setter(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n {label === 'To' && (\n <span className=\"flex shrink-0 gap-2\">\n {!showCc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowCc(true)}\n >\n Cc\n </button>\n )}\n {!showBcc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowBcc(true)}\n >\n Bcc\n </button>\n )}\n </span>\n )}\n </label>\n ))}\n <label className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\">\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">Subject</span>\n <input\n aria-label=\"Subject\"\n placeholder=\"Add a subject\"\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={subject}\n onChange={(e) => {\n setSubject(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n </label>\n <Suspense fallback={<p className=\"py-4 text-sm text-muted-foreground\">Loading editor…</p>}>\n {usesWord ? (\n <div\n // The body is the rest of the composer, edge to edge: no box around the letter.\n className=\"-mx-5 -mb-3 flex min-h-[22rem] flex-1 flex-col border-t border-border/60\"\n data-testid=\"mail-word-body\"\n // The editor's own forms (a comment, a reply) submit there: never as this message (that would send it).\n onSubmit={(event) => event.stopPropagation()}\n >\n <NativeDocxEditor\n compact\n adapter={wordBody.adapter}\n documentId={wordBody.documentKey}\n title=\"Email\"\n stateRef={wordBody.stateRef}\n />\n </div>\n ) : (\n <MailBodyEditor\n text={text}\n html={html}\n disabled={locked}\n onChange={(nextText, nextHtml) => {\n setText(nextText)\n setHtml(nextHtml)\n setSaved(false)\n }}\n />\n )}\n </Suspense>\n <div className=\"flex flex-wrap gap-2\">\n {attachments.map((attachment, index) => (\n <span\n key={`${attachment.name}-${index}`}\n className=\"flex items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-3 py-2 text-xs\"\n >\n <Paperclip className=\"size-3\" />\n {attachment.name}\n <button\n type=\"button\"\n disabled={locked}\n aria-label={`Remove ${attachment.name}`}\n onClick={() => {\n setAttachments((a) => a.filter((_, i) => i !== index))\n setSaved(false)\n setDirty(true)\n }}\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n <footer className=\"flex flex-wrap items-center gap-1 border-t border-border/60 bg-muted/20 px-4 py-2 [&_button]:h-8 [&_button]:text-xs\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!ready || locked}\n onClick={() => {\n setError('')\n saveDraft()\n }}\n >\n {save.isPending ? 'Saving…' : 'Save draft'}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={locked}\n onClick={() => fileInput.current?.click()}\n >\n <Paperclip className=\"mr-2 size-4\" />\n Attach\n </Button>\n {documents && (\n <MailDocumentPicker\n documents={documents.documents}\n disabled={locked}\n onAttach={(doc) => void addDocument(doc.id)}\n />\n )}\n <input\n ref={fileInput}\n type=\"file\"\n multiple\n hidden\n onChange={(e) => {\n void addFiles(e.target.files)\n e.target.value = ''\n }}\n />\n {saved && (\n <span className=\"whitespace-nowrap text-xs text-muted-foreground\">\n {savedLocally\n ? 'Saved on this device · syncs to Drafts when online'\n : 'Saved to Drafts'}\n </span>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n {account?.provider === 'native' && client.prepareSecureMail && (\n <Tooltip>\n <TooltipTrigger asChild showWithText>\n <label className=\"flex h-8 shrink-0 cursor-pointer items-center gap-1.5 rounded border border-border/70 px-2 text-xs text-primary\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 accent-primary\"\n checked={secure}\n disabled={locked}\n onChange={(e) => setSecure(e.target.checked)}\n />\n Secure\n </label>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n The recipient will receive a secure link to access the message through the platform.\n </TooltipContent>\n </Tooltip>\n )}\n <Button\n type=\"submit\"\n className=\"h-8 rounded bg-primary px-4 text-primary-foreground shadow-none hover:bg-primary/90\"\n disabled={!ready || busy}\n >\n <Send className=\"mr-2 size-4\" />\n {send.isPending ? 'Sending…' : attemptedPayload.current ? 'Check send result' : 'Send'}\n </Button>\n </div>\n {offline && !isOnline && (\n <p\n className=\"w-full text-[11px] text-muted-foreground\"\n data-testid=\"compose-offline-hint\"\n >\n {\n \"You're offline. Send puts this message in your Outbox; it goes out when you reconnect.\"\n }\n </p>\n )}\n </footer>\n </form>\n )\n if (embedded)\n return (\n <div role=\"dialog\" aria-label=\"Compose email\" className=\"h-full min-h-0\">\n {form}\n </div>\n )\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) close()\n }}\n >\n <DialogContent className=\"max-h-[95dvh] max-w-3xl overflow-auto p-0\">\n <DialogTitle className=\"sr-only\">Compose email</DialogTitle>\n <DialogDescription className=\"sr-only\">Write a message and attach files.</DialogDescription>\n {form}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { MailAccount } from '@arbidocs/react'\n\n/** The account a `mailbox` choice names: an account id, or `'native'` for the user's own inbox. */\nexport function resolveMailbox(\n accounts: MailAccount[] | undefined,\n mailbox: string | undefined\n): MailAccount | undefined {\n if (!accounts) return undefined\n if (mailbox === 'native') return accounts.find((a) => a.provider === 'native')\n return mailbox ? accounts.find((a) => a.id === mailbox) : undefined\n}\n","/**\n * The mail composer bound to the mail client in scope: write a new message, or open a saved draft\n * (`draftId`), save it to Drafts and send it, with files and workspace documents attached.\n *\n * Inside `ConnectedMailbox` everything is passed in; on its own it finds what it needs: the account\n * (`mailbox`, default the native inbox), the attachment limit, the unlock and the saved drafts.\n */\n\nimport { useMemo, useState, type RefObject } from 'react'\nimport {\n useMailAccounts,\n useMailClient,\n useMailDraftCompose,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAccount,\n type MailCompose,\n type MailMessage,\n} from '@arbidocs/react'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { hydrateMailAttachments } from './attachments'\nimport { MailComposerForm } from './MailComposerForm'\nimport { resolveMailbox } from './mailbox'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\n\nconst DEFAULT_MAX_BYTES = 15 * 1024 * 1024\n\nexport interface ConnectedMailComposerProps {\n /** Open this saved draft (from the account's Drafts) instead of a new message. */\n draftId?: string\n /** The message to start from (new, reply, forward). Default: empty, or the draft. */\n initial?: MailCompose\n /** Send from this account. Default: the `mailbox` account. */\n account?: MailAccount\n /** Which account to send from when `account` is not given: an id, or `'native'` (default). */\n mailbox?: string\n /** The attachment limit. Default: the deployment's. */\n maxBytes?: number\n /** Whether saving and sending can run. Default: once the account is unlocked (or offline). */\n ready?: boolean\n /** Saved drafts, for the \"already in Drafts\" notice. Default: the account's Drafts. */\n drafts?: MailMessage[]\n onClose: () => void\n onOpenDraft?: (id: string) => void\n onChange?: (value: MailCompose) => void\n /** Fill the parent (a panel) instead of opening as a dialog. */\n embedded?: boolean\n /** Receives the close request (asks before discarding unsaved changes). */\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (see {@link MailOfflineSupport}). */\n localDraftId?: string\n offline?: MailOfflineSupport\n /** Workspace documents to attach (\"From workspace\"). Absent: not offered. */\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor (see {@link MailWordEditor}). Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** A reply to this email (its id): the composer starts addressed and threaded as one; the body is `roomId`. */\n replyTo?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\nexport function ConnectedMailComposer({\n draftId,\n initial,\n account: accountProp,\n mailbox = 'native',\n maxBytes: maxBytesProp,\n ready: readyProp,\n drafts: draftsProp,\n offline,\n replyTo,\n ...rest\n}: ConnectedMailComposerProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const policy = useMailPolicy()\n const accounts = useMailAccounts({ enabled: !accountProp && !!policy.data?.enabled })\n const account = accountProp ?? resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(readyProp === undefined ? account : undefined)\n const ready = readyProp ?? (!!account && (!!unlock.data || !isOnline))\n const folders = useMailFolders(account, { enabled: !draftsProp && ready })\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const draftsList = useMailMessages(account, draftsFolderId, '', null, {\n enabled: !draftsProp && ready,\n })\n // A newer version of the draft, saved elsewhere (see MailComposerForm's onReload): reopen on it.\n const [reloaded, setReloaded] = useState<string>()\n const openId = reloaded ?? draftId\n const draft = useMailDraftCompose(\n account,\n openId,\n async (from, id) => {\n const message = await client.getMessage(from, id)\n return draftMailCompose(\n message,\n await hydrateMailAttachments(client, from, message.id, message.attachments, {\n isOnline,\n offline,\n })\n )\n },\n { enabled: (!initial || !!reloaded) && ready }\n )\n const original = useMailMessage(account, replyTo, { enabled: !!replyTo && ready })\n const start = useMemo(() => {\n if (replyTo)\n return original.data && account\n ? {\n ...replyMailCompose(original.data, { account, folderRole: 'inbox' }),\n text: '',\n html: '',\n }\n : undefined\n return reloaded ? draft.data : (initial ?? (openId ? draft.data : emptyMailCompose()))\n }, [replyTo, original.data, account, reloaded, initial, openId, draft.data])\n if (!start)\n return (draft.error ?? original.error) ? (\n <p role=\"alert\" className=\"p-4 text-sm text-destructive\">\n {(draft.error ?? original.error)?.message}\n </p>\n ) : (\n <p className=\"p-4 text-sm text-muted-foreground\">Loading draft…</p>\n )\n return (\n <MailComposerForm\n key={`${account?.id}-${openId ?? ''}`}\n account={account}\n initial={start}\n maxBytes={maxBytesProp ?? policy.data?.max_attachment_bytes ?? DEFAULT_MAX_BYTES}\n ready={ready}\n drafts={draftsProp ?? draftsList.data?.messages ?? []}\n offline={offline}\n onReload={setReloaded}\n {...rest}\n />\n )\n}\n","import { useState } from 'react'\nimport { Mail as MailIcon } from 'lucide-react'\nimport { Button, Input } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useMailOnline,\n type MailPolicy,\n} from '@arbidocs/react'\nimport type { MailAliasUser } from './ConnectedMailAccounts'\n\n/**\n * First run of Mail, in the main screen rather than a dialog: the user confirms the suggested\n * address and is straight into their inbox. External accounts (Gmail, Outlook, IMAP) stay one\n * click away, in the accounts dialog, for deployments that enable them.\n */\nexport function ConnectedMailSetup({\n policy,\n user,\n productName,\n onClaimed,\n onConnectExisting,\n}: {\n policy: MailPolicy\n user?: MailAliasUser | null\n /** The product's name in the copy (\"Set up your ARBI email\"). Default: none. */\n productName?: string\n /** The inbox exists now (the alias that was claimed). */\n onClaimed: (alias: string) => void\n onConnectExisting: () => void\n}) {\n const isOnline = useMailOnline()\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const [error, setError] = useState('')\n const claim = useClaimNativeAlias(onClaimed)\n const hasExternal = policy.oauth_providers.length > 0 || policy.server_profiles.length > 0\n const onClaimError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n\n return (\n <div\n data-testid=\"mail-setup\"\n className=\"mx-auto flex max-w-xl flex-col items-center gap-6 px-6 py-16 text-center\"\n >\n <MailIcon className=\"size-10 text-muted-foreground\" aria-hidden />\n {policy.native_enabled ? (\n <>\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">\n Set up your {productName ? `${productName} ` : ''}email\n </h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Confirm your address and you are ready to go: you can send and receive email as\n </p>\n </div>\n <form\n className=\"flex w-full flex-col items-center gap-4\"\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n claim.mutate(alias, { onError: onClaimError })\n }}\n >\n <div className=\"flex w-full items-center justify-center gap-2 text-base\">\n <Input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n autoFocus\n className=\"max-w-60 text-right\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span className=\"text-foreground\">@{policy.native_domain}</span>\n </div>\n <Button\n type=\"submit\"\n disabled={claim.isPending || !alias || !isOnline}\n title={isOnline ? undefined : 'Available when you are back online'}\n >\n {claim.isPending ? 'Setting up…' : 'Confirm'}\n </Button>\n </form>\n </>\n ) : (\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">Connect your email</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Connect an existing account to read and send email{' '}\n {productName ? `from ${productName}` : 'here'}.\n </p>\n </div>\n )}\n {hasExternal && (\n <Button\n variant={policy.native_enabled ? 'ghost' : 'default'}\n onClick={onConnectExisting}\n className={policy.native_enabled ? 'text-muted-foreground' : undefined}\n >\n {policy.native_enabled\n ? 'Connect an existing email account instead'\n : 'Connect an email account'}\n </Button>\n )}\n {!policy.native_enabled && !hasExternal && (\n <p className=\"text-sm text-muted-foreground\">\n Mail is not set up for this deployment yet. Ask your administrator.\n </p>\n )}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","/**\n * The whole mail screen bound to the mail client in scope (`MailClientProvider`, else the\n * `ArbiProvider` session): first-run setup or the accounts, the folder picker and filter, the message\n * list, the reader and the composer.\n *\n * The host owns navigation: it can ask for a draft (`draftId`), a folder (`folder`) or a new message\n * with attachments (`composeAttachments`); each is taken once and reported back (`on…Opened`), so\n * asking again for the same thing works. Device storage (offline reading, the Outbox), workspace\n * documents and saving to a workspace are optional host capabilities passed as props.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { GridState } from 'ag-grid-community'\nimport { ArrowLeft, Mail as MailIcon, Plus, Settings, X } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n accountPath,\n mailJson,\n useMailCache,\n MailOfflineUnavailableError,\n useMailAccounts,\n useMailClient,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAddress,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailFolder,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { FilterInput } from '../../shell/FilterInput'\nimport { TabHeader } from '../../shell/TabHeader'\nimport { FolderPickerRow } from '../../files/FolderPicker'\nimport { FolderFilterButton } from '../../files/bulk/FolderFilterButton'\nimport { FilesFilterBar } from '../../files/page/FilesPageParts'\nimport { TriStateFilterMenu, type TriState } from '../../settings/TriStateFilterMenu'\nimport { ConfirmDialog } from '../../settings/ConfirmDialog'\nimport { MailGrid } from '../../collaboration/mail/MailGrid'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { ConnectedMailAccounts, type MailAliasUser } from './ConnectedMailAccounts'\nimport { ConnectedMailComposer } from './ConnectedMailComposer'\nimport { resolveMailbox } from './mailbox'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { ConnectedMailSetup } from './ConnectedMailSetup'\nimport type {\n MailDocumentSource,\n MailLocalDraft,\n MailOutboxEntry,\n MailOfflineSupport,\n MailPanelProps,\n MailSaveToWorkspace,\n MailWordEditor,\n} from './types'\n\ntype MailQuickFilter = 'unread' | 'attachments' | 'secure'\n\nconst NO_DRAFTS: MailLocalDraft[] = []\nconst NO_OUTBOX: MailOutboxEntry[] = []\n\n/** Row ids of drafts kept on this device, in the Drafts list. */\nconst LOCAL_DRAFT_PREFIX = 'local-draft:'\n/** Offline with no folders saved on this device: Drafts (kept here) and the Outbox still work. */\nconst OFFLINE_FOLDERS: MailFolder[] = [\n { id: 'device:drafts', name: 'Drafts', role: 'drafts', unread: 0 },\n]\n\n/** A draft kept on this device, as a row of the Drafts folder. */\nfunction localDraftRow(draft: MailLocalDraft): MailMessage {\n return {\n id: LOCAL_DRAFT_PREFIX + draft.id,\n subject: draft.compose.subject,\n sender: [],\n to: draft.compose.to,\n cc: draft.compose.cc,\n bcc: draft.compose.bcc,\n received_at: new Date(draft.updatedAt).toISOString(),\n preview: draft.error\n ? `Saved on this device only: ${draft.error}`\n : 'Saved on this device · syncs to Drafts when online',\n unread: false,\n text: '',\n references: [],\n attachments: draft.compose.attachments.map((a) => ({ ...a, content_base64: null })),\n }\n}\n\n/** Excluded wins; with any included, an item needs one of them. */\nfunction applyQuickFilters(\n messages: MailMessage[],\n filters: Map<MailQuickFilter, TriState>\n): MailMessage[] {\n const included = [...filters].filter(([, s]) => s === 'include').map(([k]) => k)\n const excluded = [...filters].filter(([, s]) => s === 'exclude').map(([k]) => k)\n if (!included.length && !excluded.length) return messages\n return messages.filter((m) => {\n const has: Record<MailQuickFilter, boolean> = {\n unread: m.unread,\n attachments: m.attachments.length > 0,\n secure: !!m.secure_delivery,\n }\n if (excluded.some((k) => has[k])) return false\n return !included.length || included.some((k) => has[k])\n })\n}\n\n/** The default panel: the reader and composer beside the list. */\nfunction SidePanel({ isOpen, title, onClose, children }: MailPanelProps) {\n if (!isOpen) return null\n return (\n <aside\n aria-label={title}\n className=\"flex min-h-0 w-full max-w-2xl shrink-0 flex-col border-l border-border bg-background\"\n >\n <header className=\"flex items-center justify-between gap-2 border-b px-3 py-2\">\n <h2 className=\"truncate text-sm font-semibold\">{title}</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Close\"\n data-testid=\"close-mail-viewer\"\n onClick={onClose}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n <div className=\"flex min-h-0 flex-1\">{children}</div>\n </aside>\n )\n}\n\nexport interface ConnectedMailboxProps {\n /** Which mailbox: an account id, or `'native'` for the user's own inbox. Default: the first. */\n mailbox?: string\n /** Open this draft (in the native mailbox's Drafts); taken once, then `onDraftOpened`. */\n draftId?: string | null\n onDraftOpened?: () => void\n /** Open this folder (a role such as `inbox`, or an id); taken once, then `onFolderOpened`. */\n folder?: string | null\n onFolderOpened?: () => void\n /** Start a new message with these attachments; taken once, then `onComposeOpened`. */\n composeAttachments?: MailAttachment[] | null\n onComposeOpened?: () => void\n /**\n * Open a document: offered as \"Open\" on the notice after an email is saved into a workspace\n * (when `saveToWorkspace.save` resolves with the new document's id).\n */\n onOpenDocument?: (documentId: string, workspaceId: string) => void\n /** The user, for the suggested native address (`given.family`). */\n user?: MailAliasUser | null\n /** The product's name in the setup copy (\"Set up your ARBI email\"). */\n productName?: string\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** How a person is named (e.g. from contacts). Default: the name on the message, else the address. */\n personLabel?: (person: MailAddress) => string\n /** Device storage: offline reading, the Outbox, drafts written offline. Absent: online only. */\n offline?: MailOfflineSupport\n /** The open workspace's documents, attachable in the composer. */\n documents?: MailDocumentSource\n /** Saving an email into a workspace (\"Save to workspace\" on native mail). */\n saveToWorkspace?: MailSaveToWorkspace\n /** Native drafts' bodies in the Word editor, where ARBI's edits are suggestions. Absent: rich text. */\n word?: MailWordEditor\n /** \"Reply with ARBI\" on a native message: the host starts the chat that drafts it. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n /** A calendar invite card for a message with an .ics part. */\n renderInvite?: (props: {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n }) => ReactNode\n /** Where the reader and composer open. Default: a panel beside the list. */\n renderPanel?: (props: MailPanelProps) => ReactNode\n /** The reader or composer opened or closed. */\n onViewerOpenChange?: (open: boolean) => void\n /** The message list's column state, and where to persist it. */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n /** The message opened first (e.g. restored after a redirect). */\n initialMessageId?: string | null\n}\n\nexport function ConnectedMailbox({\n mailbox,\n draftId,\n onDraftOpened,\n folder: requestedFolder,\n onFolderOpened,\n composeAttachments,\n onComposeOpened,\n onOpenDocument,\n user,\n productName,\n oauthReturnPath,\n personLabel,\n offline,\n documents,\n saveToWorkspace,\n word,\n onReplyWithArbi,\n renderInvite,\n renderPanel = SidePanel,\n onViewerOpenChange,\n gridState,\n onGridStateChange,\n initialMessageId = null,\n}: ConnectedMailboxProps) {\n const { notify } = useBlocksEnvironment()\n const cache = useMailCache()\n const { client } = useMailClient()\n const [savingToWorkspace, setSavingToWorkspace] = useState(false)\n const [savePending, setSavePending] = useState(false)\n const [saveWorkspaceId, setSaveWorkspaceId] = useState('')\n const { data: policy, error: policyError } = useMailPolicy()\n const isOnline = useMailOnline()\n // Mail queries run offline too (networkMode 'always'): a host's client answers from this device,\n // or says plainly that something isn't saved here, instead of waiting forever for a connection.\n const accounts = useMailAccounts({ enabled: !!policy?.enabled })\n const [accountId, setAccountId] = useState('')\n const account =\n accounts.data?.find((a) => a.id === accountId) ??\n resolveMailbox(accounts.data, mailbox) ??\n accounts.data?.[0]\n const unlock = useMailUnlock(account)\n const [folder, setFolder] = useState('inbox')\n const [folderMenuOpen, setFolderMenuOpen] = useState(false)\n const [filterMenuOpen, setFilterMenuOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [mailFilters, setMailFilters] = useState<Map<MailQuickFilter, TriState>>(new Map())\n const [cursor, setCursor] = useState<string | null>(null)\n const [selected, setSelected] = useState<string | null>(initialMessageId)\n const [compose, setCompose] = useState<MailCompose | null>(null)\n // Set when the open compose is a draft kept on this device.\n const [composeLocalDraftId, setComposeLocalDraftId] = useState<string | undefined>()\n // Each compose the user opens (new, reply, forward, a draft) gets a fresh form. Edits reported by\n // the form (onChange) keep the same one, so moving the panel never resets what was typed.\n const [composeSession, setComposeSession] = useState(0)\n // Unique to this mailbox, so a compose session's key (which keeps its Word room) never repeats.\n const [mailboxKey] = useState(() => crypto.randomUUID())\n const openCompose = (value: MailCompose, localDraftId?: string) => {\n setComposeSession((n) => n + 1)\n setComposeLocalDraftId(localDraftId)\n setCompose(value)\n }\n const composeClose = useRef<(() => void) | null>(null)\n useEffect(() => {\n onViewerOpenChange?.(!!selected || !!compose)\n }, [selected, compose, onViewerOpenChange])\n useEffect(() => () => onViewerOpenChange?.(false), [onViewerOpenChange])\n const [settings, setSettings] = useState(false)\n // Set once the user has just created their inbox, to greet them with their new address.\n const [justCreated, setJustCreated] = useState(false)\n const [actionError, setActionError] = useState('')\n // Offline the account can't be unlocked, and needn't be: reads come from this device and sends\n // wait in the Outbox. Unlocking runs as soon as the connection is back.\n const ready = !!account && (!!unlock.data || !isOnline)\n useEffect(() => {\n // Reads that ran before the unlock finished (e.g. right after reconnecting) get another go.\n if (unlock.data) void cache.refreshFolders()\n }, [unlock.data, cache])\n const folders = useMailFolders(account, { enabled: ready })\n const outbox = offline?.useOutbox() ?? NO_OUTBOX\n const outboxRole = offline?.outboxRole\n const waitingInOutbox = outbox.filter(\n (item) => item.account.id === account?.id && item.status !== 'sent'\n ).length\n // The server's folders, plus the Outbox (the server's own when it has one, else this device's).\n const folderList = useMemo(() => {\n const base =\n folders.data ?? (offline && !isOnline && folders.error ? OFFLINE_FOLDERS : undefined)\n if (!base || !outboxRole) return base\n const withCount = (f: MailFolder) =>\n f.role === outboxRole ? { ...f, unread: f.unread + waitingInOutbox } : f\n return base.some((f) => f.role === outboxRole)\n ? base.map(withCount)\n : [...base, withCount({ id: 'device:outbox', name: 'Outbox', role: outboxRole, unread: 0 })]\n }, [folders.data, folders.error, isOnline, waitingInOutbox, offline, outboxRole])\n const folderId =\n folderList?.find((f) => f.role === folder || f.id === folder)?.id ?? folderList?.[0]?.id\n const folderRole = folderList?.find((f) => f.id === folderId)?.role ?? folder\n // Folders that exist only on this device have no server list.\n const deviceFolder = !!folderId?.startsWith('device:')\n const list = useMailMessages(account, folderId, query, cursor, {\n enabled: ready && !deviceFolder,\n refetchInterval: 60_000,\n })\n const localDrafts = offline?.useLocalDrafts(account?.id) ?? NO_DRAFTS\n // Same key as the list above when Drafts is open, so the cache is shared.\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const drafts = useMailMessages(account, draftsFolderId, '', null, {\n enabled: ready && !!compose,\n })\n // Quick filters (the dropdown inside the filter box) narrow the messages already loaded.\n const loadedMessages = useMemo(() => {\n if (folderRole !== 'drafts') return list.data?.messages\n const words = query.toLowerCase()\n const mine = localDrafts\n .map(localDraftRow)\n .filter(\n (m) =>\n !words ||\n `${m.subject} ${m.to.map((r) => r.email).join(' ')}`.toLowerCase().includes(words)\n )\n return [...mine, ...(list.data?.messages ?? [])]\n }, [folderRole, list.data, localDrafts, query])\n const filteredMessages = useMemo(\n () => applyQuickFilters(loadedMessages ?? [], mailFilters),\n [loadedMessages, mailFilters]\n )\n const mailFilterOptions = useMemo(\n () => [\n {\n id: 'unread' as const,\n label: 'Unread',\n count: (loadedMessages ?? []).filter((m) => m.unread).length,\n },\n {\n id: 'attachments' as const,\n label: 'Has attachments',\n count: (loadedMessages ?? []).filter((m) => m.attachments.length > 0).length,\n },\n {\n id: 'secure' as const,\n label: 'Secure delivery',\n count: (loadedMessages ?? []).filter((m) => m.secure_delivery).length,\n },\n ],\n [loadedMessages]\n )\n const hasActiveFilters = !!query || [...mailFilters.values()].some(Boolean)\n const detail = useMailMessage(account, selected, { enabled: ready && !compose })\n const message = detail.data\n // A new message with attachments asked for by the host (e.g. \"Email\" on a document).\n useEffect(() => {\n if (!composeAttachments?.length) return\n openCompose({ ...emptyMailCompose(), attachments: composeAttachments })\n onComposeOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [composeAttachments])\n useEffect(() => {\n if (!requestedFolder) return\n setFolder(requestedFolder)\n setCursor(null)\n setSelected(null)\n onFolderOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [requestedFolder])\n // A draft asked for by the host: it is in the native mailbox's Drafts, so it is selected once the\n // accounts are known and that account is chosen (never read from another).\n const [pendingDraft, setPendingDraft] = useState<string | null>(null)\n useEffect(() => {\n if (!draftId) return\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(null)\n setPendingDraft(draftId)\n onDraftOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [draftId])\n useEffect(() => {\n if (!pendingDraft || !accounts.data) return\n const native = accounts.data.find((a) => a.provider === 'native')\n if (native) setAccountId(native.id)\n setSelected(pendingDraft)\n setPendingDraft(null)\n }, [pendingDraft, accounts.data])\n // The host switched mailbox.\n useEffect(() => {\n const chosen = resolveMailbox(accounts.data, mailbox)\n if (!chosen) return\n setAccountId(chosen.id)\n // eslint-disable-next-line react-hooks/exhaustive-deps -- follows the host's choice only\n }, [mailbox, !!accounts.data])\n const patch = (messageId: string, body: MailMessageUpdate) =>\n mailJson(\n client.fetch,\n `${accountPath(account!.id)}/messages/${encodeURIComponent(messageId)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n // ARBI mail's Trash: Restore (back where it came from), Delete forever, Empty Trash. Mail in the Trash\n // still counts against the person's storage until it is deleted or purged.\n const nativeTrash = account?.provider === 'native' && folderRole === 'trash'\n const [confirmDelete, setConfirmDelete] = useState<'message' | 'trash' | null>(null)\n const [deleting, setDeleting] = useState(false)\n const deleteForever = async () => {\n if (!account || !isOnline || !confirmDelete) return\n setDeleting(true)\n try {\n if (confirmDelete === 'message' && selected) {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(selected)}`,\n { method: 'DELETE' }\n )\n setSelected(null)\n } else if (confirmDelete === 'trash') {\n await mailJson(client.fetch, `${accountPath(account.id)}/messages?folder=trash`, {\n method: 'DELETE',\n })\n setSelected(null)\n }\n await cache.refreshAll()\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not delete')\n } finally {\n setDeleting(false)\n setConfirmDelete(null)\n }\n }\n const update = async (body: MailMessageUpdate) => {\n if (!selected || !account || !isOnline) return\n try {\n await patch(selected, body)\n await cache.refreshAll()\n if (body.folder_id || body.action) setSelected(null)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n const response = await client.fetch(path)\n saveFile(await response.blob(), name)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const downloadAttachment = async (a: MailAttachment) => {\n if (!message || !account) return\n if (isOnline) {\n await download(attachmentPath(account.id, message.id, a.id), a.name)\n return\n }\n const file = await offline?.loadAttachment(account.id, message.id, a)\n if (!file) {\n setActionError(`${a.name} isn't saved on this device. Open it when you're back online.`)\n return\n }\n saveFile(file, a.name)\n }\n const saveEmail = async () => {\n if (!message || !account || !saveWorkspaceId || !saveToWorkspace) return\n setSavePending(true)\n try {\n const response = await client.fetch(\n `${accountPath(account.id)}/messages/${message.id}/original`\n )\n const fileName = `${message.subject.replace(/[^a-zA-Z0-9 ._-]/g, '').slice(0, 80) || 'email'}.eml`\n const workspaceId = saveWorkspaceId\n const documentId = await saveToWorkspace.save(\n workspaceId,\n new File([await response.blob()], fileName, { type: 'message/rfc822' })\n )\n setSavingToWorkspace(false)\n notify(\n 'Email saved to workspace',\n 'success',\n documentId && onOpenDocument\n ? { action: { label: 'Open', onClick: () => onOpenDocument(documentId, workspaceId) } }\n : undefined\n )\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not save email to workspace')\n } finally {\n setSavePending(false)\n }\n }\n const hydrate = (attachments: MailAttachment[]) =>\n message && account\n ? hydrateMailAttachments(client, account, message.id, attachments, { isOnline, offline })\n : Promise.resolve([])\n const editDraft = async () => {\n if (!message) return\n try {\n openCompose(draftMailCompose(message, await hydrate(message.attachments)))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not load draft attachments')\n }\n }\n const reply = async (forward = false, all = false) => {\n if (!message || !account) return\n try {\n const attachments = forward ? await hydrate(message.attachments) : []\n openCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n const failures = [policyError, accounts.error, unlock.error, folders.error, list.error]\n const offlineNotice = failures.find((e) => e instanceof MailOfflineUnavailableError)?.message\n const error =\n actionError ||\n failures.find((e) => e && !(e instanceof MailOfflineUnavailableError))?.message ||\n (detail.error instanceof MailOfflineUnavailableError ? undefined : detail.error?.message)\n return (\n <section className=\"flex h-full min-h-0 flex-col bg-background\" aria-label=\"Mail\">\n <header className=\"sticky top-0 z-10 bg-background\">\n <TabHeader\n testId=\"mail-tab-header\"\n tabs={[\n {\n id: 'mail',\n // Icon + count only, like the Files, Facts and Threads headers.\n label: '',\n count: filteredMessages.length,\n countIcon: <MailIcon className=\"size-3.5\" />,\n countPlacement: 'leading',\n presentation: 'count',\n hasActiveFilters,\n testId: 'mail-tab',\n },\n ]}\n activeTabId=\"mail\"\n onTabChange={() => {}}\n compactBreakpoint={360}\n firstTabContent={\n account ? (\n <FilesFilterBar>\n <FilterInput\n value={query}\n onChange={(q) => {\n setQuery(q)\n setCursor(null)\n }}\n hideFieldPicker\n fields={['text']}\n onFieldsChange={() => {}}\n ariaLabel=\"Filter mail\"\n labels={{ placeholder: 'Filter...' }}\n testIds={{ root: 'mail-search', input: 'mail-filter-input' }}\n className=\"min-w-28 flex-1 sm:max-w-72\"\n filter={\n <TriStateFilterMenu\n testId=\"mail-bar-filter-button\"\n open={filterMenuOpen}\n onOpenChange={setFilterMenuOpen}\n filterStates={mailFilters}\n onFiltersChange={setMailFilters}\n options={mailFilterOptions}\n groups={[{ label: 'Messages', options: ['unread', 'attachments', 'secure'] }]}\n renderChevron\n disableHoverOpen\n triggerClassName=\"inline-flex items-center gap-0.5 h-6 rounded px-1 text-muted-foreground hover:bg-foreground/10 cursor-pointer transition-colors pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n />\n }\n />\n {folderList && (\n <div className=\"flex shrink-0 items-center gap-2\">\n <FolderFilterButton\n label={folderList.find((f) => f.id === folderId)?.name ?? 'Folders'}\n isActive={false}\n open={folderMenuOpen}\n onOpenChange={setFolderMenuOpen}\n testId=\"mail-folder-button\"\n >\n {folderList.map((item) => (\n <FolderPickerRow\n key={item.id}\n label={item.name}\n count={item.unread > 0 ? item.unread : undefined}\n depth={0}\n isActive={item.id === folderId}\n onClick={() => {\n setFolder(item.id)\n setCursor(null)\n setSelected(null)\n setFolderMenuOpen(false)\n }}\n />\n ))}\n </FolderFilterButton>\n </div>\n )}\n </FilesFilterBar>\n ) : undefined\n }\n rightContent={\n <span className=\"flex items-center gap-1\">\n {account && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label=\"Mail settings\"\n data-testid=\"mail-settings-button\"\n onClick={() => setSettings(true)}\n >\n <Settings className=\"size-4\" />\n </Button>\n )}\n {nativeTrash && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!isOnline}\n data-testid=\"mail-empty-trash-button\"\n onClick={() => setConfirmDelete('trash')}\n >\n Empty Trash\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={!ready || !!compose}\n onClick={() => openCompose(emptyMailCompose())}\n >\n <Plus className=\"mr-1.5 size-4\" />\n Email\n </Button>\n </span>\n }\n />\n {/* No refresh button: native mail refreshes the moment the server pushes `native_mail_received`,\n and the list re-polls every minute (and on window focus) for every other provider. */}\n {(accounts.data?.length ?? 0) > 1 && (\n <div className=\"flex items-center gap-2 px-3 py-1\">\n <select\n aria-label=\"Mail account\"\n disabled={!!compose}\n className=\"min-w-0 max-w-64 rounded border-0 bg-transparent px-2 py-1.5 text-xs text-muted-foreground\"\n value={account?.id ?? ''}\n onChange={(e) => {\n setAccountId(e.target.value)\n setFolder('inbox')\n setCursor(null)\n setSelected(null)\n }}\n >\n {accounts.data?.map((a) => (\n <option key={a.id} value={a.id}>\n {a.email}\n </option>\n ))}\n </select>\n </div>\n )}\n </header>\n {account && offline?.renderStatus?.()}\n {error && (\n <p role=\"alert\" className=\"border-b p-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {!error && offlineNotice && (\n <p role=\"status\" className=\"border-b p-3 text-sm text-muted-foreground\">\n {offlineNotice}\n </p>\n )}\n {policy && !policy.enabled && (\n <p className=\"p-6 text-muted-foreground\">Mail is not enabled on this deployment.</p>\n )}\n {/* Setting up an inbox needs the server; offline (accounts unknown) the notice above says why. */}\n {policy?.enabled && accounts.isSuccess && !account && (\n <ConnectedMailSetup\n policy={policy}\n user={user}\n productName={productName}\n onClaimed={() => setJustCreated(true)}\n onConnectExisting={() => setSettings(true)}\n />\n )}\n {account && justCreated && (\n <div\n role=\"status\"\n data-testid=\"mail-ready-banner\"\n className=\"flex items-start justify-between gap-3 border-b bg-accent/40 px-4 py-3 text-sm\"\n >\n <p>\n <span className=\"font-semibold\">\n Your {productName ? `${productName} ` : ''}email is ready to go.\n </span>{' '}\n You can send and receive email as <span className=\"font-medium\">{account.email}</span>.\n </p>\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => setJustCreated(false)}\n >\n ×\n </button>\n </div>\n )}\n {account && (\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex min-h-0 w-full flex-col\">\n {outboxRole &&\n folderRole === outboxRole &&\n offline?.renderOutbox({\n accountId: account.id,\n onEdit: (value) => openCompose({ ...value }),\n })}\n <div className={deviceFolder ? 'hidden' : 'min-h-0 flex-1'}>\n <MailGrid\n messages={filteredMessages}\n loading={list.isPending && list.fetchStatus !== 'idle'}\n selected={selected}\n outgoing={\n folderRole === 'sent' || folderRole === 'drafts' || folderRole === outboxRole\n }\n personLabel={personLabel}\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n onSelect={(id) => {\n if (id.startsWith(LOCAL_DRAFT_PREFIX)) {\n const draft = localDrafts.find((d) => LOCAL_DRAFT_PREFIX + d.id === id)\n if (draft) openCompose({ ...draft.compose }, draft.id)\n return\n }\n setSelected(id)\n if (isOnline && list.data?.messages.find((m) => m.id === id)?.unread) {\n void patch(id, { unread: false })\n // An initial read can finish after the PATCH with the old unread flag.\n .then(() => cache.settleMessage(account.id, id))\n .catch((error: Error) => setActionError(error.message))\n }\n }}\n />\n </div>\n {(cursor || list.data?.next_cursor) && (\n <footer className=\"flex gap-2 p-2\">\n {cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(null)}>\n First page\n </Button>\n )}\n {list.data?.next_cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(list.data!.next_cursor!)}>\n Next page\n </Button>\n )}\n </footer>\n )}\n </div>\n {renderPanel({\n isOpen: !!selected || !!compose,\n title: compose ? 'New message' : message?.subject || 'Mail',\n onClose: () => {\n if (compose) composeClose.current?.()\n else setSelected(null)\n },\n children: compose ? (\n <ConnectedMailComposer\n key={`${account?.id}-${composeSession}`}\n account={account}\n initial={compose}\n maxBytes={policy?.max_attachment_bytes ?? 15 * 1024 * 1024}\n ready={ready}\n drafts={drafts.data?.messages ?? []}\n embedded\n localDraftId={composeLocalDraftId}\n offline={offline}\n documents={documents}\n word={word}\n sessionKey={`${mailboxKey}-${composeSession}`}\n onChange={setCompose}\n closeRequestRef={composeClose}\n onClose={() => {\n setCompose(null)\n if (compose.draft_id) setSelected(null)\n }}\n onOpenDraft={(id) => {\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(id)\n }}\n />\n ) : message && selected ? (\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={folders.data}\n isOnline={isOnline}\n loading={detail.isFetching}\n uploadPending={savePending}\n personLabel={personLabel}\n renderInvite={\n renderInvite &&\n (() =>\n renderInvite({\n accountId: account.id,\n messageId: message.id,\n attachments: message.attachments,\n isOnline,\n }))\n }\n onBack={() => setSelected(null)}\n onEditDraft={() => void editDraft()}\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onRestore={nativeTrash ? () => void update({ action: 'restore' }) : undefined}\n onDeleteForever={nativeTrash ? () => setConfirmDelete('message') : undefined}\n onDownloadAttachment={(a) => void downloadAttachment(a)}\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n onSaveToWorkspace={\n saveToWorkspace &&\n (() => {\n setSaveWorkspaceId(\n saveToWorkspace.defaultWorkspaceId ?? saveToWorkspace.workspaces[0]?.id ?? ''\n )\n setSavingToWorkspace(true)\n })\n }\n />\n ) : (\n <article className=\"min-w-0 flex-1 overflow-auto p-4 sm:p-5\">\n {selected && (\n <Button className=\"mb-3\" variant=\"ghost\" onClick={() => setSelected(null)}>\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n )}\n {detail.isFetching && selected && (\n <p className=\"text-muted-foreground\">Loading message…</p>\n )}\n {detail.error instanceof MailOfflineUnavailableError && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {detail.error.message}\n </p>\n )}\n </article>\n ),\n })}\n </div>\n )}\n {saveToWorkspace && (\n <Dialog open={savingToWorkspace} onOpenChange={setSavingToWorkspace}>\n <DialogContent>\n <DialogTitle>Save email to workspace</DialogTitle>\n <DialogDescription>\n Save a copy as an .eml file. Members with access to the file can read it.\n </DialogDescription>\n <select\n aria-label=\"Destination workspace\"\n value={saveWorkspaceId}\n onChange={(e) => setSaveWorkspaceId(e.target.value)}\n className=\"rounded border bg-background p-2\"\n >\n <option value=\"\" disabled>\n Choose a workspace\n </option>\n {saveToWorkspace.workspaces.map((w) => (\n <option key={w.id} value={w.id}>\n {w.name}\n </option>\n ))}\n </select>\n <Button disabled={!saveWorkspaceId || savePending} onClick={() => void saveEmail()}>\n {savePending ? 'Saving…' : 'Save email'}\n </Button>\n {actionError && <p role=\"alert\">{actionError}</p>}\n </DialogContent>\n </Dialog>\n )}\n {settings && policy && (\n <ConnectedMailAccounts\n policy={policy}\n accounts={accounts.data ?? []}\n user={user}\n oauthReturnPath={oauthReturnPath}\n settings={offline?.renderSettings?.()}\n onClose={() => setSettings(false)}\n />\n )}\n <ConfirmDialog\n isOpen={confirmDelete !== null}\n onClose={() => setConfirmDelete(null)}\n onConfirm={() => void deleteForever()}\n isLoading={deleting}\n title={confirmDelete === 'trash' ? 'Empty Trash?' : 'Delete forever?'}\n description={\n confirmDelete === 'trash'\n ? 'Every message in the Trash is deleted permanently and stops using your storage. This cannot be undone.'\n : 'This message is deleted permanently and stops using your storage. This cannot be undone.'\n }\n confirmText={confirmDelete === 'trash' ? 'Empty Trash' : 'Delete forever'}\n testId=\"mail-delete-forever-dialog\"\n />\n </section>\n )\n}\n","/**\n * One email of the mail client in scope, shown on its own (e.g. in a panel beside a chat): its actions,\n * sender, recipients, attachments and body, as the mailbox shows it. Replying hands the new message to\n * the host (`onCompose`), and so does asking ARBI to draft the reply (`onReplyWithArbi`).\n */\n\nimport { useState } from 'react'\nimport {\n accountPath,\n mailJson,\n useMailAccounts,\n useMailCache,\n useMailClient,\n useMailMessage,\n useMailOnline,\n useMailUnlock,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport { draftMailCompose, replyMailCompose } from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { resolveMailbox } from './mailbox'\n\nexport interface ConnectedMailMessageProps {\n messageId: string\n /** The account the message is in: an id, or `'native'` (default). */\n mailbox?: string\n /** The folder it is in (replying from Sent goes to its recipients). Default: the inbox. */\n folderRole?: string\n onClose: () => void\n /** Reply / reply all / forward: the new message, to open in a composer. */\n onCompose: (initial: MailCompose) => void\n /** Ask ARBI to draft the reply. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n}\n\nexport function ConnectedMailMessage({\n messageId,\n mailbox = 'native',\n folderRole = 'inbox',\n onClose,\n onCompose,\n onReplyWithArbi,\n}: ConnectedMailMessageProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const cache = useMailCache()\n const accounts = useMailAccounts()\n const account = resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(account)\n const detail = useMailMessage(account, messageId, { enabled: !!unlock.data || !isOnline })\n const [error, setError] = useState('')\n const message = detail.data\n if (!account || !message)\n return (\n <p role={detail.error ? 'alert' : 'status'} className=\"p-4 text-sm text-muted-foreground\">\n {detail.error?.message ?? 'Loading message…'}\n </p>\n )\n const update = async (body: MailMessageUpdate) => {\n try {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(message.id)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n await cache.refreshAll()\n if (body.folder_id || body.action) onClose()\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n saveFile(await (await client.fetch(path)).blob(), name)\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const reply = async (forward = false, all = false) => {\n try {\n const attachments = forward\n ? await hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n : []\n onCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {error && (\n <p role=\"alert\" className=\"px-4 pt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={undefined}\n isOnline={isOnline}\n loading={detail.isFetching}\n onBack={onClose}\n onEditDraft={() =>\n void hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n .then((attachments) => onCompose(draftMailCompose(message, attachments)))\n .catch((e: Error) => setError(e.message))\n }\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onDownloadAttachment={(a: MailAttachment) =>\n void download(attachmentPath(account.id, message.id, a.id), a.name)\n }\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n />\n </div>\n )\n}\n","import {\n useAgentSession,\n useStartAgentSession,\n useCloseAgentSession,\n useArbiChat,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ChatPage } from '../chat/ChatPage'\nimport { takeOpenDocumentForTurn } from '../chat/open-document'\n\nexport interface ConnectedAgentChatPanelProps {\n agentId: string\n workspaceId: string\n agentName?: string\n}\n\nfunction ActiveChat({ agentId, workspaceId }: ConnectedAgentChatPanelProps) {\n // The agent drafts in the open document too, when it is in the agent's workspace.\n const chat = useArbiChat({\n agentId,\n workspaceId,\n activeArtifact: () => takeOpenDocumentForTurn({ workspaceId }),\n })\n return (\n <ChatPage\n chat={{ ...chat, assistantMode: undefined, setAssistantMode: undefined }}\n documentsRequired={false}\n compactHeader\n surface=\"dock\"\n emptyTitle=\"What would you like me to do?\"\n emptyDescription=\"This agent works through its own login. Upload files here to stage them in its sandbox.\"\n className=\"h-[min(65vh,650px)] min-h-[380px]\"\n />\n )\n}\n\n/** An owned agent's independent login and chat, using the shared controller and chat surface. */\nexport function ConnectedAgentChatPanel({\n agentId,\n workspaceId,\n agentName = 'Agent',\n}: ConnectedAgentChatPanelProps) {\n const session = useAgentSession(agentId)\n const start = useStartAgentSession()\n const close = useCloseAgentSession()\n const ready = session.data?.active && session.data.workspace_ext_id === workspaceId\n const busy = start.isPending || close.isPending\n const error = start.error ?? close.error ?? session.error\n return (\n <section className=\"space-y-3\" data-testid=\"agent-chat-panel\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <p className=\"text-sm\" data-testid=\"agent-chat-session-status\">\n {agentName} ·{' '}\n {ready\n ? 'Signed in to this workspace'\n : session.data?.active\n ? `Signed in to ${session.data.workspace_name ?? 'another workspace'}`\n : 'Signed out'}\n </p>\n <div className=\"flex gap-2\">\n {!ready && (\n <Button\n type=\"button\"\n disabled={busy || session.isLoading}\n onClick={() => start.mutate({ agentId, workspaceId })}\n data-testid=\"agent-chat-login\"\n >\n {start.isPending ? 'Signing in…' : 'Sign in here'}\n </Button>\n )}\n {session.data?.active && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => close.mutate(agentId)}\n data-testid=\"agent-chat-logout\"\n >\n {close.isPending ? 'Signing out…' : 'Sign out agent'}\n </Button>\n )}\n </div>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error.message}\n </p>\n )}\n {ready && (\n <ActiveChat key={`${agentId}:${workspaceId}`} agentId={agentId} workspaceId={workspaceId} />\n )}\n </section>\n )\n}\n"]}
|