@arbidocs/blocks 0.5.115 → 0.5.117
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/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-OZBTU3IT.cjs} +20 -20
- package/dist/{ConnectedCallDock-WER7R222.cjs.map → ConnectedCallDock-OZBTU3IT.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-VMZE2NFP.cjs} +13 -13
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-VMZE2NFP.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs → ConnectedNativeDocxComparison-7OUKTKYP.cjs} +20 -20
- package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs.map → ConnectedNativeDocxComparison-7OUKTKYP.cjs.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs → ConnectedStreamedWordArtifact-7V24ZDAC.cjs} +20 -20
- package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs.map → ConnectedStreamedWordArtifact-7V24ZDAC.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-OCPFVMLD.cjs} +15 -15
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs.map → DocumentReviewCard-OCPFVMLD.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-I5QIHQZT.cjs → FilesViewerDialog-KLRDIYEH.cjs} +45 -45
- package/dist/{FilesViewerDialog-I5QIHQZT.cjs.map → FilesViewerDialog-KLRDIYEH.cjs.map} +1 -1
- package/dist/{NativeDocxEditor-H6TAEVGY.cjs → NativeDocxEditor-2LQY2CTV.cjs} +6 -6
- package/dist/{NativeDocxEditor-H6TAEVGY.cjs.map → NativeDocxEditor-2LQY2CTV.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-IMAZICIZ.cjs} +8 -8
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs.map → WorkspaceTableView-IMAZICIZ.cjs.map} +1 -1
- package/dist/agents/index.cjs +297 -297
- package/dist/{ai-IM4A23YT.cjs → ai-7U4B4CVF.cjs} +24 -24
- package/dist/ai-7U4B4CVF.cjs.map +1 -0
- package/dist/calls/index.cjs +121 -121
- package/dist/chat/index.cjs +1 -1
- package/dist/{chunk-M6IKVKU5.cjs → chunk-2CSLFAGF.cjs} +392 -149
- package/dist/chunk-2CSLFAGF.cjs.map +1 -0
- package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
- package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
- package/dist/{chunk-P77YTTJ3.cjs → chunk-3ODEWSRO.cjs} +4 -4
- package/dist/{chunk-P77YTTJ3.cjs.map → chunk-3ODEWSRO.cjs.map} +1 -1
- package/dist/{chunk-DDIW4HLU.cjs → chunk-3U36VYMD.cjs} +27 -27
- package/dist/{chunk-DDIW4HLU.cjs.map → chunk-3U36VYMD.cjs.map} +1 -1
- package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
- package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
- package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
- package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
- package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
- package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
- package/dist/{chunk-Y24V6HPR.cjs → chunk-57EE6CMW.cjs} +15 -15
- package/dist/{chunk-Y24V6HPR.cjs.map → chunk-57EE6CMW.cjs.map} +1 -1
- package/dist/{chunk-NNUK5ZM7.cjs → chunk-5QUL5BZO.cjs} +4 -4
- package/dist/{chunk-NNUK5ZM7.cjs.map → chunk-5QUL5BZO.cjs.map} +1 -1
- package/dist/{chunk-OEREKAAP.cjs → chunk-6DCIZA3X.cjs} +75 -75
- package/dist/{chunk-OEREKAAP.cjs.map → chunk-6DCIZA3X.cjs.map} +1 -1
- package/dist/{chunk-YGXOKB5Z.cjs → chunk-7TEUGFIL.cjs} +4 -4
- package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-7TEUGFIL.cjs.map} +1 -1
- package/dist/{chunk-TT4IF52H.cjs → chunk-7X3FS5HQ.cjs} +35 -35
- package/dist/{chunk-TT4IF52H.cjs.map → chunk-7X3FS5HQ.cjs.map} +1 -1
- package/dist/{chunk-CPR6EHG7.cjs → chunk-7XT5B2DZ.cjs} +47 -47
- package/dist/{chunk-CPR6EHG7.cjs.map → chunk-7XT5B2DZ.cjs.map} +1 -1
- package/dist/chunk-BKY2LAV2.cjs +18 -0
- package/dist/{chunk-CIHERNDO.cjs.map → chunk-BKY2LAV2.cjs.map} +1 -1
- package/dist/{chunk-XKVPSOKP.cjs → chunk-BW5MF464.cjs} +4 -4
- package/dist/{chunk-XKVPSOKP.cjs.map → chunk-BW5MF464.cjs.map} +1 -1
- package/dist/{chunk-IW7CDJTA.cjs → chunk-COD5ENHK.cjs} +4 -4
- package/dist/{chunk-IW7CDJTA.cjs.map → chunk-COD5ENHK.cjs.map} +1 -1
- package/dist/{chunk-A3T3IC3K.cjs → chunk-D7ICHGWM.cjs} +239 -85
- package/dist/chunk-D7ICHGWM.cjs.map +1 -0
- package/dist/{chunk-TDO5UWXF.cjs → chunk-E4BLRF2L.cjs} +5 -5
- package/dist/{chunk-TDO5UWXF.cjs.map → chunk-E4BLRF2L.cjs.map} +1 -1
- package/dist/{chunk-WR2SF44W.cjs → chunk-E4DUXU5K.cjs} +9 -9
- package/dist/{chunk-WR2SF44W.cjs.map → chunk-E4DUXU5K.cjs.map} +1 -1
- package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
- package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
- package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
- package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
- package/dist/{chunk-6UTKM5AB.cjs → chunk-JSQQV23D.cjs} +3 -3
- package/dist/{chunk-6UTKM5AB.cjs.map → chunk-JSQQV23D.cjs.map} +1 -1
- package/dist/{chunk-557MJ4IH.cjs → chunk-LFRNBT2I.cjs} +20 -20
- package/dist/{chunk-557MJ4IH.cjs.map → chunk-LFRNBT2I.cjs.map} +1 -1
- package/dist/{chunk-R7CJEIA5.cjs → chunk-LYTIQQQ2.cjs} +3 -3
- package/dist/{chunk-R7CJEIA5.cjs.map → chunk-LYTIQQQ2.cjs.map} +1 -1
- package/dist/{chunk-CPG7II4E.cjs → chunk-MC4F2URI.cjs} +28 -28
- package/dist/{chunk-CPG7II4E.cjs.map → chunk-MC4F2URI.cjs.map} +1 -1
- package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
- package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
- package/dist/{chunk-ZTXQIIFV.cjs → chunk-OZVDOAXG.cjs} +6 -6
- package/dist/{chunk-ZTXQIIFV.cjs.map → chunk-OZVDOAXG.cjs.map} +1 -1
- package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
- package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
- package/dist/{chunk-KTQOGT2L.cjs → chunk-TDN33HSK.cjs} +6 -6
- package/dist/{chunk-KTQOGT2L.cjs.map → chunk-TDN33HSK.cjs.map} +1 -1
- package/dist/{chunk-T23UTIRI.cjs → chunk-UNDQYTRF.cjs} +6 -6
- package/dist/{chunk-T23UTIRI.cjs.map → chunk-UNDQYTRF.cjs.map} +1 -1
- package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
- package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
- package/dist/{chunk-24EDG4PC.cjs → chunk-VBL3SHWX.cjs} +50 -50
- package/dist/{chunk-24EDG4PC.cjs.map → chunk-VBL3SHWX.cjs.map} +1 -1
- package/dist/{chunk-3A7QWUAW.cjs → chunk-VKH3BEZE.cjs} +3 -3
- package/dist/{chunk-3A7QWUAW.cjs.map → chunk-VKH3BEZE.cjs.map} +1 -1
- package/dist/{chunk-X5LANJDZ.cjs → chunk-VTYJAZDU.cjs} +23 -15
- package/dist/chunk-VTYJAZDU.cjs.map +1 -0
- package/dist/{chunk-B3LZITVF.cjs → chunk-WW6LXQY6.cjs} +12 -12
- package/dist/{chunk-B3LZITVF.cjs.map → chunk-WW6LXQY6.cjs.map} +1 -1
- package/dist/{chunk-NJCK6V6U.cjs → chunk-XKDUPU7B.cjs} +4 -4
- package/dist/{chunk-NJCK6V6U.cjs.map → chunk-XKDUPU7B.cjs.map} +1 -1
- package/dist/{chunk-42TURFHF.cjs → chunk-YGBHY67W.cjs} +5 -5
- package/dist/{chunk-42TURFHF.cjs.map → chunk-YGBHY67W.cjs.map} +1 -1
- package/dist/connect/docx.cjs +24 -24
- package/dist/connect/index.cjs +983 -983
- package/dist/connect/viewer.cjs +34 -34
- package/dist/connection/docx/ConnectedNativeDocxEditor.js +10 -2
- package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
- package/dist/connection/viewer/ConnectedDocumentViewer.js +124 -21
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/VersionDropdown.d.ts +9 -0
- package/dist/connection/viewer/VersionDropdown.js +39 -0
- package/dist/connection/viewer/VersionDropdown.js.map +7 -0
- package/dist/connection/viewer/ViewerPdfPane.js +4 -1
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/useViewerBlobs.d.ts +3 -1
- package/dist/connection/viewer/useViewerBlobs.js +14 -8
- package/dist/connection/viewer/useViewerBlobs.js.map +2 -2
- package/dist/connection/viewer/useViewerTabs.js +10 -0
- package/dist/connection/viewer/useViewerTabs.js.map +2 -2
- package/dist/dashboards/index.cjs +1 -1
- package/dist/docx/DocxCommandMenu.d.ts +8 -0
- package/dist/docx/DocxCommandMenu.js +202 -0
- package/dist/docx/DocxCommandMenu.js.map +7 -0
- package/dist/docx/NativeDocxEditor.d.ts +4 -2
- package/dist/docx/NativeDocxEditor.js +51 -12
- package/dist/docx/NativeDocxEditor.js.map +2 -2
- package/dist/docx/RibbonMenu.d.ts +3 -1
- package/dist/docx/RibbonMenu.js +10 -3
- package/dist/docx/RibbonMenu.js.map +2 -2
- package/dist/docx/RibbonOverflow.d.ts +3 -0
- package/dist/docx/RibbonOverflow.js +24 -1
- package/dist/docx/RibbonOverflow.js.map +2 -2
- package/dist/docx/index.cjs +38 -38
- package/dist/docx/signatures/SignatureFields.d.ts +3 -1
- package/dist/docx/signatures/SignatureFields.js +17 -8
- package/dist/docx/signatures/SignatureFields.js.map +2 -2
- package/dist/embed/index.cjs +38 -38
- package/dist/files/index.cjs +224 -224
- package/dist/index.cjs +1590 -1590
- package/dist/settings/index.cjs +147 -147
- package/dist/shell/index.cjs +90 -90
- package/dist/studio/index.cjs +26 -26
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +55 -55
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/src/docx/styles.css +94 -0
- package/dist/ai-IM4A23YT.cjs.map +0 -1
- package/dist/chunk-A3T3IC3K.cjs.map +0 -1
- package/dist/chunk-CIHERNDO.cjs +0 -18
- package/dist/chunk-M6IKVKU5.cjs.map +0 -1
- package/dist/chunk-X5LANJDZ.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/entities/renderConnectedUser.tsx","../src/connection/remote-control/remoteControl.ts","../src/connection/defaultHost.tsx","../src/connection/auth/support.ts","../src/connection/settings-page/SessionStatusIcon.tsx","../src/connection/ConnectedSettings.tsx","../src/connection/config/useModelPicker.ts","../src/connection/config/ConnectedModelSelector.tsx","../src/connection/tips/useContextualHints.ts","../src/connection/conversation/ConversationComposer.tsx","../src/connection/conversation/MessageLiveSeconds.tsx","../src/connection/conversation/AgentSteps.tsx","../src/connection/conversation/RunningSubagents.tsx","../src/connection/conversation/AnswerTable.tsx","../src/connection/conversation/useOpenChunk.ts","../src/connection/conversation/useWorkspaceDocTitles.ts","../src/connection/conversation/ConnectedCitationRenderer.tsx","../src/connection/conversation/MessageDetailsModal.tsx","../src/connection/conversation/useOpenWorkspaceIcon.tsx","../src/connection/conversation/AskAgainContext.ts","../src/connection/conversation/WorkflowStepMessage.tsx","../src/connection/conversation/ConnectedMessage.tsx","../src/connection/conversation/ConnectedBranchControls.tsx","../src/connection/conversation/ConnectedThreadsPreview.tsx","../src/chat/messageRowSize.ts","../src/connection/conversation/ConnectedMessageList.tsx","../src/connection/conversation/ConnectedMessageArea.tsx","../src/connection/conversation/ConnectedCompactConversation.tsx","../src/connection/conversation/ConnectedConversationDocumentPicker.tsx","../src/connection/auth/ConnectedForgotPassword.tsx","../src/connection/auth/signup-backup.ts","../src/connection/auth/useLoginActions.ts","../src/connection/auth/useLoginForm.ts","../src/connection/auth/useSsoVerificationRedirect.ts","../src/connection/auth/ConnectedLoginPage.tsx","../src/connection/auth/sso-name.ts","../src/connection/auth/sso-sign-in.ts","../src/connection/auth/ConnectedCompactLogin.tsx","../src/connection/embedded/EmbeddedNavigation.tsx","../src/connection/embedded/EmbeddedChatPanel.tsx"],"names":["jsx","ConnectedUserEntity","remoteControlActions","remoteControlStateOf","logger","isSurfaceMounted","toRemoteControlRequest","cancelGuidedRun","useArbiSessionStore","useGuidedRuns","useMemo","useArbiHost","useArbiSession","useEffect","useRef","useConnection","ArbiWebSocketProvider","useBlocksEnvironment","useOfflineMailRuntime","OUTBOX_FOLDER","sessionStorage","client","createArbiQueryClient","Arbi","browserSessionStateStorage","QueryClientProvider","ConnectionProvider","useHost","DEFAULT_PASSWORD_RULES","ArbiBotHeadIcon","Monitor","notify","useProfile","useUpdateProfile","useRequestEmailChange","useConfirmEmailChange","useNameEditor","useAvatarCrop","useEmailChange","jsxs","SettingsSection","UserCircle","ProfileCard","Fragment","AvatarPicker","initials","ImageCropModal","useIdentityVerification","IdentityVerificationCard","IdentityVerificationDialog","usePasswordChange","usePasswordChangeForm","PasswordChangeDialog","useState","KeyRound","SettingsCard","SettingsActionRow","EMAIL_NOTIFICATION_CATEGORIES","EMAIL_NOTIFICATION_KEYS","useNotificationPreferences","NotificationCategoryList","toNotificationCategories","useSessions","useCurrentSessionId","useTerminateSession","toActiveSessionViews","SettingsRow","Button","Radio","ActiveSessionsDialog","useSignOut","useIsOnline","confirmLosingOfflineMail","LogoutDialog","isAgent","toLogoutSessionViews","useDeleteAccount","useDeleteAccountFlow","SettingsDangerZone","DeleteAccountDialog","toDeleteBlockerViews","useAvailableModels","useUserSettings","useApplyChatModel","useArbiSessionState","useConfig","resolveConfigModel","standardTier","premiumTier","AUTO_CHAT_MODEL","useCallback","formatGbpPerMillionTokens","ARBI_MARK_SRC","ModelTierIcon","ModelAutoIcon","ProviderIcon","ModelDot","ModelPricingTip","ModelPickerPopover","ModelPickerTrigger","ModelOption","ModelMenuDivider","ModelTierOption","ModelConfigureButton","ModelMenuMessage","TooltipProvider","Tooltip","TooltipTrigger","Select","SelectTrigger","cn","ModelTriggerContent","SelectContent","SelectItem","ModelOptionLabel","TooltipContent","useTransientView","TIPS_VISIBILITY_OVERRIDE","useUpdateUserSettings","setHintsSessionOverride","selectDraft","useLongPaste","useLayoutEffect","useSlashItems","BUILTIN_SKILLS","useWorkspaceUsers","useAssistantName","buildMentionCandidates","useMentionAutocomplete","useConversations","useRecipientDraft","useAssistantCopy","useListKeyNav","Composer","SlashMenu","MentionMenu","Settings","ContextUsageBar","ConversationComposer","memo","useMessageTimer","React","getModelIcon","useDocuments","getDocumentTitle","mergeAgentSteps","extractSubagentLanes","getCurrentStep","getAgentStepPresentation","getStepDisplay","stepAccent","MODEL_TIER_ICON_MAP","StepRow","MODEL_TIER_LABELS","formatTokens","formatGbp","StepNarration","ConnectedMarkdown","StepSummary","StepDetail","StepOutcome","StepParams","GoalCriteria","SubStepGroup","computeRunStats","StepTraceSummary","isNearAiUsageBudget","StepTrace","SubAgentLane","subagentJobLabel","getAgentStepLabel","getStepTool","useConversationData","findLeafForTaskMessage","SubagentRoster","downloadTableAsCsv","ChevronRight","Download","citedVersionRef","workspaceDocIdFromHref","InternalDocLink","ExternalLink","CitationRendererCore","useMessageDetails","Dialog","DialogContent","ModalBreadcrumbHeader","FileText","ModalCrumbs","Loader2","MessageJsonTree","useWorkspaces","ShieldIcon","workspaceKindColor","getWorkspaceKind","createContext","useConversationItems","useConversationActivity","fromPlanSteps","stepStatesFromActivity","stepDocuments","splitDocRef","WorkflowStepChip","stepKindOf","stepPhase","useLinkMentions","useDeleteMessage","getSubagentBranchRecord","useMessageChatArtifact","findMessageDocument","artifactKindFromFileName","isImageDocument","viewerTabForArtifactMode","transcriptSegmentOf","citationData","buildCitationChunkData","useThinkingContent","getCurrentAgentStepPresentation","useContext","buildFactCitations","topLevelAgentSteps","buildDeepLinkPath","copyMessageToClipboard","err","useConversationWorkspace","useCreateFact","useCreateFacts","chronologyFactBodies","formatFriendlyDate","useTranscriptRuns","Edit3","Copy","Link","Share2","Trash2","MessageActionMenu","MessageActionButton","Check","Milestone","MessageFooter","DocumentUser","AssistantEntity","RotateCcw","workflowStepOf","getUserDisplayName","TranscriptEntry","stripSpeakerPrefix","ErrorBoundary","MessageRoot","MessageContent","MessageAuthor","MessageBubble","MessageByline","MessageSubagentBadge","MessageBody","MessageNarration","Clock","MessageArtifactCard","BranchControls","getEntityLabel","Network","EntityIcon","ThreadVisualizer","getParticipantTints","useBranchNavigation","findMainSiblingLeaf","sliceToSubagentThread","useStreamAnnouncement","stripThinking","useConnectedThreadActivity","useVirtualizer","flashMessage","MessageList","ThreadActivity","forwardRef","useConversationTurn","useSlashSkillWorkflows","useAutoSendDraft","CompactChatContext","EmptyState","MessageSquare","ComposerContainer","ArrowDown","Square","Send","useUploadDocuments","useWorkspaceRole","Popover","PopoverTrigger","Paperclip","PopoverContent","Upload","Search","Checkbox","Eye","X","useArbi","validateRecoveryKeyFile","RECOVERY_KEY_ERRORS","decryptRecoveryKey","parseAuthError","AccountRecoveryDialog","promptSaveCredential","downloadRecoveryFile","useOptionalConnection","firstName","splitAuthHash","withTrailingFragment","prefetchChunk","initSodium","useFragmentCredentials","parseRecoveryUrl","AuthOfflineBadge","AuthTabs","AuthLayout","AuthHeading","AuthField","AuthLink","AuthFieldBadge","BadgeCheck","AuthInput","AuthNote","PasswordStrengthInput","RevealablePasswordInput","prewarmKeyPairs","AuthConsent","AuthSubmitButton","AuthDivider","LinkedInIcon","GoogleIcon","AppleIcon","login","Input","LogIn","parseVersionRef","ArbiHost","MobileAppBar","ArrowLeft","Sidebar","error","useDocument","useDownloadDocuments","DocumentReview","useSelectWorkspace","Plus","LogOut"],"mappings":"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","file":"chunk-OEREKAAP.cjs","sourcesContent":["import type { DocumentsSupport } from '@arbidocs/react'\nimport { ConnectedUserEntity } from './ConnectedUserEntity'\n\n/**\n * People in the document kits (a version's author, a comment, an activity entry) as connected\n * entities: the host configuration's `documents.renderUser`.\n */\nexport const renderConnectedUser: NonNullable<DocumentsSupport['renderUser']> = (\n user,\n { tooltip, variant = 'icon' }\n) => (\n <ConnectedUserEntity\n user={user}\n size={variant === 'pill' ? 'sm' : 'xs'}\n variant={variant}\n showTooltip={tooltip}\n />\n)\n","/**\n * Remote-control orchestration — the frontend side of \"a backend agent drives the UI over the\n * websocket\" (the message and the session state: `@arbidocs/react`'s remote-control module).\n *\n * This is the SEPARATE, gated entry point for websocket-arriving runs. It is deliberately distinct\n * from a site's `GuidedRuns.run` so that local \"Show me\" tips (which run directly) are NEVER gated\n * by consent — GUARANTEE #4. Only runs that arrive here, from the socket, pass through the gate.\n *\n * Gate logic (`handleMessage`):\n * - the site has not turned remote control on (`guided.remoteControl`), or the consent prompt or\n * the guided cursor is not on screen → refuse: nothing runs, nothing is asked.\n * - remote control `enabled` this session → run immediately.\n * - otherwise → stash the request in `pending` (the consent prompt opens); run NOTHING until the\n * user grants (GUARANTEE #2).\n *\n * What a remote command can run: a `sequence_id` the site registered (`GuidedRuns.isSequenceId`)\n * or inline `steps` whose every step has a target, through the one guided runner — nothing else\n * (no action dispatch). In a remote run the runner acts only on what the user can see, caps waits\n * and pauses at 5 s, and never acts inside an off-limits surface (remote control's own controls,\n * so a one-off grant cannot grant itself the session; credential and endpoint forms) nor on a\n * label whose control is inside one; no guided run types into a secret field.\n *\n * Every sign-in, sign-out, session expiry and change of user drops the grant, any pending request\n * and the run in flight (`useRemoteControlSessionReset`, mounted with the handler and the cursor),\n * so nothing carries over to the next person in the tab.\n *\n * While a run executes, `controllingAgent` is set (labels the pill) and cleared afterwards.\n * Turning remote control off (`disable`) cancels any in-flight run immediately (GUARANTEE #5).\n */\nimport { useEffect, useMemo, useRef } from 'react'\nimport { logger } from '@arbidocs/client'\nimport {\n remoteControlActions,\n remoteControlStateOf,\n toRemoteControlRequest,\n useArbiHost,\n useArbiSession,\n useArbiSessionStore,\n type ArbiWsHandlers,\n type GuidedStep,\n type RemoteControlMessage,\n type RemoteControlRequest,\n type RemoteControlSession,\n} from '@arbidocs/react'\nimport { cancelGuidedRun } from '../../guided/runner'\nimport type { GuidedRuns } from '../../guided/sequences'\nimport { useGuidedRuns } from '../../guided/useGuidedRuns'\nimport { isSurfaceMounted } from '../../guided/surfaces'\n\nexport interface RemoteControl {\n /** The websocket entry point, for a `remote_control` message. Gated (see the file header). */\n handleMessage(msg: RemoteControlMessage): void\n /**\n * Grant the pending consent and run it. `forSession: true` keeps remote control enabled so\n * later websocket runs go without re-prompting; `false` runs the one pending run and leaves it\n * disabled (\"just this once\").\n */\n grantAndRun(opts: { forSession: boolean }): void\n /** Deny the pending consent — clears it and runs nothing. */\n deny(): void\n /**\n * Turn remote control OFF and revoke immediately (GUARANTEE #5): clears the enabled flag, the\n * pending prompt and the pill, and cancels any in-flight run so the guided cursor stops at once.\n */\n disable(): void\n /** Turn remote control ON directly — the user's own explicit choice. Runs nothing by itself. */\n enable(): void\n}\n\n/** Remote control on a session's state, running the site's guided runs. */\nexport function createRemoteControl(\n session: RemoteControlSession,\n guided: Pick<GuidedRuns, 'isSequenceId' | 'run' | 'remoteControl'>\n): RemoteControl {\n const actions = remoteControlActions(session)\n const state = () => remoteControlStateOf(session.getState())\n\n /** Resolve a request to the concrete run input for the runner. */\n const resolveRun = (req: RemoteControlRequest): string | GuidedStep[] | null => {\n if (req.steps && req.steps.length > 0) return req.steps\n if (req.sequenceId && guided.isSequenceId(req.sequenceId)) return req.sequenceId\n return null\n }\n\n /** Execute a request, labelling the pill for its duration. The ONLY place a websocket-arriving\n * run reaches the runner. */\n const runRemoteRequest = async (req: RemoteControlRequest): Promise<void> => {\n const run = resolveRun(req)\n if (!run) return\n actions.setControllingAgent({ name: req.agentName, extId: req.agentExtId })\n try {\n await guided.run(run, { remote: true })\n } finally {\n // Only clear the pill if THIS run is still the active one — a newer run or a disable will\n // have replaced/cleared it already.\n const current = state().controllingAgent\n if (current && current.name === req.agentName && current.extId === req.agentExtId) {\n actions.setControllingAgent(null)\n }\n }\n }\n\n return {\n handleMessage(msg) {\n if (!guided.remoteControl) {\n logger.warn('[RemoteControl] Off on this site — ignoring a request')\n return\n }\n if (!isSurfaceMounted('consent') || !isSurfaceMounted('cursor')) {\n logger.warn('[RemoteControl] No consent prompt or cursor on screen — ignoring a request')\n return\n }\n const req = toRemoteControlRequest(msg, guided.isSequenceId)\n if (!req) return\n if (state().enabled) {\n logger.info('[RemoteControl] Enabled — running requested action from', req.agentName)\n void runRemoteRequest(req)\n return\n }\n logger.info('[RemoteControl] Consent required — prompting for', req.agentName)\n actions.request(req)\n },\n grantAndRun(opts) {\n const pending = state().pending\n actions.grant(opts)\n if (pending) void runRemoteRequest(pending)\n },\n deny: () => actions.deny(),\n disable() {\n actions.setEnabled(false)\n cancelGuidedRun()\n },\n enable: () => actions.setEnabled(true),\n }\n}\n\n/** Remote control on the host's session and guided runs. */\nexport function useRemoteControlActions(): RemoteControl {\n const session = useArbiSessionStore()\n const guided = useGuidedRuns()\n return useMemo(() => createRemoteControl(session, guided), [session, guided])\n}\n\n/**\n * Drop remote control's grant, its pending request and the guided run in flight on every sign-in,\n * sign-out and session expiry of the host's `Arbi`, and whenever the signed-in user changes (a\n * host that signs in its own way), so nothing carries over to the next person in the tab.\n */\nexport function useRemoteControlSessionReset(): void {\n const session = useArbiSessionStore()\n const { arbi } = useArbiHost()\n const userId = useArbiSession().user?.external_id ?? null\n useEffect(() => {\n const reset = () => {\n remoteControlActions(session).reset()\n cancelGuidedRun()\n }\n if (!arbi) return\n // A host's stand-in `Arbi` (a demo, a test) may lack some of them.\n const off = [\n arbi.onSigningOut?.(reset),\n arbi.onSessionExpired?.(reset),\n arbi.onSignedIn?.(reset),\n ]\n return () => off.forEach((unsubscribe) => unsubscribe?.())\n }, [arbi, session])\n const lastUser = useRef(userId)\n useEffect(() => {\n if (lastUser.current === userId) return\n lastUser.current = userId\n remoteControlActions(session).reset()\n cancelGuidedRun()\n }, [userId, session])\n}\n\n/**\n * The live connection's handler for remote control (`ArbiWebSocketProvider` `handlers`): an\n * `agt-…` agent asking to drive the UI goes to the consent-gated entry point. None while the\n * site has not turned remote control on (`guided.remoteControl`). It also drops the grant and\n * the run in flight at every sign-in and sign-out (`useRemoteControlSessionReset`).\n */\nexport function useRemoteControlHandlers(): ArbiWsHandlers {\n useRemoteControlSessionReset()\n const remote = useRemoteControlActions()\n const { remoteControl } = useGuidedRuns()\n return useMemo(\n () =>\n remoteControl\n ? {\n remote_control: (message) =>\n remote.handleMessage(message as unknown as RemoteControlMessage),\n }\n : {},\n [remote, remoteControl]\n )\n}\n","/**\n * The host configuration of a blocks-only site (Clarum, the custom site starter): an `Arbi` on the\n * site's backend and the sign-in layer (demo or live login, the selected workspace, the live\n * connection), with React Query, people in the document kits as connected entities, and mail kept\n * on the device (`useOfflineMailRuntime`: the Outbox and changes made offline go out on reconnect,\n * and recent mail stays readable offline).\n *\n * const host = defaultHost({ apiUrl, demoUser, … }) // once, at module scope\n * <ArbiHost config={{ ...host, environment: { navigate }, billing }}>\n * <Site />\n * </ArbiHost>\n *\n * With no live `apiUrl` the `Arbi` points at `demoApiUrl` (cheap, inert) and the site runs in\n * seeded demo mode. A site with its own login passes its own `arbi` and `session` instead.\n */\nimport type { ReactNode } from 'react'\nimport { type QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport {\n ArbiWebSocketProvider,\n createArbiQueryClient,\n OUTBOX_FOLDER,\n useOfflineMailRuntime,\n} from '@arbidocs/react'\nimport { Arbi } from '@arbidocs/sdk/browser'\nimport { browserSessionStateStorage, type SessionStateStorage } from '@arbidocs/client'\nimport type { ArbiHostConfig } from '../provider/host'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\nimport { renderConnectedUser } from './entities/renderConnectedUser'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { useRemoteControlHandlers } from './remote-control/remoteControl'\n\nexport interface DefaultHostOptions {\n /** The React Query client the kits share. Default: a new `createArbiQueryClient()`. */\n queryClient?: QueryClient\n /** Optional session state adapter; embedded hosts isolate deployment tokens. */\n sessionStorage?: SessionStateStorage\n}\n\n/**\n * The shared WebSocket, open while signed in live (demo and signed-out sessions have no backend),\n * with remote control's consent-gated handler where the site turned it on (`guided.remoteControl`;\n * none otherwise). Every sign-in and sign-out drops remote control's grant and stops a guided run.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider\n enabled={status === 'authenticated'}\n handlers={useRemoteControlHandlers()}\n >\n {children}\n </ArbiWebSocketProvider>\n )\n}\n\n/** Mail kept on this device, for the signed-in user with Mail on (see `useOfflineMailRuntime`). */\nfunction OfflineMail({ children }: { children: ReactNode }) {\n const { openMail } = useBlocksEnvironment()\n useOfflineMailRuntime({ openOutbox: () => openMail?.({ folder: OUTBOX_FOLDER }) })\n return children\n}\n\n/** `arbi` and the sign-in layer (`connection`) for `<ArbiHost config>`. Call it once per site. */\nexport function defaultHost(\n config: ArbiConnectionConfig,\n { queryClient, sessionStorage }: DefaultHostOptions = {}\n): Pick<ArbiHostConfig, 'arbi' | 'connection' | 'documents'> {\n // ARBI-frontend's client: its freshness, retries and write notices (`@arbidocs/react`).\n const client = queryClient ?? createArbiQueryClient().queryClient\n const arbi = new Arbi({\n url: config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local',\n deploymentDomain: config.deploymentDomain,\n // Live: the signed-in session survives a reload (the connection restores it).\n sessionStorage: config.apiUrl ? (sessionStorage ?? browserSessionStateStorage()) : undefined,\n })\n // What was read for the user never outlives their session, signed out or expired: the next one\n // starts from an empty cache (the same client, so every hook keeps it). Its keys are not per user.\n arbi.onSigningOut(() => client.clear())\n arbi.onSessionExpired(() => client.clear())\n function DefaultHostConnection({ children }: { children: ReactNode }) {\n return (\n <QueryClientProvider client={client}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>\n <OfflineMail>{children}</OfflineMail>\n </ConnectionBoundWebSocket>\n </ConnectionProvider>\n </QueryClientProvider>\n )\n }\n // People in the document kits as connected entities (presence, \"You\", a click opens a chat).\n return {\n arbi,\n connection: { Provider: DefaultHostConnection },\n documents: { renderUser: renderConnectedUser },\n }\n}\n","/**\n * What a site gives the connected sign-in kits (`ConnectedLoginPage`, `ConnectedForgotPassword`,\n * `ConnectedRecoveryKeyDialog`), once, in its host configuration:\n *\n * - `auth`: the look of the auth pages (brand, the panel beside the form, the footer, the legal\n * links), the password rules, and what the site does around a sign-in (a fresh registration's\n * landing, an invitation's return path);\n * - `sso`: the single sign-on provider, as a hook (its state is live). Blocks ship an Auth0 one; a\n * site without SSO leaves it out and the SSO affordances are hidden.\n */\n\nimport type { ReactNode } from 'react'\nimport type { LoginResult } from '@arbidocs/client'\nimport type { AuthLegalLink } from '../../auth/AuthFooter'\nimport type { PasswordRules } from '../../auth/password-rules'\nimport { DEFAULT_PASSWORD_RULES } from '../../auth/password-rules'\nimport { useHost } from '../../provider/host'\n\nexport interface AuthPagesSupport {\n /** The brand mark at the top of every auth page. */\n brand?: ReactNode\n /** The corner of the auth pages (ARBI shows the deployment there). */\n corner?: ReactNode\n /** The panel beside the sign-in and registration forms. */\n aside?: ReactNode\n /** Under the sign-in form (privacy link, install options). */\n footer?: ReactNode\n /** Above the form (a warning that this browser cannot keep the session, say). */\n banner?: ReactNode\n /** Shown while the page hands over to the SSO provider. */\n loading?: ReactNode\n /** The sign-up consent: the legal documents and the warning without a recovery key. */\n consent?: {\n termsLink: AuthLegalLink\n privacyLink: AuthLegalLink\n noRecoveryKeyWarning?: string\n }\n /** The rules a new password must meet. Default: `DEFAULT_PASSWORD_RULES`. */\n passwordRules?: PasswordRules\n /** Only SSO: the page hands straight over to the provider. */\n ssoOnly?: boolean\n /**\n * Visitors can create an account here. Default: on. Off (a staff-only site whose accounts are\n * made for people): the page signs in only, with no Register tab.\n */\n allowRegistration?: boolean\n /** The sign-in heading and the line under it. Default: \"Welcome back\". */\n heading?: { title: string; description?: ReactNode }\n /** The email field's label on sign-in. Default: \"Email\". */\n emailLabel?: string\n /**\n * Sign in from `#email=…&password=…[&next=…]` (mock and demo deployments only; see\n * `useFragmentCredentials`). A `next` path goes to `onReturnPath`. Default: off.\n */\n fragmentSignIn?: boolean\n /** The visitor started to sign in: warm what the signed-in app needs. */\n onIntent?: () => void\n /** An invitation link carries where to go once signed in. */\n onReturnPath?: (path: string) => void\n /** A fresh registration signed in (the site's first landing; its workspaces are in the login). */\n onRegistered?: (login: LoginResult) => void\n /** Signed in with a recovery key: the site asks for a new password. */\n onRecovered?: () => void\n /** Signed in on this device while offline. */\n onUnlockedOffline?: () => void\n /** The SSO provider's email verification failed, with its message. Default: a notice. */\n onVerificationFailed?: (message: string) => void\n}\n\n/** The account signed in at the SSO provider (its claims). */\nexport interface SsoUser {\n /** The provider's id of the account: an SSO account's recovery key is sealed to it. */\n sub: string\n email?: string\n name?: string\n given_name?: string\n family_name?: string\n picture?: string\n}\n\n/** The single sign-on provider as the kits see it. */\nexport interface SsoSignIn {\n /** SSO can run in this browser (Auth0 needs a secure origin). */\n available: boolean\n /** The provider is still settling (after a redirect back). */\n isLoading: boolean\n /** Signed in at the provider. */\n isAuthenticated: boolean\n /** The account signed in at the provider; `null` when none. */\n user: SsoUser | null\n /**\n * Hand over to the provider's sign-in. It comes back to `returnTo` (the site's path), or to\n * `redirectUri` (an absolute callback); `consent` asks again (after an email verification).\n */\n signIn(options?: {\n returnTo?: string\n redirectUri?: string\n consent?: boolean\n connection?: string\n }): Promise<void>\n /** Sign out at the provider, coming back to `returnTo`. */\n signOut(options?: { returnTo?: string }): void\n /** The provider's token for the signed-in account, or `null`. */\n getToken(): Promise<string | null>\n /**\n * Where to continue a provider-side account link (`link`) or give it up (`cancel`), for the\n * linking `state` the provider sent back. Absent: the provider links no accounts.\n */\n continueUrl?(action: 'link' | 'cancel', state: string): string\n}\n\nexport interface SsoSupport {\n /** The provider's live state and actions. */\n useSignIn(): SsoSignIn\n}\n\nconst NO_SSO: SsoSignIn = {\n available: false,\n isLoading: false,\n isAuthenticated: false,\n user: null,\n signIn: () => Promise.reject(new Error('No SSO provider is configured')),\n signOut: () => {},\n getToken: async () => null,\n}\n\n/** The auth pages' configuration, with its defaults. */\nexport function useAuthPages(): AuthPagesSupport & { passwordRules: PasswordRules } {\n const auth = useHost().auth\n return { ...auth, passwordRules: auth?.passwordRules ?? DEFAULT_PASSWORD_RULES }\n}\n\n/** The SSO provider; none (unavailable) without one. */\nexport function useSsoSignIn(): SsoSignIn {\n const sso = useHost().sso\n // A host's `sso` is fixed for its lifetime, so the hook is called on every render or never.\n return sso ? sso.useSignIn() : NO_SSO\n}\n","import { Monitor } from 'lucide-react'\nimport { ArbiBotHeadIcon } from '@arbidocs/react'\n\n/** The glyph of a signed-in session: an agent's bot head, else a device. */\nexport function SessionStatusIcon({ status, className }: { status: string; className?: string }) {\n if (status === 'agent') return <ArbiBotHeadIcon className={className ?? 'w-4 h-4'} />\n return <Monitor className={className ?? 'w-4 h-4 text-muted-foreground'} />\n}\n\n/** `renderSessionIcon` default of the session lists. */\nexport const renderSessionStatusIcon = (status: string) => <SessionStatusIcon status={status} />\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 * `defaultHost`'s sign-in layer gives one over the SDK; a host with its own session and API\n * client gives its own as its host config's `account` (as ARBI-frontend does), and these sections\n * work alike.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n confirmLosingOfflineMail,\n ImageCropModal,\n useArbiSession,\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/core'\nimport { Button, type IdentityStatus, isAgent } 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 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/environment'\nimport { useAuthPages } from './auth/support'\nimport { renderSessionStatusIcon } from './settings-page/SessionStatusIcon'\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 /** Classes of the initials avatar shown without a picture (e.g. the host's per-user colour). */\n avatarClassName?: string\n /** A compact status beside the profile name. */\n nameBadge?: ReactNode\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 avatarClassName = 'bg-primary text-primary-foreground',\n nameBadge,\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=\"Profile\">\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 nameBadge={nameBadge}\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 /** Collapse the secondary settings card by default. */\n collapsible?: boolean\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 collapsible,\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\n flow={flow}\n labels={labels}\n onManageBilling={onManageBilling}\n collapsible={collapsible}\n />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n onManageBilling={onManageBilling}\n />\n </>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\nexport interface ConnectedPasswordChangeDialogProps {\n open: boolean\n onClose: () => void\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 recoveryMode = false,\n onRecoveryComplete,\n}: ConnectedPasswordChangeDialogProps) {\n const { notify } = useBlocksEnvironment()\n // The site's password rules (the host configuration's `auth`).\n const getUnmetRequirement = useAuthPages().passwordRules.unmet\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 /** 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({ children }: 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 open={open} onClose={() => setOpen(false)} />\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}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\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=\"Notifications\">\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; default `SessionStatusIcon`. */\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** \"Active sessions\" row with the manage dialog (`ActiveSessionsDialog`); end any but this device. */\nexport function ConnectedSessionsRow({\n renderSessionIcon = renderSessionStatusIcon,\n}: 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 /**\n * Ask before signing out; resolve `false` to stay signed in. Default: ask when unsent mail,\n * drafts or changes are kept only on this device (`confirmLosingOfflineMail`, which looks at the\n * device itself, so it asks even before the mail settings have loaded).\n */\n confirmSignOut?: () => Promise<boolean> | boolean\n /** Glyph per session status; default `SessionStatusIcon`. */\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 confirmSignOut,\n renderSessionIcon = renderSessionStatusIcon,\n}: ConnectedLogoutDialogProps) {\n const user = useArbiSession().user\n const sessions = useSessions({ enabled: open })\n const signOut = useSignOut()\n const isOnline = useIsOnline()\n const { confirm } = useBlocksEnvironment()\n const run = async (everywhere: boolean) => {\n onClose()\n const confirmed = confirmSignOut ? confirmSignOut() : confirmLosingOfflineMail(confirm)\n if (!(await confirmed)) 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 // \"All sessions\" is for people, not for agent accounts.\n canLogoutAll={!(user && isAgent(user))}\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","/**\n * Model picker behaviour: tier discovery from the live model list, the selected model (store or\n * controlled), saving the choice to the backend config, and keeping the active model in sync with\n * the user's Premium preference. Presentation lives in `@arbidocs/blocks` (ModelPicker parts).\n */\n\nimport { useMemo, useCallback, useEffect } from 'react'\nimport {\n AUTO_CHAT_MODEL,\n formatGbpPerMillionTokens,\n resolveConfigModel,\n useApplyChatModel,\n useArbiSessionState,\n useAvailableModels,\n useConfig,\n useUserSettings,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\n/** ARBI offers two tiers in the model picker, both keyed off proxy *tags* so renaming the\n * underlying models never breaks the UI.\n *\n * - Standard tier (tag `Standard`): one row per Standard-tagged model.\n * - Premium tier (tag `Premium`): a single sentinel + Configure cog. The cog opens settings\n * where the user picks the specific Premium-tagged model to use. */\nexport const STANDARD_TIER_TAG = 'Standard'\nexport const PREMIUM_TIER_TAG = 'Premium'\n\ninterface Options {\n /** Controlled value: when provided the picker does not touch the store or backend. */\n value?: string\n onValueChange?: (value: string) => void\n}\n\nexport function useModelPicker({\n value: controlledValue,\n onValueChange: controlledOnChange,\n}: Options) {\n const { data: availableModels } = useAvailableModels()\n const { data: userSettings } = useUserSettings()\n const isDeveloper = userSettings?.developer === true\n const isControlled = controlledValue !== undefined\n\n const applyChatModel = useApplyChatModel()\n const { openSettings } = useBlocksEnvironment()\n const currentConversationModel = useArbiSessionState((state) => state.chatModelName)\n // With no model named for this chat, the turn runs on its chosen config, else the person's last\n // one: show that config's model, so the model shown is the model sent.\n const chatConfigId = useArbiSessionState((state) => state.chatModel)\n const sendConfigId = chatConfigId ?? userSettings?.last_config\n const { data: sendConfig } = useConfig(sendConfigId, {\n enabled: !isControlled && !currentConversationModel,\n })\n const sendConfigModel = sendConfig ? resolveConfigModel(sendConfig) : undefined\n\n // Premium preference; '' means the user switched Premium off.\n const premiumModelPref = userSettings?.premium_model as string | undefined\n\n // Tier discovery is purely tag-driven. Premium-tagged models collapse into one sentinel.\n const { standardTier, premiumTier, developerModels } = useMemo(() => {\n type ModelEntry = NonNullable<typeof availableModels>['models'][number]\n\n const empty = {\n standardTier: null as null | { members: ModelEntry[] },\n premiumTier: null as null | { members: ModelEntry[]; resolvedModelName: string },\n developerModels: [] as ModelEntry[],\n }\n if (!availableModels?.models) return empty\n\n const standardMembers = availableModels.models.filter((m) =>\n m.tags?.includes(STANDARD_TIER_TAG)\n )\n const standardTier = standardMembers.length > 0 ? { members: standardMembers } : null\n\n const premiumMembers = availableModels.models.filter((m) => m.tags?.includes(PREMIUM_TIER_TAG))\n let premiumTier: typeof empty.premiumTier = null\n if (premiumMembers.length > 0) {\n // One label, one model. With no user choice the fallback is the backend's\n // `premium_default` (the value auto mode resolves its premium tier to), so picking\n // \"Premium\" here and letting auto pick premium cannot land on two different models. The\n // first member is only a last resort for an older backend that does not send the field.\n const matchPref =\n premiumModelPref && premiumMembers.find((m) => m.model_name === premiumModelPref)\n const backendDefault =\n availableModels.premium_default &&\n premiumMembers.find((m) => m.model_name === availableModels.premium_default)\n premiumTier = {\n members: premiumMembers,\n resolvedModelName: (matchPref || backendDefault || premiumMembers[0]).model_name,\n }\n }\n\n const tierMemberNames = new Set<string>()\n for (const m of standardMembers) tierMemberNames.add(m.model_name)\n for (const m of premiumMembers) tierMemberNames.add(m.model_name)\n\n const seen = new Set<string>()\n const developer = isDeveloper\n ? availableModels.models\n .filter((m) => {\n if (m.connection_scope || tierMemberNames.has(m.model_name)) return false\n if (!m.model_name.includes('@') || seen.has(m.model_name)) return false\n seen.add(m.model_name)\n return true\n })\n .sort((a, b) => a.model_name.localeCompare(b.model_name))\n : []\n\n const custom = availableModels.models.filter(\n (m) => m.connection_scope === 'personal' || m.connection_scope === 'box'\n )\n return { standardTier, premiumTier, developerModels: [...custom, ...developer] }\n }, [availableModels, isDeveloper, premiumModelPref])\n\n // Always resolves to a model, never empty (Auto when nothing says otherwise).\n const selectedModel =\n (isControlled ? controlledValue : currentConversationModel || sendConfigModel) ||\n AUTO_CHAT_MODEL\n\n // Looked up from the full list so the selected model is found even if filtered from the menu.\n const selectedModelInfo = useMemo(\n () => availableModels?.models?.find((m) => m.model_name === selectedModel),\n [availableModels, selectedModel]\n )\n\n const handleModelChange = useCallback(\n (value: string) => {\n if (isControlled) {\n controlledOnChange?.(value)\n return\n }\n const label =\n value === AUTO_CHAT_MODEL ? 'Quick Model Change - Auto' : `Quick Model Change - ${value}`\n applyChatModel(value, label).catch((error) =>\n console.error('Failed to save model config', error)\n )\n },\n [isControlled, controlledOnChange, applyChatModel]\n )\n\n const isAuto = selectedModel === AUTO_CHAT_MODEL\n\n // Keep the active conversation model in sync with the user's Premium settings (skipped in\n // controlled mode): Premium disabled while a Premium model is active -> bounce to Auto;\n // Premium preference changed while on Premium -> follow the new preference.\n useEffect(() => {\n if (isControlled) return\n if (!premiumTier) return\n const onPremium = premiumTier.members.some((m) => m.model_name === selectedModel)\n if (!onPremium) return\n if (premiumModelPref === '') {\n handleModelChange(AUTO_CHAT_MODEL)\n return\n }\n if (selectedModel === premiumTier.resolvedModelName) return\n handleModelChange(premiumTier.resolvedModelName)\n }, [isControlled, premiumTier, selectedModel, premiumModelPref, handleModelChange])\n\n const pricing = useMemo(() => {\n if (isAuto || !selectedModelInfo) return null\n const inputPrice = formatGbpPerMillionTokens(selectedModelInfo.input_cost_per_token)\n const outputPrice = formatGbpPerMillionTokens(selectedModelInfo.output_cost_per_token)\n if (!inputPrice && !outputPrice) return null\n return { inputPrice, outputPrice, modelName: selectedModelInfo.model_name }\n }, [selectedModelInfo, isAuto])\n\n const openPremiumSettings = useCallback(() => openSettings('chat'), [openSettings])\n\n return {\n standardTier,\n premiumTier,\n developerModels,\n selectedModel,\n selectedModelInfo,\n isAuto,\n /** The user switched Premium off in settings. */\n premiumDisabled: premiumModelPref === '',\n pricing,\n handleModelChange,\n openPremiumSettings,\n }\n}\n","/**\n * ModelSelector: the app's single model picker, bound to the `@arbidocs/blocks` ModelPicker\n * parts. Behaviour (tier discovery, saving the choice, Premium sync) lives in `useModelPicker`.\n *\n * Modes:\n * - Uncontrolled (default): reads/writes the store and saves config to the backend.\n * - Controlled: pass value/onValueChange for use in forms.\n *\n * Variants:\n * - default: Select component for settings/forms\n * - compact: Popover for the MessageInput area\n */\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n ARBI_MARK_SRC,\n cn,\n ProviderIcon,\n} from '@arbidocs/react/ui'\nimport { useState } from 'react'\nimport { AUTO_CHAT_MODEL } from '@arbidocs/react'\nimport type { ReactNode } from 'react'\nimport {\n ModelAutoIcon,\n ModelConfigureButton,\n ModelDot,\n ModelMenuDivider,\n ModelMenuMessage,\n ModelOption,\n ModelOptionLabel,\n ModelPickerPopover,\n ModelPickerTrigger,\n ModelPricingTip,\n ModelTierIcon,\n ModelTierOption,\n ModelTriggerContent,\n type ModelTierKind,\n} from '../../chat/ModelPicker'\nimport { PREMIUM_TIER_TAG, STANDARD_TIER_TAG, useModelPicker } from './useModelPicker'\n\n/** Tier glyph by tag (or model name: Fast/Wise only carry the generic 'Standard' tag). */\nconst TAG_TIER: Record<string, ModelTierKind> = {\n Standard: 'standard',\n Fast: 'standard',\n Wise: 'wise',\n Reasoning: 'wise',\n Premium: 'premium',\n}\n\nfunction ArbiLogo() {\n return <img src={ARBI_MARK_SRC} alt=\"ARBI\" className=\"size-3.5 shrink-0 rounded-md\" />\n}\n\ninterface ModelSelectorProps {\n /** 'default' uses Select, 'compact' uses Popover */\n variant?: 'default' | 'compact'\n className?: string\n /** Controlled value: if provided, the component is controlled */\n value?: string\n /** Controlled onChange: required when value is provided */\n onValueChange?: (value: string) => void\n}\n\nexport function ConnectedModelSelector({\n variant = 'default',\n className,\n value,\n onValueChange,\n}: ModelSelectorProps) {\n const picker = useModelPicker({ value, onValueChange })\n const {\n standardTier,\n premiumTier,\n developerModels,\n selectedModel,\n selectedModelInfo,\n isAuto,\n premiumDisabled,\n pricing,\n handleModelChange,\n } = picker\n const [isOpen, setIsOpen] = useState(false)\n\n // The most specific tier glyph for a Standard model, so each row gets its own logo (Fast: bolt,\n // Wise: glasses) instead of all sharing the generic ARBI mark. Fast/Wise are identified by NAME.\n const standardIcon = (model: { model_name: string; tags?: string[] | null }): ReactNode => {\n let tier: ModelTierKind | undefined = TAG_TIER[model.model_name]\n if (!tier) {\n for (const t of model.tags ?? []) {\n if (t === STANDARD_TIER_TAG || t === PREMIUM_TIER_TAG) continue\n if (TAG_TIER[t]) {\n tier = TAG_TIER[t]\n break\n }\n }\n }\n return tier ? <ModelTierIcon tier={tier} /> : <ArbiLogo />\n }\n\n // Trigger: Premium collapses to the tier name with the provider mark standing in for which\n // Premium model is active. With Premium switched off, a greyed crown, never a third-party mark.\n const isSelectedStandard = !!selectedModelInfo?.tags?.includes(STANDARD_TIER_TAG)\n const isSelectedPremium = !!selectedModelInfo?.tags?.includes(PREMIUM_TIER_TAG)\n const triggerLabel = isAuto\n ? 'Autoselect'\n : isSelectedPremium\n ? 'Premium'\n : selectedModelInfo?.display_name || selectedModelInfo?.model_name || selectedModel\n const firstTag = selectedModelInfo?.tags?.[0]\n const triggerIcon: ReactNode = isAuto ? (\n <ModelAutoIcon />\n ) : isSelectedPremium ? (\n premiumDisabled ? (\n <ModelTierIcon tier=\"premium\" isGreyed />\n ) : (\n <ProviderIcon\n modelName={selectedModelInfo?.model_name}\n provider={selectedModelInfo?.provider}\n size={14}\n className=\"shrink-0\"\n />\n )\n ) : isSelectedStandard && selectedModelInfo ? (\n standardIcon(selectedModelInfo)\n ) : firstTag && TAG_TIER[firstTag] ? (\n <ModelTierIcon tier={TAG_TIER[firstTag]} />\n ) : selectedModelInfo ? (\n <ModelDot />\n ) : null\n\n const tooltip: ReactNode = isAuto ? (\n <div className=\"text-sm\">Automatically selects the best model</div>\n ) : pricing ? (\n <ModelPricingTip\n modelName={pricing.modelName}\n inputPrice={pricing.inputPrice}\n outputPrice={pricing.outputPrice}\n />\n ) : null\n\n const hasTiers = !!(standardTier || premiumTier || developerModels.length)\n\n if (variant === 'compact') {\n const choose = (name: string) => {\n handleModelChange(name)\n setIsOpen(false)\n }\n const premiumMember = premiumTier?.members.find(\n (m) => m.model_name === premiumTier.resolvedModelName\n )\n return (\n <ModelPickerPopover\n open={isOpen}\n onOpenChange={setIsOpen}\n tooltip={tooltip}\n trigger={\n <ModelPickerTrigger icon={triggerIcon} label={triggerLabel} className={className} />\n }\n >\n <ModelOption\n icon={<ModelAutoIcon />}\n label=\"Autoselect\"\n isSelected={isAuto}\n onSelect={() => choose(AUTO_CHAT_MODEL)}\n testId=\"model-option-auto\"\n />\n <ModelMenuDivider />\n {hasTiers ? (\n <>\n {standardTier?.members.map((m) => (\n <ModelOption\n key={`standard-${m.model_name}`}\n icon={standardIcon(m)}\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n isSelected={selectedModel === m.model_name}\n onSelect={() => choose(m.model_name)}\n testId={`model-option-${m.model_name}`}\n emphasis=\"tier\"\n />\n ))}\n {premiumTier && (\n <ModelTierOption\n key=\"tier-Premium\"\n icon={\n premiumDisabled || !premiumMember ? (\n <ModelTierIcon tier=\"premium\" isGreyed={premiumDisabled} />\n ) : (\n // The resolved Premium model's provider is the row's brand icon, so the pick\n // is recognisable without a model_name suffix.\n <ProviderIcon\n modelName={premiumMember.model_name}\n provider={premiumMember.provider}\n size={14}\n className=\"shrink-0\"\n />\n )\n }\n label=\"Premium\"\n isSelected={premiumTier.members.some((m) => m.model_name === selectedModel)}\n isDisabled={premiumDisabled}\n onSelect={() => choose(premiumTier.resolvedModelName)}\n testId=\"model-option-tier-Premium\"\n action={\n <ModelConfigureButton\n label=\"Configure Premium tier\"\n tooltip=\"Configure Premium\"\n testId=\"tier-Premium-configure-button\"\n onClick={() => {\n picker.openPremiumSettings()\n setIsOpen(false)\n }}\n />\n }\n />\n )}\n {developerModels.length > 0 && (\n <>\n <ModelMenuDivider />\n {developerModels.map((m) => {\n const tag = m.tags?.[0]\n return (\n <ModelOption\n key={m.model_name}\n icon={\n tag && TAG_TIER[tag] ? <ModelTierIcon tier={TAG_TIER[tag]} /> : <ModelDot />\n }\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n isSelected={selectedModel === m.model_name}\n onSelect={() => choose(m.model_name)}\n testId={`model-option-${m.model_name}`}\n />\n )\n })}\n </>\n )}\n </>\n ) : (\n <ModelMenuMessage>Loading models...</ModelMenuMessage>\n )}\n </ModelPickerPopover>\n )\n }\n\n // Default variant: Select.\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div>\n <Select value={selectedModel || ''} onValueChange={handleModelChange}>\n <SelectTrigger\n className={cn('h-8 w-[200px] text-sm', className)}\n data-testid=\"model-selector\"\n >\n <ModelTriggerContent icon={triggerIcon} label={triggerLabel} />\n </SelectTrigger>\n <SelectContent className=\"z-50\">\n <SelectItem value={AUTO_CHAT_MODEL} data-testid=\"model-option-auto\">\n <ModelOptionLabel icon={<ModelAutoIcon />} label=\"Autoselect\" />\n </SelectItem>\n {hasTiers ? (\n <>\n {standardTier?.members.map((m) => (\n <SelectItem\n key={`standard-${m.model_name}`}\n value={m.model_name}\n data-testid={`model-option-${m.model_name}`}\n >\n <ModelOptionLabel\n icon={standardIcon(m)}\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n />\n </SelectItem>\n ))}\n {premiumTier && (\n <SelectItem\n key=\"tier-Premium\"\n value={premiumTier.resolvedModelName}\n data-testid=\"model-option-tier-Premium\"\n >\n <ModelOptionLabel icon={<ArbiLogo />} label=\"Premium\" />\n </SelectItem>\n )}\n {developerModels.map((m) => (\n <SelectItem\n key={m.model_name}\n value={m.model_name}\n data-testid={`model-option-${m.model_name}`}\n >\n <ModelOptionLabel\n icon={<ModelDot />}\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n />\n </SelectItem>\n ))}\n </>\n ) : (\n <SelectItem value=\"loading\" disabled>\n Loading models...\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n </div>\n </TooltipTrigger>\n {tooltip && <TooltipContent side=\"top\">{tooltip}</TooltipContent>}\n </Tooltip>\n </TooltipProvider>\n )\n}\n","import {\n useArbiSessionStore,\n useTransientView,\n useUserSettings,\n useUpdateUserSettings,\n} from '@arbidocs/react'\nimport { setHintsSessionOverride, TIPS_VISIBILITY_OVERRIDE } from '../../tips/visibility'\n\n/**\n * Shared hints visibility: the account's saved show_hints preference, with an optional\n * session-only override for guided actions. An explicit saved choice clears the override.\n * Consumers gate on settingsLoaded so hints do not flash before the saved choice arrives.\n */\nexport function useHintsVisibility() {\n const { data: userSettings } = useUserSettings()\n const [sessionOverride] = useTransientView<boolean | null>(TIPS_VISIBILITY_OVERRIDE, null)\n return {\n showHints: sessionOverride ?? userSettings?.show_hints ?? true,\n settingsLoaded: userSettings !== undefined,\n isDeveloper: userSettings?.developer === true,\n }\n}\n\nexport function useContextualHints() {\n const visibility = useHintsVisibility()\n const session = useArbiSessionStore()\n const updateUserSettings = useUpdateUserSettings()\n const setShowHints = (value: boolean) => setHintsSessionOverride(session, value)\n const setShowHintsPersisted = (value: boolean) => {\n setHintsSessionOverride(session, null)\n updateUserSettings.mutate({ show_hints: value })\n }\n return {\n ...visibility,\n setShowHints,\n setShowHintsPersisted,\n dismissHints: () => setShowHints(false),\n }\n}\n","/**\n * The conversation's composer: the `Composer` block bound to the session's draft, the slash menu\n * (the backend's built-in commands and the user's skills), @mentions of the workspace's people,\n * and the backend-suggested follow-up. Layout, long-paste folding, menu rendering and keyboard\n * navigation are the `Composer` parts'; what a send does is the caller's (`handleSendMessage`).\n */\n\nimport { Button } from '@arbidocs/react/ui'\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, memo, type ReactNode } from 'react'\nimport { Settings } from 'lucide-react'\nimport {\n buildMentionCandidates,\n selectDraft,\n useArbiSession,\n useArbiSessionState,\n useArbiSessionStore,\n useConversations,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { useAssistantName, useAssistantCopy } from '@arbidocs/react/shell'\nimport type { ContextUsage } from '@arbidocs/sdk/browser'\nimport { Composer } from '../../chat/Composer'\nimport { useHintsVisibility } from '../tips/useContextualHints'\nimport { MentionMenu } from '../../chat/MentionMenu'\nimport { SlashMenu, type SlashMenuItem } from '../../chat/SlashMenu'\nimport { useListKeyNav } from '../../lib/useListKeyNav'\nimport { useLongPaste } from '../../lib/useLongPaste'\nimport { useMentionAutocomplete } from '../../chat/useMentionAutocomplete'\nimport { useRecipientDraft } from '../../chat/useRecipientDraft'\nimport { ContextUsageBar } from '../../chat/ContextUsageBar'\nimport type { WorkflowDefinition } from '../../agents/workflows/types'\nimport { useSlashItems } from './useSlashItems'\nimport { BUILTIN_SKILLS } from '../../agents/workflows/catalogue/seed'\n\nconst NO_SKILLS: ReadonlyArray<WorkflowDefinition> = []\n\n/** What picking a skill in the slash menu does (the host's workflow launcher). */\nexport interface ComposerSkills {\n /** A picked skill: open its launcher. True when it did (the composer then clears the draft). */\n openFor: (item: SlashMenuItem) => boolean\n}\n\nexport interface ConversationComposerProps {\n /** The draft, controlled (default: the session's draft for the open conversation). */\n value?: string\n /** Set the controlled draft. */\n onValueChange?: (value: string) => void\n /** Function to handle sending the message */\n handleSendMessage: () => void\n /** Whether an AI response is currently being generated */\n isGenerating?: boolean\n /** Compact presentation is opt-in; the full app retains its existing layout. */\n compact?: boolean\n /** Reference to the input element for focus management */\n inputRef?: React.RefObject<HTMLTextAreaElement | null>\n /** Flag indicating if we're currently creating a branch */\n isBranching?: boolean\n /** Function to cancel branch creation */\n onCancelBranching?: () => void\n /** Custom placeholder text */\n placeholder?: string\n /** Function to open settings popup */\n onOpenSettings?: () => void\n /** Optional left button element (e.g., paperclip button) */\n leftButton?: React.ReactNode\n /** Optional right button element (e.g., send/stop button) */\n rightButton?: React.ReactNode\n /** The model selector, before `rightButton` (the host's). */\n modelSelector?: ReactNode\n /**\n * What picking a skill does (its form). With it the menu offers the built-in skills too; without\n * it, only what is typed as `/slug` (commands, the host's packs, the user's skills).\n */\n skills?: ComposerSkills\n /** The slash menu's \"Browse all\" opens the host's skills browser. */\n onBrowseSkills?: () => void\n /** Context usage data from the latest assistant message */\n contextUsage?: ContextUsage | null\n /** Whether this is an empty conversation (taller, more inviting input + warmer placeholder) */\n isConversationEmpty?: boolean\n /**\n * Offer the backend's follow-up chip. The host turns this off while the reader is scrolled up\n * the thread: the chip grows the sticky dock upward, so it would cover the answer being read.\n */\n shouldOfferFollowUp?: boolean\n}\n\nconst ConversationComposerComponent = function ConversationComposer({\n value,\n onValueChange,\n handleSendMessage,\n isGenerating = false,\n compact = false,\n inputRef,\n isBranching = false,\n onCancelBranching,\n placeholder,\n onOpenSettings,\n leftButton,\n rightButton,\n modelSelector,\n skills,\n onBrowseSkills,\n contextUsage,\n isConversationEmpty = false,\n shouldOfferFollowUp = true,\n}: ConversationComposerProps) {\n // The draft is read here, so the conversation does not re-render on every keystroke.\n const session = useArbiSessionStore()\n const sessionDraft = useArbiSessionState(selectDraft)\n const newMessage = value ?? sessionDraft\n const setNewMessage = onValueChange ?? session.setDraft\n\n // Backend-suggested follow-up for THIS conversation, offered as faded inline text in the composer. The\n // input is never pre-filled: the chip drops the text in only when clicked.\n const { showHints } = useHintsVisibility()\n const suggestedQuery = useArbiSessionState((s) => s.suggestedQuery)\n const currentConversationId = useArbiSessionState((s) => s.conversationId)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const longPaste = useLongPaste(newMessage)\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n // Expose the input form's live width and position as CSS vars so the (portaled)\n // documents/facts hover popups can size themselves to the chat bar, line up with it, and open\n // clear of the field itself (see useChatBarAnchor).\n const formRef = useRef<HTMLFormElement>(null)\n useLayoutEffect(() => {\n const el = formRef.current\n if (!el) return\n const apply = () => {\n document.documentElement.style.setProperty('--chat-input-width', `${el.offsetWidth}px`)\n const rect = el.getBoundingClientRect()\n document.documentElement.style.setProperty('--chat-input-left', `${rect.left}px`)\n document.documentElement.style.setProperty('--chat-input-top', `${rect.top}px`)\n }\n apply()\n const ro = new ResizeObserver(apply)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n // Synchronize the internal and forwarded refs\n useLayoutEffect(() => {\n if (textareaRef.current && inputRef && 'current' in inputRef) {\n inputRef.current = textareaRef.current\n }\n }, [inputRef])\n\n // ── Slash-command menu ───────────────────────────────────────────────\n //\n // Two sources, one menu (see useSlashItems): the backend's built-in commands and the user's\n // skills. The menu only opens when the draft is a bare slash command in progress; once the user\n // types a space (committing the slug -> arguments), the menu hides and Enter/arrows fall through.\n const {\n slashToken,\n filteredItems,\n isOpen: isSlashMenuOpen,\n canBrowseSkills,\n } = useSlashItems(newMessage, skills ? BUILTIN_SKILLS : NO_SKILLS)\n\n /**\n * Replace the leading slash token with the chosen slug and a trailing space, so the user can\n * type arguments immediately. The trailing space also commits the slug, which closes the menu.\n */\n const insertSlashItem = (item: SlashMenuItem) => {\n // A picked skill that takes arguments opens the host's workflow launcher.\n if (skills?.openFor(item)) {\n setNewMessage('')\n return\n }\n setNewMessage(`/${item.name} `)\n requestAnimationFrame(() => {\n const ta = textareaRef.current\n if (!ta) return\n ta.focus()\n const end = `/${item.name} `.length\n ta.setSelectionRange(end, end)\n })\n }\n\n // ── @mentions + assistant mode ───────────────────────────────────────\n //\n // `@` opens the member + assistant autocomplete. In a thread (`mentioned` mode) a message only\n // reaches the assistant when it @mentions it; the send path reads the mentions from the text.\n const { data: users } = useWorkspaceUsers()\n const currentUserId = useArbiSession().user?.external_id\n const assistantName = useAssistantName()\n const mentionCandidates = useMemo(\n () => buildMentionCandidates(users ?? [], currentUserId, assistantName),\n [users, currentUserId, assistantName]\n )\n const mention = useMentionAutocomplete({\n value: newMessage,\n onValueChange: setNewMessage,\n candidates: mentionCandidates,\n textareaRef,\n })\n // Shared chats use explicit recipients; solo chats address the assistant implicitly.\n const { data: conversations } = useConversations(workspaceId ?? undefined)\n const isThread =\n conversations?.find((conversation) => conversation.external_id === currentConversationId)\n ?.is_shared ?? false\n // A thread's draft starts addressed to the assistant.\n const prefillsAssistant = isThread && !isBranching\n const recipient = useRecipientDraft({\n value: newMessage,\n onValueChange: setNewMessage,\n contextKey: currentConversationId,\n defaultLabel: prefillsAssistant ? assistantName : null,\n })\n\n const assistant = useAssistantCopy()\n const slashNav = useListKeyNav({\n open: isSlashMenuOpen,\n items: filteredItems,\n onPick: insertSlashItem,\n // Clear the leading slash to fully dismiss; otherwise the menu reopens on the next letter.\n onDismiss: () => setNewMessage(''),\n resetKey: slashToken,\n })\n\n // The citation popover docks right above the composer and would paint over the menus that open\n // from it, so opening one dismisses the popover. The document viewer keeps the passage, as\n // Escape does.\n const isComposerMenuOpen = isSlashMenuOpen || mention.isOpen\n useEffect(() => {\n if (isComposerMenuOpen) session.setActiveCitationKey(null)\n }, [isComposerMenuOpen, session])\n\n // Shown only while the input is empty and the suggestion belongs to the conversation on\n // screen: a suggestion from another tab must never appear here. It also stays out of the\n // way while a reply streams or the reader is scrolled up: the chip sits inside the sticky dock\n // and would cover the text being read.\n const followUp =\n !newMessage &&\n !isBranching &&\n !isGenerating &&\n shouldOfferFollowUp &&\n showHints &&\n suggestedQuery &&\n suggestedQuery.conversationExtId === currentConversationId\n ? suggestedQuery.text\n : null\n\n const sendDraft = () => {\n handleSendMessage()\n // Keep input focused to allow typing the next prompt during generation\n textareaRef.current?.focus()\n // Reset branching state after sending the message\n if (isBranching && onCancelBranching) onCancelBranching()\n }\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (recipient.handleKeyDown(event)) return\n // Slash- and mention-menu keys take priority, but only while a menu is actually open.\n if (slashNav.handleKeyDown(event)) return\n if (mention.nav.handleKeyDown(event)) return\n\n if (followUp && event.key === 'Tab' && !event.shiftKey) {\n event.preventDefault()\n setNewMessage(followUp)\n return\n }\n\n // Plain Enter submits through <Composer.Input> (handleSubmit below).\n if (event.key === 'Escape' && isBranching && onCancelBranching) {\n event.preventDefault()\n onCancelBranching()\n }\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (recipient.hasBody) sendDraft()\n }\n\n return (\n <>\n <Composer.Root\n onSubmit={handleSubmit}\n formRef={formRef}\n isBranching={isBranching}\n notice={isBranching ? <Composer.Notice onCancel={onCancelBranching} /> : undefined}\n >\n <Composer.Frame\n className={\n compact\n ? 'rounded-none border-0 px-0 py-0 shadow-none focus-within:shadow-none'\n : undefined\n }\n >\n {/* Anchors above the textarea inside the frame so it floats over content. */}\n <SlashMenu\n open={isSlashMenuOpen}\n items={filteredItems}\n selectedIndex={slashNav.selectedIndex}\n setSelectedIndex={slashNav.setSelectedIndex}\n listboxId={slashNav.listboxId}\n onSelect={insertSlashItem}\n onBrowse={canBrowseSkills ? onBrowseSkills : undefined}\n />\n <MentionMenu\n open={mention.isOpen}\n items={mention.items}\n selectedIndex={mention.nav.selectedIndex}\n setSelectedIndex={mention.nav.setSelectedIndex}\n listboxId={mention.nav.listboxId}\n onSelect={mention.pick}\n />\n <Composer.Input\n value={newMessage}\n onValueChange={(next) => {\n mention.onValueChange(next)\n longPaste.onValueChange(next)\n }}\n onPaste={(event) => longPaste.onPaste(event, newMessage)}\n onKeyDown={onKeyDown}\n textareaProps={{\n ...(mention.isOpen ? mention.nav.comboboxProps : slashNav.comboboxProps),\n ...mention.textareaProps,\n }}\n textareaRef={textareaRef}\n isPasteCollapsed={longPaste.isCollapsed}\n onExpandPaste={() => {\n longPaste.expand()\n requestAnimationFrame(() => textareaRef.current?.focus())\n }}\n isRoomy={isConversationEmpty}\n isSuggestion={!!followUp}\n compact={compact}\n placeholder={\n followUp ||\n placeholder ||\n (isBranching\n ? 'Edit message to create a branch...'\n : isThread\n ? 'Message the thread… @mention someone to notify them'\n : isGenerating\n ? 'Type your next prompt...'\n : assistant.askAnythingPlaceholder)\n }\n />\n <Composer.Toolbar\n className={compact ? 'flex-nowrap' : undefined}\n leading={\n <>\n {leftButton}\n {compact && modelSelector}\n {onOpenSettings && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenSettings}\n className=\"h-8 w-8 p-0 pointer-coarse:h-11 pointer-coarse:w-11\"\n aria-label=\"Chat settings\"\n title=\"Chat settings\"\n data-testid=\"message-input-settings-button\"\n >\n <Settings className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n )}\n </>\n }\n trailing={\n <>\n {!compact && modelSelector}\n {rightButton}\n </>\n }\n />\n <ContextUsageBar contextUsage={contextUsage} draftLength={newMessage.length} />\n </Composer.Frame>\n </Composer.Root>\n </>\n )\n}\n\nexport const ConversationComposer = memo(ConversationComposerComponent)\n","import { useMessageTimer } from '@arbidocs/react'\nimport React from 'react'\n\nexport interface MessageTimerSubscription {\n conversationId: string | undefined\n messageId: string | undefined\n isUser: boolean\n isGenerating: boolean\n}\n\ninterface MessageLiveSecondsProps extends MessageTimerSubscription {\n /** Subtract this many seconds from the elapsed time before displaying. */\n offsetSeconds?: number\n /** Used when the live timer is not running (e.g. for messages loaded from history). */\n fallbackSeconds?: number | null\n /** Skip rendering when the resolved value is below this threshold (in seconds). */\n minDisplaySeconds?: number\n /** Suffix appended after the number (defaults to \"s\"). */\n suffix?: string\n}\n\n/**\n * Leaf component that subscribes to `useMessageTimer` and renders the elapsed\n * seconds as plain text. Designed to be embedded inside larger components\n * (AssistantStatus, AgentSteps) so the 100 ms timer tick re-renders only this\n * leaf instead of propagating up to the entire Message subtree.\n */\nfunction MessageLiveSecondsComponent({\n conversationId,\n messageId,\n isUser,\n isGenerating,\n offsetSeconds = 0,\n fallbackSeconds,\n minDisplaySeconds = 0,\n suffix = 's',\n}: MessageLiveSecondsProps) {\n const { elapsedTime } = useMessageTimer({ conversationId, messageId, isUser, isGenerating })\n const base = elapsedTime > 0 ? elapsedTime : (fallbackSeconds ?? 0)\n const value = base - offsetSeconds\n if (!Number.isFinite(value) || value < minDisplaySeconds) return null\n return (\n <>\n {value.toFixed(1)}\n {suffix}\n </>\n )\n}\n\nexport const MessageLiveSeconds = React.memo(MessageLiveSecondsComponent)\n","/**\n * A turn's agent steps, bound to the session: the step trace (`StepTrace` and its rows) filled\n * from the step stream, with the workspace's document names, the model tiers, the developer\n * details and the live duration of the running step.\n */\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n getDocumentTitle,\n ProviderIcon,\n} from '@arbidocs/react/ui'\nimport { formatGbp, useAvailableModels, useDocuments, useUserSettings } from '@arbidocs/react'\nimport React, { useMemo } from 'react'\nimport {\n GoalCriteria,\n StepDetail,\n StepNarration,\n StepOutcome,\n StepParams,\n StepRow,\n StepSummary,\n StepTrace,\n StepTraceSummary,\n SubAgentLane,\n SubStepGroup,\n type GoalCriterionView,\n} from '../../agents/runs/AgentSteps'\nimport {\n getAgentStepPresentation,\n getModelIcon,\n MODEL_TIER_ICON_MAP,\n MODEL_TIER_LABELS,\n stepAccent,\n} from '../../agents/runs/step-presentation'\nimport { MessageLiveSeconds, type MessageTimerSubscription } from './MessageLiveSeconds'\nimport { ConnectedMarkdown } from './ConnectedMarkdown'\nimport {\n computeRunStats,\n extractSubagentLanes,\n formatTokens,\n getAgentStepLabel,\n getCurrentStep,\n getStepDisplay,\n getStepTool,\n isNearAiUsageBudget,\n mergeAgentSteps,\n subagentJobLabel,\n type AgentStepEvent,\n type ContextUsage,\n type DocInfoMap,\n} from '@arbidocs/sdk/browser'\n\n/** A workspace document, as the step trace names it. */\ntype StepDocument = { external_id: string; file_name?: string | null; n_pages?: number | null }\n\n/** Fields injected by the backend for display — excluded from param rendering */\nconst DISPLAY_FIELDS = new Set(['tool', 'label', 'icon', 'summary'])\n\n/**\n * Extract tool parameters from a detail entry, excluding display fields.\n * Returns key-value pairs for inline rendering.\n */\nfunction getToolParams(detail: Record<string, unknown>): Array<{ key: string; value: string }> {\n const params: Array<{ key: string; value: string }> = []\n for (const [key, value] of Object.entries(detail)) {\n if (DISPLAY_FIELDS.has(key) || value == null) continue\n const strValue = typeof value === 'string' ? value : JSON.stringify(value)\n params.push({ key, value: strValue })\n }\n return params\n}\n\nfunction StepModelIcon({ modelName, tag }: { modelName?: string | null; tag: string | null }) {\n // Premium → brand mark; Fast/Wise → their name icon; otherwise the tag icon.\n const cfg = tag === 'Premium' ? null : getModelIcon(modelName, tag)\n if (tag !== 'Premium' && !cfg) return null\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex-shrink-0\">\n {tag === 'Premium' ? (\n <ProviderIcon modelName={modelName ?? undefined} size={11} />\n ) : (\n cfg && <cfg.icon className={cfg.className} style={{ width: 11, height: 11 }} />\n )}\n </span>\n </TooltipTrigger>\n <TooltipContent>{modelName}</TooltipContent>\n </Tooltip>\n )\n}\n\ninterface AgentStepsProps {\n steps: AgentStepEvent[]\n isStreaming: boolean\n className?: string\n /**\n * Total elapsed seconds for the message — used as a static fallback for the\n * last step's duration when `liveTimer` is not provided (e.g. messages\n * loaded from history). When `liveTimer` is provided this prop is forwarded\n * to the leaf as the post-generation fallback.\n */\n totalElapsedTime?: number\n /**\n * Optional live-timer subscription. When provided, the last step's duration\n * is rendered by a leaf component so the parent does not re-render at the\n * 100 ms timer cadence.\n */\n liveTimer?: MessageTimerSubscription\n /**\n * When true (the live bar's expander), hide what the bar already shows live —\n * the agent's current step and any still-running sub-agents — so the expander\n * is purely \"what came before\", never a duplicate of the footer. Finished\n * sub-agents stay (they're history). No effect once settled.\n */\n hideLive?: boolean\n /**\n * This turn's settled context/AI usage (£) (`message.finalContextUsage`).\n * £ spent belongs here, on the turn that spent them — not on the\n * composer's forward-looking context bar, which is about future messages.\n */\n contextUsage?: ContextUsage | null\n}\n\nconst AgentStepsComponent: React.FC<AgentStepsProps> = ({\n steps,\n isStreaming,\n className,\n totalElapsedTime,\n liveTimer,\n hideLive = false,\n contextUsage,\n}) => {\n const { data: userSettings } = useUserSettings()\n const isDeveloper = userSettings?.developer === true\n\n // Build doc_ext_id → {name, pages} map from workspace documents (cached by React Query)\n const { data: documents = [] } = useDocuments()\n const docInfo = useMemo(() => {\n const map: DocInfoMap = {}\n const docArray = Array.isArray(documents) ? documents : []\n for (const doc of docArray) {\n if (doc && 'external_id' in doc) {\n const d = doc as StepDocument\n // Use the canonical document entity label (doc_metadata.title ?? file\n // name), not the raw file name, so references resolve to the same name\n // the rest of the app shows.\n map[d.external_id] = {\n name: getDocumentTitle(d, d.file_name ?? d.external_id),\n pages: d.n_pages ?? null,\n }\n }\n }\n return map\n }, [documents])\n\n // Resolve model name → tag for looking up tier icons\n const { data: availableModels } = useAvailableModels()\n const getModelTag = useMemo(() => {\n return (modelName?: string | null): string | null => {\n if (!modelName || !availableModels?.models) return null\n return availableModels.models.find((m) => m.model_name === modelName)?.tags?.[0] || null\n }\n }, [availableModels])\n\n // Raw SSE events → the logical steps a reader sees. Shared with the `Step N`\n // counter so the count always matches the rows rendered below.\n //\n // When `hideLive` (the live bar's expander), the current step STAYS — the\n // drawer is a complete, correctly-numbered list with the active step\n // highlighted as the last row, matching the \"Step N\" position on the bar.\n // (Dropping it made the drawer show N-1 rows while the bar said N, and marked\n // the *previous* step active.) Still-running sub-agents are the one thing\n // dropped: they have their own live lanes in the roster beneath the bar, so\n // showing them here too would double-render them.\n const mergedSteps = useMemo(() => {\n const merged = mergeAgentSteps(steps)\n if (!hideLive) return merged\n const runningHandles = new Set(\n extractSubagentLanes(merged)\n .filter((l) => l.status === 'running')\n .map((l) => l.handle)\n )\n return merged.filter((s) => !(s.subagent && runningHandles.has(s.subagent)))\n }, [steps, hideLive])\n\n // Compute step durations: duration = next_step.t - current_step.t\n // For the last step, use totalElapsedTime (frontend timer) if available\n const stepDurations = useMemo(() => {\n const durations: (number | null)[] = []\n for (let i = 0; i < mergedSteps.length; i++) {\n const currentT = mergedSteps[i].t\n if (currentT == null) {\n durations.push(null)\n continue\n }\n if (i + 1 < mergedSteps.length) {\n const nextT = mergedSteps[i + 1].t\n durations.push(nextT != null ? nextT - currentT : null)\n } else {\n // Last step: close it with the turn's total elapsed time.\n //\n // This is the one place two clocks meet — `totalElapsedTime` is the\n // client's wall-clock for a live turn, while `t` is the backend's\n // seconds-since-stream-start. They agree when the client watched the\n // whole stream, but a client that started late (a reconnect, or a\n // background conversation opened mid-run) measures less than the\n // backend, and the subtraction goes negative: the trace rendered\n // \"Answered −21.9s\". Show nothing rather than a duration we know is\n // wrong — a settled turn re-read from history uses the backend's own\n // completed `t`, so it stays consistent there.\n const remaining = totalElapsedTime != null ? totalElapsedTime - currentT : null\n durations.push(remaining != null && remaining >= 0 ? remaining : null)\n }\n }\n return durations\n }, [mergedSteps, totalElapsedTime])\n\n // Display step_tokens (per-step cost) directly from the backend.\n const stepTokens = useMemo(() => {\n return mergedSteps.map((step) => step.step_tokens ?? null)\n }, [mergedSteps])\n\n // Per-step £ cost — an estimate (cached model pricing, not the\n // authoritative LiteLLM cost), but useful to see which step is expensive\n // while the turn is still streaming. User-facing (unlike step_tokens,\n // which is raw and developer-gated) since £ is the budget unit the\n // user actually spends against.\n const stepGbp = useMemo(() => {\n return mergedSteps.map((step) => step.step_gbp ?? null)\n }, [mergedSteps])\n\n // Following the run is the HOST's job, not this list's: AgentBarShell pins\n // its drawer to the bottom while the user hasn't scrolled away. A\n // scrollIntoView here looked like it nudged \"the nearest scroll container\",\n // but it scrolls EVERY ancestor short of the viewport — each streamed tick\n // yanked the whole conversation back to this list while the user was\n // reading elsewhere on the page.\n const currentStepIndex = isStreaming ? getCurrentStep(mergedSteps)?.index : undefined\n\n if (mergedSteps.length === 0) return null\n\n // Two groupings run in one pass:\n // • Concurrent sub-agent LANES — steps carrying a `subagent` handle are pulled\n // into their own live lane (spawn marker → intermediate steps → done marker),\n // rendered as a card at the position of the lane's spawn. Multiple children\n // running at once each get their own lane, so fan-out reads as parallel work.\n // • Legacy parent_index NESTING — a handle-less sub-step (older single-child\n // relays) still indents under the parent tool step that spawned it.\n const posByIndex = new Map(mergedSteps.map((s, idx) => [s.index, idx]))\n const childrenByParent = new Map<number, AgentStepEvent[]>()\n const topLevelSteps: AgentStepEvent[] = []\n const laneStepsByHandle = new Map<string, AgentStepEvent[]>()\n const laneSpawnIndex = new Map<string, number>()\n for (const step of mergedSteps) {\n const handle = step.subagent\n if (handle) {\n const arr = laneStepsByHandle.get(handle)\n if (arr) arr.push(step)\n else {\n laneStepsByHandle.set(handle, [step])\n laneSpawnIndex.set(handle, step.index)\n }\n continue\n }\n const parent = step.parent_index\n if (parent != null && parent !== step.index && posByIndex.has(parent)) {\n const siblings = childrenByParent.get(parent) ?? []\n siblings.push(step)\n childrenByParent.set(parent, siblings)\n } else {\n topLevelSteps.push(step)\n }\n }\n\n // Interleave top-level steps and lanes by index, so a lane appears exactly where\n // its child was spawned in the parent's timeline.\n type DisplayRow = { index: number; step?: AgentStepEvent; lane?: string }\n const displayRows: DisplayRow[] = [\n ...topLevelSteps.map((s) => ({ index: s.index, step: s })),\n ...[...laneStepsByHandle.keys()].map((h) => ({ index: laneSpawnIndex.get(h) ?? 0, lane: h })),\n ].sort((a, b) => a.index - b.index)\n\n // Display numbers: top-level rows read 1..N (lanes count as a row); a fold's\n // inner rows read \"<parent>.<n>\".\n const displayNumber = new Map<number, string>()\n displayRows.forEach((r, i) => {\n if (r.lane) {\n // Lane inner steps read \"<lane>.<n>\".\n laneStepsByHandle\n .get(r.lane)\n ?.filter((s) => !s.subagent_status)\n .forEach((c, ci) => displayNumber.set(c.index, `${i + 1}.${ci + 1}`))\n return\n }\n displayNumber.set(r.step!.index, String(i + 1))\n childrenByParent\n .get(r.step!.index)\n ?.forEach((c, ci) => displayNumber.set(c.index, `${i + 1}.${ci + 1}`))\n })\n\n const lastStepIndex = mergedSteps[mergedSteps.length - 1].index\n\n const renderRow = (step: AgentStepEvent, depth: number, isLastInList: boolean) => {\n const i = posByIndex.get(step.index)!\n const presentation = getAgentStepPresentation(step, docInfo)\n const { tool, Icon } = presentation\n const { label, summary, isMultiLine, details } = getStepDisplay(step, docInfo)\n const accent = stepAccent(step, tool)\n const duration = stepDurations[i]\n const isLastStep = step.index === lastStepIndex\n const isActive = step.index === currentStepIndex\n\n // Goal-step model tier icon (auto mode) — the tier the router picked. It\n // stands in for the goal step's raw outcome (\"fast, all 0 docs\"), so it\n // carries a tooltip: an unlabelled glyph would just be cryptic noise.\n const tier = step.step === 'goal' ? step.model_recommendation : null\n const TierIcon = tier ? MODEL_TIER_ICON_MAP[tier] : null\n\n // The last step during streaming renders its duration through a leaf that\n // subscribes to the message timer directly, keeping the 10 Hz tick\n // contained so AgentSteps and its parent stay stable across timer updates.\n const useLiveDuration = isLastStep && liveTimer != null && step.t != null\n const durationNode: React.ReactNode = useLiveDuration ? (\n <MessageLiveSeconds\n {...liveTimer!}\n offsetSeconds={step.t!}\n fallbackSeconds={totalElapsedTime ?? null}\n minDisplaySeconds={0.05}\n />\n ) : duration != null ? (\n `${duration.toFixed(1)}s`\n ) : null\n\n // The goal step's outcome is internal routing (\"fast, all 0 docs\") — cryptic\n // to a reader and redundant with the model-tier icon beside the label. Tool\n // outcomes (\"15 passages retrieved\") are real feedback, so those stay.\n const showOutcome = step.outcome && step.step !== 'goal'\n // A green tick on \"exit 1\" claims the step succeeded when it didn't — the\n // code agent's first attempt failing then retrying is exactly the story the\n // trace should tell honestly.\n const outcomeFailed = !!step.outcome && isFailureOutcome(step.outcome)\n\n // Raw tool params are a developer affordance, and only when the backend\n // gave us no summary to show instead.\n const hasSummary = step.detail?.some((d) => (d as { summary?: string }).summary)\n const toolParams =\n isDeveloper && step.detail && !step.step && !hasSummary\n ? step.detail.flatMap((d) => getToolParams(d as Record<string, unknown>))\n : []\n\n const criteria =\n step.step === 'goal_progress' && step.detail && step.detail.length > 0\n ? (step.detail as Array<{\n criterion?: string\n text?: string\n status?: string\n note?: string\n }>)\n : null\n\n const criteriaView: GoalCriterionView[] | null = criteria\n ? criteria.map((c, idx) => ({\n key: c.criterion ?? String(idx),\n text: c.text || c.criterion || '',\n note: c.note,\n met: isCriterionMet(c.status),\n }))\n : null\n const folded = childrenByParent.get(step.index)\n\n return (\n <StepRow\n key={step.index}\n index={step.index}\n number={displayNumber.get(step.index) ?? String(i + 1)}\n depth={depth}\n isLast={isLastInList}\n isActive={isActive}\n accent={accent}\n icon={<Icon size={12} strokeWidth={2.25} />}\n kind={step.narration ? 'narration' : (step.step ?? 'tool')}\n title={isActive ? presentation.description : label}\n titleTestId={isActive ? 'agent-expanded-current-step-description' : undefined}\n badge={\n TierIcon ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex shrink-0 items-center self-center\">\n <TierIcon size={12} className={accent.fg} aria-hidden />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{MODEL_TIER_LABELS[tier!] ?? tier}</TooltipContent>\n </Tooltip>\n ) : undefined\n }\n meta={\n <>\n {isDeveloper && (\n <StepModelIcon modelName={step.usage?.model} tag={getModelTag(step.usage?.model)} />\n )}\n {isDeveloper && stepTokens[i] != null && (\n <span>{formatTokens(stepTokens[i]!)} tok</span>\n )}\n {/* Not on the active row: this step's cost is a frozen snapshot of the ONE LLM call\n that produced it; next to a spinner it would read as \"still counting\". */}\n {!isActive && stepGbp[i] != null && <span>{formatGbp(stepGbp[i]!)}</span>}\n {durationNode != null && <span>{durationNode}</span>}\n </>\n }\n >\n {summary &&\n !isActive &&\n (step.narration ? (\n /* Narration is PROSE (headings, bold, lists): render markdown, not raw asterisks.\n Tool summaries stay plain text: one-line headlines where a clamp matters. */\n <StepNarration index={step.index}>\n <ConnectedMarkdown isStreaming={false}>{summary}</ConnectedMarkdown>\n </StepNarration>\n ) : (\n <StepSummary index={step.index} multiLine={isMultiLine}>\n {summary}\n </StepSummary>\n ))}\n\n {/* What the narrative displaced: the tool's target or a plan's checklist. Dimmer than\n the summary: it answers \"on what?\", not \"doing what?\". */}\n {details.map((d, di) => (\n <StepDetail key={di} index={step.index}>\n {d}\n </StepDetail>\n ))}\n\n {showOutcome && (\n <StepOutcome index={step.index} failed={outcomeFailed}>\n {step.outcome}\n </StepOutcome>\n )}\n\n {toolParams.length > 0 && (\n <StepParams>{toolParams.map((p) => `${p.key}=${p.value}`).join(' ')}</StepParams>\n )}\n\n {step.routing && (\n <details className=\"mt-1 text-xs text-muted-foreground\" data-testid=\"routing-details\">\n <summary className=\"cursor-pointer\">Routing details</summary>\n <dl className=\"mt-2 space-y-2\">\n <div>\n <dt className=\"font-medium\">Answer model</dt>\n <dd>\n {step.routing.selected_model}\n {step.routing.model_recommendation\n ? ` (${step.routing.model_recommendation})`\n : ''}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">Default document search</dt>\n <dd>\n {step.routing.selected_doc_ext_ids.length\n ? step.routing.selected_doc_ext_ids\n .map((id) => docInfo[id]?.name ?? step.routing!.document_titles[id] ?? id)\n .join(', ')\n : 'No documents selected'}\n </dd>\n <dd>The complete document catalogue remains available for direct reading.</dd>\n </div>\n <div>\n <dt className=\"font-medium\">Always available tools</dt>\n <dd>\n {step.routing.always_available_tool_names\n .map((name) => name.replaceAll('_', ' '))\n .join(', ') || 'None'}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">Additional tools</dt>\n <dd>\n {step.routing.selected_tool_names == null\n ? 'All enabled tools retained'\n : step.routing.selected_tool_names\n .filter((name) => !step.routing!.always_available_tool_names.includes(name))\n .map((name) => name.replaceAll('_', ' '))\n .join(', ') || 'None'}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">History</dt>\n <dd>\n {step.routing.retained_message_ext_ids.length} messages retained\n {step.routing.history_retained_by_policy\n ? '; full history preserved by policy'\n : ''}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">Router</dt>\n <dd>\n {step.routing.router_model} · {step.routing.elapsed_seconds.toFixed(3)}s\n {step.routing.input_tokens != null\n ? ` · ${step.routing.input_tokens.toLocaleString()} input tokens`\n : ''}\n </dd>\n </div>\n {step.routing.status === 'fallback' && (\n <div>\n <dt className=\"font-medium\">Fallback</dt>\n <dd>\n Context and authorized tools retained (\n {step.routing.fallback_reason ?? 'router unavailable'}).\n </dd>\n </div>\n )}\n </dl>\n </details>\n )}\n\n {criteriaView && <GoalCriteria criteria={criteriaView} />}\n\n {/* Sub-agent steps nest under the tool step that spawned them, COLLAPSED: a\n deep_research run emits a dozen inner rows that buried the parent trace. The parent\n keeps the count so the work is never hidden, just folded. */}\n {folded && folded.length > 0 && (\n <SubStepGroup\n parentIndex={step.index}\n summary={summariseSubSteps(folded)}\n openClassName={accent.fg}\n renderSteps={() =>\n folded.map((c, ci, arr) => renderRow(c, depth + 1, ci === arr.length - 1))\n }\n />\n )}\n </StepRow>\n )\n }\n\n let summaryNode: React.ReactNode = null\n if (contextUsage?.spent_gbp != null) {\n const runStats = computeRunStats(steps)\n // Prefer the run's true cumulative totals (summed across every LLM call this turn made) over\n // total_input/total_output, which mirror only the last call's context.\n const totalInputTokens = contextUsage.all_llm_calls?.input_tokens ?? contextUsage.total_input\n const totalOutputTokens = contextUsage.all_llm_calls?.output_tokens ?? contextUsage.total_output\n const leftParts = [\n `${displayRows.length} step${displayRows.length !== 1 ? 's' : ''}`,\n `${runStats.toolCalls} tool call${runStats.toolCalls !== 1 ? 's' : ''}`,\n ]\n if (totalElapsedTime != null) leftParts.push(`${totalElapsedTime.toFixed(1)}s`)\n leftParts.push(`${formatTokens(totalInputTokens)} in`)\n if (totalOutputTokens > 0) leftParts.push(`${formatTokens(totalOutputTokens)} out`)\n summaryNode = (\n <StepTraceSummary\n left={leftParts.join(' · ')}\n isNearBudget={isNearAiUsageBudget(contextUsage)}\n total={`Total: ${formatGbp(contextUsage.spent_gbp)}`}\n />\n )\n }\n\n return (\n <StepTrace className={className} summary={summaryNode}>\n {displayRows.map((row, i) => {\n if (row.lane) {\n return (\n <LaneBinding\n key={`lane-${row.lane}`}\n handle={row.lane}\n steps={laneStepsByHandle.get(row.lane)!}\n number={i + 1}\n renderRow={renderRow}\n isStreaming={isStreaming}\n />\n )\n }\n const parent = row.step!\n return renderRow(\n parent,\n 0,\n i === displayRows.length - 1 && !childrenByParent.has(parent.index)\n )\n })}\n </StepTrace>\n )\n}\n\n/** Binds a sub-agent's lifecycle steps to the `SubAgentLane` block. */\nfunction LaneBinding({\n handle,\n steps,\n number,\n renderRow,\n isStreaming,\n}: {\n handle: string\n steps: AgentStepEvent[]\n number: number\n renderRow: (step: AgentStepEvent, depth: number, isLastInList: boolean) => React.ReactNode\n isStreaming: boolean\n}) {\n // The spawn marker (`subagent_status: \"running\"`) carries the child's task; a `done`/`failed`\n // marker closes it; in between are the child's own steps.\n const spawn = steps.find((s) => s.subagent_status === 'running')\n const closed = steps.find((s) => s.subagent_status === 'done' || s.subagent_status === 'failed')\n const failed = steps.some((s) => s.subagent_status === 'failed')\n const inner = steps.filter((s) => !s.subagent_status)\n const task = (spawn?.content || spawn?.focus || '').trim()\n const running = !closed && isStreaming\n // What the child is doing RIGHT NOW: its latest step's focus/label.\n const latest = inner[inner.length - 1]\n return (\n <SubAgentLane\n handle={handle}\n number={number}\n // Name the lane by its JOB, never \"sub-1\": the handle is only a stable key.\n job={subagentJobLabel(task) || `Sub-agent ${handle}`}\n task={task}\n status={running ? 'running' : failed ? 'failed' : 'done'}\n innerCount={inner.length}\n liveFocus={latest ? latest.focus?.trim() || getAgentStepLabel(latest) : ''}\n renderSteps={() => inner.map((s, i) => renderRow(s, 1, i === inner.length - 1))}\n />\n )\n}\n\n/** Summarise folded sub-steps by what they did, e.g. \"3 searches, 2 reads\". */\nfunction summariseSubSteps(steps: AgentStepEvent[]): string {\n const counts = new Map<string, number>()\n for (const s of steps) {\n const noun = subStepNoun(getStepTool(s))\n counts.set(noun, (counts.get(noun) ?? 0) + 1)\n }\n return [...counts.entries()]\n .map(([noun, n]) => `${n} ${n === 1 ? noun : pluralise(noun)}`)\n .join(', ')\n}\n\n/** `met` (and `absent_from_corpus`, which the gate accepts) tick; anything else stays open. */\nfunction isCriterionMet(status?: string): boolean {\n return status === 'met' || status === 'absent_from_corpus'\n}\n\n/**\n * Does this outcome describe a failure?\n *\n * Outcomes are free text from the backend (\"exit 0 · 1.2s\", \"15 passages\n * retrieved\", \"timed out · 30.0s\"), so this reads the few shapes that carry a\n * verdict and defaults to \"not a failure\" for the rest — a false alarm on a\n * successful step is worse than a neutral chip.\n */\nfunction isFailureOutcome(outcome: string): boolean {\n const o = outcome.toLowerCase()\n if (/\\bexit\\s+0\\b/.test(o)) return false\n return /\\bexit\\s+[1-9]/.test(o) || /timed out|timeout|failed|error\\b/.test(o)\n}\n\n/** What one inner step *is*, for the collapsed summary line. */\nfunction subStepNoun(tool: string | undefined): string {\n switch (tool) {\n case 'search_inside_documents':\n case 'search_conversations':\n case 'web_search':\n return 'search'\n case 'read_document':\n case 'read_url':\n case 'view_document_pages':\n case 'get_table_of_contents':\n return 'read'\n case 'execute_code':\n case 'spawn_coding_agent':\n return 'run'\n case 'create_plan':\n return 'plan'\n default:\n return 'step'\n }\n}\n\nfunction pluralise(noun: string): string {\n return noun.endsWith('h') ? `${noun}es` : `${noun}s`\n}\n\nexport const AgentSteps = React.memo(AgentStepsComponent, (prev, next) => {\n return (\n prev.isStreaming === next.isStreaming &&\n prev.className === next.className &&\n prev.totalElapsedTime === next.totalElapsedTime &&\n prev.steps === next.steps &&\n prev.liveTimer === next.liveTimer &&\n prev.hideLive === next.hideLive\n )\n})\n","/**\n * RunningSubagents — the live roster of a turn's sub-agents, shown indented under\n * the agent's own status line in the main turn bar (NOT in the steps drawer).\n *\n * One compact line per sub-agent, named by its JOB (not \"sub-1\"): a running child\n * shows a spinner + its current focus; a finished child shows a check (or an alert\n * if it failed). This is the \"watch my team work\" view — the agent up top, its\n * sub-agents beneath it, each reporting its own progress.\n *\n * Each line EXPANDS on its own chevron to reveal that child's own steps, the same\n * affordance the main bar uses for the agent's steps — a sub-agent is not a black\n * box. This is the only place a RUNNING child's steps can be read: the steps drawer\n * drops running lanes (`hideLive`) precisely because they live here.\n *\n * Purely derived from the step stream via {@link extractSubagentLanes}.\n */\n\nimport { useMemo } from 'react'\nimport {\n extractSubagentLanes,\n findLeafForTaskMessage,\n mergeAgentSteps,\n type AgentStepEvent,\n} from '@arbidocs/sdk/browser'\nimport { useConversationData } from '@arbidocs/react'\nimport { SubagentRoster } from '../../agents/runs/SubagentRoster'\nimport { AgentSteps } from './AgentSteps'\n\ninterface RunningSubagentsProps {\n steps: AgentStepEvent[]\n className?: string\n}\n\n/**\n * Each sub-agent's own steps, keyed by handle and ready to render as a plain\n * timeline.\n *\n * A child's steps are the ones carrying ITS handle — grouping is by identity, not\n * arrival order, because several children run concurrently and their events\n * interleave on the wire. The spawn/done lifecycle markers are dropped (the roster\n * line already reports that status), and the handle is stripped so AgentSteps\n * renders ordinary numbered rows instead of re-grouping them into a nested lane\n * card inside the lane we just opened.\n */\nfunction groupStepsByHandle(steps: AgentStepEvent[]): Map<string, AgentStepEvent[]> {\n const byHandle = new Map<string, AgentStepEvent[]>()\n for (const step of mergeAgentSteps(steps)) {\n if (!step.subagent || step.subagent_status) continue\n const arr = byHandle.get(step.subagent)\n const row = { ...step, subagent: undefined }\n if (arr) arr.push(row)\n else byHandle.set(step.subagent, [row])\n }\n return byHandle\n}\n\n/**\n * Thin wrapper so the data-fetching inner component (and its `useConversationData`\n * call) never mounts on a turn with no sub-agents — a plain turn shouldn't pay for\n * (or require a QueryClientProvider around) the \"open thread\" lookup.\n */\nexport function RunningSubagents({ steps, className }: RunningSubagentsProps) {\n const lanes = extractSubagentLanes(steps)\n if (lanes.length === 0) return null\n return <RunningSubagentsRoster steps={steps} lanes={lanes} className={className} />\n}\n\nfunction RunningSubagentsRoster({\n steps,\n lanes,\n className,\n}: RunningSubagentsProps & { lanes: ReturnType<typeof extractSubagentLanes> }) {\n // Only used for the \"open thread\" affordance's branch lookup — cheap (React\n // Query dedupes against the same conversation's already-fetched threads).\n const { threads, setParentMessageId: selectThread } = useConversationData()\n // Memoised so an expanded child's step array keeps a stable identity across the\n // bar's frequent re-renders (it ticks a live timer). Rebuilding it every render\n // busts AgentSteps' memo, which re-runs its \"follow the run\" auto-scroll and\n // livelocks the bar against the conversation's own scrolling.\n const stepsByHandle = useMemo(() => groupStepsByHandle(steps), [steps])\n const rosterLanes = useMemo(\n () =>\n lanes.map((lane) => ({\n handle: lane.handle,\n status: lane.status,\n task: lane.task || lane.job,\n stepCount: lane.steps,\n canOpenThread: !!lane.taskMessageExtId,\n })),\n [lanes]\n )\n\n const openThread = (handle: string) => {\n const taskMessageExtId = lanes.find((lane) => lane.handle === handle)?.taskMessageExtId\n if (!taskMessageExtId) return\n const leafId = findLeafForTaskMessage(threads, taskMessageExtId)\n if (leafId) selectThread(leafId)\n }\n\n return (\n <SubagentRoster\n lanes={rosterLanes}\n className={className}\n onOpenThread={openThread}\n // `isStreaming={false}`: these rows are the child's SETTLED steps — the\n // roster line carries \"running\".\n renderSteps={(handle) => (\n <AgentSteps\n steps={stepsByHandle.get(handle) ?? []}\n isStreaming={false}\n className=\"!border-b-0\"\n />\n )}\n />\n )\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { ChevronRight, Download } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { downloadTableAsCsv } from '../../chat/table-csv'\nimport { notify } from '@arbidocs/react/shell'\n\n/**\n * A markdown table inside an assistant answer, with a \"Download CSV\" button.\n *\n * The table scrolls sideways inside its own box when it is wider than the answer, so\n * no column is clipped. The button sits in a row above the table, so it never covers a\n * header, and only shows on hover or keyboard focus (always on touch screens), so it\n * doesn't clutter the answer; it stays in the tab order so keyboard users can always reach it.\n *\n * A table's sideways scrollbar sits at its bottom edge, often far below the screen, and phones\n * hide scrollbars until you scroll. So while columns are still off to the right, a fade on the\n * right edge and a labelled \"Scroll right\" button in the row above the table say there is more.\n * The button scrolls the table on tap and sits outside the table, so it never covers a header.\n * Both go away once you reach the end.\n */\nexport function AnswerTable({\n children,\n className,\n ...props\n}: React.ComponentPropsWithoutRef<'table'>): React.JSX.Element {\n const wrapperRef = useRef<HTMLDivElement>(null)\n const scrollRef = useRef<HTMLDivElement>(null)\n const [hasMoreRight, setHasMoreRight] = useState(false)\n\n const checkOverflow = useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n const more = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n // Equality-guarded so scrolling or resizing doesn't re-render when nothing changed.\n setHasMoreRight((prev) => (prev === more ? prev : more))\n }, [])\n\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n checkOverflow()\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n if (el.firstElementChild) observer.observe(el.firstElementChild)\n return () => observer.disconnect()\n }, [checkOverflow])\n\n const scrollRight = useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n el.scrollBy({ left: 240, behavior: 'smooth' })\n }, [])\n\n const handleDownload = useCallback(async () => {\n const table = wrapperRef.current?.querySelector('table')\n if (!table || !wrapperRef.current) return\n try {\n const filename = await downloadTableAsCsv(table, wrapperRef.current)\n notify.success(`Saved ${filename}`)\n } catch (error) {\n console.error('Failed to download table as CSV', error)\n notify.error('Could not download the table as CSV')\n }\n }, [])\n\n return (\n <div ref={wrapperRef} className=\"group/answer-table w-fit min-w-0 max-w-full\">\n <div className=\"flex items-center justify-end gap-2 pb-1\">\n {hasMoreRight && (\n <button\n type=\"button\"\n onClick={scrollRight}\n data-testid=\"answer-table-scroll-right\"\n className=\"flex items-center gap-1 rounded border border-border bg-background/90 px-1.5 py-0.5 text-xs text-foreground shadow-sm transition-colors hover:bg-muted\"\n >\n <span>Scroll right</span>\n <ChevronRight size={12} aria-hidden=\"true\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={handleDownload}\n data-testid=\"answer-table-download-csv\"\n aria-label=\"Download table as CSV\"\n title=\"Download as CSV\"\n className=\"flex items-center gap-1 rounded border border-border bg-background/90 px-1.5 py-0.5 text-xs text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground focus-visible:opacity-100 group-hover/answer-table:opacity-100 group-focus-within/answer-table:opacity-100 pointer-coarse:opacity-100\"\n >\n <Download size={12} aria-hidden=\"true\" />\n <span>CSV</span>\n </button>\n </div>\n {/* Wide tables scroll sideways inside the bubble instead of running past its edge. */}\n <div className=\"relative min-w-0 max-w-full\">\n <div\n ref={scrollRef}\n onScroll={checkOverflow}\n className=\"scrollbar-subtle max-w-full overflow-x-auto pb-1\"\n data-testid=\"answer-table-scroll\"\n >\n {/* Each column keeps a readable width, so on a phone the table scrolls sideways\n instead of squeezing every column to a word or two per line. */}\n <table\n data-testid=\"markdown-table\"\n {...props}\n className={cn('[&_td]:min-w-36 [&_th]:min-w-36', className)}\n >\n {children}\n </table>\n </div>\n {hasMoreRight && (\n <div\n aria-hidden=\"true\"\n data-testid=\"answer-table-fade\"\n className=\"pointer-events-none absolute inset-y-0 right-0 w-10 bg-linear-to-l from-background to-transparent\"\n />\n )}\n </div>\n </div>\n )\n}\n","/**\n * Open a cited or retrieved passage in the viewer: its document (the version it was quoted from),\n * its page and the passage itself.\n */\n\nimport { useCallback } from 'react'\nimport { useDocuments, type Chunk } from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { citedVersionRef } from '../../facts/cited-version-ref'\n\nexport function useOpenChunk(): (chunk: Chunk) => void {\n const { openDocument } = useBlocksEnvironment()\n const { data: documents } = useDocuments()\n return useCallback(\n (chunk: Chunk) => {\n const meta = chunk.metadata\n if (!meta?.doc_ext_id) return\n // A passage of an older version opens that version.\n const listed = documents?.find((d) => d.external_id === meta.doc_ext_id)\n openDocument(citedVersionRef(meta.doc_ext_id, meta.doc_version, listed?.current_version), {\n page: meta.page_number ?? undefined,\n passageId: meta.chunk_ext_id ?? undefined,\n })\n },\n [openDocument, documents]\n )\n}\n","import { useMemo } from 'react'\nimport { useDocuments } from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\n\n/**\n * Workspace display names keyed by document external id: the same label the document list and\n * viewer show. Citation chunks carry the raw upload name instead, so answers can name a file\n * differently from the workspace.\n */\nexport function useWorkspaceDocTitles(): ReadonlyMap<string, string> {\n const { data } = useDocuments()\n return useMemo(\n () =>\n new Map<string, string>(\n (data ?? []).map((doc) => [doc.external_id, getDocumentTitle(doc)] as [string, string])\n ),\n [data]\n )\n}\n","import React, { useCallback } from 'react'\nimport {\n CitationRenderer as CitationRendererCore,\n useArbiHost,\n useArbiSessionState,\n useArbiSessionStore,\n type ChunkActivation,\n type CitationRendererProps as CitationRendererCoreProps,\n type CitationState,\n type RenderMarkdown,\n type ToolResponses,\n} from '@arbidocs/react'\nimport { notify } from '@arbidocs/react/shell'\nimport type { MarkdownRendererProps } from '@arbidocs/react/ui'\nimport { workspaceDocIdFromHref } from '../../chat/doc-links'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { ConnectedMarkdown, ExternalLink, InternalDocLink } from './ConnectedMarkdown'\nimport { AnswerTable } from './AnswerTable'\nimport { useOpenChunk } from './useOpenChunk'\nimport { useWorkspaceDocTitles } from './useWorkspaceDocTitles'\n\n/** The markdown element overrides, as the kit's renderer takes them. */\ntype Components = NonNullable<MarkdownRendererProps['components']>\n\n/**\n * An answer with its citations, bound to the session.\n *\n * The presentational behaviour lives in the token-neutral core at `@arbidocs/react`\n * (`CitationRenderer`). This binding wires the session into the core's injected callbacks (the\n * open citation, the viewed passage) and hands it the conversation's markdown and links. Whether\n * the conversation is on screen (the citation popover shows only then) is the host's\n * (`ArbiChatHost.useIsChatInView`).\n */\n\nexport interface ConnectedCitationRendererProps {\n content: string\n citations?: Record<string, string[]>\n citationData?: ToolResponses\n className?: string\n messageId: string\n isStreaming?: boolean\n}\n\n/** Whether the conversation is on screen; without a host answer, it is. */\nconst alwaysInView = () => true\n\n// Reactive popover state, read as a hook so the subscription stays local to each popover: the\n// top-level renderer never re-renders on citation state changes.\nfunction useCitationState(): CitationState {\n const activeCitationKey = useArbiSessionState((s) => s.activeCitationKey)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const useIsChatInView = useArbiHost().chat?.useIsChatInView ?? alwaysInView\n return { activeCitationKey, viewingPassageId, isOnConversationPage: useIsChatInView() }\n}\n\n// Module-scope so the reference is stable: it is a dependency of the renderer's markdown components.\nconst notifyCitation: NonNullable<CitationRendererCoreProps['notify']> = (message, kind) =>\n notify[kind ?? 'info'](message)\n\n// Answer tables get a \"Download CSV\" button. Cached per core components object so the\n// merged reference stays stable and memoised markdown blocks don't re-parse.\nconst answerComponentsCache = new WeakMap<Partial<Components>, Partial<Components>>()\nfunction withAnswerTable(components: Partial<Components>): Partial<Components> {\n let merged = answerComponentsCache.get(components)\n if (!merged) {\n merged = { ...components, table: AnswerTable }\n answerComponentsCache.set(components, merged)\n }\n return merged\n}\n\n// Hand the conversation's markdown to the core (KaTeX, Mermaid, document pills). Module-scope so\n// the reference is stable across renders.\nconst renderMarkdown: RenderMarkdown = ({ components, isStreaming, children }) => (\n <ConnectedMarkdown components={withAnswerTable(components)} isStreaming={isStreaming}>\n {children}\n </ConnectedMarkdown>\n)\n\n/**\n * Links inside an answer, as the citation core sees them.\n *\n * The core's own `a` override handles `#cite-N` and hands EVERYTHING else to the\n * injected `ExternalLink` — and because component overrides are merged custom-last,\n * that override replaces the one in `MarkdownRenderer`, including its\n * workspace-document case. So a link to a document the answer just saved got the\n * \"Open External Link\" confirmation; and since the model writes the href as a bare\n * `doc-…` id, `window.open` then resolved it RELATIVE to the app and opened the\n * document in-app anyway. Confirmation dialog and correct destination, both.\n *\n * Injecting this wrapper instead of the raw `ExternalLink` puts the decision back\n * in the adapter — the one file that is supposed to know what a document is —\n * without teaching the token-neutral core about workspaces.\n */\nfunction LinkInAnswer({ href, children, ...props }: React.ComponentPropsWithoutRef<'a'>) {\n const docId = workspaceDocIdFromHref(href, useBlocksEnvironment().runtimeConfig.deploymentDomain)\n if (docId) {\n return (\n <InternalDocLink docId={docId} href={href} {...props}>\n {children}\n </InternalDocLink>\n )\n }\n return (\n <ExternalLink href={href} {...props}>\n {children}\n </ExternalLink>\n )\n}\n\nconst ConnectedCitationRendererComponent: React.FC<ConnectedCitationRendererProps> = (props) => {\n const session = useArbiSessionStore()\n const openChunk = useOpenChunk()\n const docTitles = useWorkspaceDocTitles()\n\n const onOpenCitation = useCallback(\n (citationKey: string) => session.setActiveCitationKey(citationKey),\n [session]\n )\n\n const onActivateChunk = useCallback(\n ({ messageId, citationNum, chunk }: ChunkActivation) => {\n session.setActiveCitationKey(`${messageId}-${citationNum}`)\n if (chunk.metadata.chunk_ext_id) openChunk(chunk)\n },\n [session, openChunk]\n )\n\n const onCloseCitation = useCallback(() => {\n session.setActiveCitationKey(null)\n const viewing = session.getState().viewingDocument\n if (viewing?.passageId) session.setViewingDocument({ id: viewing.id, passageId: null })\n }, [session])\n\n const onDismissCitation = useCallback(() => session.setActiveCitationKey(null), [session])\n\n return (\n <CitationRendererCore\n {...props}\n renderMarkdown={renderMarkdown}\n ExternalLink={LinkInAnswer}\n onOpenCitation={onOpenCitation}\n onActivateChunk={onActivateChunk}\n useCitationState={useCitationState}\n onCloseCitation={onCloseCitation}\n onDismissCitation={onDismissCitation}\n notify={notifyCitation}\n docTitles={docTitles}\n />\n )\n}\n\nexport const ConnectedCitationRenderer = React.memo(ConnectedCitationRendererComponent)\n","/**\n * MessageDetailsModal Component\n *\n * Displays detailed message information including execution trace in a collapsible JSON tree.\n * Similar to browser developer console JSON viewer.\n */\n\nimport type { ReactNode } from 'react'\nimport { Dialog, DialogContent } from '@arbidocs/react/ui'\nimport { useArbiSessionState, useMessageDetails } from '@arbidocs/react'\nimport { Loader2, FileText } from 'lucide-react'\nimport { MessageJsonTree } from '../../settings/MessageJsonTree'\nimport { ModalBreadcrumbHeader, ModalCrumbs } from '../../settings/ModalBreadcrumbHeader'\n\nexport interface MessageDetailsModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n messageExtId: string | null\n /** The open workspace, for the breadcrumb: its name and the host's icon for it. */\n workspace?: { name: string; icon?: ReactNode } | null\n}\n\nexport function MessageDetailsModal({\n open,\n onOpenChange,\n messageExtId,\n workspace,\n}: MessageDetailsModalProps) {\n const {\n data: messageDetails,\n isLoading,\n error,\n } = useMessageDetails(messageExtId, { enabled: open && !!messageExtId })\n\n const currentConversationId = useArbiSessionState((s) => s.conversationId)\n\n // Get conversation title from message details once loaded\n const conversationTitle =\n messageDetails?.conversation_ext_id === currentConversationId\n ? 'Current Conversation'\n : 'Message'\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"max-w-4xl max-h-[calc(100dvh-2rem)] overflow-hidden flex flex-col\"\n data-testid=\"message-details-modal\"\n >\n <ModalBreadcrumbHeader\n icon={<FileText size={20} />}\n title=\"Message Details\"\n subtitle={\n workspace || currentConversationId ? (\n <ModalCrumbs\n items={[\n ...(workspace\n ? [\n {\n icon: workspace.icon,\n label: workspace.name,\n },\n ]\n : []),\n ...(currentConversationId ? [{ label: conversationTitle }] : []),\n ]}\n />\n ) : undefined\n }\n description=\"Full message data including execution trace and metadata\"\n />\n\n <div className=\"flex-1 overflow-auto p-4 bg-muted/20 rounded-md\">\n {isLoading && (\n <div\n className=\"flex items-center justify-center h-64\"\n data-testid=\"message-details-loading\"\n >\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n )}\n\n {error && (\n <div\n className=\"text-destructive p-4 border border-destructive/20 rounded-md\"\n data-testid=\"message-details-error\"\n >\n Error loading message details: {String(error)}\n </div>\n )}\n\n {messageDetails && (\n <div data-testid=\"message-details-content\">\n <MessageJsonTree data={messageDetails} name=\"message\" defaultExpanded={true} />\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The open workspace and its shield (its initial in its kind's colour), for a notice or a\n * dialog's breadcrumb about something in it.\n */\nimport type { ReactNode } from 'react'\nimport { getWorkspaceKind, useArbiSessionState, useWorkspaces } from '@arbidocs/react'\nimport { ShieldIcon } from '@arbidocs/react/ui'\nimport { workspaceKindColor } from '../../shell/Workspace'\n\nexport function useOpenWorkspaceIcon() {\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: workspaces } = useWorkspaces()\n const workspace = workspaces?.find((w) => w.external_id === workspaceId)\n const icon = (size: number): ReactNode =>\n workspace ? (\n <ShieldIcon\n char={workspace.name.charAt(0)}\n workspaceColor={workspaceKindColor(getWorkspaceKind(workspace))}\n size={size}\n />\n ) : undefined\n return { workspaceId, workspace, icon }\n}\n","import { createContext } from 'react'\nimport type { AskAgain } from '@arbidocs/react'\n\n/**\n * Re-run the question of a stopped answer. The conversation view provides it, since only it\n * knows how the question must go: straight back to ARBI, or through the task's review when the\n * task waits for one. Without a provider, \"Ask again\" falls back to editing the question.\n */\nexport const AskAgainContext = createContext<AskAgain | null>(null)\n","import { useConversationActivity, useDocuments, useConversationItems } from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\nimport { WorkflowStepChip } from '../../chat/WorkflowStepChip'\nimport { fromPlanSteps, type TaskPlanStep } from '../../agents/workflows/planSteps'\nimport {\n splitDocRef,\n stepPhase,\n stepStatesFromActivity,\n type WorkflowActivityEvent,\n} from '../../agents/workflows/run'\nimport { stepDocuments } from '../../agents/workflows/StepDocuments'\nimport { stepKindOf } from '../../agents/workflows/stepKinds'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\nexport interface WorkflowStepMessageProps {\n messageId: string\n conversationId?: string | null\n /** The step the message starts (its `tools.workflow_step`). */\n step: string\n content: string\n}\n\n/**\n * A message the server sent to start a workflow step: the step's chip, centred, in its kind's\n * colour and its current phase (the run's plan and activity, as the thread's top bar reads them),\n * expandable to the full instruction.\n */\nexport function WorkflowStepMessage({\n messageId,\n conversationId,\n step,\n content,\n}: WorkflowStepMessageProps) {\n const { conversations } = useConversationItems()\n // The same cached query as the thread's bar: no extra request.\n const activity = useConversationActivity(conversationId ?? undefined, { live: true })\n const plan = conversations.find((c) => c.external_id === conversationId)?.plan\n const steps = fromPlanSteps((plan?.steps ?? []) as TaskPlanStep[])\n const found = steps.find((s) => s.id === step)\n const states = stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[])\n const { data: documents = [] } = useDocuments()\n const { openDocument } = useBlocksEnvironment()\n // The step's document (its latest version), one click from its chip.\n const ref = found ? stepDocuments(steps, states, step).at(-1) : undefined\n const docId = ref ? splitDocRef(ref).id : undefined\n const doc = documents.find((d) => d.external_id === docId)\n return (\n <WorkflowStepChip\n step={step}\n title={found?.title}\n kind={found ? stepKindOf(found) : undefined}\n phase={found && activity.data ? stepPhase(steps, states, step) : undefined}\n document={\n docId\n ? {\n name: doc ? getDocumentTitle(doc) : docId,\n onOpen: () => {\n openDocument(docId)\n },\n }\n : undefined\n }\n content={content}\n messageId={messageId}\n />\n )\n}\n","/**\n * ConnectedMessage\n *\n * Renders a single message in the conversation, connected to the session and the host.\n * This component:\n * - Displays user and assistant messages with appropriate styling\n * - Handles message editing and context actions\n * - Supports markdown content rendering with syntax highlighting\n * - Manages message state (loading, error, edit mode)\n * - Coordinates with branch controls for forked conversations\n */\n\nimport {\n MessageArtifactCard,\n workflowStepOf,\n type MessageArtifact,\n useCreateFact,\n useCreateFacts,\n useDocuments,\n useWorkspaceUsers,\n useConversationWorkspace,\n stripSpeakerPrefix,\n transcriptSegmentOf,\n useThinkingContent,\n useConversationItems,\n resolveConfigModel,\n useArbiSession,\n useArbiSessionState,\n useArbiSessionStore,\n useAvailableModels,\n useConfig,\n useDeleteMessage,\n useUserSettings,\n useLinkMentions,\n} from '@arbidocs/react'\nimport { useMessageChatArtifact, useAssistantCopy } from '@arbidocs/react/shell'\nimport {\n formatFriendlyDate,\n getDocumentTitle,\n isImageDocument,\n getUserDisplayName,\n} from '@arbidocs/react/ui'\nimport React, { useState, useRef, useEffect, useMemo, useCallback, useContext } from 'react'\nimport type { ChatMessage as MessageType } from '@arbidocs/sdk/browser'\nimport { ErrorBoundary } from '../../components/ErrorBoundary'\nimport {\n MessageRoot,\n MessageContent,\n MessageAuthor,\n MessageBubble,\n MessageByline,\n MessageSubagentBadge,\n MessageBody,\n MessageNarration,\n MessageFooter,\n MessageActionButton,\n MessageActionMenu,\n type MessageActionMenuItem,\n} from '../../chat/Message'\nimport { buildDeepLinkPath } from '../../lib/deep-link'\nimport { Copy, Check, Clock, Edit3, Link, Trash2, Milestone, Share2, RotateCcw } from 'lucide-react'\nimport { AssistantEntity } from '../../agents/tasks/AssistantEntity'\nimport { AgentSteps } from './AgentSteps'\nimport { ConnectedCitationRenderer } from './ConnectedCitationRenderer'\nimport { ConnectedMarkdown } from './ConnectedMarkdown'\nimport { MessageDetailsModal } from './MessageDetailsModal'\nimport { MessageLiveSeconds } from './MessageLiveSeconds'\nimport { buildCitationChunkData } from '@arbidocs/sdk/browser'\nimport { artifactKindFromFileName, viewerTabForArtifactMode } from '@arbidocs/react/artifacts'\nimport { findMessageDocument } from '../../chat/generatedDocuments'\nimport { useOpenWorkspaceIcon } from './useOpenWorkspaceIcon'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { DocumentUser } from '../files/fields/DocumentUser'\nimport { buildFactCitations } from '../../facts/fact-citations'\nimport { chronologyFactBodies } from '../../facts/fact-chronology'\nimport { topLevelAgentSteps } from '@arbidocs/sdk/browser'\nimport { copyMessageToClipboard } from '../../chat/message-copy'\nimport { getCurrentAgentStepPresentation } from '../../agents/runs/step-presentation'\nimport { getSubagentBranchRecord } from '@arbidocs/sdk/browser'\nimport { AskAgainContext } from './AskAgainContext'\nimport { WorkflowStepMessage } from './WorkflowStepMessage'\nimport { TranscriptEntry } from '../../calls/connected/TranscriptEntry'\nimport { useTranscriptRuns } from '../../calls/connected/transcript-runs-context'\n\nexport interface ConnectedMessageProps {\n message: MessageType\n index: number\n className?: string\n ['data-message-id']?: string\n branchControl?: React.ReactNode\n subagentLinks?: React.ReactNode\n messageHistory?: MessageType[]\n participantTint?: string\n}\n\nconst MessageComponent = ({\n message,\n index,\n branchControl,\n subagentLinks,\n messageHistory,\n participantTint,\n ...rest\n}: ConnectedMessageProps) => {\n const [isCopied, setIsCopied] = useState(false)\n const [factSaved, setFactSaved] = useState(false)\n const [isStepsExpanded, setIsStepsExpanded] = useState(false)\n const [showDetailsModal, setShowDetailsModal] = useState(false)\n const messageRef = useRef<HTMLDivElement>(null)\n\n const session = useArbiSessionStore()\n const environment = useBlocksEnvironment()\n // Stored @mentions become chips, the assistant's under the host's name for it as well.\n const linkMentions = useLinkMentions()\n const { notify } = environment\n const editingMessageId = useArbiSessionState((state) => state.editingMessageId)\n const isEditing = editingMessageId === message.external_id\n const { conversations } = useConversationItems()\n const isShared = !!conversations?.find(\n (conversation) => conversation.external_id === message.conversation_ext_id\n )?.is_shared\n const assistantTint = isShared ? 'var(--color-secondary)' : 'var(--color-primary)'\n const deleteMessage = useDeleteMessage()\n\n // Get user settings to check developer status\n const { data: userSettings } = useUserSettings()\n const isDeveloper = userSettings?.developer === true\n\n const role = (message.role || '').toLowerCase()\n const isUser = role === 'user'\n const isTopLevel = index === 0\n\n // A sub-agent task message is a `role: user` message ARBI generates itself\n // to hand a task to a delegate — it is created_by the human (the human did\n // delegate it), so it would otherwise render pixel-identical to a message\n // that human actually typed: same \"You\" pill, same bubble. Sitting right\n // next to the human's real ask, two visually-identical \"You\" bubbles read\n // as a duplicate-send bug, not \"the system rephrased this for a delegate\".\n const subagentTaskRecord = isUser ? getSubagentBranchRecord(message) : null\n\n // Get current user and workspace users to determine message author\n const currentUser = useArbiSession().user\n const {\n workspaceId: selectedWorkspaceId,\n workspace: currentWorkspace,\n icon: workspaceIcon,\n } = useOpenWorkspaceIcon()\n const { data: workspaceUsers = [] } = useWorkspaceUsers()\n\n // Inline artifact (drafted document) linked to this assistant message —\n // surfaces the draft in the conversation, not only a docked panel.\n const streaming = useMessageChatArtifact(message.external_id)\n const { data: workspaceDocs } = useDocuments()\n const linkedArtifact = useMemo((): MessageArtifact | undefined => {\n if (!message.external_id) return undefined\n if (streaming) return streaming\n const doc = findMessageDocument(workspaceDocs, message.external_id)\n if (!doc) return undefined\n // A saved artifact's mode is its file's extension: .html/.jsx are live artifacts, an image is\n // an image, and anything else is a document draft (stored by the server as .docx).\n const kind = artifactKindFromFileName(doc.file_name)\n return {\n docExtId: doc.external_id,\n title: getDocumentTitle(doc),\n isComplete: true,\n mode: isImageDocument(doc) ? 'image' : (kind ?? 'markdown'),\n }\n }, [streaming, workspaceDocs, message.external_id])\n const handleOpenArtifact = useCallback(\n (docExtId: string) => {\n // Open on the tab that fits the artifact: a document draft in the Word editor, an html/react\n // artifact on its Preview, an image on its media view.\n session.setDocumentViewer({ tab: viewerTabForArtifactMode(linkedArtifact?.mode) })\n environment.openDocument(docExtId)\n },\n [linkedArtifact?.mode, session, environment]\n )\n\n // Find the user object for the message author\n const messageAuthorUser = useMemo(() => {\n if (!isUser) return null\n\n // Check if message is from current user\n const isCurrentUser = message.created_by_ext_id === currentUser?.external_id\n if (isCurrentUser && currentUser) {\n // Current user from auth store is already User-compatible\n return currentUser\n }\n\n // Find the workspace user who created this message\n const workspaceUser = workspaceUsers.find(\n (wu) => wu.user.external_id === message.created_by_ext_id\n )\n return workspaceUser?.user || null\n }, [isUser, message.created_by_ext_id, currentUser, workspaceUsers])\n\n // Someone else's typed message: left-aligned, under their person pill each time the author\n // changes (my own stay on the right; transcript lines are centred for everyone).\n const isOtherPerson =\n isUser && !!message.created_by_ext_id && message.created_by_ext_id !== currentUser?.external_id\n const startsAuthorRun = useMemo(() => {\n if (!isOtherPerson) return false\n const prev = messageHistory && index > 0 ? messageHistory[index - 1] : null\n if (!prev) return true\n const prevIsTranscript = !!transcriptSegmentOf(prev.tools ?? prev.meta?.tools)\n return (\n prev.role !== 'user' ||\n prevIsTranscript ||\n prev.created_by_ext_id !== message.created_by_ext_id\n )\n }, [isOtherPerson, messageHistory, index, message.created_by_ext_id])\n\n // Get config for this message to extract model info\n // For user messages, get the config from the immediately following assistant message\n const configId = useMemo(() => {\n if (!isUser) {\n return message.config_ext_id\n }\n\n // For user messages, get the next message (which should be the assistant response)\n if (messageHistory && index + 1 < messageHistory.length) {\n const nextMessage = messageHistory[index + 1]\n if (nextMessage.role === 'assistant') {\n return nextMessage.config_ext_id\n }\n }\n\n return message.config_ext_id // fallback\n }, [isUser, message.config_ext_id, messageHistory, index])\n\n const { data: messageConfig } = useConfig(configId || 'default')\n\n // Extract the model that actually ran for the message footer.\n //\n // Source of truth is the assistant response itself, not the request config:\n // assistant messages persist `tools.stream_events.events` which hydrate into\n // `message.agentSteps`. Each step's `usage.model` is the LLM the backend\n // actually called for that step (resolved post-FilterPlan in auto mode).\n //\n // The 'answering' step is the LLM call that produced the response content,\n // so it's the most accurate source. We fall back to the last step with a\n // recorded model (handles edge cases like a still-streaming answering step\n // or non-standard step ordering), and finally to the goal step's\n // `selected_model` for messages mid-stream that haven't recorded usage yet.\n //\n // The request config can't be used here — assistant messages typically\n // have `config_ext_id = null`, so it would just read the user's *current*\n // default config (not what ran), and in auto mode it stores the\n // placeholder `AGENT_MODEL_NAME = \"auto\"` which isn't a real model.\n const modelName = useMemo(() => {\n const steps = message.agentSteps\n if (!steps?.length) return null\n const answering = steps.find((s) => s.step === 'answering' && s.usage?.model)\n if (answering?.usage?.model) return answering.usage.model\n for (let i = steps.length - 1; i >= 0; i--) {\n const used = steps[i].usage?.model\n if (used) return used\n }\n return steps.find((s) => s.selected_model)?.selected_model ?? null\n }, [message.agentSteps])\n\n // Look up model tag for the footer icon (matches ModelSelector's tag icons)\n const { data: availableModels } = useAvailableModels()\n const modelTag = useMemo(() => {\n if (!modelName || !availableModels?.models) return null\n const info = availableModels.models.find((m) => m.model_name === modelName)\n return info?.tags?.[0] || null\n }, [modelName, availableModels])\n\n // Use model name directly for footer label — matches the ModelSelector dropdown\n const modelDisplayName = modelName\n\n // Extract citations and convert to the format CitationRenderer expects\n const activeCitations = useMemo(() => {\n const tools = message.tools || message.meta?.tools\n const modelCitations = tools?.model_citations\n const toolResponses =\n modelCitations && 'tool_responses' in modelCitations ? modelCitations.tool_responses : null\n\n if (!toolResponses || typeof toolResponses !== 'object') {\n return null\n }\n\n // Schema format: citation number as key, CitationData object as value\n // Convert to simple Record<string, string[]> for CitationRenderer\n const citationMap: Record<string, string[]> = {}\n\n Object.entries(toolResponses).forEach(([citationNum, citationData]) => {\n if (citationData && typeof citationData === 'object' && 'chunk_ids' in citationData) {\n // Frontend only needs chunk_ids from CitationData\n const citation = citationData as { chunk_ids: string[] }\n citationMap[citationNum] = citation.chunk_ids\n }\n })\n\n return Object.keys(citationMap).length > 0 ? citationMap : null\n }, [message.tools, message.meta?.tools])\n\n // Stable citation-data object so CitationRenderer (memo'd) doesn't re-render per token\n const citationData = useMemo(() => buildCitationChunkData(message), [message])\n\n // Keep faded until WebSocket confirms completion (isLoading becomes false/undefined).\n // Assistant-only: the user's own message is also stamped isLoading=true while its\n // response streams (see the chat stream handlers (@arbidocs/react)) purely to suppress the orphan-alert\n // flash, so it must not be treated as \"still generating\" for footer purposes.\n const isGenerating = !isUser && message.isLoading === true\n const isFailed = message.status === 'failed'\n // The person stopped this answer; the server keeps whatever had streamed so far.\n const isStopped = !isUser && message.status === 'cancelled'\n const isQueued = isUser && message.status === 'queued'\n\n // Kept purely to STRIP a leaked `<think>…</think>` block out of the body, so a\n // model that emits one does not show raw reasoning (or a stray `</think>`) as\n // its answer. The extracted reasoning itself is discarded and shown nowhere:\n // the backend already streams real reasoning on its own channel\n // (`reasoning_content` → a reasoning output item → a row in the steps trace),\n // so surfacing this legacy copy would only duplicate it.\n const { responseContent } = useThinkingContent({\n content: message.content || '',\n modelName,\n isUser,\n isGenerating,\n })\n\n // Split the body at the settled/live boundary the stream stamped on it.\n // Before it: prose the model has moved on from, which dims. After it: what is\n // being written now, which never dims — so the answer's opacity is constant\n // from its first token and nothing un-fades at the end.\n //\n // The boundary only exists while a turn is streaming. Once the answer is\n // committed the narration has already left the body, so everything is live.\n const settledLength = isGenerating ? (message.settledNarrationLength ?? 0) : 0\n const settledNarration = settledLength ? responseContent.slice(0, settledLength).trimEnd() : ''\n const liveContent = settledLength ? responseContent.slice(settledLength) : responseContent\n\n // The server still has this turn running, but this client is not streaming it (e.g. it\n // left the thread mid-stream and cleared its local loading flag). It is not finished, so\n // do not claim it is. The attach re-connects once the thread is viewed again.\n const isRunningOnServer =\n !isUser && (message.status === 'in_progress' || message.status === 'queued')\n // A follow-up's answer waiting behind the running turn: saved with status `queued` until its\n // turn starts. Nothing is being worked on yet, so it reads as queued, not as working. Once this\n // client streams it (the row may still say `queued` until the next refetch) it is working.\n const isQueuedAnswer = !isUser && message.status === 'queued' && !isGenerating\n\n // A running turn may spend many seconds on tool steps before its first token. Show that\n // inside the bubble, since the footer step label sits well away from the answer. The same\n // line covers a turn the server still runs while this client is not streaming it.\n // A pending question means the turn is paused on the person, not working. Its card is docked\n // by the composer, out of sight from the bubble, so the bubble says whose move it is. Only while\n // the turn is live: a stopped or settled turn must not claim to be waiting on the person.\n const isAwaitingAnswer =\n (isGenerating || isRunningOnServer) && !isStopped && !!message.pendingUserInput\n const showWorkingIndicator =\n (isGenerating || isRunningOnServer) &&\n !isQueuedAnswer &&\n !responseContent.trim() &&\n !linkedArtifact &&\n !isAwaitingAnswer\n\n // What the run is doing right now (e.g. \"Thinking\", \"Searching the web\"). Without it the\n // bubble says only \"Working on the answer…\" for the whole wait, and the progress lives in\n // the step bar far below. Same step the bar shows, so the two never disagree.\n const workingStepLabel = showWorkingIndicator\n ? getCurrentAgentStepPresentation(message.agentSteps ?? [])?.description\n : undefined\n\n // A settled turn can finish with no answer text (the model returned nothing). Say so\n // rather than leave an empty bubble, unless the turn produced a drafted document.\n const showEmptyAnswer =\n !isUser &&\n !isGenerating &&\n !isRunningOnServer &&\n !isFailed &&\n !isStopped &&\n !responseContent.trim() &&\n !linkedArtifact\n\n // A stopped answer with nothing streamed has no body to show.\n const isEmptyStopped = isStopped && !responseContent.trim()\n\n // \"Ask again\" on a stopped answer re-runs its question: the conversation view sends it again\n // (AskAgainContext). Where no view provides that, fall back to the question's own edit action,\n // or, for the first question (it has no edit action), to putting its text in the composer.\n const stoppedQuestion = useMemo(() => {\n if (!isStopped || !messageHistory || !message.parent_message_ext_id) return null\n const parentIndex = messageHistory.findIndex(\n (m) => m.external_id === message.parent_message_ext_id\n )\n const parent = parentIndex >= 0 ? messageHistory[parentIndex] : null\n if (!parent || (parent.role || '').toLowerCase() !== 'user') return null\n return { question: parent, isEditable: parentIndex > 0 }\n }, [isStopped, messageHistory, message.parent_message_ext_id])\n\n const askAgain = useContext(AskAgainContext)\n const askStoppedQuestionAgain = (retry: { question: MessageType; isEditable: boolean }) => {\n if (askAgain) askAgain(retry.question, message)\n else if (retry.isEditable) startEditing(retry.question)\n else session.setDraft(retry.question.content)\n }\n\n // The clean text a fact would carry PLUS its per-claim citations (each cited\n // statement's span + the chunks and quotes backing it), so a fact saved from\n // this answer keeps the chat's click-a-statement → highlight-passage\n // behaviour. The text stays clean — the mapping rides in `citations`. Whether\n // saving makes sense: a finished (not streaming, not failed) answer with real\n // content — never an empty, mid-stream, or citation-only (\"cite-1\") message.\n const factData = useMemo(\n () => buildFactCitations(responseContent, activeCitations, citationData),\n [responseContent, activeCitations, citationData]\n )\n const factText = factData.text\n const canCreateFact = !isUser && !isGenerating && !isFailed && factText.length > 2\n\n // Count the rows the drawer actually renders: raw events collapse (heartbeats,\n // same-index follow-ups) AND sub-agent steps fold under their parent, so both\n // `agentSteps.length` and a merged count would promise rows that aren't there.\n const visibleStepCount = useMemo(\n () => (message.agentSteps ? topLevelAgentSteps(message.agentSteps).length : 0),\n [message.agentSteps]\n )\n\n // The settled turn's elapsed time. The live ticker for the in-flight turn is\n // owned by the docked AgentControlBar (MessageLiveSeconds); Message itself only\n // reads the FINAL value from Zustand (written once when generation ends), so it\n // does not re-render at the 100 ms timer cadence.\n const timerKey = `${message.conversation_ext_id || 'new'}:${message.external_id}`\n const finalElapsedSeconds =\n useArbiSessionState((state) => state.messageTimers[timerKey]?.elapsedTime) ??\n message.agentStepsTotalElapsed ??\n 0\n\n // Reset copy state after delay\n useEffect(() => {\n let timeout: NodeJS.Timeout\n if (isCopied) {\n timeout = setTimeout(() => setIsCopied(false), 2000)\n }\n return () => clearTimeout(timeout)\n }, [isCopied])\n\n // Clear the \"fact created\" confirmation when this component is reused for a\n // different message (React.memo + list virtualization), so a stale green\n // check never appears on a message whose fact was never created.\n useEffect(() => {\n setFactSaved(false)\n }, [message.external_id])\n\n // Steps stay collapsed by default — the user can click the step-count chip to\n // expand. The trace is rich info but noisy for short prompts (e.g. a fresh PA\n // session's bootstrap rituals — IDENTITY.md reads, memory_search — feel like\n // garbage when the user typed a trivial message). Keep the rendered chat\n // clean; let power users opt in.\n\n const { openShare } = environment\n\n const handleCopyLink = () => {\n if (!selectedWorkspaceId || !message.conversation_ext_id || !message.external_id) {\n notify('Unable to copy link', 'error')\n return\n }\n\n const path = buildDeepLinkPath({\n workspaceId: selectedWorkspaceId,\n conversationId: message.conversation_ext_id,\n messageId: message.external_id,\n })\n\n const domain = environment.runtimeConfig.deploymentDomain\n const fullUrl = domain ? `https://${domain}${path}` : `${window.location.origin}${path}`\n\n navigator.clipboard\n .writeText(fullUrl)\n .then(() =>\n notify(\n React.createElement(\n 'span',\n {},\n React.createElement(\n 'a',\n {\n href: fullUrl,\n target: '_blank',\n rel: 'noopener noreferrer',\n className: 'text-blue-text hover:underline',\n onClick: (e: React.MouseEvent) => e.stopPropagation(),\n },\n 'Message link'\n ),\n ' copied to clipboard'\n ),\n 'success',\n { icon: workspaceIcon(20), workspaceId: selectedWorkspaceId }\n )\n )\n .catch(() => notify('Failed to copy link', 'error'))\n }\n\n const handleCopy = async () => {\n try {\n // For assistant messages, find the preceding user message\n let precedingUserMessage: string | undefined\n if (!isUser && message.parent_message_ext_id && messageHistory) {\n const parentMessage = messageHistory.find(\n (m) => m.external_id === message.parent_message_ext_id\n )\n if (parentMessage?.role === 'user') {\n precedingUserMessage = parentMessage.content\n }\n }\n\n await copyMessageToClipboard({\n messageRef,\n responseContent,\n messageContent: message.content,\n isUser,\n selectedWorkspaceId,\n conversationExtId: message.conversation_ext_id,\n messageExtId: message.external_id,\n activeCitations,\n citationData,\n precedingUserMessage,\n deploymentDomain: environment.runtimeConfig.deploymentDomain,\n })\n setIsCopied(true)\n notify('Message copied to clipboard', 'success')\n } catch (err) {\n console.error('Copy error:', err)\n // Ultimate fallback - try plain text\n const plainTextContent = isUser ? message.content : responseContent\n navigator.clipboard\n .writeText(plainTextContent)\n .then(() => {\n setIsCopied(true)\n notify('Message copied to clipboard', 'success')\n })\n .catch((err) => {\n console.error('All copy attempts failed:', err)\n notify('Could not copy message', 'error')\n })\n }\n }\n\n // Turn this assistant answer into a workspace Fact. The stored text is the\n // answer's markdown with citation links flattened to their label (a fact is\n // curated knowledge, not a link back into this thread); the answer's model\n // citations ride along as the fact's sources AND its per-statement claims, so\n // the fact stays as clickable as the answer. The fact is saved in the\n // conversation's workspace (named on the request), whichever one is open. A\n // chronology table saves as one dated fact per row, so the Timeline can place\n // each event.\n const factWorkspaceId = useConversationWorkspace(message.conversation_ext_id)\n const createFact = useCreateFact(factWorkspaceId)\n const createFacts = useCreateFacts(factWorkspaceId)\n const handleCreateFact = async () => {\n if (!canCreateFact || createFact.isPending || createFacts.isPending) return\n if (!factWorkspaceId) {\n notify('Cannot create fact: no workspace open', 'error')\n return\n }\n const chronology = chronologyFactBodies(factText, factData.citations)\n try {\n if (chronology) {\n await createFacts.mutateAsync({ facts: chronology })\n notify(`${chronology.length} facts created from the table`, 'success')\n } else {\n await createFact.mutateAsync({\n text: factText,\n shared: false,\n confirmed: true,\n tag_ext_ids: [],\n citations: factData.citations,\n })\n notify('Fact created from message', 'success')\n }\n setFactSaved(true)\n } catch (err) {\n console.error('Create fact error:', err)\n notify('Could not create fact', 'error')\n }\n }\n\n // Puts a user message back in the composer for editing; sending it branches a new answer.\n const startEditing = (target: MessageType) => {\n session.startEditing(target.external_id || '', target.content)\n\n // The edit runs on the config this message ran with, and the picker shows its model.\n if (messageConfig && 'QueryLLM' in messageConfig) {\n session.setChatModelName(resolveConfigModel(messageConfig))\n if (configId) session.setChatModel(configId)\n }\n }\n const handleEditStart = () => startEditing(message)\n\n const handleDeleteFailedMessage = async () => {\n if (!message.external_id) return\n try {\n await deleteMessage.mutateAsync(message.external_id)\n notify('Failed message deleted', 'success')\n } catch {\n notify('Failed to delete message', 'error')\n }\n }\n\n // Toggle handler removed - citations always show when available\n\n const settledForHeader = !isGenerating || isFailed\n const statusLabel = isFailed\n ? 'Response failed'\n : isStopped\n ? 'Stopped'\n : finalElapsedSeconds >= 0.05\n ? `Answered in ${finalElapsedSeconds.toFixed(1)}s`\n : 'Complete'\n const timeLabel = formatFriendlyDate(message.created_at || '')\n const messageId = message.external_id\n // A meeting thread's transcript lines: runs of one speaker, and each speaker's newest line.\n const assistant = useAssistantCopy()\n const transcriptRuns = useTranscriptRuns()\n const messageRole = isUser ? 'user' : 'assistant'\n\n const menuItems: MessageActionMenuItem[] = [\n ...(isUser\n ? [\n ...(!isTopLevel\n ? [\n {\n id: 'edit',\n label: 'Edit message',\n icon: <Edit3 size={14} />,\n onSelect: handleEditStart,\n testId: `edit-message-button-${messageId}`,\n },\n ]\n : []),\n {\n id: 'copy',\n label: 'Copy message',\n icon: <Copy size={14} />,\n onSelect: handleCopy,\n testId: `copy-message-button-${messageId}`,\n },\n ]\n : []),\n ...(isDeveloper\n ? [\n {\n id: 'details',\n label: 'View details',\n onSelect: () => setShowDetailsModal(true),\n testId: `message-details-button-${messageId}`,\n },\n ]\n : []),\n {\n id: 'copy-link',\n label: 'Copy link',\n icon: <Link size={14} className=\"mr-2\" />,\n onSelect: handleCopyLink,\n testId: `copy-link-button-${messageId}`,\n },\n ...(message.conversation_ext_id && selectedWorkspaceId && openShare\n ? [\n {\n id: 'share',\n label: 'Share via email',\n icon: <Share2 size={14} className=\"mr-2\" />,\n onSelect: () =>\n openShare({\n resourceType: 'conversation',\n resourceExtId: message.conversation_ext_id!,\n workspaceExtId: selectedWorkspaceId,\n isPrivate: !isShared,\n }),\n testId: `share-conversation-button-${messageId}`,\n },\n ]\n : []),\n ...(isFailed\n ? [\n {\n id: 'delete-failed',\n label: 'Delete failed message',\n icon: <Trash2 size={14} className=\"mr-2\" />,\n onSelect: handleDeleteFailedMessage,\n tone: 'danger' as const,\n testId: `delete-message-button-${messageId}`,\n },\n ]\n : []),\n ]\n\n const actions = (\n <>\n {branchControl}\n {isUser ? (\n <MessageActionMenu\n items={menuItems}\n heading={\n <>\n <div>\n {messageAuthorUser\n ? `${messageAuthorUser.given_name} ${messageAuthorUser.family_name ?? ''}`.trim()\n : 'Participant'}\n </div>\n <div className=\"text-xs text-muted-foreground\">{timeLabel}</div>\n </>\n }\n testId={`message-actions-menu-${messageId}`}\n />\n ) : (\n <>\n <MessageActionButton\n onClick={(e) => {\n e.stopPropagation()\n handleCreateFact()\n }}\n disabled={createFact.isPending || !canCreateFact}\n isDone={factSaved}\n title={factSaved ? 'Fact created' : 'Create a fact from this message'}\n aria-label=\"Create a fact from this message\"\n data-testid={`create-fact-button-${messageId}`}\n >\n {factSaved ? <Check size={16} /> : <Milestone size={16} />}\n </MessageActionButton>\n <MessageActionButton\n onClick={(e) => {\n e.stopPropagation()\n handleCopy()\n }}\n isDone={isCopied}\n title={isCopied ? 'Copied!' : 'Copy message with formatting'}\n data-testid={`copy-message-button-${messageId}`}\n >\n {isCopied ? <Check size={16} /> : <Copy size={16} />}\n </MessageActionButton>\n <MessageActionMenu\n items={menuItems}\n heading={\n <>\n <div>{modelDisplayName || assistant.name}</div>\n <div className=\"text-xs text-muted-foreground\">\n {timeLabel} · {statusLabel}\n </div>\n </>\n }\n testId={`message-actions-menu-${messageId}`}\n />\n </>\n )}\n </>\n )\n\n // A stopped answer with no text and no steps has nothing for the footer to carry: its avatar\n // would float alone under the stopped note. Keep the footer when steps exist (Show steps).\n const isBareStopped = isEmptyStopped && visibleStepCount === 0\n\n const footer = settledForHeader && !isBareStopped && (\n <MessageFooter\n role={messageRole}\n align={isOtherPerson ? 'start' : 'end'}\n leading={\n isUser ? (\n // Someone else's author is the pill above their run; only mine is marked here.\n !isOtherPerson && messageAuthorUser && <DocumentUser user={messageAuthorUser} />\n ) : (\n <span\n className=\"inline-flex rounded-full p-1\"\n style={{\n backgroundColor: `color-mix(in srgb, ${assistantTint} 8%, transparent)`,\n color: assistantTint,\n }}\n // The model that wrote the answer: an icon whose tooltip names it.\n data-testid={`message-model-${messageId}`}\n >\n <AssistantEntity\n name={modelDisplayName}\n modelName={modelName}\n tag={modelTag}\n size={20}\n variant=\"icon\"\n />\n </span>\n )\n }\n actions={actions}\n steps={\n !isUser\n ? {\n count: visibleStepCount,\n open: isStepsExpanded,\n onOpenChange: setIsStepsExpanded,\n panel: message.agentSteps ? (\n <AgentSteps\n steps={message.agentSteps}\n isStreaming={false}\n totalElapsedTime={message.agentStepsTotalElapsed ?? undefined}\n className=\"border-b-0\"\n contextUsage={message.finalContextUsage}\n />\n ) : null,\n }\n : undefined\n }\n />\n )\n\n const stoppedNote = isStopped && !isGenerating && (\n <p\n className=\"mt-2 flex flex-wrap items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`message-stopped-${messageId}`}\n >\n <span>\n {isEmptyStopped\n ? 'You stopped this answer before it wrote anything.'\n : 'You stopped this answer.'}\n </span>\n {stoppedQuestion && (\n <button\n type=\"button\"\n onClick={() => askStoppedQuestionAgain(stoppedQuestion)}\n className=\"inline-flex items-center gap-1 underline-offset-2 hover:text-foreground hover:underline\"\n data-testid={`retry-stopped-answer-button-${messageId}`}\n >\n <RotateCcw size={12} aria-hidden=\"true\" />\n Ask again\n </button>\n )}\n </p>\n )\n\n // The server's instruction that starts a workflow step reads as that step, not as raw text.\n const workflowStep = isUser ? workflowStepOf(message.tools ?? message.meta?.tools) : undefined\n if (workflowStep)\n return (\n <WorkflowStepMessage\n messageId={messageId}\n conversationId={message.conversation_ext_id}\n step={workflowStep}\n content={message.content ?? ''}\n />\n )\n\n // A call's transcript line in its meeting thread: a compact attributed line, not a comment.\n const transcriptSegment = isUser\n ? transcriptSegmentOf(message.tools ?? message.meta?.tools)\n : undefined\n if (transcriptSegment) {\n const speaker =\n transcriptSegment.speaker_ext_id === currentUser?.external_id\n ? currentUser\n : workspaceUsers.find((wu) => wu.user.external_id === transcriptSegment.speaker_ext_id)\n ?.user\n const speakerName = speaker ? getUserDisplayName(speaker) : null\n const isMe = transcriptSegment.speaker_ext_id === currentUser?.external_id\n return (\n <TranscriptEntry\n speakerId={transcriptSegment.speaker_ext_id}\n speakerName={isMe ? 'Me' : speakerName || 'Former member'}\n text={stripSpeakerPrefix(message.content ?? '', speakerName)}\n at={transcriptSegment.started_at ?? message.created_at}\n continued={!!messageId && transcriptRuns.continued.has(messageId)}\n />\n )\n }\n\n return (\n <ErrorBoundary testId=\"message-error-boundary\">\n <MessageRoot\n role={messageRole}\n messageId={messageId}\n tone={isFailed ? 'error' : subagentTaskRecord ? 'subagent' : 'default'}\n {...rest}\n >\n <MessageContent\n role={messageRole}\n messageId={messageId}\n align={isOtherPerson ? 'start' : 'end'}\n >\n {startsAuthorRun && messageAuthorUser && (\n <MessageAuthor>\n <DocumentUser user={messageAuthorUser} variant=\"pill\" />\n </MessageAuthor>\n )}\n <MessageBubble\n ref={messageRef}\n role={messageRole}\n messageId={messageId}\n isEditing={isEditing}\n // Other people's messages share ONE surface (the chats' peer bubble: card + hairline),\n // whoever wrote them: a per-person tint at 4% read as beige for one hue and as no\n // bubble at all for another. My own keep their tint; the assistant its own.\n participantTint={\n isFailed || isEmptyStopped || isOtherPerson\n ? undefined\n : isUser\n ? participantTint\n : assistantTint\n }\n className={isOtherPerson ? 'border border-border bg-card' : undefined}\n >\n {!isUser && isGenerating && (\n <MessageByline\n messageId={messageId}\n identity={\n // Stays the ARBI identity while streaming: the model name arrives\n // with the first step that reports one and would swap the author\n // mid-answer. The model is shown in the footer once settled.\n <AssistantEntity size={16} />\n }\n timeLabel={timeLabel}\n isSettled={settledForHeader}\n isFailed={isFailed}\n statusLabel={statusLabel}\n />\n )}\n {/* Marks this as ARBI's own instruction to a delegate, not something the human\n typed (see `subagentTaskRecord`). */}\n {subagentTaskRecord && <MessageSubagentBadge messageId={messageId} />}\n {/* While the turn runs this holds EVERYTHING the model has said. Only SUPERSEDED\n prose dims (a real opacity, not a colour token); the live segment is solid so\n the answer's opacity never changes and nothing un-fades at the end. The single\n commit at `response.completed` swaps in the server's answer and its citations. */}\n <MessageBody messageId={messageId}>\n {settledNarration ? (\n <MessageNarration messageId={messageId}>\n <ConnectedMarkdown isStreaming={false}>{settledNarration}</ConnectedMarkdown>\n </MessageNarration>\n ) : null}\n {liveContent ? (\n role === 'assistant' ? (\n <ConnectedCitationRenderer\n content={liveContent}\n citations={activeCitations || undefined}\n citationData={citationData}\n messageId={message.external_id || 'unknown'}\n isStreaming={isGenerating}\n />\n ) : (\n <ConnectedMarkdown isStreaming={isGenerating}>\n {/* ``/pa `` is internal routing: show the user's actual text. Stored\n @mentions become chips. */}\n {linkMentions(\n isUser && liveContent.startsWith('/pa ') ? liveContent.slice(4) : liveContent,\n message.mentions\n )}\n </ConnectedMarkdown>\n )\n ) : null}\n {showWorkingIndicator && (\n // One line of running text, not a flex row: in a narrow column (the viewer docked\n // beside the chat) flex items each shrank and wrapped on their own, as columns.\n <div>\n <p\n className=\"text-muted-foreground italic\"\n data-testid={`message-thinking-${messageId}`}\n >\n <span className=\"mr-2 inline-block h-2 w-2 animate-pulse rounded-full bg-current align-middle\" />\n Working on the answer…\n {workingStepLabel && (\n <>\n {' '}\n <span\n className=\"not-italic\"\n data-testid={`message-thinking-step-${messageId}`}\n >\n · {workingStepLabel}\n </span>\n </>\n )}\n {/* Total wait stays visible as individual steps change in the control bar.\n Only a turn this client is streaming has a clock to show. */}\n {isGenerating && (\n <>\n {' '}\n <span\n className=\"whitespace-nowrap not-italic\"\n data-testid={`message-thinking-elapsed-${messageId}`}\n >\n ·{' '}\n <MessageLiveSeconds\n conversationId={message.conversation_ext_id}\n messageId={messageId}\n isUser={false}\n isGenerating={isGenerating}\n suffix=\"s elapsed\"\n />\n </span>\n </>\n )}\n </p>\n {isGenerating && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-testid={`message-wait-help-${messageId}`}\n >\n You can stop this answer or choose Ask for status from the menu beside Stop.\n </p>\n )}\n </div>\n )}\n {isQueuedAnswer && !responseContent.trim() && (\n <p\n className=\"flex items-center gap-2 text-muted-foreground\"\n data-testid={`message-queued-${messageId}`}\n >\n <Clock className=\"size-3.5 shrink-0\" aria-hidden />\n Queued\n </p>\n )}\n {isAwaitingAnswer && (\n <p\n className=\"font-medium text-foreground\"\n data-testid={`message-awaiting-answer-${messageId}`}\n >\n Waiting for your answer below\n </p>\n )}\n {showEmptyAnswer && (\n <p\n className=\"text-muted-foreground italic\"\n data-testid={`message-empty-answer-${messageId}`}\n >\n ARBI finished without an answer. Ask again or request changes to retry.\n </p>\n )}\n </MessageBody>\n {/* A follow-up sent mid-answer waits its turn. The bubble stays solid (a faded\n bubble read as lost), so the state is said in words. */}\n {isQueued && (\n <p\n className=\"mt-1 flex items-center gap-1.5 text-xs text-muted-foreground\"\n data-testid={`message-queued-${messageId}`}\n >\n <Clock className=\"size-3 shrink-0\" aria-hidden />\n Queued, ARBI will answer after the current reply\n </p>\n )}\n\n {/* Inline drafted-document affordance */}\n {!isUser && linkedArtifact && (\n <MessageArtifactCard artifact={linkedArtifact} onOpen={handleOpenArtifact} />\n )}\n\n {/* Sub-agent thread links sit OUTSIDE the settled-only footer: a delegated thread\n must be openable whether this turn is streaming or long done. */}\n {!isUser && subagentLinks}\n </MessageBubble>\n {footer}\n {/* Below the footer, not in the bubble, for every stopped answer: the steps popover\n opens upward over the bubble and would hide the note while the trace is open. */}\n {stoppedNote}\n </MessageContent>\n\n <MessageDetailsModal\n open={showDetailsModal}\n onOpenChange={setShowDetailsModal}\n messageExtId={message.external_id || null}\n workspace={\n currentWorkspace\n ? {\n name: currentWorkspace.name,\n icon: workspaceIcon(16),\n }\n : null\n }\n />\n </MessageRoot>\n </ErrorBoundary>\n )\n}\n\n/**\n * Custom comparison for React.memo to prevent unnecessary re-renders during streaming.\n *\n * Most fields are read directly off `prevProps.message` / `nextProps.message`\n * — we deliberately do NOT peek into `messageHistory[index + 1]` for\n * assistant messages, because during streaming every message's\n * `messageHistory` reference changes on every rAF flush and a neighbor-index\n * read would cascade re-renders across the whole list.\n *\n * Exception: a USER message's model-switch indicator is derived from the\n * NEXT message's `config_ext_id` (the assistant response — see the\n * `configId` useMemo at line ~106). For user messages we must re-render\n * when that specific neighbor's config changes, or the indicator stays\n * stale after an assistant completes. Assistant messages still only look\n * at their own config_ext_id, so the cascade stays contained.\n */\nfunction areMessagesEqual(\n prevProps: ConnectedMessageProps,\n nextProps: ConnectedMessageProps\n): boolean {\n if (prevProps.participantTint !== nextProps.participantTint) return false\n // Always re-render if the message content or loading state changed\n if (prevProps.message.content !== nextProps.message.content) return false\n if (prevProps.message.isLoading !== nextProps.message.isLoading) return false\n if (prevProps.message.status !== nextProps.message.status) return false\n if (prevProps.message.external_id !== nextProps.message.external_id) return false\n if (prevProps.message.created_at !== nextProps.message.created_at) return false\n if (prevProps.message.config_ext_id !== nextProps.message.config_ext_id) return false\n if (prevProps.message.mentions !== nextProps.message.mentions) return false\n\n // User messages derive their model indicator from the next (assistant)\n // message's config — catch changes there so the indicator refreshes when\n // the assistant response arrives / switches model.\n if (prevProps.message.role === 'user') {\n const prevNext = prevProps.messageHistory?.[prevProps.index + 1]\n const nextNext = nextProps.messageHistory?.[nextProps.index + 1]\n if (prevNext?.config_ext_id !== nextNext?.config_ext_id) return false\n }\n\n // Re-render if message metadata changed (tools contain citations)\n if (prevProps.message.tools !== nextProps.message.tools) return false\n if (prevProps.message.meta !== nextProps.message.meta) return false\n\n // Re-render if agent steps or pending user input changed\n if (prevProps.message.agentSteps !== nextProps.message.agentSteps) return false\n if (prevProps.message.pendingUserInput !== nextProps.message.pendingUserInput) return false\n\n // Re-render if structural props changed\n if (prevProps.index !== nextProps.index) return false\n\n // branchControl is React node - compare by reference (will be same if parent doesn't re-render)\n if (prevProps.branchControl !== nextProps.branchControl) return false\n if (prevProps.subagentLinks !== nextProps.subagentLinks) return false\n\n return true\n}\n\nexport const ConnectedMessage = React.memo(MessageComponent, areMessagesEqual)\n","/**\n * Conversation Branch Controls binding\n *\n * Maps a conversation `BranchPoint` onto the `BranchControls` block (position label + previous /\n * next arrows) and wires the optional side-by-side threads preview to the store. Renders nothing\n * when the fork has only one branch.\n */\n\nimport React from 'react'\nimport {\n BranchControls as BranchControlsView,\n type BranchControlsLabels,\n} from '../../chat/BranchControls'\nimport type { BranchPoint } from '@arbidocs/react'\nimport { ErrorBoundary } from '../../components/ErrorBoundary'\n\n/**\n * Users see these alternatives as versions of one message (an edit, or \"Ask again\" on a stopped\n * answer), so the copy says so instead of the internal term \"branch\".\n */\nconst VERSION_LABELS: Partial<BranchControlsLabels> = {\n branchOf: (current, total) => `Version ${current} of ${total}`,\n previousBranch: 'Previous version',\n nextBranch: 'Next version',\n}\nconst VERSION_PREVIEW_HINT =\n 'This message has more than one version. Click to compare the answers side by side.'\n\ninterface BranchControlsProps {\n branchPoint: BranchPoint\n /** Switch between branches. */\n switchBranch: (branchPoint: BranchPoint, targetIndex: number) => void\n /** Open the threads preview (the versions side by side). Absent: no preview button. */\n onPreview?: () => void\n}\n\n/** A message's versions (an edit, an \"Ask again\"): which one this is, and the others. */\nexport const ConnectedBranchControls: React.FC<BranchControlsProps> = ({\n branchPoint,\n switchBranch,\n onPreview,\n}) => {\n return (\n <ErrorBoundary testId=\"branch-controls-error-boundary\">\n <BranchControlsView\n index={branchPoint.currentBranchIndex}\n count={branchPoint.branches.length}\n onSwitch={(target) => switchBranch(branchPoint, target)}\n onPreview={onPreview}\n previewHint={VERSION_PREVIEW_HINT}\n labels={VERSION_LABELS}\n />\n </ErrorBoundary>\n )\n}\n","/**\n * ThreadsPreviewModal - Dialog wrapper for ThreadVisualizer\n * Shows thread visualization for the current conversation\n */\n\nimport { Dialog, DialogContent, EntityIcon, getEntityLabel } from '@arbidocs/react/ui'\nimport { ModalBreadcrumbHeader, ModalCrumbs } from '../../settings/ModalBreadcrumbHeader'\nimport { ThreadVisualizer } from '../../chat/ThreadVisualizer'\nimport { Network } from 'lucide-react'\nimport { useArbiSessionState, useConversationData, useConversationItems } from '@arbidocs/react'\nimport { useOpenWorkspaceIcon } from './useOpenWorkspaceIcon'\n\ninterface ConnectedThreadsPreviewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\n/** The open conversation's threads as a map: pick one to show it. */\nexport function ConnectedThreadsPreview(props: ConnectedThreadsPreviewProps) {\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n // Its data hooks only mount while it is open.\n return props.open && currentConversationId ? (\n <ThreadsPreviewDialog {...props} currentConversationId={currentConversationId} />\n ) : null\n}\n\nfunction ThreadsPreviewDialog({\n open,\n onOpenChange,\n currentConversationId,\n}: ConnectedThreadsPreviewProps & { currentConversationId: string }) {\n const { workspace: currentWorkspace, icon: workspaceIcon } = useOpenWorkspaceIcon()\n const { conversations } = useConversationItems()\n const { threads, setParentMessageId } = useConversationData()\n\n const currentConv = conversations?.find((conv) => conv.external_id === currentConversationId)\n const conversationTitle = currentConv?.title\n ? `Re: ${currentConv.title}`\n : `Private ${getEntityLabel('CONVERSATION')}`\n\n // Calculate dynamic width based on thread count\n const modalWidth = Math.min(\n Math.max(400 + (threads?.length || 0) * 200, 600),\n typeof window !== 'undefined' ? window.innerWidth * 0.9 : 800\n )\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onOpenChange(false)}>\n <DialogContent\n presentation=\"sheet\"\n className=\"max-h-panel flex flex-col overflow-hidden p-0\"\n style={{ width: `${modalWidth}px`, maxWidth: '95vw' }}\n >\n <ModalBreadcrumbHeader\n className=\"mb-0 p-6 pb-3 pr-12\"\n icon={<Network className=\"size-5\" />}\n title=\"Threads preview\"\n subtitle={\n <ModalCrumbs\n items={[\n {\n icon: workspaceIcon(16),\n label: currentWorkspace ? currentWorkspace.name : 'Workspace',\n },\n {\n icon: <EntityIcon entityType=\"CONVERSATION\" className=\"size-4\" />,\n label: conversationTitle,\n },\n ]}\n />\n }\n description=\"Visualize conversation threads\"\n />\n\n <div className=\"flex-1 min-h-0\" style={{ height: '70vh' }}>\n {/* The map loads mermaid itself on first render. */}\n <ThreadVisualizer\n threads={threads || []}\n switchToThread={(threadId: string) => {\n onOpenChange(false)\n setParentMessageId(threadId)\n }}\n showHeader={true}\n showDownloadButton={true}\n className=\"h-full\"\n />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Row heights for the virtualised chat thread (MessageList).\n *\n * The list only measures rows it has rendered; every other row counts at an estimated height, and\n * the thread's scroll height (and so the scrollbar's thumb) is the sum. A flat estimate far below a\n * real answer's height (a 2,000px answer counted as 120px) made the thumb jump away from the\n * pointer while it was dragged, and a drag to the top stopped hundreds of pixels short of it.\n * Rows are estimated from their text instead, and once measured their height is remembered across\n * remounts (leaving a thread and coming back) for the rest of the session.\n */\n\nconst MAX_REMEMBERED_ROWS = 4000\nconst rememberedHeights = new Map<string, number>()\n\n/** Remember a row's measured height (by message or activity id). */\nexport function rememberRowHeight(id: string, height: number): void {\n if (!id || !(height > 0)) return\n rememberedHeights.delete(id)\n rememberedHeights.set(id, height)\n if (rememberedHeights.size > MAX_REMEMBERED_ROWS) {\n const oldest = rememberedHeights.keys().next().value\n if (oldest !== undefined) rememberedHeights.delete(oldest)\n }\n}\n\n/** A row's measured height from earlier in the session, if it was ever rendered. */\nexport function rememberedRowHeight(id: string | undefined): number | undefined {\n return id ? rememberedHeights.get(id) : undefined\n}\n\n/** Test helper: forget every remembered height. */\nexport function forgetRowHeights(): void {\n rememberedHeights.clear()\n}\n\n// Rough typography of a chat message body (text-base, leading-relaxed).\nconst LINE_HEIGHT_PX = 26\nconst AVERAGE_CHAR_PX = 8.5\nconst TABLE_ROW_PX = 52\n// Bubble padding, author line and footer (steps bar, actions) around the text.\nconst ASSISTANT_CHROME_PX = 110\nconst USER_CHROME_PX = 72\nconst ACTIVITY_ROW_PX = 48\nconst MIN_ROW_PX = 60\n\n/**\n * Estimated height of a message row whose text is `content`, laid out `width` pixels wide. Close\n * enough (within a few lines) that the scrollbar stays put as rows are measured.\n */\nexport function estimateMessageRowHeight(\n content: string | null | undefined,\n role: string | undefined,\n width: number\n): number {\n const chrome = role === 'user' ? USER_CHROME_PX : ASSISTANT_CHROME_PX\n const text = content ?? ''\n if (!text) return Math.max(MIN_ROW_PX, chrome)\n // A user's bubble is narrower than the column; an answer spans it, less its padding.\n const textWidth = Math.max(160, (role === 'user' ? width * 0.75 : width) - 80)\n const charsPerLine = Math.max(16, Math.floor(textWidth / AVERAGE_CHAR_PX))\n let height = 0\n for (const line of text.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) {\n height += LINE_HEIGHT_PX / 2\n } else if (trimmed.startsWith('|')) {\n // Markdown table row; the separator row (|---|) draws nothing\n if (!/^\\|[\\s:|-]+\\|?$/.test(trimmed)) height += TABLE_ROW_PX\n } else {\n height += Math.ceil(trimmed.length / charsPerLine) * LINE_HEIGHT_PX\n }\n }\n return Math.round(Math.max(MIN_ROW_PX, height + chrome))\n}\n\n/** Estimated height of a thread activity row (\"Alex joined\", \"Assigned to …\"). */\nexport function estimateActivityRowHeight(): number {\n return ACTIVITY_ROW_PX\n}\n","'use client'\n\nimport { flashMessage } from '../../chat/flashMessage'\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useCallback,\n useMemo,\n useState,\n type RefObject,\n} from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { useConnectedThreadActivity } from '../tasks/useConnectedThreadActivity'\nimport { ConnectedMessage as MessageComponent } from './ConnectedMessage'\nimport type { ChatMessage as Message } from '@arbidocs/sdk/browser'\nimport { ConnectedBranchControls } from './ConnectedBranchControls'\nimport { ConnectedThreadsPreview } from './ConnectedThreadsPreview'\nimport { RunningSubagents } from './RunningSubagents'\nimport { findMainSiblingLeaf, sliceToSubagentThread } from '@arbidocs/sdk/browser'\nimport {\n estimateActivityRowHeight,\n estimateMessageRowHeight,\n rememberRowHeight,\n rememberedRowHeight,\n} from '../../chat/messageRowSize'\nimport { MessageList as BlocksMessageList } from '../../chat/MessageList'\nimport { useStreamAnnouncement } from '../../chat/useStreamAnnouncement'\nimport { getParticipantTints } from '../../chat/participant-tints'\nimport { ThreadActivity } from '../../agents/tasks/TaskFlow'\nimport {\n useArbiSessionState,\n useArbiSessionStore,\n useBranchNavigation,\n useConversationData,\n useUserSettings,\n} from '@arbidocs/react'\nimport { stripThinking } from '../../lib/think'\n\nexport interface ConnectedMessageListProps {\n messages: Message[]\n /** Embedded hosts supply their own scroll surface rather than the app dock. */\n scrollElementRef?: RefObject<HTMLDivElement | null>\n}\n\n/** Activity kinds that only echo a message in the thread; shown in the header ribbon instead. */\n// Echoes of messages the transcript already shows (a stopped answer carries its own stopped note).\nconst TRANSCRIPT_HIDDEN_ACTIVITY = new Set([\n 'created',\n 'participant_joined',\n 'assistant_responded',\n 'assistant_stopped',\n])\n\n// Width a row's text is laid out at before the list has rendered (the thread column's width).\nconst DEFAULT_ROW_WIDTH_PX = 736\n/** Tries (every 100 ms) to bring a deep-linked message into the virtualised list: 3 s. */\nconst DEEP_LINK_MOVE_ATTEMPTS = 30\n\n// Measures a rendered row and remembers its height for the rest of the session, so the thread's\n// height (and its scrollbar) is right from the first frame when it is opened again. Module scope so\n// `useVirtualizer`'s options stay stable across renders.\nconst measureMessageElement =\n typeof window !== 'undefined'\n ? (element: Element | null) => {\n const height = element?.getBoundingClientRect().height ?? 0\n const id = element?.getAttribute('data-message-id')\n if (id) rememberRowHeight(id, height)\n return height\n }\n : undefined\n\n/** The thread's scroll surface: re-resolved once the one it had is gone from the page. */\nfunction resolveScrollContainer(current: HTMLElement | null): HTMLElement {\n if (current?.isConnected) return current\n return (\n (document.querySelector('[data-scroll-container]') as HTMLElement | null) ||\n document.documentElement\n )\n}\n\n/**\n * ConnectedMessageList renders the chat thread using @tanstack/react-virtual.\n *\n * Scroll architecture:\n * The scroll container is `[data-scroll-container]` in DockZone — NOT this component.\n * The virtualizer is configured with getScrollElement pointing to that outer container\n * so it integrates with the existing useScrollBehavior hook without modification.\n *\n * Auto-scroll:\n * useScrollBehavior drives auto-scroll by setting container.scrollTop = container.scrollHeight.\n * This continues to work because the virtualizer's total size div occupies the full\n * estimated height inside the scroll container.\n *\n * Deep-link / leaf scroll:\n * useScrollBehavior queries `[data-message-id]` DOM nodes. Those attributes are preserved\n * on each virtual row wrapper, so they work for messages currently in the viewport.\n * Deep links first scroll the virtualizer to the target index, materializing off-screen\n * rows before useScrollBehavior centers and highlights the destination.\n *\n * Streaming:\n * The last message is always included in the virtual items list. The auto-scroll mechanism\n * in useScrollBehavior continuously scrolls to scrollHeight during streaming, which keeps\n * the last item in view and therefore rendered.\n */\nexport function ConnectedMessageList({ messages, scrollElementRef }: ConnectedMessageListProps) {\n const session = useArbiSessionStore()\n const [previewOpen, setPreviewOpen] = useState(false)\n const participantTints = useMemo(\n () =>\n getParticipantTints(\n messages.map((message) =>\n message.role === 'assistant' ? '' : (message.created_by_ext_id ?? '')\n )\n ),\n [messages]\n )\n const { parentMessageId, setParentMessageId, threads } = useConversationData()\n const { data: userSettings } = useUserSettings()\n const showThreadVisualization = userSettings?.show_thread_visualization ?? false\n\n const { getBranchControlForMessage, switchBranch } = useBranchNavigation(\n threads,\n parentMessageId,\n messages,\n setParentMessageId\n )\n\n // A sub-agent's branch is deliberately excluded from useBranchNavigation\n // (see its own docs) — it's a delegation, not a reply variant, so there is\n // no \"previous branch\" arrow back to the conversation it was spawned from.\n // This is the one way back once RunningSubagents has opened one.\n const mainSiblingLeaf = findMainSiblingLeaf(threads ?? [], messages)\n\n // A sub-agent's own thread renders as its own small transcript — the\n // instruction handed to it and its reply — not the full shared history\n // leading up to it. The human's real earlier messages aren't part of this\n // delegation; `mainSiblingLeaf` above is how you get back to them. `messages`\n // (unsliced) is still what feeds branch navigation and gets passed down as\n // `messageHistory`, so ancestor-relative lookups elsewhere keep working.\n const displayMessages = sliceToSubagentThread(messages)\n\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n const isGenerating =\n useArbiSessionState((state) => state.generating[currentConversationId || '']?.isGenerating) ??\n false\n\n // A turn is live while generation runs and the thread's last message is still loading, the same\n // signal the scroll hook follows (see the list tail below).\n const isLiveTurn = isGenerating && messages[messages.length - 1]?.isLoading === true\n\n // Screen readers: say \"responding\" once and read the finished answer once, never the tokens.\n const lastMessage = displayMessages[displayMessages.length - 1]\n const statusMessage = useStreamAnnouncement({\n isStreaming: isGenerating,\n text: lastMessage?.role === 'assistant' ? stripThinking(lastMessage.content ?? '') : '',\n resetKey: currentConversationId,\n })\n\n // Ref to the scroll container ([data-scroll-container] in DockZone).\n // We look it up on mount and pass it to the virtualizer.\n const scrollContainerRef = useRef<HTMLElement | null>(null)\n\n const getScrollContainer = useCallback((): HTMLElement => {\n scrollContainerRef.current =\n scrollElementRef?.current ?? resolveScrollContainer(scrollContainerRef.current)\n return scrollContainerRef.current\n }, [scrollElementRef])\n\n // Re-resolve on mount so SSR/test environments can also supply the element.\n useEffect(() => {\n scrollContainerRef.current = scrollElementRef?.current ?? resolveScrollContainer(null)\n }, [scrollElementRef])\n\n const { items: activityItems } = useConnectedThreadActivity(currentConversationId)\n const transcript = [\n ...displayMessages.map((message, index) => ({\n type: 'message' as const,\n message,\n index,\n id: message.external_id,\n createdAt: message.created_at,\n })),\n // \"Started thread\", \"Followed Up\" and \"Answered\" only echo the message right beside them; they\n // live in the header ribbon (each entry links to its message), not in the transcript.\n ...activityItems\n .filter((item) => item.label !== 'Posted' && !TRANSCRIPT_HIDDEN_ACTIVITY.has(item.kind))\n .map((item) => ({\n type: 'activity' as const,\n item,\n id: item.id,\n createdAt: item.createdAt,\n })),\n ].sort((a, b) => Date.parse(a.createdAt ?? '') - Date.parse(b.createdAt ?? ''))\n\n // Key measurements by transcript item, not by row position. A follow-up inserted above a\n // streaming answer shifts that answer's index; keyed by index, the virtualizer would drop the\n // answer's ResizeObserver and its height would freeze at the first paint, overlapping the rows\n // below it until a reload.\n const getTranscriptItemKey = useCallback(\n (index: number) => transcript[index]?.id ?? index,\n [transcript]\n )\n\n // A row not rendered yet counts at the height it had when last seen, else at an estimate from\n // its text: far closer than a flat guess, so the scrollbar holds still as rows are measured.\n const estimateTranscriptItemSize = useCallback(\n (index: number) => {\n const entry = transcript[index]\n if (!entry) return estimateActivityRowHeight()\n const remembered = rememberedRowHeight(entry.id)\n if (remembered !== undefined) return remembered\n if (entry.type === 'activity') return estimateActivityRowHeight()\n const width =\n document.querySelector<HTMLElement>('[data-slot=\"message-list-rows\"]')?.clientWidth ||\n DEFAULT_ROW_WIDTH_PX\n return estimateMessageRowHeight(entry.message.content, entry.message.role, width)\n },\n [transcript]\n )\n\n const rowVirtualizer = useVirtualizer({\n count: transcript.length,\n getScrollElement: getScrollContainer,\n estimateSize: estimateTranscriptItemSize,\n getItemKey: getTranscriptItemKey,\n overscan: 5,\n // measureElement lets the virtualizer measure actual rendered heights\n // after render. Both callbacks are module-scope refs for stability.\n measureElement: measureMessageElement,\n })\n\n const deepLinkMessageId = useArbiSessionState((state) => state.deepLinkMessageId)\n // Materialize an off-screen destination before useScrollBehavior centers and highlights it.\n // Without this, the destination of a ribbon click may not exist in the virtualized DOM.\n // A move made before the scroll container is laid out does nothing, so move again until the\n // destination is rendered (or give up after a few seconds).\n const positionedDeepLink = useRef<string | null>(null)\n useEffect(() => {\n if (!deepLinkMessageId) {\n positionedDeepLink.current = null\n return\n }\n if (positionedDeepLink.current === deepLinkMessageId) return\n const index = transcript.findIndex((entry) => entry.id === deepLinkMessageId)\n if (index < 0) return\n positionedDeepLink.current = deepLinkMessageId\n let attempts = 0\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n const move = () => {\n if (document.querySelector(`[data-message-id=\"${deepLinkMessageId}\"]`)) return\n rowVirtualizer.scrollToIndex(index, { align: 'center', behavior: 'auto' })\n if (++attempts < DEEP_LINK_MOVE_ATTEMPTS) timeoutId = setTimeout(move, 100)\n }\n move()\n return () => {\n clearTimeout(timeoutId)\n positionedDeepLink.current = null\n }\n }, [deepLinkMessageId, transcript, rowVirtualizer])\n\n const virtualItems = rowVirtualizer.getVirtualItems()\n useLayoutEffect(() => {\n if (!deepLinkMessageId || !deepLinkMessageId.startsWith('ntf-')) return\n const target = document.querySelector(`[data-message-id=\"${deepLinkMessageId}\"]`)\n if (!target) return\n target.scrollIntoView({ behavior: 'smooth', block: 'center' })\n flashMessage(target)\n session.setDeepLinkMessageId(null)\n }, [deepLinkMessageId, virtualItems, session])\n\n // The live region outlives the empty -> first-message switch so the first reply is announced too.\n const status = <BlocksMessageList.Status message={statusMessage} />\n if (transcript.length === 0) {\n return (\n <>\n {status}\n <BlocksMessageList.Empty />\n </>\n )\n }\n\n return (\n <>\n {status}\n <BlocksMessageList.Root isBusy={isGenerating}>\n {/* Viewing a sub-agent's branch has no \"previous branch\" arrow (see useBranchNavigation):\n this is the way back to the conversation it was delegated from. */}\n {mainSiblingLeaf && (\n <BlocksMessageList.Banner onBack={() => setParentMessageId(mainSiblingLeaf)} />\n )}\n <BlocksMessageList.Rows totalSize={rowVirtualizer.getTotalSize()}>\n {virtualItems.map((virtualItem) => {\n const entry = transcript[virtualItem.index]\n if (entry.type === 'activity') {\n return (\n <BlocksMessageList.Row\n key={entry.id}\n ref={rowVirtualizer.measureElement}\n index={virtualItem.index}\n start={virtualItem.start}\n messageId={entry.id}\n setSize={transcript.length}\n >\n {/* A thread call's log card replaces the plain activity line. */}\n {entry.item.card ?? (\n <ThreadActivity item={entry.item}>\n {entry.item.onOpenDocument && (\n <button\n className=\"mt-1 hover:underline text-primary\"\n onClick={entry.item.onOpenDocument}\n >\n {entry.item.docTitle}\n </button>\n )}\n </ThreadActivity>\n )}\n </BlocksMessageList.Row>\n )\n }\n const message = entry.message\n const messageId = message.external_id\n const branchPoint = messageId ? getBranchControlForMessage(messageId) : null\n\n // Key by external_id when available so React reuses DOM across reorder / prepend;\n // fall back to index for optimistic sends that have no id yet.\n return (\n <BlocksMessageList.Row\n key={message.external_id ?? `msg-${virtualItem.index}`}\n ref={rowVirtualizer.measureElement}\n index={virtualItem.index}\n start={virtualItem.start}\n messageId={message.external_id}\n setSize={transcript.length}\n >\n <MessageComponent\n message={message}\n index={entry.index}\n messageHistory={messages}\n participantTint={participantTints.get(\n message.role === 'assistant'\n ? 'assistant:arbi'\n : (message.created_by_ext_id ?? '')\n )}\n branchControl={\n branchPoint ? (\n <ConnectedBranchControls\n branchPoint={branchPoint}\n switchBranch={switchBranch}\n onPreview={\n showThreadVisualization && currentConversationId\n ? () => setPreviewOpen(true)\n : undefined\n }\n />\n ) : undefined\n }\n subagentLinks={\n message.role === 'assistant' ? (\n <RunningSubagents steps={message.agentSteps ?? []} />\n ) : undefined\n }\n />\n </BlocksMessageList.Row>\n )\n })}\n </BlocksMessageList.Rows>\n {/* The library tail is ~8rem tall, sized for a footer inside the list. While a turn\n runs, its live bar is docked right below the list, so the full tail would open a\n gap between the answer and its own steps. The full tail returns in the same render\n the turn settles (its message stops loading), so the scroll hook's end-of-stream\n settle to the bottom already sees it and the view is not left short of the end. */}\n {isLiveTurn ? <div className=\"h-4\" aria-hidden=\"true\" /> : <BlocksMessageList.Tail />}\n </BlocksMessageList.Root>\n <ConnectedThreadsPreview open={previewOpen} onOpenChange={setPreviewOpen} />\n </>\n )\n}\n","'use client'\n\nimport { forwardRef, memo, type RefObject } from 'react'\nimport { ConnectedMessageList as MessageList } from './ConnectedMessageList'\nimport type { ChatMessage as Message } from '@arbidocs/sdk/browser'\n\ninterface MessageAreaProps {\n messages: Message[]\n scrollElementRef?: RefObject<HTMLDivElement | null>\n}\n\n// NOTE: do NOT add `overflow-y-auto` to the wrapper. The actual scroll surface\n// is `[data-scroll-container]` in DockZone, which is what MessageList's\n// virtualizer is wired to. A second overflow container nested inside the first\n// creates an inner scrollbar that toggles on/off as streaming content grows\n// past the viewport — visible as a screen-wide flicker.\nconst MessageAreaComponent = forwardRef<HTMLDivElement, MessageAreaProps>(\n ({ messages, scrollElementRef }, ref) => {\n return (\n <div ref={ref} className=\"flex w-full flex-1 flex-col pt-4\" data-testid=\"message-area\">\n {/* Auto margin consumes only spare height: short threads sit beside the\n composer, while long threads keep their natural top-to-bottom flow. */}\n <div className=\"mt-auto w-full\" data-testid=\"message-list-bottom-anchor\">\n <MessageList messages={messages} scrollElementRef={scrollElementRef} />\n </div>\n </div>\n )\n }\n)\n\nMessageAreaComponent.displayName = 'ConnectedMessageArea'\n\n// Memoize to prevent re-renders when parent re-renders due to newMessage changes\n// Only re-render if messages actually change (not the callback)\nexport const ConnectedMessageArea = memo(MessageAreaComponent, (prevProps, nextProps) => {\n // Only re-render if messages change\n return (\n prevProps.messages === nextProps.messages &&\n prevProps.scrollElementRef === nextProps.scrollElementRef\n )\n})\n","/**\n * ConnectedCompactConversation: the open conversation in a narrow panel (an add-in's task pane, an\n * embedded panel): its messages and a composer with Send and Stop. The same engine as the full\n * conversation (`useConversationTurn`): streaming, caching, branching, stop and retry.\n */\n\nimport { Button } from '@arbidocs/react/ui'\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { ArrowDown, MessageSquare, Send, Square } from 'lucide-react'\nimport {\n selectDraft,\n useArbiSessionState,\n useArbiSessionStore,\n useAutoSendDraft,\n useConversationData,\n useConversationTurn,\n} from '@arbidocs/react'\nimport { useAssistantCopy } from '@arbidocs/react/shell'\nimport { CompactChatContext } from '../../chat/CompactChatContext'\nimport { EmptyState } from '../../components/EmptyState'\nimport { ComposerContainer } from '../../chat/Composer'\nimport { ConnectedMessageArea as MessageArea } from './ConnectedMessageArea'\nimport { ConnectedModelSelector } from '../config/ConnectedModelSelector'\nimport { ConversationComposer } from './ConversationComposer'\nimport { useSlashSkillWorkflows } from '../workflows/useSlashSkillWorkflows'\n\nexport function ConnectedCompactConversation({ attachments }: { attachments?: ReactNode } = {}) {\n const containerRef = useRef<HTMLDivElement>(null)\n const scrollRef = useRef<HTMLDivElement>(null)\n const following = useRef(true)\n const [showLatest, setShowLatest] = useState(false)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { selectedWorkspaceId, parentMessageId, messageHistory } = useConversationData()\n\n const {\n isGenerating,\n handleSendMessage: sendDraft,\n handleAbortGeneration,\n } = useConversationTurn({\n selectedWorkspaceId,\n parentMessageId,\n })\n\n // The slash menu's skills run in this conversation, as in the full chat: the launch sets the\n // draft and asks for it to be sent (`autoSendDraft`), and a typed `/skill text` opens the form\n // instead of being sent.\n const session = useArbiSessionStore()\n const slashWorkflows = useSlashSkillWorkflows({ landing: 'current-chat' })\n useAutoSendDraft(sendDraft)\n const skills = useMemo(() => ({ openFor: slashWorkflows.openFor }), [slashWorkflows.openFor])\n const handleSendMessage = () => {\n if (slashWorkflows.openForDraft(selectDraft(session.getState()))) {\n session.setDraft('')\n return\n }\n void sendDraft()\n }\n\n const assistant = useAssistantCopy()\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n\n useEffect(() => {\n following.current = true\n setShowLatest(false)\n }, [currentConversationId])\n\n useEffect(() => {\n const viewport = scrollRef.current\n const content = containerRef.current\n if (!viewport || !content) return\n const follow = () => {\n if (following.current) viewport.scrollTop = viewport.scrollHeight\n }\n follow()\n const observer = new ResizeObserver(follow)\n observer.observe(content)\n observer.observe(viewport)\n return () => observer.disconnect()\n }, [messageHistory.length > 0, currentConversationId])\n\n return (\n <CompactChatContext.Provider value>\n <div className=\"flex flex-col flex-1 min-h-0\" data-arbi-compact data-testid=\"embedded-chat\">\n {slashWorkflows.launcher}\n {/* Message area */}\n <div className=\"relative flex flex-col flex-1 min-h-0 overflow-hidden bg-muted/25\">\n <div\n ref={scrollRef}\n className=\"flex-1 min-h-0 overflow-y-auto overscroll-contain scrollbar-themed px-4\"\n tabIndex={0}\n aria-label=\"Conversation messages\"\n data-testid=\"embedded-transcript\"\n onWheel={(event) => {\n if (event.deltaY < 0) following.current = false\n }}\n onTouchMove={() => {\n following.current = false\n }}\n onKeyDown={(event) => {\n if (\n ['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' '].includes(\n event.key\n )\n )\n following.current = false\n }}\n onPointerDown={(event) => {\n // A scrollbar drag is user input; ordinary scroll events also come from row\n // measurement and layout changes, so they must never cancel following on their own.\n const viewport = event.currentTarget\n if (\n event.target === viewport &&\n event.clientX >= viewport.getBoundingClientRect().right - 20\n ) {\n following.current = false\n }\n }}\n onScroll={(event) => {\n const node = event.currentTarget\n const atBottom = node.scrollHeight - node.clientHeight - node.scrollTop <= 1\n if (!following.current) {\n following.current = atBottom\n setShowLatest(!atBottom)\n }\n }}\n >\n {messageHistory.length > 0 ? (\n <MessageArea\n ref={containerRef}\n messages={messageHistory}\n scrollElementRef={scrollRef}\n />\n ) : (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n icon={MessageSquare}\n title={currentConversationId ? 'Opening your conversation' : 'How can I help?'}\n description={currentConversationId ? 'Loading messages...' : undefined}\n className=\"w-full bg-transparent px-4 py-8\"\n />\n </div>\n )}\n </div>\n </div>\n\n {/* Input area */}\n <div className=\"shrink-0 w-full border-t border-border bg-background px-3 py-2 z-10\">\n <ComposerContainer>\n <ConversationComposer\n handleSendMessage={handleSendMessage}\n isGenerating={isGenerating}\n inputRef={inputRef}\n placeholder={assistant.askPlaceholder}\n shouldOfferFollowUp={false}\n compact\n skills={skills}\n leftButton={\n <>\n {attachments}\n {showLatest && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 shrink-0\"\n aria-label=\"Latest message\"\n title=\"Latest message\"\n onClick={() => {\n following.current = true\n const viewport = scrollRef.current\n if (viewport) viewport.scrollTop = viewport.scrollHeight\n setShowLatest(false)\n }}\n >\n <ArrowDown className=\"size-4\" />\n </Button>\n )}\n </>\n }\n modelSelector={\n <ConnectedModelSelector\n variant=\"compact\"\n className=\"h-8 max-w-32 border-0 px-2 text-xs\"\n />\n }\n rightButton={\n isGenerating ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"destructive\"\n className=\"h-8 w-8 flex-shrink-0\"\n aria-label=\"Stop generating\"\n onClick={handleAbortGeneration}\n data-testid=\"embedded-stop-button\"\n >\n <Square className=\"h-3.5 w-3.5 animate-pulse\" fill=\"currentColor\" />\n </Button>\n ) : (\n <CompactSendButton onClick={handleSendMessage} />\n )\n }\n />\n </ComposerContainer>\n </div>\n </div>\n </CompactChatContext.Provider>\n )\n}\n\n/** The send button reads the draft itself, so typing does not re-render the conversation. */\nfunction CompactSendButton({ onClick }: { onClick: () => void }) {\n const draftMessage = useArbiSessionState(selectDraft)\n\n return (\n <Button\n type=\"button\"\n size=\"icon\"\n className=\"h-8 w-8 flex-shrink-0\"\n aria-label=\"Send message\"\n disabled={draftMessage === ''}\n onClick={onClick}\n data-testid=\"embedded-send-button\"\n >\n <Send className=\"h-3.5 w-3.5\" />\n </Button>\n )\n}\n","/**\n * ConnectedConversationDocumentPicker: which of the workspace's documents the open conversation\n * reads, as a scrollable checkbox list (an embedded panel's). It writes the session's conversation\n * documents, so the next turn sends them.\n */\n\nimport {\n Button,\n Checkbox,\n Popover,\n PopoverContent,\n PopoverTrigger,\n getDocumentTitle,\n} from '@arbidocs/react/ui'\nimport { Paperclip, Upload, Search, X, FileText, Eye } from 'lucide-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport {\n useArbiSessionState,\n useArbiSessionStore,\n useDocuments,\n useUploadDocuments,\n useWorkspaceRole,\n} from '@arbidocs/react'\n\nconst EMPTY_DOCS: Array<{ docId: string; isPinned: boolean }> = []\n\nexport interface ConnectedConversationDocumentPickerProps {\n /** The ids now selected, after each change (a host keeps them for its own commands, say). */\n onSelectionChange?: (docIds: string[]) => void\n}\n\nexport function ConnectedConversationDocumentPicker({\n onSelectionChange,\n}: ConnectedConversationDocumentPickerProps) {\n const session = useArbiSessionStore()\n const { openDocument } = useBlocksEnvironment()\n const upload = useUploadDocuments()\n const role = useWorkspaceRole()\n const canUpload = role !== null && role !== 'guest'\n const inputRef = useRef<HTMLInputElement>(null)\n const [expanded, setExpanded] = useState(false)\n const [uploadError, setUploadError] = useState<string | null>(null)\n const [uploadNotice, setUploadNotice] = useState<string | null>(null)\n const [search, setSearch] = useState('')\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n const convKey = currentConversationId || 'new'\n const inConversationDocuments = useArbiSessionState(\n (state) => state.conversationDocuments[convKey] || EMPTY_DOCS\n )\n\n const { data: documentsData, isLoading, error: documentsError } = useDocuments()\n const documents = documentsData || []\n const visible = documents.filter((doc) =>\n getDocumentTitle(doc, 'Untitled').toLowerCase().includes(search.toLowerCase())\n )\n useEffect(() => {\n setExpanded(false)\n setUploadNotice(null)\n setUploadError(null)\n setSearch('')\n }, [currentConversationId])\n\n const selectedDocIds = inConversationDocuments.map((d) => d.docId)\n\n const handleToggle = (docId: string) => {\n const selected = selectedDocIds.includes(docId)\n session.setConversationDocuments(\n convKey,\n selected\n ? inConversationDocuments.filter((d) => d.docId !== docId)\n : [...inConversationDocuments, { docId, isPinned: false }]\n )\n onSelectionChange?.(\n selected ? selectedDocIds.filter((id) => id !== docId) : [...selectedDocIds, docId]\n )\n }\n\n async function addFiles(files: File[]) {\n if (!canUpload) return\n setExpanded(false)\n setUploadError(null)\n setUploadNotice(null)\n const original = session.getState()\n const workspaceId = original.workspaceId\n const key = original.conversationId || 'new'\n try {\n const result = await upload.mutateAsync({ files })\n const ids = result.doc_ext_ids ?? []\n // Read the current selection after the upload; the reader may have changed it meanwhile.\n const current = session.getState()\n if (current.workspaceId !== workspaceId || (current.conversationId || 'new') !== key) return\n const selected = current.conversationDocuments[key] || EMPTY_DOCS\n const merged = [\n ...selected,\n ...ids\n .filter((id) => !selected.some((d) => d.docId === id))\n .map((docId) => ({ docId, isPinned: false })),\n ]\n session.setConversationDocuments(key, merged)\n onSelectionChange?.(merged.map((d) => d.docId))\n setUploadNotice(\n ids.length\n ? `${ids.length} file${ids.length === 1 ? '' : 's'} added to this chat.`\n : 'No new files added. Files may already exist in this workspace.'\n )\n } catch (error) {\n setExpanded(true)\n setUploadError(error instanceof Error ? error.message : 'Could not upload files. Try again.')\n }\n }\n\n return (\n <div className=\"flex min-w-0 items-center\" data-testid=\"embedded-document-selector\">\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Upload files\"\n onChange={(event) => {\n const files = Array.from(event.target.files ?? [])\n event.target.value = ''\n if (files.length) void addFiles(files)\n }}\n />\n <Popover open={expanded} onOpenChange={setExpanded}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2 text-xs\"\n aria-label={`Documents${selectedDocIds.length ? ` (${selectedDocIds.length} selected)` : ''}`}\n >\n <Paperclip className=\"size-4\" />\n {upload.isPending ? 'Uploading…' : 'Docs'}\n {selectedDocIds.length > 0 && (\n <span className=\"rounded bg-primary/10 px-1 text-primary\">\n {selectedDocIds.length}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={10}\n collisionPadding={12}\n className=\"w-[min(22rem,calc(100vw-1.5rem))] overflow-hidden p-0\"\n aria-label=\"Conversation documents\"\n >\n <div className=\"flex items-center justify-between gap-2 border-b border-border p-3\">\n <span className=\"text-sm font-semibold\">Documents</span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={upload.isPending || !canUpload}\n title={\n !canUpload ? 'You do not have permission to upload to this workspace.' : undefined\n }\n onClick={() => inputRef.current?.click()}\n >\n <Upload className=\"size-3.5\" /> Upload files\n </Button>\n </div>\n <label className=\"m-2 flex items-center gap-2 rounded-md border border-input px-2\">\n <Search className=\"size-3.5 text-muted-foreground\" />\n <input\n aria-label=\"Find documents\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder=\"Find a document…\"\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none\"\n />\n </label>\n {uploadError && (\n <p role=\"alert\" className=\"px-3 pb-2 text-sm text-destructive\">\n {uploadError}\n </p>\n )}\n <div\n className=\"max-h-[min(45dvh,16rem)] overflow-y-auto px-2 pb-2\"\n data-testid=\"embedded-documents-list\"\n >\n {isLoading ? (\n <p className=\"p-2 text-sm text-muted-foreground\">Loading files…</p>\n ) : documentsError ? (\n <p role=\"alert\" className=\"p-2 text-sm text-destructive\">\n Could not load workspace files.\n </p>\n ) : visible.length === 0 ? (\n <p className=\"p-2 text-sm text-muted-foreground\">\n {search ? 'No matching documents.' : 'No files yet. Upload a file to get started.'}\n </p>\n ) : (\n visible.map((doc) => {\n const docId = doc.external_id\n const selected = selectedDocIds.includes(docId)\n const title = getDocumentTitle(doc, 'Untitled')\n return (\n <div\n key={docId}\n className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-2 hover:bg-muted\"\n data-testid={`embedded-document-${docId}`}\n >\n <Checkbox\n id={`embedded-doc-${docId}`}\n aria-label={title}\n checked={selected}\n onCheckedChange={() => handleToggle(docId)}\n />\n <FileText className=\"size-4 shrink-0 text-muted-foreground\" />\n <label htmlFor={`embedded-doc-${docId}`} className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\" title={doc.file_name || title}>\n {title}\n </span>\n <span className=\"block text-xs text-muted-foreground\">\n {doc.file_type?.toUpperCase() ||\n doc.file_name?.split('.').pop()?.toUpperCase()}\n {doc.status && ` · ${doc.status}`}\n </span>\n </label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0\"\n aria-label={`View ${title}`}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n setExpanded(false)\n openDocument(docId)\n }}\n >\n <Eye className=\"size-4\" />\n </Button>\n </div>\n )\n })\n )}\n </div>\n {selectedDocIds.length > 0 && (\n <div className=\"flex items-center justify-between border-t border-border px-3 py-2 text-xs text-muted-foreground\">\n <span>{selectedDocIds.length} selected</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs\"\n onClick={() => {\n session.setConversationDocuments(convKey, [])\n onSelectionChange?.([])\n }}\n >\n <X className=\"size-3\" /> Clear\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n {uploadNotice && (\n <span className=\"sr-only\" role=\"status\">\n {uploadNotice}\n </span>\n )}\n </div>\n )\n}\n","/**\n * Forgot password: sign in with the recovery key (a saved file, or the recovery link's key), then\n * set a new password. The `AccountRecoveryDialog` block over the host's `Arbi`.\n *\n * Both kinds of recovery key work: the plain one (64 bytes) directly, and an SSO account's (104\n * bytes, sealed to the SSO account), which opens once the user is signed in at the provider.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport { RECOVERY_KEY_ERRORS, decryptRecoveryKey, validateRecoveryKeyFile } from '@arbidocs/client'\nimport { AccountRecoveryDialog } from '../../auth/RecoveryDialogs'\nimport { parseAuthError } from '../../auth/auth-error'\nimport { useAuthPages, useSsoSignIn } from './support'\n\n/** sessionStorage: a recovery in progress, kept across the SSO provider's sign-in. */\nexport const PENDING_RECOVERY_KEY = 'arbi_pending_recovery'\n\nexport interface ConnectedForgotPasswordProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Signed in with the recovery key: set a new password next. */\n onRecovered: () => void\n /** The email, when the recovery link carried it. */\n initialEmail?: string\n /** The key from the recovery link (skips the file picker). */\n initialRecoveryKey?: Uint8Array\n /** Whether that key is an SSO account's (sealed to the SSO account). */\n initialIsKeyEncrypted?: boolean\n}\n\nexport function ConnectedForgotPassword({\n open,\n onOpenChange,\n onRecovered,\n initialEmail,\n initialRecoveryKey,\n initialIsKeyEncrypted = false,\n}: ConnectedForgotPasswordProps) {\n const arbi = useArbi()\n const sso = useSsoSignIn()\n const { onRecovered: onSiteRecovered } = useAuthPages()\n const [showSsoPrompt, setShowSsoPrompt] = useState(false)\n const [email, setEmail] = useState(initialEmail ?? '')\n const [recoveryKey, setRecoveryKey] = useState<Uint8Array | null>(initialRecoveryKey ?? null)\n const [isKeyEncrypted, setIsKeyEncrypted] = useState(initialIsKeyEncrypted)\n const [fileName, setFileName] = useState<string | null>(\n initialRecoveryKey ? 'recovery link' : null\n )\n const [error, setError] = useState<string | null>(null)\n const [isProcessing, setIsProcessing] = useState(false)\n\n // Take the prefill whenever the dialog opens: the initial state above is read once, and the\n // recovery link may open the dialog after it mounted empty.\n useEffect(() => {\n if (!open) return\n if (initialEmail !== undefined) setEmail(initialEmail)\n if (initialRecoveryKey !== undefined) {\n setRecoveryKey(initialRecoveryKey)\n setIsKeyEncrypted(initialIsKeyEncrypted)\n setFileName('recovery link')\n }\n }, [open, initialEmail, initialRecoveryKey, initialIsKeyEncrypted])\n\n const processFile = useCallback(\n async (file: File) => {\n setError(null)\n setIsKeyEncrypted(false)\n\n const result = await validateRecoveryKeyFile(file)\n if (!result.valid || !result.data) {\n setError(result.error || RECOVERY_KEY_ERRORS.INVALID_SIZE)\n setRecoveryKey(null)\n setFileName(null)\n return\n }\n if (result.isEncrypted) {\n // An SSO account's key opens with the SSO account: sign in there first.\n if (!sso.user?.sub) {\n setError(RECOVERY_KEY_ERRORS.ENCRYPTED_KEY_REQUIRES_SSO)\n setRecoveryKey(null)\n setFileName(null)\n return\n }\n setIsKeyEncrypted(true)\n }\n setRecoveryKey(result.data)\n setFileName(file.name)\n },\n [sso.user?.sub]\n )\n\n const handleClose = () => {\n setEmail('')\n setRecoveryKey(null)\n setIsKeyEncrypted(false)\n setFileName(null)\n setError(null)\n onOpenChange(false)\n }\n\n const handleRecover = async () => {\n setError(null)\n if (!email) {\n setError('Please enter your email address')\n return\n }\n if (!recoveryKey) {\n setError('Please upload your recovery key file')\n return\n }\n\n setIsProcessing(true)\n setShowSsoPrompt(false)\n try {\n let signingPrivateKey = recoveryKey\n if (isKeyEncrypted) {\n if (!sso.user?.sub) {\n setError(RECOVERY_KEY_ERRORS.ENCRYPTED_KEY_REQUIRES_SSO)\n return\n }\n try {\n signingPrivateKey = await decryptRecoveryKey(recoveryKey, sso.user?.sub)\n } catch {\n setError(RECOVERY_KEY_ERRORS.DECRYPTION_FAILED)\n return\n }\n }\n\n // Best-effort: with an SSO session at hand, send its token. The server needs it for an\n // SSO-linked account; for a purely local one it changes nothing. Without one, an SSO-linked\n // account is refused below and the SSO prompt shows.\n const ssoToken = (await sso.getToken().catch(() => null)) ?? undefined\n await arbi.loginWithKey(email, signingPrivateKey, { ssoToken })\n\n handleClose()\n onSiteRecovered?.()\n onRecovered()\n } catch (err) {\n console.error('Recovery login error:', err)\n const detail =\n typeof err === 'object' && err !== null && 'detail' in err\n ? String((err as { detail: unknown }).detail)\n : ''\n if (/requires SSO login|SSO/i.test(detail)) {\n setShowSsoPrompt(true)\n setError(null)\n } else {\n setError(\n parseAuthError(err, {\n messageMap: { 'Incorrect username or password': RECOVERY_KEY_ERRORS.AUTH_FAILED },\n defaultMessage:\n 'Failed to authenticate with recovery key. Please check your email and try again.',\n })\n )\n }\n } finally {\n setIsProcessing(false)\n }\n }\n\n // Keep the recovery, then sign in at the provider. Back on the sign-in page, the recovery\n // resumes from what was kept, so the user does not click the recovery link again.\n const handleSsoSignInForRecovery = async () => {\n try {\n sessionStorage.setItem(\n PENDING_RECOVERY_KEY,\n JSON.stringify({\n email,\n keyB64: btoa(String.fromCharCode(...(recoveryKey ?? new Uint8Array()))),\n isEncrypted: isKeyEncrypted,\n })\n )\n } catch {\n // Best effort: without storage the user clicks the recovery link again.\n }\n await sso.signIn({ returnTo: '/recover' })\n }\n\n return (\n <AccountRecoveryDialog\n open={open}\n onClose={handleClose}\n email={email}\n onEmailChange={setEmail}\n isKeyFromLink={!!(initialRecoveryKey && recoveryKey)}\n keyFileName={fileName}\n isKeyEncrypted={isKeyEncrypted}\n onKeyFile={processFile}\n error={error}\n needsSsoSignIn={showSsoPrompt || (isKeyEncrypted && !sso.isAuthenticated)}\n onSsoSignIn={handleSsoSignInForRecovery}\n isProcessing={isProcessing}\n canSubmit={!!email && !!recoveryKey}\n onSubmit={handleRecover}\n />\n )\n}\n","/**\n * Signup Backup\n *\n * Runs at registration, with no extra dialog: always offers the password to\n * the browser's password manager, and downloads the recovery key unless the\n * user opted out via the signup checkbox.\n */\n\nimport { promptSaveCredential } from '../../auth/credential-storage'\nimport { downloadRecoveryFile } from '@arbidocs/react'\n\ninterface SignupBackupOptions {\n email: string\n password: string\n signingPrivateKey: Uint8Array\n /** Download the recovery key file (the checkbox, on by default). */\n saveRecoveryKey: boolean\n /** Auth0 sub for SSO users — the recovery key is then encrypted. */\n auth0Sub?: string | null\n}\n\nexport async function backUpOnSignup({\n email,\n password,\n signingPrivateKey,\n saveRecoveryKey,\n auth0Sub,\n}: SignupBackupOptions): Promise<void> {\n // Never blocks registration: promptSaveCredential swallows its own errors.\n await promptSaveCredential(email, password)\n\n if (!saveRecoveryKey) return\n try {\n await downloadRecoveryFile({ signingPrivateKey, email, auth0Sub })\n } catch (err) {\n // A failed download must not block account creation.\n console.warn('[SIGNUP] Recovery key download failed:', err)\n }\n}\n","/**\n * What the sign-in page does: local sign-in (or an offline unlock with no network), registration\n * (then straight in), the verification email and the hand-over to SSO. Every sign-in goes through\n * the host's `Arbi` (`arbi.login`), so the SDK opens the identity, stores the keys and signs the\n * session in, and the site's sign-in hooks run around it.\n */\n\nimport { useCallback, useState } from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport { parseAuthError } from '../../auth/auth-error'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { backUpOnSignup } from './signup-backup'\nimport { useOptionalConnection } from '../ConnectionProvider'\nimport { useAuthPages, useSsoSignIn } from './support'\nimport type { LoginFormActions, LoginFormState } from './useLoginForm'\n\nconst BAD_CREDENTIALS =\n 'This username/password combination is not valid. Please double-check your credentials and try again.'\n\nexport function useLoginActions({\n formState,\n formActions,\n onError,\n}: {\n formState: LoginFormState\n formActions: LoginFormActions\n /** Show a refusal in the form itself. Default: a notice. */\n onError?: (message: string) => void\n}) {\n const arbi = useArbi()\n const signInLayer = useOptionalConnection()\n const sso = useSsoSignIn()\n const environment = useBlocksEnvironment()\n // Errors go to the form's own place when it has one; everything else is a notice.\n const environmentNotify = environment.notify\n const notify = useCallback<typeof environmentNotify>(\n (...args) =>\n args[1] === 'error' && onError && typeof args[0] === 'string'\n ? onError(args[0])\n : environmentNotify(...args),\n [environmentNotify, onError]\n )\n const { passwordRules, onRegistered, onUnlockedOffline } = useAuthPages()\n\n // True from the moment a login/registration submit starts doing real work until it fails.\n // Deliberately NOT cleared on success: after the API call there is still key setup, session\n // storage and the signed-in app's download before this page is replaced, and the button must not\n // flip back to \"Sign in\" and look idle then.\n const [isAuthenticating, setIsAuthenticating] = useState(false)\n const [isRequestingCode, setIsRequestingCode] = useState(false)\n\n const {\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n cooldownSeconds,\n } = formState\n const { setVerificationSent, setIsRedirecting, startCooldown, validateEmailWithError } =\n formActions\n\n /** Hand over to the SSO provider. */\n const handleSsoLogin = useCallback(\n (connection?: string) => {\n arbi.session?.setSsoMode(true)\n setIsRedirecting(true)\n sso.signIn(connection ? { connection } : undefined).catch((error) => {\n console.error('Error during SSO redirect:', error)\n setIsRedirecting(false)\n notify(\n 'There was a problem connecting to the authentication service. Please try again.',\n 'error'\n )\n })\n },\n [arbi, sso, setIsRedirecting, notify]\n )\n\n /** Send the verification email (a link and a three-word code). */\n const handleRequestVerificationCode = useCallback(async () => {\n if (cooldownSeconds > 0) {\n notify(`Please wait ${cooldownSeconds} seconds before requesting again`, 'warning')\n return\n }\n if (!validateEmailWithError(email)) return\n\n setIsRequestingCode(true)\n try {\n const sent = await arbi.requestVerification(email)\n setVerificationSent(true)\n notify(sent, 'success')\n startCooldown(30)\n } catch (error: unknown) {\n console.error('Verification email error:', error)\n const { detail, message } = error as { detail?: string; message?: string }\n notify(detail || message || 'Unable to send verification email.', 'error')\n } finally {\n setIsRequestingCode(false)\n }\n }, [\n arbi,\n cooldownSeconds,\n email,\n validateEmailWithError,\n setVerificationSent,\n startCooldown,\n notify,\n ])\n\n /** Local (non-SSO) sign-in; offline, an unlock on this device. */\n const handleLocalLogin = useCallback(\n async (opts?: {\n isFreshRegistration?: boolean\n /** Sign in with these, not the form's (a sign-in link's). */\n credentials?: { email: string; password: string }\n }) => {\n arbi.session?.setSsoMode(false)\n const loginEmail = opts?.credentials?.email ?? email\n const loginPassword = opts?.credentials?.password ?? password\n\n if (!loginPassword) {\n notify('Please fill in all required fields.', 'error')\n return\n }\n if (!validateEmailWithError(loginEmail)) return\n\n // Offline: unlock locally from the saved session instead of calling the backend. The\n // password still derives the key client-side; it is the same login box with no\n // /v1/user/login. This is what lets you back in (and back to your offline files) after a\n // \"log out (this device)\" with no network.\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n try {\n await arbi.unlock(loginEmail, loginPassword)\n onUnlockedOffline?.()\n } catch (err: unknown) {\n notify(\n err instanceof Error && err.message === 'no-session'\n ? 'You need to be online to log in on this device.'\n : BAD_CREDENTIALS,\n 'error'\n )\n }\n return\n }\n\n // A demo site (`defaultHost` with no backend configured) enters its demo workspace.\n if (signInLayer && !signInLayer.apiConfigured) {\n await signInLayer.login(loginEmail, loginPassword)\n return\n }\n\n setIsAuthenticating(true)\n try {\n const login = await arbi.login(loginEmail, loginPassword)\n // The single welcome toast comes with the signed-in app; none here. Where to land is the\n // site's: a fresh registration hands its login over.\n if (opts?.isFreshRegistration) onRegistered?.(login)\n return login\n } catch (error: unknown) {\n setIsAuthenticating(false)\n console.error('Login error:', error)\n notify(\n parseAuthError(error, {\n messageMap: { 'Incorrect username or password': BAD_CREDENTIALS },\n }),\n 'error'\n )\n }\n },\n [\n arbi,\n signInLayer,\n email,\n password,\n validateEmailWithError,\n notify,\n onRegistered,\n onUnlockedOffline,\n ]\n )\n\n /** Registration, then straight in. */\n const handleRegister = useCallback(\n async (saveRecoveryKey = true) => {\n arbi.session?.setSsoMode(false)\n\n if (!password || !confirmPassword || !firstName || !lastName || !verificationCode) {\n notify('Please fill in all required fields.', 'error')\n return\n }\n if (!validateEmailWithError(email)) return\n if (password !== confirmPassword) {\n notify('Passwords do not match. Please ensure both password fields are identical.', 'error')\n return\n }\n const passwordError = passwordRules.error(password)\n if (passwordError) {\n notify(passwordError, 'error')\n return\n }\n\n setIsAuthenticating(true)\n try {\n const { signingPrivateKey } = await arbi.register({\n email,\n password,\n verificationCode: verificationCode.trim(),\n firstName,\n lastName,\n })\n // Password manager save always; recovery key download unless opted out. After the\n // account exists: each attempt generates a new random identity, so a recovery file saved\n // for a failed attempt would recover nothing.\n await backUpOnSignup({ email, password, signingPrivateKey, saveRecoveryKey })\n // No success toast: the button already says \"Creating your account…\", and the next thing\n // the user sees (the site's first landing) is the confirmation.\n await handleLocalLogin({ isFreshRegistration: true })\n } catch (error: unknown) {\n setIsAuthenticating(false)\n console.error('Registration error:', error)\n notify(parseAuthError(error), 'error')\n }\n },\n [\n arbi,\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n validateEmailWithError,\n passwordRules,\n handleLocalLogin,\n notify,\n ]\n )\n\n return {\n isAuthenticating,\n isRequestingCode,\n handleSsoLogin,\n handleLocalLogin,\n handleRegister,\n handleRequestVerificationCode,\n }\n}\n","/**\n * Login Form State Hook\n *\n * Manages all form state, validation, and cooldown timer for login/registration.\n */\n\nimport { useState, useEffect, useRef, useMemo, useCallback } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { splitAuthHash, withTrailingFragment } from './auth-hash'\nimport { useAuthPages } from './support'\n\nexport interface LoginFormState {\n email: string\n password: string\n confirmPassword: string\n firstName: string\n lastName: string\n verificationCode: string\n verificationSent: boolean\n emailVerified: boolean\n /**\n * Whether the actual code/name/password inputs are on screen. Separate from\n * `verificationSent` so that sending the email doesn't itself dump the whole\n * form in front of the visitor — they land on a \"check your email\" notice\n * with a manual-entry fallback, and this flips true only once they choose\n * that fallback (or arrive via a link that already carries a code).\n */\n showVerificationForm: boolean\n /** An email arrived in the URL without a code — request one on arrival. */\n pendingAutoRequest: boolean\n cooldownSeconds: number\n error: { message: string } | null\n success: { message: string } | null\n isRegistering: boolean\n isRedirecting: boolean\n}\n\nexport interface LoginFormActions {\n setEmail: (email: string) => void\n setPassword: (password: string) => void\n setConfirmPassword: (confirmPassword: string) => void\n setFirstName: (firstName: string) => void\n setLastName: (lastName: string) => void\n setVerificationCode: (code: string) => void\n setVerificationSent: (sent: boolean) => void\n setShowVerificationForm: (shown: boolean) => void\n setPendingAutoRequest: (pending: boolean) => void\n resetEmailEntry: () => void\n setError: (error: { message: string } | null) => void\n setSuccess: (success: { message: string } | null) => void\n setIsRegistering: (isRegistering: boolean) => void\n switchMode: (isRegistering: boolean) => void\n setIsRedirecting: (isRedirecting: boolean) => void\n startCooldown: (seconds: number) => void\n clearForm: () => void\n validateEmail: (email: string) => boolean\n validateEmailWithError: (email: string) => boolean\n}\n\nexport function useLoginForm() {\n const { notify } = useBlocksEnvironment()\n const { onReturnPath } = useAuthPages()\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [firstName, setFirstName] = useState('')\n const [lastName, setLastName] = useState('')\n const [verificationCode, setVerificationCode] = useState('')\n const [verificationSent, setVerificationSent] = useState(false)\n const [emailVerified, setEmailVerified] = useState(false)\n const [showVerificationForm, setShowVerificationForm] = useState(false)\n const [pendingAutoRequest, setPendingAutoRequest] = useState(false)\n const [cooldownSeconds, setCooldownSeconds] = useState(0)\n const [error, setError] = useState<{ message: string } | null>(null)\n const [success, setSuccess] = useState<{ message: string } | null>(null)\n const [isRegistering, setIsRegistering] = useState(() => {\n if (typeof window === 'undefined') return false\n const tab = new URLSearchParams(window.location.search).get('tab')\n return tab === 'register'\n })\n const [isRedirecting, setIsRedirecting] = useState(false)\n\n const cooldownIntervalRef = useRef<NodeJS.Timeout | null>(null)\n\n // Cleanup cooldown interval on unmount\n useEffect(() => {\n return () => {\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n cooldownIntervalRef.current = null\n }\n }\n }, [])\n\n // Handle URL hash parameters for verification codes and errors\n useEffect(() => {\n // A call invitation appends the call key fragment (`#k=…&v=…`) after our own hash\n // parameters; split it off so it rides along to the `next` destination.\n const { params: hashParams, trailingFragment } = splitAuthHash(window.location.hash)\n const errorParam = hashParams.get('error')\n const errorDescriptionParam = hashParams.get('error_description')\n const emailParam = hashParams.get('verify')\n const codeParam = hashParams.get('code')\n\n if (errorParam || errorDescriptionParam) {\n console.error('Auth0 error detected:', errorParam, errorDescriptionParam)\n setIsRedirecting(false)\n setError({\n message: errorDescriptionParam || 'Authentication error. Please try again.',\n })\n window.history.replaceState(null, '', window.location.pathname + window.location.search)\n }\n\n // Handle verification details from the URL hash. Two shapes:\n // #verify=<email>&code=<code> invitation link — both fields prefilled\n // #verify=<email> \"verify email\" hand-off from the marketing\n // site — we request the code on arrival so\n // the visitor only types it back in (see the\n // auto-request effect in Login).\n // The hash (not the query) carries the address so it never reaches server\n // logs, and it is scrubbed either way once read.\n // An invite for a specific shared document/conversation additionally\n // carries `&next=<path>` (see ARBI's send_invitation_email) — stash it as\n // the post-auth return URL right away so it survives all the way through\n // registration/login, the same generic mechanism an already-registered\n // user's deep link already rides (resolvePostAuthReturnUrl / App.tsx).\n const nextParam = hashParams.get('next')\n if (nextParam) {\n onReturnPath?.(withTrailingFragment(decodeURIComponent(nextParam), trailingFragment))\n }\n if (emailParam) {\n setIsRegistering(true)\n const decodedEmail = decodeURIComponent(emailParam).trim()\n setEmail(decodedEmail)\n if (codeParam) {\n const formattedCode = codeParam.toUpperCase().replace(/\\s+/g, '-')\n setVerificationCode(formattedCode)\n setVerificationSent(true)\n setEmailVerified(true)\n // The emailed link already carries a code, so it's the one thing that\n // should drop the visitor straight into the form — no manual-entry\n // link to click first.\n setShowVerificationForm(true)\n } else {\n setPendingAutoRequest(true)\n }\n window.history.replaceState(null, '', window.location.pathname + window.location.search)\n }\n // The URL is read once, on arrival (it is scrubbed right after).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const validateEmail = useCallback((emailToValidate: string): boolean => {\n const atIndex = emailToValidate.indexOf('@')\n if (atIndex === -1) return false\n const domainPart = emailToValidate.substring(atIndex + 1)\n return domainPart.includes('.')\n }, [])\n\n const validateEmailWithError = useCallback(\n (emailToValidate: string): boolean => {\n if (!emailToValidate) {\n notify('Please enter your email address.', 'error')\n return false\n }\n if (!validateEmail(emailToValidate)) {\n notify('Please enter a valid email address.', 'error')\n return false\n }\n return true\n },\n [validateEmail, notify]\n )\n\n const clearCooldown = useCallback(() => {\n setCooldownSeconds(0)\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n cooldownIntervalRef.current = null\n }\n }, [])\n\n /**\n * Step back to an editable email field after a code has been sent.\n *\n * The address is locked while a verification is outstanding, so without this\n * a typo — or a wrong address auto-requested from a marketing link — is a\n * dead end short of reloading the page. The cooldown is dropped too: it\n * throttles repeat sends to one address, and this is a different one. Repeat\n * sends are rate-limited server-side regardless.\n */\n const resetEmailEntry = useCallback(() => {\n setEmailVerified(false)\n setVerificationSent(false)\n setShowVerificationForm(false)\n setVerificationCode('')\n setPendingAutoRequest(false)\n clearCooldown()\n }, [clearCooldown])\n\n const startCooldown = useCallback((seconds: number) => {\n setCooldownSeconds(seconds)\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n }\n cooldownIntervalRef.current = setInterval(() => {\n setCooldownSeconds((prev) => {\n if (prev <= 1) {\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n cooldownIntervalRef.current = null\n }\n return 0\n }\n return prev - 1\n })\n }, 1000)\n }, [])\n\n /**\n * Flip between the Login and Register tabs. The email field is shared, but a\n * password typed on one form must never sit masked in the other, so both\n * password fields are cleared on every switch.\n */\n const switchMode = useCallback((registering: boolean) => {\n setIsRegistering(registering)\n setPassword('')\n setConfirmPassword('')\n }, [])\n\n const clearForm = useCallback(() => {\n setEmailVerified(false)\n setEmail('')\n setPassword('')\n setConfirmPassword('')\n setFirstName('')\n setLastName('')\n setVerificationCode('')\n setVerificationSent(false)\n setShowVerificationForm(false)\n setPendingAutoRequest(false)\n setError(null)\n setSuccess(null)\n clearCooldown()\n }, [clearCooldown])\n\n const state: LoginFormState = {\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n verificationSent,\n emailVerified,\n showVerificationForm,\n pendingAutoRequest,\n cooldownSeconds,\n error,\n success,\n isRegistering,\n isRedirecting,\n }\n\n const actions: LoginFormActions = {\n setEmail,\n setPassword,\n setConfirmPassword,\n setFirstName,\n setLastName,\n setVerificationCode,\n setVerificationSent,\n setShowVerificationForm,\n setPendingAutoRequest,\n resetEmailEntry,\n setError,\n setSuccess,\n setIsRegistering,\n switchMode,\n setIsRedirecting,\n startCooldown,\n clearForm,\n validateEmail,\n validateEmailWithError,\n }\n\n return { ...state, ...actions }\n}\n\n/**\n * Memoized registration submit button state\n */\nexport function useRegisterSubmitState(\n isRegistering: boolean,\n isPending: boolean,\n password: string,\n confirmPassword: string,\n email: string,\n firstName: string,\n lastName: string,\n verificationCode: string,\n isPasswordValid: (password: string) => boolean\n) {\n const isDisabled = useMemo(() => {\n if (!isRegistering) return false\n return (\n isPending ||\n !isPasswordValid(password) ||\n password !== confirmPassword ||\n !email ||\n !firstName ||\n !lastName ||\n !verificationCode\n )\n }, [\n isRegistering,\n isPending,\n password,\n confirmPassword,\n email,\n firstName,\n lastName,\n verificationCode,\n isPasswordValid,\n ])\n\n const isDefault = useMemo(() => {\n if (!isRegistering) return false\n return (\n email &&\n password &&\n confirmPassword &&\n firstName &&\n lastName &&\n verificationCode &&\n isPasswordValid(password) &&\n password === confirmPassword\n )\n }, [\n isRegistering,\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n isPasswordValid,\n ])\n\n return { isDisabled, isDefault }\n}\n","import { useEffect } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useAuthPages, useSsoSignIn } from './support'\n\n/**\n * Back on the sign-in page from the SSO provider's email verification: verified\n * (`?success=true&code=success`, or a token in the fragment) goes straight on to the provider's\n * sign-in, asking for consent again; failed (`?success=false`) says so, or hands the provider's\n * message to the site (`auth.onVerificationFailed`).\n */\nexport function useSsoVerificationRedirect(): void {\n const sso = useSsoSignIn()\n const { notify } = useBlocksEnvironment()\n const { onVerificationFailed } = useAuthPages()\n\n useEffect(() => {\n const urlParams = new URLSearchParams(window.location.search)\n const success = urlParams.get('success') || null\n const code = urlParams.get('code') || null\n const message = urlParams.get('message') || null\n const accessToken = window.location.hash.includes('access_token=')\n\n if ((success === 'true' && code === 'success') || accessToken) {\n notify('Verified! Redirecting...', 'success')\n try {\n void sso.signIn({ consent: true })\n } catch (error) {\n console.error('Error during login redirect:', error)\n notify(\n 'Error during login redirect. Please click \"Login with Arbi.City\" to continue.',\n 'error'\n )\n }\n } else if (success === 'false') {\n if (message && onVerificationFailed) onVerificationFailed(message)\n else notify('Email verification failed. Please try again.', 'error')\n }\n // The URL is read once, on arrival.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n}\n","/**\n * The sign-in page: login and registration (a verification email, then the form), the\n * verification link from an invitation, an offline unlock, forgot password with a recovery key or\n * the recovery link (`/recover`), and the hand-over to SSO. The reference composition of the auth\n * blocks over the host's `Arbi`; the site gives its look and follow-ups once, as the host\n * configuration's `auth` (and `sso`), see `./support`.\n */\n\nimport { useEffect, useRef, useState, type FormEvent, type ReactElement } from 'react'\nimport { BadgeCheck } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useIsOnline } from '@arbidocs/react/document-tools/core'\nimport { initSodium, parseRecoveryUrl, prewarmKeyPairs } from '@arbidocs/client'\nimport {\n AuthDivider,\n AuthField,\n AuthFieldBadge,\n AuthHeading,\n AuthInput,\n AuthLink,\n AuthNote,\n AuthOfflineBadge,\n AuthSubmitButton,\n AuthTabs,\n RevealablePasswordInput,\n} from '../../auth/AuthForm'\nimport { AuthLayout } from '../../auth/AuthLayout'\nimport { AuthConsent } from '../../auth/AuthFooter'\nimport { PasswordStrengthInput } from '../../auth/PasswordStrengthInput'\nimport { AppleIcon, GoogleIcon, LinkedInIcon, useArbi } from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { prefetchChunk } from '../../shell/reload-policy'\nimport { ConnectedPasswordChangeDialog } from '../ConnectedSettings'\nimport { ConnectedForgotPassword, PENDING_RECOVERY_KEY } from './ConnectedForgotPassword'\nimport { useAuthPages, useSsoSignIn } from './support'\nimport { useLoginActions } from './useLoginActions'\nimport { useFragmentCredentials } from './fragment-credentials'\nimport { useLoginForm, useRegisterSubmitState } from './useLoginForm'\nimport { useSsoVerificationRedirect } from './useSsoVerificationRedirect'\n\nconst NO_RECOVERY_KEY_WARNING =\n 'Without your password or a recovery key, we cannot recover your account or data.'\n\n/** Compile the libsodium wasm while the visitor types, not inside the sign-in click. Once only. */\nlet sodiumWarmed = false\nfunction warmSodium() {\n if (sodiumWarmed) return\n sodiumWarmed = true\n const run = () => void prefetchChunk(initSodium)\n if (typeof window.requestIdleCallback === 'function') window.requestIdleCallback(run)\n else window.setTimeout(run, 200)\n}\n\n/**\n * The full sign-in and registration page. An embedded host's narrow pane signs in with\n * `ConnectedCompactLogin`.\n */\nexport function ConnectedLoginPage(): ReactElement {\n const sso = useSsoSignIn()\n const auth = useAuthPages()\n const { notify } = useBlocksEnvironment()\n const isSsoOnly = !!auth.ssoOnly\n const allowRegistration = auth.allowRegistration ?? true\n const isOnline = useIsOnline()\n const passwordRules = auth.passwordRules\n\n // Form state and actions\n // Back from the SSO provider's email verification: straight on to its sign-in.\n useSsoVerificationRedirect()\n const formState = useLoginForm()\n const deploymentDomain = useArbi().getDeploymentDomain()\n const {\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n verificationSent,\n emailVerified,\n showVerificationForm,\n pendingAutoRequest,\n isRegistering,\n isRedirecting,\n setEmail,\n setPassword,\n setConfirmPassword,\n setFirstName,\n setLastName,\n setVerificationCode,\n setIsRegistering,\n switchMode,\n setIsRedirecting,\n setPendingAutoRequest,\n setVerificationSent,\n setShowVerificationForm,\n validateEmailWithError,\n clearForm,\n } = formState\n\n const {\n isAuthenticating,\n isRequestingCode,\n handleSsoLogin,\n handleLocalLogin,\n handleRegister,\n handleRequestVerificationCode,\n } = useLoginActions({\n formState,\n formActions: formState,\n })\n\n // Register button state\n const { isDisabled: isRegisterSubmitDisabled } = useRegisterSubmitState(\n isRegistering,\n isAuthenticating,\n password,\n confirmPassword,\n email,\n firstName,\n lastName,\n verificationCode,\n passwordRules.isValid\n )\n\n // The visitor started to sign in: warm the crypto, and whatever the site warms.\n const handleIntent = () => {\n warmSodium()\n auth.onIntent?.()\n }\n\n // Offline: you can only unlock locally (not register), so force the Login tab.\n // The header also swaps its toggle for an offline pill (see offlineIndicator)\n // so it's clear why the password unlocks on-device with the backend unreachable.\n useEffect(() => {\n if (!isOnline || !allowRegistration) setIsRegistering(false)\n }, [isOnline, allowRegistration, setIsRegistering])\n\n // A sign-in link (mock and demo deployments that opt in): straight in, the form prefilled\n // should it fail.\n useFragmentCredentials({\n enabled: !!auth.fragmentSignIn,\n onCredentials: ({ email: linkEmail, password: linkPassword, next }) => {\n setEmail(linkEmail)\n if (next) auth.onReturnPath?.(next)\n void handleLocalLogin({ credentials: { email: linkEmail, password: linkPassword } })\n },\n })\n\n // Visitors who entered their address on the marketing site arrive at\n // /login#verify=<email> — the address is already known, so send the code\n // immediately rather than making them press Request for it. Ref-guarded\n // because StrictMode double-mounts effects and each run would send a second\n // email. Skipped when the local form is not usable at all (SSO-only, or\n // offline with the backend unreachable).\n const autoRequestFiredRef = useRef(false)\n const emailInputRef = useRef<HTMLInputElement>(null)\n useEffect(() => {\n if (!pendingAutoRequest || autoRequestFiredRef.current) return\n if (isSsoOnly || !isOnline || !allowRegistration) return\n autoRequestFiredRef.current = true\n setPendingAutoRequest(false)\n void handleRequestVerificationCode()\n }, [\n pendingAutoRequest,\n isSsoOnly,\n isOnline,\n allowRegistration,\n setPendingAutoRequest,\n handleRequestVerificationCode,\n ])\n\n // Terms acceptance state\n const [termsAccepted, setTermsAccepted] = useState(false)\n // Download the recovery key on signup (opt-out; unchecking shows a warning)\n const [saveRecoveryKey, setSaveRecoveryKey] = useState(true)\n const [showPassword, setShowPassword] = useState(false)\n\n // Forgot password modal state\n const [showForgotPasswordModal, setShowForgotPasswordModal] = useState(false)\n const [showChangePasswordModal, setShowChangePasswordModal] = useState(false)\n const [prefilledRecovery, setPrefilledRecovery] = useState<{\n email: string\n recoveryKey: Uint8Array\n isEncrypted: boolean\n } | null>(null)\n\n // Handle recovery success - open change password dialog in recovery mode\n const handleRecoverySuccess = () => {\n setShowForgotPasswordModal(false)\n setShowChangePasswordModal(true)\n }\n\n // On mount: pre-open the forgot-password modal in two cases.\n //\n // 1. Landed on /recover with email + #KEY=... in the URL — parse, prefill,\n // scrub URL so the key bytes don't linger in browser history.\n // 2. Landed on /login after an Auth0 redirect that started from the\n // recovery flow — restore from sessionStorage so the user doesn't have\n // to re-click their recovery link (set by ForgotPasswordModal's\n // handleSsoSignInForRecovery).\n useEffect(() => {\n // Case 1: /recover URL\n if (window.location.pathname === '/recover') {\n const recovery = parseRecoveryUrl(window.location.search, window.location.hash)\n if (!recovery) return\n setPrefilledRecovery(recovery)\n setShowForgotPasswordModal(true)\n window.history.replaceState(null, '', '/login')\n return\n }\n\n // Case 2: returned from Auth0 with a pending recovery in sessionStorage\n try {\n const raw = sessionStorage.getItem(PENDING_RECOVERY_KEY)\n if (!raw) return\n sessionStorage.removeItem(PENDING_RECOVERY_KEY)\n const parsed = JSON.parse(raw) as { email: string; keyB64: string; isEncrypted: boolean }\n const bin = atob(parsed.keyB64)\n const recoveryKey = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) recoveryKey[i] = bin.charCodeAt(i)\n setPrefilledRecovery({\n email: parsed.email,\n recoveryKey,\n isEncrypted: parsed.isEncrypted,\n })\n setShowForgotPasswordModal(true)\n } catch (err) {\n console.error('Failed to restore recovery state from sessionStorage:', err)\n }\n }, [])\n\n // SSO only: hand straight over to the provider\n useEffect(() => {\n if (isSsoOnly && !sso.isLoading && !isRedirecting) {\n handleSsoLogin()\n }\n }, [isSsoOnly, sso.isLoading, isRedirecting, handleSsoLogin])\n\n // Reset redirecting state after the provider settled\n useEffect(() => {\n if (!sso.isLoading && isRedirecting) {\n const timer = setTimeout(() => {\n setIsRedirecting(false)\n }, 500)\n return () => clearTimeout(timer)\n }\n }, [sso.isLoading, isRedirecting, setIsRedirecting])\n\n // Show loading screen during SSO redirect\n if ((isRedirecting && sso.isLoading) || isSsoOnly) {\n return <>{auth.loading ?? null}</>\n }\n\n const showVerifiedBadge = isRegistering && emailVerified\n\n const handleFormSubmit = (e: FormEvent) => {\n e.preventDefault()\n if (isRegistering) {\n if (!termsAccepted) {\n notify('You must acknowledge the Terms of Use and Privacy Policy.', 'error')\n return\n }\n handleRegister(saveRecoveryKey)\n } else {\n handleLocalLogin()\n }\n }\n\n // Offline: the header swaps its tabs for a pill so it's clear why the password\n // unlocks on-device with the backend unreachable.\n const offlineIndicator = (\n <AuthOfflineBadge title=\"No connection — sign in to unlock your offline files on this device\" />\n )\n\n const loginRegisterToggle = (\n <AuthTabs\n ariaLabel=\"Login or register\"\n value={isRegistering ? 'register' : 'login'}\n onChange={(tab) => switchMode(tab === 'register')}\n tabs={[\n { value: 'login', label: 'Login' },\n { value: 'register', label: 'Register', testId: 'register-switch' },\n ]}\n />\n )\n\n // The site's panel beside the form — the same on both Login and Register.\n const aside = isSsoOnly ? undefined : auth.aside\n\n const isStepTwo = isRegistering && verificationSent && showVerificationForm\n\n return (\n <AuthLayout\n brand={auth.brand}\n corner={auth.corner}\n headerRight={\n isSsoOnly\n ? undefined\n : !isOnline\n ? offlineIndicator\n : allowRegistration\n ? loginRegisterToggle\n : undefined\n }\n aside={aside}\n >\n {auth.banner}\n {!isSsoOnly && (\n <>\n <AuthHeading\n title={isRegistering ? 'Create your account' : (auth.heading?.title ?? 'Welcome back')}\n description={isRegistering ? undefined : auth.heading?.description}\n />\n <div data-testid=\"login-form-container\">\n {/* Login/Registration Form */}\n\n <form\n className=\"space-y-4\"\n aria-label={isRegistering ? 'Sign up with email' : 'Sign in with email'}\n onSubmit={handleFormSubmit}\n onFocusCapture={handleIntent}\n aria-busy={isAuthenticating}\n >\n {/* The address locks once a code is out, so the way back sits beside it: a typo, or\n a wrong address carried in from a marketing link, would otherwise need a reload.\n One control does it — clearing the form frees the address and returns to step 1. */}\n <AuthField\n htmlFor=\"email\"\n label={isRegistering ? 'Email' : (auth.emailLabel ?? 'Email')}\n required\n labelAction={\n isRegistering && verificationSent ? (\n <AuthLink onClick={clearForm} data-testid=\"clear-button\">\n Clear form\n </AuthLink>\n ) : undefined\n }\n trailing={\n // Shown once the address is locked in with a code in hand — i.e. the emailed\n // link, or a code typed in. The server checks the code when the account is made.\n showVerifiedBadge ? (\n <AuthFieldBadge\n testId=\"email-verified-badge\"\n icon={<BadgeCheck className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n Verified\n </AuthFieldBadge>\n ) : undefined\n }\n >\n <AuthInput\n ref={emailInputRef}\n type=\"email\"\n placeholder=\"you@company.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n data-testid=\"email-input\"\n name=\"email\"\n id=\"email\"\n autoComplete=\"email\"\n required\n className={showVerifiedBadge ? 'pr-24' : ''}\n // Locked, not disabled: a disabled input is faded (opacity-50) and reads as a\n // hint, so the address the code went to would look empty.\n readOnly={isRegistering && verificationSent}\n disabled={isAuthenticating}\n />\n </AuthField>\n\n {/* Step 1 — the whole window is \"enter an email, get a code\". Nothing else is shown,\n because nothing else can be completed until the address is verified. */}\n {isRegistering && !verificationSent && (\n <div className=\"space-y-3 pt-1\">\n <Button\n type=\"button\"\n onClick={handleRequestVerificationCode}\n className=\"w-full\"\n disabled={isRequestingCode || !email}\n data-testid=\"verify-email-button\"\n >\n {isRequestingCode ? 'Sending…' : 'Email me a verification link'}\n </Button>\n {/* Fallback for anyone who already has a code — an invitation forwarded as text,\n a code from an earlier attempt, a link opened on another device. Sending a\n second email would invalidate the code they are holding, so this only unlocks\n the form. The address is still validated, because it is about to be locked and\n submitted with the code. */}\n <AuthLink\n onClick={() => {\n // Say why nothing happened, and point at the field to fill in.\n if (!email) {\n emailInputRef.current?.focus()\n notify(\n 'Enter your email address first, then choose \"I already have my code\".',\n 'error'\n )\n return\n }\n if (!validateEmailWithError(email)) return\n setVerificationSent(true)\n setShowVerificationForm(true)\n }}\n className=\"w-full text-center\"\n data-testid=\"already-have-code-button\"\n >\n I already have my code\n </AuthLink>\n </div>\n )}\n\n {/* Step 1.5 — the code is out, but the code/name/password form stays off screen until\n the visitor needs it. Most people just click the link in the email, so leading\n with the full form here would show fields almost nobody fills in. */}\n {isRegistering && verificationSent && !showVerificationForm && (\n <div className=\"space-y-2 pt-1\" data-testid=\"verification-sent-notice\">\n <AuthNote>We've sent a link to your email — click it to continue.</AuthNote>\n <AuthLink\n onClick={() => setShowVerificationForm(true)}\n className=\"w-full text-center\"\n data-testid=\"enter-code-manually-button\"\n >\n Enter code manually instead\n </AuthLink>\n </div>\n )}\n\n {/* Step 2 — the rest of the form, unlocked once a code has been sent AND the visitor\n asked to see it (or arrived via an emailed link that already carries a code — see\n useLoginForm's hash effect, which sets both flags together for that case). */}\n {isStepTwo && (\n <>\n {/* The code field has no Request button beside it: requesting is step 1's whole\n job, so repeating it here just invites a second email and a second cooldown. */}\n {!showVerifiedBadge && (\n <AuthField htmlFor=\"verificationCode\" label=\"Verification Code\" required>\n <AuthInput\n type=\"text\"\n // The code is three dash-joined words, which is not guessable from an empty\n // box — and the onChange below rewrites whitespace to dashes, so showing the\n // shape up front stops it looking like the field is mangling input.\n placeholder=\"THREE-WORD-CODE\"\n value={verificationCode}\n onChange={(e) => {\n const value = e.target.value.toUpperCase().replace(/\\s+/g, '-')\n setVerificationCode(value)\n }}\n data-testid=\"verification-code-input\"\n name=\"verificationCode\"\n id=\"verificationCode\"\n autoComplete=\"off\"\n required\n className=\"w-full\"\n />\n </AuthField>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <AuthField htmlFor=\"firstName\" label=\"First Name\" required>\n <AuthInput\n type=\"text\"\n placeholder=\"\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n data-testid=\"firstname-input\"\n name=\"firstName\"\n id=\"firstName\"\n autoComplete=\"given-name\"\n required\n />\n </AuthField>\n <AuthField htmlFor=\"lastName\" label=\"Last Name\" required>\n <AuthInput\n type=\"text\"\n placeholder=\"\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n data-testid=\"lastname-input\"\n name=\"lastName\"\n id=\"lastName\"\n autoComplete=\"family-name\"\n required\n />\n </AuthField>\n </div>\n\n <PasswordStrengthInput\n password={password}\n confirmPassword={confirmPassword}\n onPasswordChange={setPassword}\n onConfirmPasswordChange={setConfirmPassword}\n showConfirmation={true}\n passwordLabel=\"Password\"\n confirmLabel=\"Confirm Password\"\n layout=\"side-by-side\"\n showStrengthIndicator={true}\n getUnmetRequirement={passwordRules.unmet}\n />\n </>\n )}\n\n {/* Password Field for Login */}\n {!isRegistering && (\n <AuthField htmlFor=\"password\" label=\"Password\" required>\n <RevealablePasswordInput\n isRevealed={showPassword}\n onToggleReveal={() => setShowPassword((v) => !v)}\n placeholder=\"\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n // Argon2 (~70 ms on a fast desktop, ~300 ms+ on a phone) is the CPU cost of\n // signing in. It is deterministic, so start it as the user leaves the field and\n // the click only has to sign + send.\n onBlur={() => {\n if (email && password) prewarmKeyPairs(email, password, deploymentDomain)\n }}\n data-testid=\"password-input\"\n name=\"password\"\n id=\"password\"\n autoComplete=\"current-password\"\n required\n disabled={isAuthenticating}\n />\n <AuthLink\n onClick={() => setShowForgotPasswordModal(true)}\n className=\"mt-2\"\n data-testid=\"forgot-password-link\"\n >\n Forgot your password?\n </AuthLink>\n </AuthField>\n )}\n\n {/* Terms + recovery-key checkboxes — step 2, next to the actual account creation */}\n {isStepTwo && (\n <AuthConsent\n termsAccepted={termsAccepted}\n onTermsAcceptedChange={setTermsAccepted}\n saveRecoveryKey={saveRecoveryKey}\n onSaveRecoveryKeyChange={setSaveRecoveryKey}\n termsLink={auth.consent?.termsLink ?? { href: '#', label: 'Terms of Use' }}\n privacyLink={auth.consent?.privacyLink ?? { href: '#', label: 'Privacy Policy' }}\n noRecoveryKeyWarning={\n auth.consent?.noRecoveryKeyWarning ?? NO_RECOVERY_KEY_WARNING\n }\n />\n )}\n\n {/* Submit Button — step 2 only; in step 1 (and step 1.5, waiting on the emailed link)\n the primary action is \"Verify Email\" / \"Enter code manually\" above. */}\n {(!isRegistering || isStepTwo) && (\n <div className=\"space-y-3 pt-1\">\n <AuthSubmitButton\n isBusy={isAuthenticating}\n disabled={isAuthenticating || (isRegistering && isRegisterSubmitDisabled)}\n testId={isRegistering ? 'register-submit' : 'login-submit'}\n >\n {isRegistering\n ? isAuthenticating\n ? 'Creating your account…'\n : 'Create account'\n : isAuthenticating\n ? 'Signing in…'\n : 'Sign in'}\n </AuthSubmitButton>\n </div>\n )}\n </form>\n\n {(!isRegistering || !verificationSent) && sso.available && (\n <div className=\"mt-6 space-y-4\">\n <AuthDivider label=\"or continue with\" />\n <div className=\"grid grid-cols-3 gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"min-w-0 gap-2 px-2\"\n aria-label=\"Continue with LinkedIn\"\n disabled={sso.isLoading || isRedirecting || isAuthenticating}\n onClick={() => handleSsoLogin('linkedin')}\n data-testid={\n isRegistering ? 'register-with-linkedin-button' : 'login-with-linkedin-button'\n }\n >\n <LinkedInIcon size={16} aria-hidden={true} />\n LinkedIn\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"min-w-0 gap-2 px-2\"\n aria-label=\"Continue with Google\"\n disabled={sso.isLoading || isRedirecting || isAuthenticating}\n onClick={() => handleSsoLogin('google-oauth2')}\n data-testid={\n isRegistering ? 'register-with-google-button' : 'login-with-google-button'\n }\n >\n <GoogleIcon size={16} aria-hidden={true} />\n Google\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"min-w-0 gap-2 px-2\"\n aria-label=\"Continue with Apple\"\n disabled={sso.isLoading || isRedirecting || isAuthenticating}\n onClick={() => handleSsoLogin('apple')}\n data-testid={\n isRegistering ? 'register-with-apple-button' : 'login-with-apple-button'\n }\n >\n <AppleIcon size={16} aria-hidden={true} />\n Apple\n </Button>\n </div>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* SSO Login Button. Hidden where the provider cannot run (Auth0 on a non-secure origin, a\n dev server reached over a LAN address) — email + password still works. */}\n {!isRegistering && sso.available && (\n <AuthLink onClick={() => handleSsoLogin()} data-testid=\"login-with-arbi-button\">\n Continue with Arbicity\n </AuthLink>\n )}\n\n {/* Footer links (the consent checkboxes live inside the form for register mode) */}\n {!isRegistering && auth.footer}\n\n {/* Forgot Password Modal */}\n <ConnectedForgotPassword\n open={showForgotPasswordModal}\n onOpenChange={(open) => {\n setShowForgotPasswordModal(open)\n if (!open) setPrefilledRecovery(null)\n }}\n onRecovered={handleRecoverySuccess}\n initialEmail={prefilledRecovery?.email}\n initialRecoveryKey={prefilledRecovery?.recoveryKey ?? undefined}\n initialIsKeyEncrypted={prefilledRecovery?.isEncrypted ?? false}\n />\n\n {/* Change Password Dialog (Recovery Mode) */}\n <ConnectedPasswordChangeDialog\n open={showChangePasswordModal}\n onClose={() => setShowChangePasswordModal(false)}\n recoveryMode\n />\n </AuthLayout>\n )\n}\n","/** The pieces of a name an identity provider may give us. Providers fill these inconsistently. */\nexport interface NameSource {\n given_name?: string | null\n family_name?: string | null\n name?: string | null\n}\n\nexport interface ResolvedName {\n given_name: string\n family_name: string\n}\n\nconst clean = (value?: string | null): string => value?.trim() ?? ''\n\n/**\n * One rule for splitting an SSO profile into first and last name, used everywhere the app shows or registers one.\n *\n * A provider can send `family_name` without `given_name` (or neither). The full `name` then has to be split without\n * counting the surname twice: with only a surname known it is stripped off the end of `name`; with nothing known\n * the first word is the first name and the rest is the surname. Names known to the backend (`preferred`) win.\n */\nexport function resolveSsoName(\n profile: NameSource,\n preferred: NameSource = {},\n emailFallback?: string\n): ResolvedName {\n const fullName = clean(profile.name)\n let given = clean(preferred.given_name) || clean(profile.given_name)\n let family = clean(preferred.family_name) || clean(profile.family_name)\n\n if (!given && fullName) {\n const surnameAtEnd =\n family &&\n fullName.length > family.length &&\n fullName.toLowerCase().endsWith(family.toLowerCase())\n given = surnameAtEnd\n ? fullName.slice(0, fullName.length - family.length).trim()\n : fullName.split(/\\s+/)[0]\n }\n if (!family && given && fullName.toLowerCase().startsWith(given.toLowerCase())) {\n family = fullName.slice(given.length).trim()\n }\n if (!given && emailFallback) given = emailFallback.split('@')[0]\n\n return { given_name: given, family_name: family }\n}\n","/**\n * Finishing a sign-in through SSO, once the provider has signed the person in: what their account\n * is for the provider's email (`arbi.sso.status`), then, with the master password, register a new\n * account (and back it up), link a local one, or sign in. One implementation for the full-page\n * callback (`ConnectedSsoCallback`) and the compact sign-in of embedded hosts.\n */\nimport type { components, LoginResult } from '@arbidocs/client'\nimport type { useArbi } from '@arbidocs/react'\nimport { backUpOnSignup } from './signup-backup'\nimport { resolveSsoName } from './sso-name'\nimport type { SsoUser } from './support'\n\nexport type SsoAccountStatus = components['schemas']['SSOStatusResponse']\n\ntype Arbi = ReturnType<typeof useArbi>\n\n/** What the provider's account is on this deployment (`new_user`, `sso_exists`, `local_exists`). */\nexport function ssoAccountStatus(arbi: Arbi, token: string, user: SsoUser) {\n return arbi.sso.status({ token, email: user.email!, picture: user.picture })\n}\n\nexport interface CompleteSsoSignIn {\n token: string\n user: SsoUser\n status: SsoAccountStatus\n /** The master password: a new one for `new_user`, the account's otherwise. */\n password: string\n /** A new account: download its recovery key (default on). */\n saveRecoveryKey?: boolean\n}\n\n/**\n * Sign in with the master password by account status. A new account is registered (the SSO token\n * stands in for the verification code), backed up, and signed in with the provider's name and\n * picture; `registered` says so. A local account is linked to SSO (`linked`).\n */\nexport async function completeSsoSignIn(\n arbi: Arbi,\n { token, user, status, password, saveRecoveryKey = true }: CompleteSsoSignIn\n): Promise<{ login: LoginResult | undefined; registered: boolean; linked: boolean }> {\n const email = user.email!\n if (status.status === 'new_user') {\n const { given_name: firstName, family_name: lastName } = resolveSsoName(user, status, email)\n const { signingPrivateKey } = await arbi.sso.register({\n token,\n email,\n password,\n firstName,\n lastName,\n picture: user.picture,\n })\n // After the account exists: each attempt makes a new identity, so a recovery file saved for a\n // failed attempt would recover nothing.\n await backUpOnSignup({\n email,\n password,\n signingPrivateKey,\n saveRecoveryKey,\n auth0Sub: user.sub,\n })\n const login = await arbi.sso.login({\n token,\n email,\n password,\n profile: { ...resolveSsoName(user, status), picture: user.picture ?? null },\n })\n return { login, registered: true, linked: false }\n }\n // An existing account: the backend's profile is authoritative (the person may have edited it).\n const linked = status.status === 'local_exists'\n const signIn = linked ? arbi.sso.link : arbi.sso.login\n const login = await signIn({ token, email, password })\n return { login: login ?? undefined, registered: false, linked }\n}\n","/**\n * The compact sign-in of embedded hosts (an Office task pane, a browser extension): email and\n * password, or SSO in a popup (the host opens it, `onSsoSignIn`) followed by the master password\n * the account's keys are derived from. The same actions as the sign-in page (`useLoginActions`)\n * and the same SSO completion as the callback page (`completeSsoSignIn`), arranged for a narrow\n * pane, with errors shown in place. The full sign-in page is `ConnectedLoginPage`.\n */\nimport { useState, type FormEvent, type ReactElement } from 'react'\nimport { Loader2, LogIn } from 'lucide-react'\nimport { Button, Input } from '@arbidocs/react/ui'\nimport { useArbi } from '@arbidocs/react'\nimport { parseAuthError } from '../../auth/auth-error'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { completeSsoSignIn, ssoAccountStatus } from './sso-sign-in'\nimport { useAuthPages, type SsoUser } from './support'\nimport { useLoginActions } from './useLoginActions'\nimport { useLoginForm } from './useLoginForm'\n\nexport interface ConnectedCompactLoginProps {\n /**\n * Sign in at the SSO provider in a popup: the provider's token and user, or `null` when the\n * popup closed without one. Absent: no SSO.\n */\n onSsoSignIn?: () => Promise<{ accessToken: string; user: SsoUser } | null>\n /** Signed in, with the person's first name. */\n onSignedIn?: (name: string) => void\n /** The product name in the copy (\"Sign in with …\", \"your … master password\"). */\n appName?: string\n /** The SSO provider's name on its buttons. Default: the product name. */\n ssoName?: string\n}\n\nconst firstName = (user: { given_name?: string | null } | undefined, fallback: string) =>\n user?.given_name || fallback.split('@')[0]\n\nexport function ConnectedCompactLogin({\n onSsoSignIn,\n onSignedIn,\n appName = 'ARBI',\n ssoName = appName,\n}: ConnectedCompactLoginProps): ReactElement {\n const arbi = useArbi()\n const auth = useAuthPages()\n const { notify } = useBlocksEnvironment()\n const isSsoOnly = !!auth.ssoOnly\n const [error, setError] = useState<string | null>(null)\n const formState = useLoginForm()\n const { email, password, setEmail, setPassword } = formState\n const { isAuthenticating, handleLocalLogin } = useLoginActions({\n formState,\n formActions: formState,\n onError: setError,\n })\n\n // SSO: the provider signed in; the master password finishes it.\n const [sso, setSso] = useState<{ accessToken: string; user: SsoUser } | null>(null)\n const [masterPassword, setMasterPassword] = useState('')\n\n const signInLocally = async (e: FormEvent) => {\n e.preventDefault()\n setError(null)\n const login = await handleLocalLogin()\n if (login) onSignedIn?.(firstName(login.response?.user, email))\n }\n\n const finishSso = async () => {\n if (!sso?.user.email) {\n setError('User email not available')\n return\n }\n try {\n const status = await ssoAccountStatus(arbi, sso.accessToken, sso.user)\n const { login } = await completeSsoSignIn(arbi, {\n token: sso.accessToken,\n user: sso.user,\n status,\n password: masterPassword,\n })\n const name = login?.response?.user.given_name ?? sso.user.given_name ?? sso.user.name\n setError(null)\n setSso(null)\n setMasterPassword('')\n const shown = name ?? sso.user.email.split('@')[0]\n notify(`Welcome, ${shown}!`, 'success')\n onSignedIn?.(shown)\n } catch (err) {\n console.error('[SSO] Error during authentication:', err)\n setError(parseAuthError(err, { defaultMessage: 'Authentication failed. Please try again.' }))\n }\n }\n\n const startSso = async () => {\n if (!onSsoSignIn) return\n try {\n const result = await onSsoSignIn()\n if (result) setSso(result)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Authentication failed. Please try again.')\n }\n }\n\n const cancelSso = () => {\n setSso(null)\n setMasterPassword('')\n setError(null)\n }\n\n return (\n <div className=\"space-y-4\" data-testid=\"embedded-auth\">\n {error && (\n <div\n className=\"bg-destructive/10 text-destructive p-3 rounded-md\"\n data-testid=\"embedded-auth-error\"\n >\n <p className=\"text-sm\">{error}</p>\n </div>\n )}\n\n {sso ? (\n <form\n onSubmit={(e) => {\n e.preventDefault()\n if (masterPassword) void finishSso()\n }}\n className=\"space-y-3\"\n >\n <p className=\"text-sm text-muted-foreground\">\n Enter your {appName} <strong>master password</strong> — the encryption passphrase you\n set when you first registered, not your {ssoName} sign-in password.\n </p>\n <Input\n type=\"password\"\n placeholder=\"Enter master password\"\n value={masterPassword}\n onChange={(e) => setMasterPassword(e.target.value)}\n autoFocus\n data-testid=\"embedded-auth-password-input\"\n />\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!masterPassword}\n data-testid=\"embedded-auth-continue-button\"\n >\n Continue\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={cancelSso}\n data-testid=\"embedded-auth-cancel-button\"\n >\n Cancel\n </Button>\n </form>\n ) : isSsoOnly ? (\n <>\n <p className=\"text-sm text-muted-foreground\">\n Please sign in with your organization account.\n </p>\n <Button\n onClick={() => void startSso()}\n className=\"w-full\"\n data-testid=\"embedded-auth-sso-button\"\n >\n <LogIn className=\"mr-2 h-4 w-4\" />\n Sign in with {ssoName}\n </Button>\n </>\n ) : (\n <>\n <form onSubmit={(e) => void signInLocally(e)} className=\"space-y-3\">\n <Input\n type=\"email\"\n placeholder=\"Email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={isAuthenticating}\n data-testid=\"embedded-auth-email-input\"\n />\n <Input\n type=\"password\"\n placeholder=\"Password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n disabled={isAuthenticating}\n data-testid=\"embedded-auth-password-input\"\n />\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isAuthenticating}\n data-testid=\"embedded-auth-signin-button\"\n >\n {isAuthenticating ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Signing in...\n </>\n ) : (\n 'Sign In'\n )}\n </Button>\n </form>\n\n {onSsoSignIn && (\n <>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <span className=\"w-full border-t\" />\n </div>\n <div className=\"relative flex justify-center text-sm uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">Or</span>\n </div>\n </div>\n\n <Button\n onClick={() => void startSso()}\n className=\"w-full\"\n variant=\"outline\"\n data-testid=\"embedded-auth-sso-option-button\"\n >\n <LogIn className=\"mr-2 h-4 w-4\" />\n Sign in with {ssoName} (SSO)\n </Button>\n </>\n )}\n </>\n )}\n </div>\n )\n}\n","import { createContext, useContext, useEffect, useState, useRef, type ReactNode } from 'react'\nimport {\n DocumentReview,\n useArbiSessionState,\n useArbiSessionStore,\n useDocument,\n useDocuments,\n useDownloadDocuments,\n useUploadDocuments,\n useWorkspaceRole,\n} from '@arbidocs/react'\nimport { Button, Input, getDocumentTitle } from '@arbidocs/react/ui'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { ArrowLeft, ChevronRight, Download, FileText, MessageSquare, Upload } from 'lucide-react'\nimport { ArbiHost, useHost } from '../../provider/host'\nimport type { OpenDocumentOptions } from '../../provider/environment'\nimport { MobileAppBar } from '../../shell/MobileBars'\nimport { Sidebar } from '../../shell/Sidebar'\n\ninterface OpenFile {\n id: string\n options?: OpenDocumentOptions\n workspaceId: string | null\n}\ninterface Navigation {\n section: 'main' | 'documents' | 'document'\n file: OpenFile | null\n main: () => void\n documents: () => void\n open: (id: string, options?: OpenDocumentOptions) => void\n}\nconst Context = createContext<Navigation | null>(null)\nexport function useEmbeddedNavigation() {\n return useContext(Context)\n}\n\n/** Local navigation: the same session, one visible section, no implicit workspace switch. */\nexport function EmbeddedNavigation({ children }: { children: ReactNode }) {\n const host = useHost()\n const session = useArbiSessionStore()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: availableDocuments } = useDocuments()\n const [section, setSection] = useState<Navigation['section']>('main')\n const [file, setFile] = useState<OpenFile | null>(null)\n useEffect(() => {\n setSection('main')\n setFile(null)\n }, [workspaceId])\n const main = () => setSection('main')\n const documents = () => setSection('documents')\n const open = (id: string, options?: OpenDocumentOptions) => {\n if (options?.workspaceId && options.workspaceId !== workspaceId) return\n if (!availableDocuments?.some((doc) => doc.external_id === parseVersionRef(id).docId)) return\n session.setActiveCitationKey(null)\n setFile({ id, options, workspaceId })\n setSection('document')\n }\n return (\n <Context.Provider value={{ section, file, main, documents, open }}>\n <ArbiHost\n config={{\n environment: {\n ...host.environment,\n openDocument: host.environment?.openDocument ?? open,\n },\n }}\n >\n {children}\n </ArbiHost>\n </Context.Provider>\n )\n}\n\n/** Reuses the main app's mobile bar and sidebar navigation, contained in this embedded window. */\nexport function EmbeddedTopbar({\n title,\n workspace,\n actions,\n}: {\n title: string\n workspace: ReactNode\n actions: ReactNode\n}) {\n const nav = useEmbeddedNavigation()\n const [menu, setMenu] = useState(false)\n const { data: docs = [] } = useDocuments()\n const file = docs.find(\n (d) => d.external_id === (nav?.file ? parseVersionRef(nav.file.id).docId : '')\n )\n const destination =\n nav?.section === 'documents' ? 'Documents' : file ? getDocumentTitle(file) : 'Document'\n const go = (to: 'main' | 'documents') => {\n setMenu(false)\n if (to === 'main') nav?.main()\n else nav?.documents()\n }\n return (\n <>\n <MobileAppBar\n showMenu\n onMenu={() => setMenu(true)}\n className=\"h-12 sm:flex bg-primary text-primary-foreground [&_button]:text-primary-foreground [&_button:hover]:bg-primary-foreground/10\"\n title={\n nav?.section === 'main' ? (\n workspace\n ) : (\n <div className=\"flex min-w-0 items-center gap-1 text-sm\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => go('main')} className=\"h-8 px-1\">\n <ArrowLeft className=\"size-3.5\" /> Main\n </Button>\n <ChevronRight className=\"size-3 shrink-0 opacity-60\" />\n <span className=\"truncate\">{destination}</span>\n </div>\n )\n }\n actions={actions}\n />\n {menu && (\n <Sidebar.Root\n mode=\"drawer\"\n expanded\n contained\n onBackdropClick={() => setMenu(false)}\n aria-label=\"Embedded navigation\"\n >\n <Sidebar.DrawerHeader\n logo={<span className=\"font-semibold\">{title}</span>}\n onClose={() => setMenu(false)}\n />\n <Sidebar.Nav\n items={[\n {\n id: 'chat',\n label: 'Chat',\n icon: <MessageSquare className=\"size-4\" />,\n active: nav?.section === 'main',\n onSelect: () => go('main'),\n },\n {\n id: 'documents',\n label: 'Documents',\n icon: <FileText className=\"size-4\" />,\n active: nav?.section !== 'main',\n onSelect: () => go('documents'),\n },\n ]}\n />\n </Sidebar.Root>\n )}\n </>\n )\n}\n\n/** The Documents section is a sibling of Chat; opening a document never mounts a second pane. */\nexport function EmbeddedDocuments() {\n const nav = useEmbeddedNavigation()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: docs = [], isLoading, error } = useDocuments()\n const [search, setSearch] = useState('')\n const upload = useUploadDocuments()\n const role = useWorkspaceRole()\n const input = useRef<HTMLInputElement>(null)\n const [uploadError, setUploadError] = useState<string | null>(null)\n if (!nav || nav.section === 'main') return null\n if (nav.section === 'document' && nav.file?.workspaceId === workspaceId)\n return <EmbeddedDocument file={nav.file} />\n return (\n <section className=\"flex min-h-0 flex-1 flex-col\" aria-label=\"Documents\">\n <div className=\"flex shrink-0 items-center gap-2 p-3\">\n <Input\n aria-label=\"Search documents\"\n placeholder=\"Search documents…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <input\n ref={input}\n className=\"hidden\"\n type=\"file\"\n multiple\n aria-label=\"Upload workspace documents\"\n onChange={(event) => {\n const files = Array.from(event.target.files ?? [])\n event.target.value = ''\n if (files.length && role && role !== 'guest') {\n setUploadError(null)\n void upload\n .mutateAsync({ files })\n .catch((error: unknown) =>\n setUploadError(error instanceof Error ? error.message : 'Upload failed.')\n )\n }\n }}\n />\n <Button\n size=\"icon\"\n variant=\"outline\"\n aria-label=\"Upload documents\"\n title=\"Upload documents\"\n disabled={!role || role === 'guest' || upload.isPending}\n onClick={() => input.current?.click()}\n >\n <Upload className=\"size-4\" />\n </Button>\n </div>\n {uploadError && (\n <p role=\"alert\" className=\"px-3 pb-2 text-xs text-destructive\">\n {uploadError}\n </p>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto p-2\">\n {isLoading ? (\n <p className=\"p-3 text-sm text-muted-foreground\">Loading documents…</p>\n ) : error ? (\n <p role=\"alert\" className=\"p-3 text-sm text-destructive\">\n Could not load documents.\n </p>\n ) : (\n docs\n .filter((d) => getDocumentTitle(d).toLowerCase().includes(search.toLowerCase()))\n .map((doc) => (\n <Button\n key={doc.external_id}\n variant=\"ghost\"\n className=\"h-auto w-full justify-start gap-3 whitespace-normal px-3 py-3 text-left\"\n onClick={() => nav.open(doc.external_id)}\n >\n <FileText className=\"size-5 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{getDocumentTitle(doc)}</span>\n <span className=\"block truncate text-xs font-normal text-muted-foreground\">\n {doc.file_name} · {doc.status}\n </span>\n </span>\n </Button>\n ))\n )}\n {!isLoading && !error && docs.length === 0 && (\n <p className=\"p-3 text-sm text-muted-foreground\">No documents in this workspace.</p>\n )}\n </div>\n </section>\n )\n}\n\nfunction EmbeddedDocument({ file }: { file: OpenFile }) {\n const baseId = parseVersionRef(file.id).docId\n const { data: doc, isLoading, error } = useDocument(baseId, { pollWhileProcessing: true })\n const { downloadDocument, isDownloading } = useDownloadDocuments()\n if (isLoading) return <p className=\"p-4 text-sm text-muted-foreground\">Loading document…</p>\n if (error || !doc || (doc.workspace_ext_id && doc.workspace_ext_id !== file.workspaceId))\n return (\n <p role=\"alert\" className=\"p-4 text-sm text-destructive\">\n This document could not be opened.\n </p>\n )\n return (\n <section className=\"flex min-h-0 flex-1 flex-col\" aria-label=\"Document viewer\">\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-b border-border px-3 py-1\">\n <span\n className=\"min-w-0 truncate text-xs text-muted-foreground\"\n title={doc.file_name ?? undefined}\n >\n {doc.file_name}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={isDownloading}\n onClick={() => void downloadDocument({ ...doc, external_id: file.id })}\n >\n <Download className=\"size-3.5\" /> Original\n </Button>\n </div>\n {['queued', 'processing'].includes(doc.status?.toLowerCase() ?? '') ? (\n <p role=\"status\" className=\"p-4 text-sm text-muted-foreground\">\n Processing document…\n </p>\n ) : (\n <DocumentReview\n docId={file.id}\n doc={{ ...doc, doctags: [] }}\n workspaceId={file.workspaceId ?? undefined}\n activeChunkId={file.options?.passageId}\n className=\"min-h-0 flex-1 rounded-none border-0 [&>div:first-child]:hidden\"\n />\n )}\n </section>\n )\n}\n","import { useAssistantCopy } from '@arbidocs/react/shell'\nimport { browserSessionStateStorage } from '@arbidocs/client'\nimport { useMemo, useState, type ReactNode } from 'react'\nimport {\n useArbi,\n useArbiSession,\n useArbiSessionState,\n useArbiSessionStore,\n useWorkspaces,\n} from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { LogOut, Plus } from 'lucide-react'\nimport { ArbiHost } from '../../provider/host'\nimport {\n ConnectedCompactLogin,\n type ConnectedCompactLoginProps,\n} from '../auth/ConnectedCompactLogin'\nimport { ConnectedCompactConversation } from '../conversation/ConnectedCompactConversation'\nimport { ConnectedConversationDocumentPicker } from '../conversation/ConnectedConversationDocumentPicker'\nimport { defaultHost } from '../defaultHost'\nimport { useOptionalConnection } from '../ConnectionProvider'\nimport { useSelectWorkspace } from '../useSelectWorkspace'\nimport {\n EmbeddedNavigation,\n EmbeddedTopbar,\n EmbeddedDocuments,\n useEmbeddedNavigation,\n} from './EmbeddedNavigation'\n\nexport interface EmbeddedChatPanelProps {\n signedIn: boolean\n login: ReactNode\n header: ReactNode\n platformHeader?: ReactNode\n platformFooter?: ReactNode\n footer?: ReactNode\n onDocumentSelectionChange?: (ids: string[]) => void\n}\n/** Shared layout and chat engine; platform shells supply authentication and native actions. */\nexport function EmbeddedChatPanel(props: EmbeddedChatPanelProps) {\n return (\n <EmbeddedNavigation>\n <EmbeddedPanelContent {...props} />\n </EmbeddedNavigation>\n )\n}\n\nfunction EmbeddedPanelContent({\n signedIn,\n login,\n header,\n platformHeader,\n platformFooter,\n footer,\n onDocumentSelectionChange,\n}: EmbeddedChatPanelProps) {\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const navigation = useEmbeddedNavigation()\n if (!signedIn)\n return (\n <div className=\"h-full min-h-0 overflow-y-auto p-4\" data-testid=\"embedded-panel-login\">\n {login}\n {footer}\n </div>\n )\n return (\n <div\n className=\"relative flex flex-col h-full min-h-0 min-w-0 overflow-hidden bg-background font-sans text-foreground\"\n data-testid=\"embedded-panel\"\n >\n <div className=\"shrink-0\">{header}</div>\n <div className=\"grid min-h-0 flex-1 grid-cols-1 grid-rows-1\">\n <div\n className={cn(\n 'col-start-1 row-start-1 flex min-h-0 flex-col',\n navigation?.section !== 'main' && 'invisible pointer-events-none'\n )}\n >\n {platformHeader && <div className=\"shrink-0\">{platformHeader}</div>}\n {workspaceId ? (\n <ConnectedCompactConversation\n key={workspaceId}\n attachments={\n <ConnectedConversationDocumentPicker\n onSelectionChange={onDocumentSelectionChange}\n />\n }\n />\n ) : (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Select a workspace to start chatting.\n </p>\n )}\n {platformFooter && <div className=\"shrink-0\">{platformFooter}</div>}\n </div>\n {workspaceId && navigation?.section !== 'main' && (\n <div className=\"col-start-1 row-start-1 flex min-h-0 flex-col bg-background\">\n <EmbeddedDocuments />\n </div>\n )}\n </div>\n {footer && <div className=\"shrink-0\">{footer}</div>}\n </div>\n )\n}\n\nfunction EmbeddedWorkspaceHeader({ title }: { title: string }) {\n const navigation = useEmbeddedNavigation()\n const session = useArbiSessionStore()\n const generating = useArbiSessionState(\n (state) => state.generating[state.conversationId || '']?.isGenerating ?? false\n )\n const arbi = useArbi()\n const signedIn = useArbiSession()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: workspaces = [], isLoading, error: listError } = useWorkspaces()\n const select = useSelectWorkspace()\n const connection = useOptionalConnection()\n const [pending, setPending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n async function choose(id: string) {\n if (!id) return\n setPending(true)\n setError(null)\n try {\n await select(id)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not open the workspace.')\n } finally {\n setPending(false)\n }\n }\n return (\n <>\n <EmbeddedTopbar\n title={title}\n workspace={\n <select\n aria-label=\"Workspace\"\n className=\"h-8 min-w-0 w-full rounded-md bg-transparent px-1 text-sm font-medium text-primary-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-foreground/60\"\n value={workspaceId ?? ''}\n disabled={isLoading || pending}\n onChange={(event) => void choose(event.target.value)}\n >\n <option className=\"bg-background text-foreground\" value=\"\" disabled>\n {title} · Select workspace…\n </option>\n {workspaces.map((workspace) => (\n <option\n className=\"bg-background text-foreground\"\n key={workspace.external_id}\n value={workspace.external_id}\n >\n {workspace.name}\n </option>\n ))}\n </select>\n }\n actions={\n <>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-primary-foreground/80 hover:bg-primary-foreground/10 hover:text-primary-foreground\"\n aria-label=\"New chat\"\n title=\"New chat\"\n disabled={generating}\n onClick={() => {\n session.clearConversationError(session.getState().conversationId || 'new')\n session.startNewConversation()\n navigation?.main()\n }}\n >\n <Plus className=\"size-4\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-primary-foreground/80 hover:bg-primary-foreground/10 hover:text-primary-foreground\"\n aria-label=\"Sign out\"\n title={`Sign out ${signedIn.user?.email ?? ''}`}\n onClick={async () => {\n try {\n if (connection) connection.logout()\n else await arbi.logout()\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not sign out.')\n }\n }}\n >\n <LogOut className=\"size-4\" />\n </Button>\n </>\n }\n />\n {(error || listError) && (\n <p role=\"alert\" className=\"shrink-0 px-3 py-1 text-xs text-destructive\">\n {error ?? 'Could not load workspaces.'}\n </p>\n )}\n </>\n )\n}\n\nexport interface ConnectedEmbeddedChatProps extends Pick<\n EmbeddedChatPanelProps,\n 'platformHeader' | 'platformFooter' | 'footer' | 'onDocumentSelectionChange'\n> {\n /** The panel's name. Default: the host's assistant name (\"ARBI\"). */\n title?: string\n /** Override the ready-made frame with ordinary utility classes. */\n className?: string\n login?: ConnectedCompactLoginProps\n}\n/** Use under an existing ArbiHost, sharing its React Query, identity and current workspace. */\nexport function ConnectedEmbeddedChat({\n title: titleProp,\n className,\n login,\n ...props\n}: ConnectedEmbeddedChatProps) {\n const session = useArbiSession()\n const assistantName = useAssistantCopy().name\n const title = titleProp ?? assistantName\n return (\n <div\n className={cn(\n 'h-[calc(100dvh-2rem)] sm:h-[min(40rem,calc(100dvh-2rem))] w-full max-w-md min-h-0 overflow-hidden rounded-2xl border border-border bg-background shadow-xl',\n className\n )}\n >\n <EmbeddedChatPanel\n {...props}\n signedIn={session.status === 'signed-in'}\n header={<EmbeddedWorkspaceHeader title={title} />}\n login={\n <>\n <h1 className=\"font-semibold mb-4\">{title}</h1>\n <ConnectedCompactLogin {...login} />\n </>\n }\n />\n </div>\n )\n}\n\nexport interface ArbiChatProps extends ConnectedEmbeddedChatProps {\n apiUrl: string\n /** Override the standard panel sizing and frame. */\n className?: string\n deploymentDomain?: string\n}\n/** Standalone live chat. No automatic choice of the first available workspace. */\nexport function ArbiChat({ apiUrl, deploymentDomain, className, ...props }: ArbiChatProps) {\n const host = useMemo(\n () =>\n defaultHost(\n {\n apiUrl,\n deploymentDomain,\n requireWorkspaceSelection: true,\n demoUser: { name: '', email: '' },\n },\n { sessionStorage: browserSessionStateStorage(`embed:${apiUrl}`) }\n ),\n [apiUrl, deploymentDomain]\n )\n return (\n <ArbiHost key={`${apiUrl}|${deploymentDomain ?? ''}`} config={host}>\n <ConnectedEmbeddedChat {...props} className={className} />\n </ArbiHost>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection/entities/renderConnectedUser.tsx","../src/connection/remote-control/remoteControl.ts","../src/connection/defaultHost.tsx","../src/connection/auth/support.ts","../src/connection/settings-page/SessionStatusIcon.tsx","../src/connection/ConnectedSettings.tsx","../src/connection/config/useModelPicker.ts","../src/connection/config/ConnectedModelSelector.tsx","../src/connection/tips/useContextualHints.ts","../src/connection/conversation/ConversationComposer.tsx","../src/connection/conversation/MessageLiveSeconds.tsx","../src/connection/conversation/AgentSteps.tsx","../src/connection/conversation/RunningSubagents.tsx","../src/connection/conversation/AnswerTable.tsx","../src/connection/conversation/useOpenChunk.ts","../src/connection/conversation/useWorkspaceDocTitles.ts","../src/connection/conversation/ConnectedCitationRenderer.tsx","../src/connection/conversation/MessageDetailsModal.tsx","../src/connection/conversation/useOpenWorkspaceIcon.tsx","../src/connection/conversation/AskAgainContext.ts","../src/connection/conversation/WorkflowStepMessage.tsx","../src/connection/conversation/ConnectedMessage.tsx","../src/connection/conversation/ConnectedBranchControls.tsx","../src/connection/conversation/ConnectedThreadsPreview.tsx","../src/chat/messageRowSize.ts","../src/connection/conversation/ConnectedMessageList.tsx","../src/connection/conversation/ConnectedMessageArea.tsx","../src/connection/conversation/ConnectedCompactConversation.tsx","../src/connection/conversation/ConnectedConversationDocumentPicker.tsx","../src/connection/auth/ConnectedForgotPassword.tsx","../src/connection/auth/signup-backup.ts","../src/connection/auth/useLoginActions.ts","../src/connection/auth/useLoginForm.ts","../src/connection/auth/useSsoVerificationRedirect.ts","../src/connection/auth/ConnectedLoginPage.tsx","../src/connection/auth/sso-name.ts","../src/connection/auth/sso-sign-in.ts","../src/connection/auth/ConnectedCompactLogin.tsx","../src/connection/embedded/EmbeddedNavigation.tsx","../src/connection/embedded/EmbeddedChatPanel.tsx"],"names":["jsx","ConnectedUserEntity","remoteControlActions","remoteControlStateOf","logger","isSurfaceMounted","toRemoteControlRequest","cancelGuidedRun","useArbiSessionStore","useGuidedRuns","useMemo","useArbiHost","useArbiSession","useEffect","useRef","useConnection","ArbiWebSocketProvider","useBlocksEnvironment","useOfflineMailRuntime","OUTBOX_FOLDER","sessionStorage","client","createArbiQueryClient","Arbi","browserSessionStateStorage","QueryClientProvider","ConnectionProvider","useHost","DEFAULT_PASSWORD_RULES","ArbiBotHeadIcon","Monitor","notify","useProfile","useUpdateProfile","useRequestEmailChange","useConfirmEmailChange","useNameEditor","useAvatarCrop","useEmailChange","jsxs","SettingsSection","UserCircle","ProfileCard","Fragment","AvatarPicker","initials","ImageCropModal","useIdentityVerification","IdentityVerificationCard","IdentityVerificationDialog","usePasswordChange","usePasswordChangeForm","PasswordChangeDialog","useState","KeyRound","SettingsCard","SettingsActionRow","EMAIL_NOTIFICATION_CATEGORIES","EMAIL_NOTIFICATION_KEYS","useNotificationPreferences","NotificationCategoryList","toNotificationCategories","useSessions","useCurrentSessionId","useTerminateSession","toActiveSessionViews","SettingsRow","Button","Radio","ActiveSessionsDialog","useSignOut","useIsOnline","confirmLosingOfflineMail","LogoutDialog","isAgent","toLogoutSessionViews","useDeleteAccount","useDeleteAccountFlow","SettingsDangerZone","DeleteAccountDialog","toDeleteBlockerViews","useAvailableModels","useUserSettings","useApplyChatModel","useArbiSessionState","useConfig","resolveConfigModel","standardTier","premiumTier","AUTO_CHAT_MODEL","useCallback","formatGbpPerMillionTokens","ARBI_MARK_SRC","ModelTierIcon","ModelAutoIcon","ProviderIcon","ModelDot","ModelPricingTip","ModelPickerPopover","ModelPickerTrigger","ModelOption","ModelMenuDivider","ModelTierOption","ModelConfigureButton","ModelMenuMessage","TooltipProvider","Tooltip","TooltipTrigger","Select","SelectTrigger","cn","ModelTriggerContent","SelectContent","SelectItem","ModelOptionLabel","TooltipContent","useTransientView","TIPS_VISIBILITY_OVERRIDE","useUpdateUserSettings","setHintsSessionOverride","selectDraft","useLongPaste","useLayoutEffect","useSlashItems","BUILTIN_SKILLS","useWorkspaceUsers","useAssistantName","buildMentionCandidates","useMentionAutocomplete","useConversations","useRecipientDraft","useAssistantCopy","useListKeyNav","Composer","SlashMenu","MentionMenu","Settings","ContextUsageBar","ConversationComposer","memo","useMessageTimer","React","getModelIcon","useDocuments","getDocumentTitle","mergeAgentSteps","extractSubagentLanes","getCurrentStep","getAgentStepPresentation","getStepDisplay","stepAccent","MODEL_TIER_ICON_MAP","StepRow","MODEL_TIER_LABELS","formatTokens","formatGbp","StepNarration","ConnectedMarkdown","StepSummary","StepDetail","StepOutcome","StepParams","GoalCriteria","SubStepGroup","computeRunStats","StepTraceSummary","isNearAiUsageBudget","StepTrace","SubAgentLane","subagentJobLabel","getAgentStepLabel","getStepTool","useConversationData","findLeafForTaskMessage","SubagentRoster","downloadTableAsCsv","ChevronRight","Download","citedVersionRef","workspaceDocIdFromHref","InternalDocLink","ExternalLink","CitationRendererCore","useMessageDetails","Dialog","DialogContent","ModalBreadcrumbHeader","FileText","ModalCrumbs","Loader2","MessageJsonTree","useWorkspaces","ShieldIcon","workspaceKindColor","getWorkspaceKind","createContext","useConversationItems","useConversationActivity","fromPlanSteps","stepStatesFromActivity","stepDocuments","splitDocRef","WorkflowStepChip","stepKindOf","stepPhase","useLinkMentions","useDeleteMessage","getSubagentBranchRecord","useMessageChatArtifact","findMessageDocument","artifactKindFromFileName","isImageDocument","viewerTabForArtifactMode","transcriptSegmentOf","citationData","buildCitationChunkData","useThinkingContent","getCurrentAgentStepPresentation","useContext","buildFactCitations","topLevelAgentSteps","buildDeepLinkPath","copyMessageToClipboard","err","useConversationWorkspace","useCreateFact","useCreateFacts","chronologyFactBodies","formatFriendlyDate","useTranscriptRuns","Edit3","Copy","Link","Share2","Trash2","MessageActionMenu","MessageActionButton","Check","Milestone","MessageFooter","DocumentUser","AssistantEntity","RotateCcw","workflowStepOf","getUserDisplayName","TranscriptEntry","stripSpeakerPrefix","ErrorBoundary","MessageRoot","MessageContent","MessageAuthor","MessageBubble","MessageByline","MessageSubagentBadge","MessageBody","MessageNarration","Clock","MessageArtifactCard","BranchControls","getEntityLabel","Network","EntityIcon","ThreadVisualizer","getParticipantTints","useBranchNavigation","findMainSiblingLeaf","sliceToSubagentThread","useStreamAnnouncement","stripThinking","useConnectedThreadActivity","useVirtualizer","flashMessage","MessageList","ThreadActivity","forwardRef","useConversationTurn","useSlashSkillWorkflows","useAutoSendDraft","CompactChatContext","EmptyState","MessageSquare","ComposerContainer","ArrowDown","Square","Send","useUploadDocuments","useWorkspaceRole","Popover","PopoverTrigger","Paperclip","PopoverContent","Upload","Search","Checkbox","Eye","X","useArbi","validateRecoveryKeyFile","RECOVERY_KEY_ERRORS","decryptRecoveryKey","parseAuthError","AccountRecoveryDialog","promptSaveCredential","downloadRecoveryFile","useOptionalConnection","firstName","splitAuthHash","withTrailingFragment","prefetchChunk","initSodium","useFragmentCredentials","parseRecoveryUrl","AuthOfflineBadge","AuthTabs","AuthLayout","AuthHeading","AuthField","AuthLink","AuthFieldBadge","BadgeCheck","AuthInput","AuthNote","PasswordStrengthInput","RevealablePasswordInput","prewarmKeyPairs","AuthConsent","AuthSubmitButton","AuthDivider","LinkedInIcon","GoogleIcon","AppleIcon","login","Input","LogIn","parseVersionRef","ArbiHost","MobileAppBar","ArrowLeft","Sidebar","error","useDocument","useDownloadDocuments","DocumentReview","useSelectWorkspace","Plus","LogOut"],"mappings":"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","file":"chunk-6DCIZA3X.cjs","sourcesContent":["import type { DocumentsSupport } from '@arbidocs/react'\nimport { ConnectedUserEntity } from './ConnectedUserEntity'\n\n/**\n * People in the document kits (a version's author, a comment, an activity entry) as connected\n * entities: the host configuration's `documents.renderUser`.\n */\nexport const renderConnectedUser: NonNullable<DocumentsSupport['renderUser']> = (\n user,\n { tooltip, variant = 'icon' }\n) => (\n <ConnectedUserEntity\n user={user}\n size={variant === 'pill' ? 'sm' : 'xs'}\n variant={variant}\n showTooltip={tooltip}\n />\n)\n","/**\n * Remote-control orchestration — the frontend side of \"a backend agent drives the UI over the\n * websocket\" (the message and the session state: `@arbidocs/react`'s remote-control module).\n *\n * This is the SEPARATE, gated entry point for websocket-arriving runs. It is deliberately distinct\n * from a site's `GuidedRuns.run` so that local \"Show me\" tips (which run directly) are NEVER gated\n * by consent — GUARANTEE #4. Only runs that arrive here, from the socket, pass through the gate.\n *\n * Gate logic (`handleMessage`):\n * - the site has not turned remote control on (`guided.remoteControl`), or the consent prompt or\n * the guided cursor is not on screen → refuse: nothing runs, nothing is asked.\n * - remote control `enabled` this session → run immediately.\n * - otherwise → stash the request in `pending` (the consent prompt opens); run NOTHING until the\n * user grants (GUARANTEE #2).\n *\n * What a remote command can run: a `sequence_id` the site registered (`GuidedRuns.isSequenceId`)\n * or inline `steps` whose every step has a target, through the one guided runner — nothing else\n * (no action dispatch). In a remote run the runner acts only on what the user can see, caps waits\n * and pauses at 5 s, and never acts inside an off-limits surface (remote control's own controls,\n * so a one-off grant cannot grant itself the session; credential and endpoint forms) nor on a\n * label whose control is inside one; no guided run types into a secret field.\n *\n * Every sign-in, sign-out, session expiry and change of user drops the grant, any pending request\n * and the run in flight (`useRemoteControlSessionReset`, mounted with the handler and the cursor),\n * so nothing carries over to the next person in the tab.\n *\n * While a run executes, `controllingAgent` is set (labels the pill) and cleared afterwards.\n * Turning remote control off (`disable`) cancels any in-flight run immediately (GUARANTEE #5).\n */\nimport { useEffect, useMemo, useRef } from 'react'\nimport { logger } from '@arbidocs/client'\nimport {\n remoteControlActions,\n remoteControlStateOf,\n toRemoteControlRequest,\n useArbiHost,\n useArbiSession,\n useArbiSessionStore,\n type ArbiWsHandlers,\n type GuidedStep,\n type RemoteControlMessage,\n type RemoteControlRequest,\n type RemoteControlSession,\n} from '@arbidocs/react'\nimport { cancelGuidedRun } from '../../guided/runner'\nimport type { GuidedRuns } from '../../guided/sequences'\nimport { useGuidedRuns } from '../../guided/useGuidedRuns'\nimport { isSurfaceMounted } from '../../guided/surfaces'\n\nexport interface RemoteControl {\n /** The websocket entry point, for a `remote_control` message. Gated (see the file header). */\n handleMessage(msg: RemoteControlMessage): void\n /**\n * Grant the pending consent and run it. `forSession: true` keeps remote control enabled so\n * later websocket runs go without re-prompting; `false` runs the one pending run and leaves it\n * disabled (\"just this once\").\n */\n grantAndRun(opts: { forSession: boolean }): void\n /** Deny the pending consent — clears it and runs nothing. */\n deny(): void\n /**\n * Turn remote control OFF and revoke immediately (GUARANTEE #5): clears the enabled flag, the\n * pending prompt and the pill, and cancels any in-flight run so the guided cursor stops at once.\n */\n disable(): void\n /** Turn remote control ON directly — the user's own explicit choice. Runs nothing by itself. */\n enable(): void\n}\n\n/** Remote control on a session's state, running the site's guided runs. */\nexport function createRemoteControl(\n session: RemoteControlSession,\n guided: Pick<GuidedRuns, 'isSequenceId' | 'run' | 'remoteControl'>\n): RemoteControl {\n const actions = remoteControlActions(session)\n const state = () => remoteControlStateOf(session.getState())\n\n /** Resolve a request to the concrete run input for the runner. */\n const resolveRun = (req: RemoteControlRequest): string | GuidedStep[] | null => {\n if (req.steps && req.steps.length > 0) return req.steps\n if (req.sequenceId && guided.isSequenceId(req.sequenceId)) return req.sequenceId\n return null\n }\n\n /** Execute a request, labelling the pill for its duration. The ONLY place a websocket-arriving\n * run reaches the runner. */\n const runRemoteRequest = async (req: RemoteControlRequest): Promise<void> => {\n const run = resolveRun(req)\n if (!run) return\n actions.setControllingAgent({ name: req.agentName, extId: req.agentExtId })\n try {\n await guided.run(run, { remote: true })\n } finally {\n // Only clear the pill if THIS run is still the active one — a newer run or a disable will\n // have replaced/cleared it already.\n const current = state().controllingAgent\n if (current && current.name === req.agentName && current.extId === req.agentExtId) {\n actions.setControllingAgent(null)\n }\n }\n }\n\n return {\n handleMessage(msg) {\n if (!guided.remoteControl) {\n logger.warn('[RemoteControl] Off on this site — ignoring a request')\n return\n }\n if (!isSurfaceMounted('consent') || !isSurfaceMounted('cursor')) {\n logger.warn('[RemoteControl] No consent prompt or cursor on screen — ignoring a request')\n return\n }\n const req = toRemoteControlRequest(msg, guided.isSequenceId)\n if (!req) return\n if (state().enabled) {\n logger.info('[RemoteControl] Enabled — running requested action from', req.agentName)\n void runRemoteRequest(req)\n return\n }\n logger.info('[RemoteControl] Consent required — prompting for', req.agentName)\n actions.request(req)\n },\n grantAndRun(opts) {\n const pending = state().pending\n actions.grant(opts)\n if (pending) void runRemoteRequest(pending)\n },\n deny: () => actions.deny(),\n disable() {\n actions.setEnabled(false)\n cancelGuidedRun()\n },\n enable: () => actions.setEnabled(true),\n }\n}\n\n/** Remote control on the host's session and guided runs. */\nexport function useRemoteControlActions(): RemoteControl {\n const session = useArbiSessionStore()\n const guided = useGuidedRuns()\n return useMemo(() => createRemoteControl(session, guided), [session, guided])\n}\n\n/**\n * Drop remote control's grant, its pending request and the guided run in flight on every sign-in,\n * sign-out and session expiry of the host's `Arbi`, and whenever the signed-in user changes (a\n * host that signs in its own way), so nothing carries over to the next person in the tab.\n */\nexport function useRemoteControlSessionReset(): void {\n const session = useArbiSessionStore()\n const { arbi } = useArbiHost()\n const userId = useArbiSession().user?.external_id ?? null\n useEffect(() => {\n const reset = () => {\n remoteControlActions(session).reset()\n cancelGuidedRun()\n }\n if (!arbi) return\n // A host's stand-in `Arbi` (a demo, a test) may lack some of them.\n const off = [\n arbi.onSigningOut?.(reset),\n arbi.onSessionExpired?.(reset),\n arbi.onSignedIn?.(reset),\n ]\n return () => off.forEach((unsubscribe) => unsubscribe?.())\n }, [arbi, session])\n const lastUser = useRef(userId)\n useEffect(() => {\n if (lastUser.current === userId) return\n lastUser.current = userId\n remoteControlActions(session).reset()\n cancelGuidedRun()\n }, [userId, session])\n}\n\n/**\n * The live connection's handler for remote control (`ArbiWebSocketProvider` `handlers`): an\n * `agt-…` agent asking to drive the UI goes to the consent-gated entry point. None while the\n * site has not turned remote control on (`guided.remoteControl`). It also drops the grant and\n * the run in flight at every sign-in and sign-out (`useRemoteControlSessionReset`).\n */\nexport function useRemoteControlHandlers(): ArbiWsHandlers {\n useRemoteControlSessionReset()\n const remote = useRemoteControlActions()\n const { remoteControl } = useGuidedRuns()\n return useMemo(\n () =>\n remoteControl\n ? {\n remote_control: (message) =>\n remote.handleMessage(message as unknown as RemoteControlMessage),\n }\n : {},\n [remote, remoteControl]\n )\n}\n","/**\n * The host configuration of a blocks-only site (Clarum, the custom site starter): an `Arbi` on the\n * site's backend and the sign-in layer (demo or live login, the selected workspace, the live\n * connection), with React Query, people in the document kits as connected entities, and mail kept\n * on the device (`useOfflineMailRuntime`: the Outbox and changes made offline go out on reconnect,\n * and recent mail stays readable offline).\n *\n * const host = defaultHost({ apiUrl, demoUser, … }) // once, at module scope\n * <ArbiHost config={{ ...host, environment: { navigate }, billing }}>\n * <Site />\n * </ArbiHost>\n *\n * With no live `apiUrl` the `Arbi` points at `demoApiUrl` (cheap, inert) and the site runs in\n * seeded demo mode. A site with its own login passes its own `arbi` and `session` instead.\n */\nimport type { ReactNode } from 'react'\nimport { type QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport {\n ArbiWebSocketProvider,\n createArbiQueryClient,\n OUTBOX_FOLDER,\n useOfflineMailRuntime,\n} from '@arbidocs/react'\nimport { Arbi } from '@arbidocs/sdk/browser'\nimport { browserSessionStateStorage, type SessionStateStorage } from '@arbidocs/client'\nimport type { ArbiHostConfig } from '../provider/host'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\nimport { renderConnectedUser } from './entities/renderConnectedUser'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { useRemoteControlHandlers } from './remote-control/remoteControl'\n\nexport interface DefaultHostOptions {\n /** The React Query client the kits share. Default: a new `createArbiQueryClient()`. */\n queryClient?: QueryClient\n /** Optional session state adapter; embedded hosts isolate deployment tokens. */\n sessionStorage?: SessionStateStorage\n}\n\n/**\n * The shared WebSocket, open while signed in live (demo and signed-out sessions have no backend),\n * with remote control's consent-gated handler where the site turned it on (`guided.remoteControl`;\n * none otherwise). Every sign-in and sign-out drops remote control's grant and stops a guided run.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider\n enabled={status === 'authenticated'}\n handlers={useRemoteControlHandlers()}\n >\n {children}\n </ArbiWebSocketProvider>\n )\n}\n\n/** Mail kept on this device, for the signed-in user with Mail on (see `useOfflineMailRuntime`). */\nfunction OfflineMail({ children }: { children: ReactNode }) {\n const { openMail } = useBlocksEnvironment()\n useOfflineMailRuntime({ openOutbox: () => openMail?.({ folder: OUTBOX_FOLDER }) })\n return children\n}\n\n/** `arbi` and the sign-in layer (`connection`) for `<ArbiHost config>`. Call it once per site. */\nexport function defaultHost(\n config: ArbiConnectionConfig,\n { queryClient, sessionStorage }: DefaultHostOptions = {}\n): Pick<ArbiHostConfig, 'arbi' | 'connection' | 'documents'> {\n // ARBI-frontend's client: its freshness, retries and write notices (`@arbidocs/react`).\n const client = queryClient ?? createArbiQueryClient().queryClient\n const arbi = new Arbi({\n url: config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local',\n deploymentDomain: config.deploymentDomain,\n // Live: the signed-in session survives a reload (the connection restores it).\n sessionStorage: config.apiUrl ? (sessionStorage ?? browserSessionStateStorage()) : undefined,\n })\n // What was read for the user never outlives their session, signed out or expired: the next one\n // starts from an empty cache (the same client, so every hook keeps it). Its keys are not per user.\n arbi.onSigningOut(() => client.clear())\n arbi.onSessionExpired(() => client.clear())\n function DefaultHostConnection({ children }: { children: ReactNode }) {\n return (\n <QueryClientProvider client={client}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>\n <OfflineMail>{children}</OfflineMail>\n </ConnectionBoundWebSocket>\n </ConnectionProvider>\n </QueryClientProvider>\n )\n }\n // People in the document kits as connected entities (presence, \"You\", a click opens a chat).\n return {\n arbi,\n connection: { Provider: DefaultHostConnection },\n documents: { renderUser: renderConnectedUser },\n }\n}\n","/**\n * What a site gives the connected sign-in kits (`ConnectedLoginPage`, `ConnectedForgotPassword`,\n * `ConnectedRecoveryKeyDialog`), once, in its host configuration:\n *\n * - `auth`: the look of the auth pages (brand, the panel beside the form, the footer, the legal\n * links), the password rules, and what the site does around a sign-in (a fresh registration's\n * landing, an invitation's return path);\n * - `sso`: the single sign-on provider, as a hook (its state is live). Blocks ship an Auth0 one; a\n * site without SSO leaves it out and the SSO affordances are hidden.\n */\n\nimport type { ReactNode } from 'react'\nimport type { LoginResult } from '@arbidocs/client'\nimport type { AuthLegalLink } from '../../auth/AuthFooter'\nimport type { PasswordRules } from '../../auth/password-rules'\nimport { DEFAULT_PASSWORD_RULES } from '../../auth/password-rules'\nimport { useHost } from '../../provider/host'\n\nexport interface AuthPagesSupport {\n /** The brand mark at the top of every auth page. */\n brand?: ReactNode\n /** The corner of the auth pages (ARBI shows the deployment there). */\n corner?: ReactNode\n /** The panel beside the sign-in and registration forms. */\n aside?: ReactNode\n /** Under the sign-in form (privacy link, install options). */\n footer?: ReactNode\n /** Above the form (a warning that this browser cannot keep the session, say). */\n banner?: ReactNode\n /** Shown while the page hands over to the SSO provider. */\n loading?: ReactNode\n /** The sign-up consent: the legal documents and the warning without a recovery key. */\n consent?: {\n termsLink: AuthLegalLink\n privacyLink: AuthLegalLink\n noRecoveryKeyWarning?: string\n }\n /** The rules a new password must meet. Default: `DEFAULT_PASSWORD_RULES`. */\n passwordRules?: PasswordRules\n /** Only SSO: the page hands straight over to the provider. */\n ssoOnly?: boolean\n /**\n * Visitors can create an account here. Default: on. Off (a staff-only site whose accounts are\n * made for people): the page signs in only, with no Register tab.\n */\n allowRegistration?: boolean\n /** The sign-in heading and the line under it. Default: \"Welcome back\". */\n heading?: { title: string; description?: ReactNode }\n /** The email field's label on sign-in. Default: \"Email\". */\n emailLabel?: string\n /**\n * Sign in from `#email=…&password=…[&next=…]` (mock and demo deployments only; see\n * `useFragmentCredentials`). A `next` path goes to `onReturnPath`. Default: off.\n */\n fragmentSignIn?: boolean\n /** The visitor started to sign in: warm what the signed-in app needs. */\n onIntent?: () => void\n /** An invitation link carries where to go once signed in. */\n onReturnPath?: (path: string) => void\n /** A fresh registration signed in (the site's first landing; its workspaces are in the login). */\n onRegistered?: (login: LoginResult) => void\n /** Signed in with a recovery key: the site asks for a new password. */\n onRecovered?: () => void\n /** Signed in on this device while offline. */\n onUnlockedOffline?: () => void\n /** The SSO provider's email verification failed, with its message. Default: a notice. */\n onVerificationFailed?: (message: string) => void\n}\n\n/** The account signed in at the SSO provider (its claims). */\nexport interface SsoUser {\n /** The provider's id of the account: an SSO account's recovery key is sealed to it. */\n sub: string\n email?: string\n name?: string\n given_name?: string\n family_name?: string\n picture?: string\n}\n\n/** The single sign-on provider as the kits see it. */\nexport interface SsoSignIn {\n /** SSO can run in this browser (Auth0 needs a secure origin). */\n available: boolean\n /** The provider is still settling (after a redirect back). */\n isLoading: boolean\n /** Signed in at the provider. */\n isAuthenticated: boolean\n /** The account signed in at the provider; `null` when none. */\n user: SsoUser | null\n /**\n * Hand over to the provider's sign-in. It comes back to `returnTo` (the site's path), or to\n * `redirectUri` (an absolute callback); `consent` asks again (after an email verification).\n */\n signIn(options?: {\n returnTo?: string\n redirectUri?: string\n consent?: boolean\n connection?: string\n }): Promise<void>\n /** Sign out at the provider, coming back to `returnTo`. */\n signOut(options?: { returnTo?: string }): void\n /** The provider's token for the signed-in account, or `null`. */\n getToken(): Promise<string | null>\n /**\n * Where to continue a provider-side account link (`link`) or give it up (`cancel`), for the\n * linking `state` the provider sent back. Absent: the provider links no accounts.\n */\n continueUrl?(action: 'link' | 'cancel', state: string): string\n}\n\nexport interface SsoSupport {\n /** The provider's live state and actions. */\n useSignIn(): SsoSignIn\n}\n\nconst NO_SSO: SsoSignIn = {\n available: false,\n isLoading: false,\n isAuthenticated: false,\n user: null,\n signIn: () => Promise.reject(new Error('No SSO provider is configured')),\n signOut: () => {},\n getToken: async () => null,\n}\n\n/** The auth pages' configuration, with its defaults. */\nexport function useAuthPages(): AuthPagesSupport & { passwordRules: PasswordRules } {\n const auth = useHost().auth\n return { ...auth, passwordRules: auth?.passwordRules ?? DEFAULT_PASSWORD_RULES }\n}\n\n/** The SSO provider; none (unavailable) without one. */\nexport function useSsoSignIn(): SsoSignIn {\n const sso = useHost().sso\n // A host's `sso` is fixed for its lifetime, so the hook is called on every render or never.\n return sso ? sso.useSignIn() : NO_SSO\n}\n","import { Monitor } from 'lucide-react'\nimport { ArbiBotHeadIcon } from '@arbidocs/react'\n\n/** The glyph of a signed-in session: an agent's bot head, else a device. */\nexport function SessionStatusIcon({ status, className }: { status: string; className?: string }) {\n if (status === 'agent') return <ArbiBotHeadIcon className={className ?? 'w-4 h-4'} />\n return <Monitor className={className ?? 'w-4 h-4 text-muted-foreground'} />\n}\n\n/** `renderSessionIcon` default of the session lists. */\nexport const renderSessionStatusIcon = (status: string) => <SessionStatusIcon status={status} />\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 * `defaultHost`'s sign-in layer gives one over the SDK; a host with its own session and API\n * client gives its own as its host config's `account` (as ARBI-frontend does), and these sections\n * work alike.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n confirmLosingOfflineMail,\n ImageCropModal,\n useArbiSession,\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/core'\nimport { Button, type IdentityStatus, isAgent } 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 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/environment'\nimport { useAuthPages } from './auth/support'\nimport { renderSessionStatusIcon } from './settings-page/SessionStatusIcon'\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 /** Classes of the initials avatar shown without a picture (e.g. the host's per-user colour). */\n avatarClassName?: string\n /** A compact status beside the profile name. */\n nameBadge?: ReactNode\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 avatarClassName = 'bg-primary text-primary-foreground',\n nameBadge,\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=\"Profile\">\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 nameBadge={nameBadge}\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 /** Collapse the secondary settings card by default. */\n collapsible?: boolean\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 collapsible,\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\n flow={flow}\n labels={labels}\n onManageBilling={onManageBilling}\n collapsible={collapsible}\n />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n onManageBilling={onManageBilling}\n />\n </>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\nexport interface ConnectedPasswordChangeDialogProps {\n open: boolean\n onClose: () => void\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 recoveryMode = false,\n onRecoveryComplete,\n}: ConnectedPasswordChangeDialogProps) {\n const { notify } = useBlocksEnvironment()\n // The site's password rules (the host configuration's `auth`).\n const getUnmetRequirement = useAuthPages().passwordRules.unmet\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 /** 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({ children }: 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 open={open} onClose={() => setOpen(false)} />\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}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\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=\"Notifications\">\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; default `SessionStatusIcon`. */\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** \"Active sessions\" row with the manage dialog (`ActiveSessionsDialog`); end any but this device. */\nexport function ConnectedSessionsRow({\n renderSessionIcon = renderSessionStatusIcon,\n}: 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 /**\n * Ask before signing out; resolve `false` to stay signed in. Default: ask when unsent mail,\n * drafts or changes are kept only on this device (`confirmLosingOfflineMail`, which looks at the\n * device itself, so it asks even before the mail settings have loaded).\n */\n confirmSignOut?: () => Promise<boolean> | boolean\n /** Glyph per session status; default `SessionStatusIcon`. */\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 confirmSignOut,\n renderSessionIcon = renderSessionStatusIcon,\n}: ConnectedLogoutDialogProps) {\n const user = useArbiSession().user\n const sessions = useSessions({ enabled: open })\n const signOut = useSignOut()\n const isOnline = useIsOnline()\n const { confirm } = useBlocksEnvironment()\n const run = async (everywhere: boolean) => {\n onClose()\n const confirmed = confirmSignOut ? confirmSignOut() : confirmLosingOfflineMail(confirm)\n if (!(await confirmed)) 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 // \"All sessions\" is for people, not for agent accounts.\n canLogoutAll={!(user && isAgent(user))}\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","/**\n * Model picker behaviour: tier discovery from the live model list, the selected model (store or\n * controlled), saving the choice to the backend config, and keeping the active model in sync with\n * the user's Premium preference. Presentation lives in `@arbidocs/blocks` (ModelPicker parts).\n */\n\nimport { useMemo, useCallback, useEffect } from 'react'\nimport {\n AUTO_CHAT_MODEL,\n formatGbpPerMillionTokens,\n resolveConfigModel,\n useApplyChatModel,\n useArbiSessionState,\n useAvailableModels,\n useConfig,\n useUserSettings,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\n/** ARBI offers two tiers in the model picker, both keyed off proxy *tags* so renaming the\n * underlying models never breaks the UI.\n *\n * - Standard tier (tag `Standard`): one row per Standard-tagged model.\n * - Premium tier (tag `Premium`): a single sentinel + Configure cog. The cog opens settings\n * where the user picks the specific Premium-tagged model to use. */\nexport const STANDARD_TIER_TAG = 'Standard'\nexport const PREMIUM_TIER_TAG = 'Premium'\n\ninterface Options {\n /** Controlled value: when provided the picker does not touch the store or backend. */\n value?: string\n onValueChange?: (value: string) => void\n}\n\nexport function useModelPicker({\n value: controlledValue,\n onValueChange: controlledOnChange,\n}: Options) {\n const { data: availableModels } = useAvailableModels()\n const { data: userSettings } = useUserSettings()\n const isDeveloper = userSettings?.developer === true\n const isControlled = controlledValue !== undefined\n\n const applyChatModel = useApplyChatModel()\n const { openSettings } = useBlocksEnvironment()\n const currentConversationModel = useArbiSessionState((state) => state.chatModelName)\n // With no model named for this chat, the turn runs on its chosen config, else the person's last\n // one: show that config's model, so the model shown is the model sent.\n const chatConfigId = useArbiSessionState((state) => state.chatModel)\n const sendConfigId = chatConfigId ?? userSettings?.last_config\n const { data: sendConfig } = useConfig(sendConfigId, {\n enabled: !isControlled && !currentConversationModel,\n })\n const sendConfigModel = sendConfig ? resolveConfigModel(sendConfig) : undefined\n\n // Premium preference; '' means the user switched Premium off.\n const premiumModelPref = userSettings?.premium_model as string | undefined\n\n // Tier discovery is purely tag-driven. Premium-tagged models collapse into one sentinel.\n const { standardTier, premiumTier, developerModels } = useMemo(() => {\n type ModelEntry = NonNullable<typeof availableModels>['models'][number]\n\n const empty = {\n standardTier: null as null | { members: ModelEntry[] },\n premiumTier: null as null | { members: ModelEntry[]; resolvedModelName: string },\n developerModels: [] as ModelEntry[],\n }\n if (!availableModels?.models) return empty\n\n const standardMembers = availableModels.models.filter((m) =>\n m.tags?.includes(STANDARD_TIER_TAG)\n )\n const standardTier = standardMembers.length > 0 ? { members: standardMembers } : null\n\n const premiumMembers = availableModels.models.filter((m) => m.tags?.includes(PREMIUM_TIER_TAG))\n let premiumTier: typeof empty.premiumTier = null\n if (premiumMembers.length > 0) {\n // One label, one model. With no user choice the fallback is the backend's\n // `premium_default` (the value auto mode resolves its premium tier to), so picking\n // \"Premium\" here and letting auto pick premium cannot land on two different models. The\n // first member is only a last resort for an older backend that does not send the field.\n const matchPref =\n premiumModelPref && premiumMembers.find((m) => m.model_name === premiumModelPref)\n const backendDefault =\n availableModels.premium_default &&\n premiumMembers.find((m) => m.model_name === availableModels.premium_default)\n premiumTier = {\n members: premiumMembers,\n resolvedModelName: (matchPref || backendDefault || premiumMembers[0]).model_name,\n }\n }\n\n const tierMemberNames = new Set<string>()\n for (const m of standardMembers) tierMemberNames.add(m.model_name)\n for (const m of premiumMembers) tierMemberNames.add(m.model_name)\n\n const seen = new Set<string>()\n const developer = isDeveloper\n ? availableModels.models\n .filter((m) => {\n if (m.connection_scope || tierMemberNames.has(m.model_name)) return false\n if (!m.model_name.includes('@') || seen.has(m.model_name)) return false\n seen.add(m.model_name)\n return true\n })\n .sort((a, b) => a.model_name.localeCompare(b.model_name))\n : []\n\n const custom = availableModels.models.filter(\n (m) => m.connection_scope === 'personal' || m.connection_scope === 'box'\n )\n return { standardTier, premiumTier, developerModels: [...custom, ...developer] }\n }, [availableModels, isDeveloper, premiumModelPref])\n\n // Always resolves to a model, never empty (Auto when nothing says otherwise).\n const selectedModel =\n (isControlled ? controlledValue : currentConversationModel || sendConfigModel) ||\n AUTO_CHAT_MODEL\n\n // Looked up from the full list so the selected model is found even if filtered from the menu.\n const selectedModelInfo = useMemo(\n () => availableModels?.models?.find((m) => m.model_name === selectedModel),\n [availableModels, selectedModel]\n )\n\n const handleModelChange = useCallback(\n (value: string) => {\n if (isControlled) {\n controlledOnChange?.(value)\n return\n }\n const label =\n value === AUTO_CHAT_MODEL ? 'Quick Model Change - Auto' : `Quick Model Change - ${value}`\n applyChatModel(value, label).catch((error) =>\n console.error('Failed to save model config', error)\n )\n },\n [isControlled, controlledOnChange, applyChatModel]\n )\n\n const isAuto = selectedModel === AUTO_CHAT_MODEL\n\n // Keep the active conversation model in sync with the user's Premium settings (skipped in\n // controlled mode): Premium disabled while a Premium model is active -> bounce to Auto;\n // Premium preference changed while on Premium -> follow the new preference.\n useEffect(() => {\n if (isControlled) return\n if (!premiumTier) return\n const onPremium = premiumTier.members.some((m) => m.model_name === selectedModel)\n if (!onPremium) return\n if (premiumModelPref === '') {\n handleModelChange(AUTO_CHAT_MODEL)\n return\n }\n if (selectedModel === premiumTier.resolvedModelName) return\n handleModelChange(premiumTier.resolvedModelName)\n }, [isControlled, premiumTier, selectedModel, premiumModelPref, handleModelChange])\n\n const pricing = useMemo(() => {\n if (isAuto || !selectedModelInfo) return null\n const inputPrice = formatGbpPerMillionTokens(selectedModelInfo.input_cost_per_token)\n const outputPrice = formatGbpPerMillionTokens(selectedModelInfo.output_cost_per_token)\n if (!inputPrice && !outputPrice) return null\n return { inputPrice, outputPrice, modelName: selectedModelInfo.model_name }\n }, [selectedModelInfo, isAuto])\n\n const openPremiumSettings = useCallback(() => openSettings('chat'), [openSettings])\n\n return {\n standardTier,\n premiumTier,\n developerModels,\n selectedModel,\n selectedModelInfo,\n isAuto,\n /** The user switched Premium off in settings. */\n premiumDisabled: premiumModelPref === '',\n pricing,\n handleModelChange,\n openPremiumSettings,\n }\n}\n","/**\n * ModelSelector: the app's single model picker, bound to the `@arbidocs/blocks` ModelPicker\n * parts. Behaviour (tier discovery, saving the choice, Premium sync) lives in `useModelPicker`.\n *\n * Modes:\n * - Uncontrolled (default): reads/writes the store and saves config to the backend.\n * - Controlled: pass value/onValueChange for use in forms.\n *\n * Variants:\n * - default: Select component for settings/forms\n * - compact: Popover for the MessageInput area\n */\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n ARBI_MARK_SRC,\n cn,\n ProviderIcon,\n} from '@arbidocs/react/ui'\nimport { useState } from 'react'\nimport { AUTO_CHAT_MODEL } from '@arbidocs/react'\nimport type { ReactNode } from 'react'\nimport {\n ModelAutoIcon,\n ModelConfigureButton,\n ModelDot,\n ModelMenuDivider,\n ModelMenuMessage,\n ModelOption,\n ModelOptionLabel,\n ModelPickerPopover,\n ModelPickerTrigger,\n ModelPricingTip,\n ModelTierIcon,\n ModelTierOption,\n ModelTriggerContent,\n type ModelTierKind,\n} from '../../chat/ModelPicker'\nimport { PREMIUM_TIER_TAG, STANDARD_TIER_TAG, useModelPicker } from './useModelPicker'\n\n/** Tier glyph by tag (or model name: Fast/Wise only carry the generic 'Standard' tag). */\nconst TAG_TIER: Record<string, ModelTierKind> = {\n Standard: 'standard',\n Fast: 'standard',\n Wise: 'wise',\n Reasoning: 'wise',\n Premium: 'premium',\n}\n\nfunction ArbiLogo() {\n return <img src={ARBI_MARK_SRC} alt=\"ARBI\" className=\"size-3.5 shrink-0 rounded-md\" />\n}\n\ninterface ModelSelectorProps {\n /** 'default' uses Select, 'compact' uses Popover */\n variant?: 'default' | 'compact'\n className?: string\n /** Controlled value: if provided, the component is controlled */\n value?: string\n /** Controlled onChange: required when value is provided */\n onValueChange?: (value: string) => void\n}\n\nexport function ConnectedModelSelector({\n variant = 'default',\n className,\n value,\n onValueChange,\n}: ModelSelectorProps) {\n const picker = useModelPicker({ value, onValueChange })\n const {\n standardTier,\n premiumTier,\n developerModels,\n selectedModel,\n selectedModelInfo,\n isAuto,\n premiumDisabled,\n pricing,\n handleModelChange,\n } = picker\n const [isOpen, setIsOpen] = useState(false)\n\n // The most specific tier glyph for a Standard model, so each row gets its own logo (Fast: bolt,\n // Wise: glasses) instead of all sharing the generic ARBI mark. Fast/Wise are identified by NAME.\n const standardIcon = (model: { model_name: string; tags?: string[] | null }): ReactNode => {\n let tier: ModelTierKind | undefined = TAG_TIER[model.model_name]\n if (!tier) {\n for (const t of model.tags ?? []) {\n if (t === STANDARD_TIER_TAG || t === PREMIUM_TIER_TAG) continue\n if (TAG_TIER[t]) {\n tier = TAG_TIER[t]\n break\n }\n }\n }\n return tier ? <ModelTierIcon tier={tier} /> : <ArbiLogo />\n }\n\n // Trigger: Premium collapses to the tier name with the provider mark standing in for which\n // Premium model is active. With Premium switched off, a greyed crown, never a third-party mark.\n const isSelectedStandard = !!selectedModelInfo?.tags?.includes(STANDARD_TIER_TAG)\n const isSelectedPremium = !!selectedModelInfo?.tags?.includes(PREMIUM_TIER_TAG)\n const triggerLabel = isAuto\n ? 'Autoselect'\n : isSelectedPremium\n ? 'Premium'\n : selectedModelInfo?.display_name || selectedModelInfo?.model_name || selectedModel\n const firstTag = selectedModelInfo?.tags?.[0]\n const triggerIcon: ReactNode = isAuto ? (\n <ModelAutoIcon />\n ) : isSelectedPremium ? (\n premiumDisabled ? (\n <ModelTierIcon tier=\"premium\" isGreyed />\n ) : (\n <ProviderIcon\n modelName={selectedModelInfo?.model_name}\n provider={selectedModelInfo?.provider}\n size={14}\n className=\"shrink-0\"\n />\n )\n ) : isSelectedStandard && selectedModelInfo ? (\n standardIcon(selectedModelInfo)\n ) : firstTag && TAG_TIER[firstTag] ? (\n <ModelTierIcon tier={TAG_TIER[firstTag]} />\n ) : selectedModelInfo ? (\n <ModelDot />\n ) : null\n\n const tooltip: ReactNode = isAuto ? (\n <div className=\"text-sm\">Automatically selects the best model</div>\n ) : pricing ? (\n <ModelPricingTip\n modelName={pricing.modelName}\n inputPrice={pricing.inputPrice}\n outputPrice={pricing.outputPrice}\n />\n ) : null\n\n const hasTiers = !!(standardTier || premiumTier || developerModels.length)\n\n if (variant === 'compact') {\n const choose = (name: string) => {\n handleModelChange(name)\n setIsOpen(false)\n }\n const premiumMember = premiumTier?.members.find(\n (m) => m.model_name === premiumTier.resolvedModelName\n )\n return (\n <ModelPickerPopover\n open={isOpen}\n onOpenChange={setIsOpen}\n tooltip={tooltip}\n trigger={\n <ModelPickerTrigger icon={triggerIcon} label={triggerLabel} className={className} />\n }\n >\n <ModelOption\n icon={<ModelAutoIcon />}\n label=\"Autoselect\"\n isSelected={isAuto}\n onSelect={() => choose(AUTO_CHAT_MODEL)}\n testId=\"model-option-auto\"\n />\n <ModelMenuDivider />\n {hasTiers ? (\n <>\n {standardTier?.members.map((m) => (\n <ModelOption\n key={`standard-${m.model_name}`}\n icon={standardIcon(m)}\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n isSelected={selectedModel === m.model_name}\n onSelect={() => choose(m.model_name)}\n testId={`model-option-${m.model_name}`}\n emphasis=\"tier\"\n />\n ))}\n {premiumTier && (\n <ModelTierOption\n key=\"tier-Premium\"\n icon={\n premiumDisabled || !premiumMember ? (\n <ModelTierIcon tier=\"premium\" isGreyed={premiumDisabled} />\n ) : (\n // The resolved Premium model's provider is the row's brand icon, so the pick\n // is recognisable without a model_name suffix.\n <ProviderIcon\n modelName={premiumMember.model_name}\n provider={premiumMember.provider}\n size={14}\n className=\"shrink-0\"\n />\n )\n }\n label=\"Premium\"\n isSelected={premiumTier.members.some((m) => m.model_name === selectedModel)}\n isDisabled={premiumDisabled}\n onSelect={() => choose(premiumTier.resolvedModelName)}\n testId=\"model-option-tier-Premium\"\n action={\n <ModelConfigureButton\n label=\"Configure Premium tier\"\n tooltip=\"Configure Premium\"\n testId=\"tier-Premium-configure-button\"\n onClick={() => {\n picker.openPremiumSettings()\n setIsOpen(false)\n }}\n />\n }\n />\n )}\n {developerModels.length > 0 && (\n <>\n <ModelMenuDivider />\n {developerModels.map((m) => {\n const tag = m.tags?.[0]\n return (\n <ModelOption\n key={m.model_name}\n icon={\n tag && TAG_TIER[tag] ? <ModelTierIcon tier={TAG_TIER[tag]} /> : <ModelDot />\n }\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n isSelected={selectedModel === m.model_name}\n onSelect={() => choose(m.model_name)}\n testId={`model-option-${m.model_name}`}\n />\n )\n })}\n </>\n )}\n </>\n ) : (\n <ModelMenuMessage>Loading models...</ModelMenuMessage>\n )}\n </ModelPickerPopover>\n )\n }\n\n // Default variant: Select.\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div>\n <Select value={selectedModel || ''} onValueChange={handleModelChange}>\n <SelectTrigger\n className={cn('h-8 w-[200px] text-sm', className)}\n data-testid=\"model-selector\"\n >\n <ModelTriggerContent icon={triggerIcon} label={triggerLabel} />\n </SelectTrigger>\n <SelectContent className=\"z-50\">\n <SelectItem value={AUTO_CHAT_MODEL} data-testid=\"model-option-auto\">\n <ModelOptionLabel icon={<ModelAutoIcon />} label=\"Autoselect\" />\n </SelectItem>\n {hasTiers ? (\n <>\n {standardTier?.members.map((m) => (\n <SelectItem\n key={`standard-${m.model_name}`}\n value={m.model_name}\n data-testid={`model-option-${m.model_name}`}\n >\n <ModelOptionLabel\n icon={standardIcon(m)}\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n />\n </SelectItem>\n ))}\n {premiumTier && (\n <SelectItem\n key=\"tier-Premium\"\n value={premiumTier.resolvedModelName}\n data-testid=\"model-option-tier-Premium\"\n >\n <ModelOptionLabel icon={<ArbiLogo />} label=\"Premium\" />\n </SelectItem>\n )}\n {developerModels.map((m) => (\n <SelectItem\n key={m.model_name}\n value={m.model_name}\n data-testid={`model-option-${m.model_name}`}\n >\n <ModelOptionLabel\n icon={<ModelDot />}\n label={\n m.display_name\n ? `${m.display_name} · ${m.connection_scope === 'box' ? 'Box' : 'Personal'}`\n : m.model_name\n }\n />\n </SelectItem>\n ))}\n </>\n ) : (\n <SelectItem value=\"loading\" disabled>\n Loading models...\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n </div>\n </TooltipTrigger>\n {tooltip && <TooltipContent side=\"top\">{tooltip}</TooltipContent>}\n </Tooltip>\n </TooltipProvider>\n )\n}\n","import {\n useArbiSessionStore,\n useTransientView,\n useUserSettings,\n useUpdateUserSettings,\n} from '@arbidocs/react'\nimport { setHintsSessionOverride, TIPS_VISIBILITY_OVERRIDE } from '../../tips/visibility'\n\n/**\n * Shared hints visibility: the account's saved show_hints preference, with an optional\n * session-only override for guided actions. An explicit saved choice clears the override.\n * Consumers gate on settingsLoaded so hints do not flash before the saved choice arrives.\n */\nexport function useHintsVisibility() {\n const { data: userSettings } = useUserSettings()\n const [sessionOverride] = useTransientView<boolean | null>(TIPS_VISIBILITY_OVERRIDE, null)\n return {\n showHints: sessionOverride ?? userSettings?.show_hints ?? true,\n settingsLoaded: userSettings !== undefined,\n isDeveloper: userSettings?.developer === true,\n }\n}\n\nexport function useContextualHints() {\n const visibility = useHintsVisibility()\n const session = useArbiSessionStore()\n const updateUserSettings = useUpdateUserSettings()\n const setShowHints = (value: boolean) => setHintsSessionOverride(session, value)\n const setShowHintsPersisted = (value: boolean) => {\n setHintsSessionOverride(session, null)\n updateUserSettings.mutate({ show_hints: value })\n }\n return {\n ...visibility,\n setShowHints,\n setShowHintsPersisted,\n dismissHints: () => setShowHints(false),\n }\n}\n","/**\n * The conversation's composer: the `Composer` block bound to the session's draft, the slash menu\n * (the backend's built-in commands and the user's skills), @mentions of the workspace's people,\n * and the backend-suggested follow-up. Layout, long-paste folding, menu rendering and keyboard\n * navigation are the `Composer` parts'; what a send does is the caller's (`handleSendMessage`).\n */\n\nimport { Button } from '@arbidocs/react/ui'\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, memo, type ReactNode } from 'react'\nimport { Settings } from 'lucide-react'\nimport {\n buildMentionCandidates,\n selectDraft,\n useArbiSession,\n useArbiSessionState,\n useArbiSessionStore,\n useConversations,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { useAssistantName, useAssistantCopy } from '@arbidocs/react/shell'\nimport type { ContextUsage } from '@arbidocs/sdk/browser'\nimport { Composer } from '../../chat/Composer'\nimport { useHintsVisibility } from '../tips/useContextualHints'\nimport { MentionMenu } from '../../chat/MentionMenu'\nimport { SlashMenu, type SlashMenuItem } from '../../chat/SlashMenu'\nimport { useListKeyNav } from '../../lib/useListKeyNav'\nimport { useLongPaste } from '../../lib/useLongPaste'\nimport { useMentionAutocomplete } from '../../chat/useMentionAutocomplete'\nimport { useRecipientDraft } from '../../chat/useRecipientDraft'\nimport { ContextUsageBar } from '../../chat/ContextUsageBar'\nimport type { WorkflowDefinition } from '../../agents/workflows/types'\nimport { useSlashItems } from './useSlashItems'\nimport { BUILTIN_SKILLS } from '../../agents/workflows/catalogue/seed'\n\nconst NO_SKILLS: ReadonlyArray<WorkflowDefinition> = []\n\n/** What picking a skill in the slash menu does (the host's workflow launcher). */\nexport interface ComposerSkills {\n /** A picked skill: open its launcher. True when it did (the composer then clears the draft). */\n openFor: (item: SlashMenuItem) => boolean\n}\n\nexport interface ConversationComposerProps {\n /** The draft, controlled (default: the session's draft for the open conversation). */\n value?: string\n /** Set the controlled draft. */\n onValueChange?: (value: string) => void\n /** Function to handle sending the message */\n handleSendMessage: () => void\n /** Whether an AI response is currently being generated */\n isGenerating?: boolean\n /** Compact presentation is opt-in; the full app retains its existing layout. */\n compact?: boolean\n /** Reference to the input element for focus management */\n inputRef?: React.RefObject<HTMLTextAreaElement | null>\n /** Flag indicating if we're currently creating a branch */\n isBranching?: boolean\n /** Function to cancel branch creation */\n onCancelBranching?: () => void\n /** Custom placeholder text */\n placeholder?: string\n /** Function to open settings popup */\n onOpenSettings?: () => void\n /** Optional left button element (e.g., paperclip button) */\n leftButton?: React.ReactNode\n /** Optional right button element (e.g., send/stop button) */\n rightButton?: React.ReactNode\n /** The model selector, before `rightButton` (the host's). */\n modelSelector?: ReactNode\n /**\n * What picking a skill does (its form). With it the menu offers the built-in skills too; without\n * it, only what is typed as `/slug` (commands, the host's packs, the user's skills).\n */\n skills?: ComposerSkills\n /** The slash menu's \"Browse all\" opens the host's skills browser. */\n onBrowseSkills?: () => void\n /** Context usage data from the latest assistant message */\n contextUsage?: ContextUsage | null\n /** Whether this is an empty conversation (taller, more inviting input + warmer placeholder) */\n isConversationEmpty?: boolean\n /**\n * Offer the backend's follow-up chip. The host turns this off while the reader is scrolled up\n * the thread: the chip grows the sticky dock upward, so it would cover the answer being read.\n */\n shouldOfferFollowUp?: boolean\n}\n\nconst ConversationComposerComponent = function ConversationComposer({\n value,\n onValueChange,\n handleSendMessage,\n isGenerating = false,\n compact = false,\n inputRef,\n isBranching = false,\n onCancelBranching,\n placeholder,\n onOpenSettings,\n leftButton,\n rightButton,\n modelSelector,\n skills,\n onBrowseSkills,\n contextUsage,\n isConversationEmpty = false,\n shouldOfferFollowUp = true,\n}: ConversationComposerProps) {\n // The draft is read here, so the conversation does not re-render on every keystroke.\n const session = useArbiSessionStore()\n const sessionDraft = useArbiSessionState(selectDraft)\n const newMessage = value ?? sessionDraft\n const setNewMessage = onValueChange ?? session.setDraft\n\n // Backend-suggested follow-up for THIS conversation, offered as faded inline text in the composer. The\n // input is never pre-filled: the chip drops the text in only when clicked.\n const { showHints } = useHintsVisibility()\n const suggestedQuery = useArbiSessionState((s) => s.suggestedQuery)\n const currentConversationId = useArbiSessionState((s) => s.conversationId)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const longPaste = useLongPaste(newMessage)\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n // Expose the input form's live width and position as CSS vars so the (portaled)\n // documents/facts hover popups can size themselves to the chat bar, line up with it, and open\n // clear of the field itself (see useChatBarAnchor).\n const formRef = useRef<HTMLFormElement>(null)\n useLayoutEffect(() => {\n const el = formRef.current\n if (!el) return\n const apply = () => {\n document.documentElement.style.setProperty('--chat-input-width', `${el.offsetWidth}px`)\n const rect = el.getBoundingClientRect()\n document.documentElement.style.setProperty('--chat-input-left', `${rect.left}px`)\n document.documentElement.style.setProperty('--chat-input-top', `${rect.top}px`)\n }\n apply()\n const ro = new ResizeObserver(apply)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n // Synchronize the internal and forwarded refs\n useLayoutEffect(() => {\n if (textareaRef.current && inputRef && 'current' in inputRef) {\n inputRef.current = textareaRef.current\n }\n }, [inputRef])\n\n // ── Slash-command menu ───────────────────────────────────────────────\n //\n // Two sources, one menu (see useSlashItems): the backend's built-in commands and the user's\n // skills. The menu only opens when the draft is a bare slash command in progress; once the user\n // types a space (committing the slug -> arguments), the menu hides and Enter/arrows fall through.\n const {\n slashToken,\n filteredItems,\n isOpen: isSlashMenuOpen,\n canBrowseSkills,\n } = useSlashItems(newMessage, skills ? BUILTIN_SKILLS : NO_SKILLS)\n\n /**\n * Replace the leading slash token with the chosen slug and a trailing space, so the user can\n * type arguments immediately. The trailing space also commits the slug, which closes the menu.\n */\n const insertSlashItem = (item: SlashMenuItem) => {\n // A picked skill that takes arguments opens the host's workflow launcher.\n if (skills?.openFor(item)) {\n setNewMessage('')\n return\n }\n setNewMessage(`/${item.name} `)\n requestAnimationFrame(() => {\n const ta = textareaRef.current\n if (!ta) return\n ta.focus()\n const end = `/${item.name} `.length\n ta.setSelectionRange(end, end)\n })\n }\n\n // ── @mentions + assistant mode ───────────────────────────────────────\n //\n // `@` opens the member + assistant autocomplete. In a thread (`mentioned` mode) a message only\n // reaches the assistant when it @mentions it; the send path reads the mentions from the text.\n const { data: users } = useWorkspaceUsers()\n const currentUserId = useArbiSession().user?.external_id\n const assistantName = useAssistantName()\n const mentionCandidates = useMemo(\n () => buildMentionCandidates(users ?? [], currentUserId, assistantName),\n [users, currentUserId, assistantName]\n )\n const mention = useMentionAutocomplete({\n value: newMessage,\n onValueChange: setNewMessage,\n candidates: mentionCandidates,\n textareaRef,\n })\n // Shared chats use explicit recipients; solo chats address the assistant implicitly.\n const { data: conversations } = useConversations(workspaceId ?? undefined)\n const isThread =\n conversations?.find((conversation) => conversation.external_id === currentConversationId)\n ?.is_shared ?? false\n // A thread's draft starts addressed to the assistant.\n const prefillsAssistant = isThread && !isBranching\n const recipient = useRecipientDraft({\n value: newMessage,\n onValueChange: setNewMessage,\n contextKey: currentConversationId,\n defaultLabel: prefillsAssistant ? assistantName : null,\n })\n\n const assistant = useAssistantCopy()\n const slashNav = useListKeyNav({\n open: isSlashMenuOpen,\n items: filteredItems,\n onPick: insertSlashItem,\n // Clear the leading slash to fully dismiss; otherwise the menu reopens on the next letter.\n onDismiss: () => setNewMessage(''),\n resetKey: slashToken,\n })\n\n // The citation popover docks right above the composer and would paint over the menus that open\n // from it, so opening one dismisses the popover. The document viewer keeps the passage, as\n // Escape does.\n const isComposerMenuOpen = isSlashMenuOpen || mention.isOpen\n useEffect(() => {\n if (isComposerMenuOpen) session.setActiveCitationKey(null)\n }, [isComposerMenuOpen, session])\n\n // Shown only while the input is empty and the suggestion belongs to the conversation on\n // screen: a suggestion from another tab must never appear here. It also stays out of the\n // way while a reply streams or the reader is scrolled up: the chip sits inside the sticky dock\n // and would cover the text being read.\n const followUp =\n !newMessage &&\n !isBranching &&\n !isGenerating &&\n shouldOfferFollowUp &&\n showHints &&\n suggestedQuery &&\n suggestedQuery.conversationExtId === currentConversationId\n ? suggestedQuery.text\n : null\n\n const sendDraft = () => {\n handleSendMessage()\n // Keep input focused to allow typing the next prompt during generation\n textareaRef.current?.focus()\n // Reset branching state after sending the message\n if (isBranching && onCancelBranching) onCancelBranching()\n }\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (recipient.handleKeyDown(event)) return\n // Slash- and mention-menu keys take priority, but only while a menu is actually open.\n if (slashNav.handleKeyDown(event)) return\n if (mention.nav.handleKeyDown(event)) return\n\n if (followUp && event.key === 'Tab' && !event.shiftKey) {\n event.preventDefault()\n setNewMessage(followUp)\n return\n }\n\n // Plain Enter submits through <Composer.Input> (handleSubmit below).\n if (event.key === 'Escape' && isBranching && onCancelBranching) {\n event.preventDefault()\n onCancelBranching()\n }\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (recipient.hasBody) sendDraft()\n }\n\n return (\n <>\n <Composer.Root\n onSubmit={handleSubmit}\n formRef={formRef}\n isBranching={isBranching}\n notice={isBranching ? <Composer.Notice onCancel={onCancelBranching} /> : undefined}\n >\n <Composer.Frame\n className={\n compact\n ? 'rounded-none border-0 px-0 py-0 shadow-none focus-within:shadow-none'\n : undefined\n }\n >\n {/* Anchors above the textarea inside the frame so it floats over content. */}\n <SlashMenu\n open={isSlashMenuOpen}\n items={filteredItems}\n selectedIndex={slashNav.selectedIndex}\n setSelectedIndex={slashNav.setSelectedIndex}\n listboxId={slashNav.listboxId}\n onSelect={insertSlashItem}\n onBrowse={canBrowseSkills ? onBrowseSkills : undefined}\n />\n <MentionMenu\n open={mention.isOpen}\n items={mention.items}\n selectedIndex={mention.nav.selectedIndex}\n setSelectedIndex={mention.nav.setSelectedIndex}\n listboxId={mention.nav.listboxId}\n onSelect={mention.pick}\n />\n <Composer.Input\n value={newMessage}\n onValueChange={(next) => {\n mention.onValueChange(next)\n longPaste.onValueChange(next)\n }}\n onPaste={(event) => longPaste.onPaste(event, newMessage)}\n onKeyDown={onKeyDown}\n textareaProps={{\n ...(mention.isOpen ? mention.nav.comboboxProps : slashNav.comboboxProps),\n ...mention.textareaProps,\n }}\n textareaRef={textareaRef}\n isPasteCollapsed={longPaste.isCollapsed}\n onExpandPaste={() => {\n longPaste.expand()\n requestAnimationFrame(() => textareaRef.current?.focus())\n }}\n isRoomy={isConversationEmpty}\n isSuggestion={!!followUp}\n compact={compact}\n placeholder={\n followUp ||\n placeholder ||\n (isBranching\n ? 'Edit message to create a branch...'\n : isThread\n ? 'Message the thread… @mention someone to notify them'\n : isGenerating\n ? 'Type your next prompt...'\n : assistant.askAnythingPlaceholder)\n }\n />\n <Composer.Toolbar\n className={compact ? 'flex-nowrap' : undefined}\n leading={\n <>\n {leftButton}\n {compact && modelSelector}\n {onOpenSettings && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenSettings}\n className=\"h-8 w-8 p-0 pointer-coarse:h-11 pointer-coarse:w-11\"\n aria-label=\"Chat settings\"\n title=\"Chat settings\"\n data-testid=\"message-input-settings-button\"\n >\n <Settings className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n )}\n </>\n }\n trailing={\n <>\n {!compact && modelSelector}\n {rightButton}\n </>\n }\n />\n <ContextUsageBar contextUsage={contextUsage} draftLength={newMessage.length} />\n </Composer.Frame>\n </Composer.Root>\n </>\n )\n}\n\nexport const ConversationComposer = memo(ConversationComposerComponent)\n","import { useMessageTimer } from '@arbidocs/react'\nimport React from 'react'\n\nexport interface MessageTimerSubscription {\n conversationId: string | undefined\n messageId: string | undefined\n isUser: boolean\n isGenerating: boolean\n}\n\ninterface MessageLiveSecondsProps extends MessageTimerSubscription {\n /** Subtract this many seconds from the elapsed time before displaying. */\n offsetSeconds?: number\n /** Used when the live timer is not running (e.g. for messages loaded from history). */\n fallbackSeconds?: number | null\n /** Skip rendering when the resolved value is below this threshold (in seconds). */\n minDisplaySeconds?: number\n /** Suffix appended after the number (defaults to \"s\"). */\n suffix?: string\n}\n\n/**\n * Leaf component that subscribes to `useMessageTimer` and renders the elapsed\n * seconds as plain text. Designed to be embedded inside larger components\n * (AssistantStatus, AgentSteps) so the 100 ms timer tick re-renders only this\n * leaf instead of propagating up to the entire Message subtree.\n */\nfunction MessageLiveSecondsComponent({\n conversationId,\n messageId,\n isUser,\n isGenerating,\n offsetSeconds = 0,\n fallbackSeconds,\n minDisplaySeconds = 0,\n suffix = 's',\n}: MessageLiveSecondsProps) {\n const { elapsedTime } = useMessageTimer({ conversationId, messageId, isUser, isGenerating })\n const base = elapsedTime > 0 ? elapsedTime : (fallbackSeconds ?? 0)\n const value = base - offsetSeconds\n if (!Number.isFinite(value) || value < minDisplaySeconds) return null\n return (\n <>\n {value.toFixed(1)}\n {suffix}\n </>\n )\n}\n\nexport const MessageLiveSeconds = React.memo(MessageLiveSecondsComponent)\n","/**\n * A turn's agent steps, bound to the session: the step trace (`StepTrace` and its rows) filled\n * from the step stream, with the workspace's document names, the model tiers, the developer\n * details and the live duration of the running step.\n */\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n getDocumentTitle,\n ProviderIcon,\n} from '@arbidocs/react/ui'\nimport { formatGbp, useAvailableModels, useDocuments, useUserSettings } from '@arbidocs/react'\nimport React, { useMemo } from 'react'\nimport {\n GoalCriteria,\n StepDetail,\n StepNarration,\n StepOutcome,\n StepParams,\n StepRow,\n StepSummary,\n StepTrace,\n StepTraceSummary,\n SubAgentLane,\n SubStepGroup,\n type GoalCriterionView,\n} from '../../agents/runs/AgentSteps'\nimport {\n getAgentStepPresentation,\n getModelIcon,\n MODEL_TIER_ICON_MAP,\n MODEL_TIER_LABELS,\n stepAccent,\n} from '../../agents/runs/step-presentation'\nimport { MessageLiveSeconds, type MessageTimerSubscription } from './MessageLiveSeconds'\nimport { ConnectedMarkdown } from './ConnectedMarkdown'\nimport {\n computeRunStats,\n extractSubagentLanes,\n formatTokens,\n getAgentStepLabel,\n getCurrentStep,\n getStepDisplay,\n getStepTool,\n isNearAiUsageBudget,\n mergeAgentSteps,\n subagentJobLabel,\n type AgentStepEvent,\n type ContextUsage,\n type DocInfoMap,\n} from '@arbidocs/sdk/browser'\n\n/** A workspace document, as the step trace names it. */\ntype StepDocument = { external_id: string; file_name?: string | null; n_pages?: number | null }\n\n/** Fields injected by the backend for display — excluded from param rendering */\nconst DISPLAY_FIELDS = new Set(['tool', 'label', 'icon', 'summary'])\n\n/**\n * Extract tool parameters from a detail entry, excluding display fields.\n * Returns key-value pairs for inline rendering.\n */\nfunction getToolParams(detail: Record<string, unknown>): Array<{ key: string; value: string }> {\n const params: Array<{ key: string; value: string }> = []\n for (const [key, value] of Object.entries(detail)) {\n if (DISPLAY_FIELDS.has(key) || value == null) continue\n const strValue = typeof value === 'string' ? value : JSON.stringify(value)\n params.push({ key, value: strValue })\n }\n return params\n}\n\nfunction StepModelIcon({ modelName, tag }: { modelName?: string | null; tag: string | null }) {\n // Premium → brand mark; Fast/Wise → their name icon; otherwise the tag icon.\n const cfg = tag === 'Premium' ? null : getModelIcon(modelName, tag)\n if (tag !== 'Premium' && !cfg) return null\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex-shrink-0\">\n {tag === 'Premium' ? (\n <ProviderIcon modelName={modelName ?? undefined} size={11} />\n ) : (\n cfg && <cfg.icon className={cfg.className} style={{ width: 11, height: 11 }} />\n )}\n </span>\n </TooltipTrigger>\n <TooltipContent>{modelName}</TooltipContent>\n </Tooltip>\n )\n}\n\ninterface AgentStepsProps {\n steps: AgentStepEvent[]\n isStreaming: boolean\n className?: string\n /**\n * Total elapsed seconds for the message — used as a static fallback for the\n * last step's duration when `liveTimer` is not provided (e.g. messages\n * loaded from history). When `liveTimer` is provided this prop is forwarded\n * to the leaf as the post-generation fallback.\n */\n totalElapsedTime?: number\n /**\n * Optional live-timer subscription. When provided, the last step's duration\n * is rendered by a leaf component so the parent does not re-render at the\n * 100 ms timer cadence.\n */\n liveTimer?: MessageTimerSubscription\n /**\n * When true (the live bar's expander), hide what the bar already shows live —\n * the agent's current step and any still-running sub-agents — so the expander\n * is purely \"what came before\", never a duplicate of the footer. Finished\n * sub-agents stay (they're history). No effect once settled.\n */\n hideLive?: boolean\n /**\n * This turn's settled context/AI usage (£) (`message.finalContextUsage`).\n * £ spent belongs here, on the turn that spent them — not on the\n * composer's forward-looking context bar, which is about future messages.\n */\n contextUsage?: ContextUsage | null\n}\n\nconst AgentStepsComponent: React.FC<AgentStepsProps> = ({\n steps,\n isStreaming,\n className,\n totalElapsedTime,\n liveTimer,\n hideLive = false,\n contextUsage,\n}) => {\n const { data: userSettings } = useUserSettings()\n const isDeveloper = userSettings?.developer === true\n\n // Build doc_ext_id → {name, pages} map from workspace documents (cached by React Query)\n const { data: documents = [] } = useDocuments()\n const docInfo = useMemo(() => {\n const map: DocInfoMap = {}\n const docArray = Array.isArray(documents) ? documents : []\n for (const doc of docArray) {\n if (doc && 'external_id' in doc) {\n const d = doc as StepDocument\n // Use the canonical document entity label (doc_metadata.title ?? file\n // name), not the raw file name, so references resolve to the same name\n // the rest of the app shows.\n map[d.external_id] = {\n name: getDocumentTitle(d, d.file_name ?? d.external_id),\n pages: d.n_pages ?? null,\n }\n }\n }\n return map\n }, [documents])\n\n // Resolve model name → tag for looking up tier icons\n const { data: availableModels } = useAvailableModels()\n const getModelTag = useMemo(() => {\n return (modelName?: string | null): string | null => {\n if (!modelName || !availableModels?.models) return null\n return availableModels.models.find((m) => m.model_name === modelName)?.tags?.[0] || null\n }\n }, [availableModels])\n\n // Raw SSE events → the logical steps a reader sees. Shared with the `Step N`\n // counter so the count always matches the rows rendered below.\n //\n // When `hideLive` (the live bar's expander), the current step STAYS — the\n // drawer is a complete, correctly-numbered list with the active step\n // highlighted as the last row, matching the \"Step N\" position on the bar.\n // (Dropping it made the drawer show N-1 rows while the bar said N, and marked\n // the *previous* step active.) Still-running sub-agents are the one thing\n // dropped: they have their own live lanes in the roster beneath the bar, so\n // showing them here too would double-render them.\n const mergedSteps = useMemo(() => {\n const merged = mergeAgentSteps(steps)\n if (!hideLive) return merged\n const runningHandles = new Set(\n extractSubagentLanes(merged)\n .filter((l) => l.status === 'running')\n .map((l) => l.handle)\n )\n return merged.filter((s) => !(s.subagent && runningHandles.has(s.subagent)))\n }, [steps, hideLive])\n\n // Compute step durations: duration = next_step.t - current_step.t\n // For the last step, use totalElapsedTime (frontend timer) if available\n const stepDurations = useMemo(() => {\n const durations: (number | null)[] = []\n for (let i = 0; i < mergedSteps.length; i++) {\n const currentT = mergedSteps[i].t\n if (currentT == null) {\n durations.push(null)\n continue\n }\n if (i + 1 < mergedSteps.length) {\n const nextT = mergedSteps[i + 1].t\n durations.push(nextT != null ? nextT - currentT : null)\n } else {\n // Last step: close it with the turn's total elapsed time.\n //\n // This is the one place two clocks meet — `totalElapsedTime` is the\n // client's wall-clock for a live turn, while `t` is the backend's\n // seconds-since-stream-start. They agree when the client watched the\n // whole stream, but a client that started late (a reconnect, or a\n // background conversation opened mid-run) measures less than the\n // backend, and the subtraction goes negative: the trace rendered\n // \"Answered −21.9s\". Show nothing rather than a duration we know is\n // wrong — a settled turn re-read from history uses the backend's own\n // completed `t`, so it stays consistent there.\n const remaining = totalElapsedTime != null ? totalElapsedTime - currentT : null\n durations.push(remaining != null && remaining >= 0 ? remaining : null)\n }\n }\n return durations\n }, [mergedSteps, totalElapsedTime])\n\n // Display step_tokens (per-step cost) directly from the backend.\n const stepTokens = useMemo(() => {\n return mergedSteps.map((step) => step.step_tokens ?? null)\n }, [mergedSteps])\n\n // Per-step £ cost — an estimate (cached model pricing, not the\n // authoritative LiteLLM cost), but useful to see which step is expensive\n // while the turn is still streaming. User-facing (unlike step_tokens,\n // which is raw and developer-gated) since £ is the budget unit the\n // user actually spends against.\n const stepGbp = useMemo(() => {\n return mergedSteps.map((step) => step.step_gbp ?? null)\n }, [mergedSteps])\n\n // Following the run is the HOST's job, not this list's: AgentBarShell pins\n // its drawer to the bottom while the user hasn't scrolled away. A\n // scrollIntoView here looked like it nudged \"the nearest scroll container\",\n // but it scrolls EVERY ancestor short of the viewport — each streamed tick\n // yanked the whole conversation back to this list while the user was\n // reading elsewhere on the page.\n const currentStepIndex = isStreaming ? getCurrentStep(mergedSteps)?.index : undefined\n\n if (mergedSteps.length === 0) return null\n\n // Two groupings run in one pass:\n // • Concurrent sub-agent LANES — steps carrying a `subagent` handle are pulled\n // into their own live lane (spawn marker → intermediate steps → done marker),\n // rendered as a card at the position of the lane's spawn. Multiple children\n // running at once each get their own lane, so fan-out reads as parallel work.\n // • Legacy parent_index NESTING — a handle-less sub-step (older single-child\n // relays) still indents under the parent tool step that spawned it.\n const posByIndex = new Map(mergedSteps.map((s, idx) => [s.index, idx]))\n const childrenByParent = new Map<number, AgentStepEvent[]>()\n const topLevelSteps: AgentStepEvent[] = []\n const laneStepsByHandle = new Map<string, AgentStepEvent[]>()\n const laneSpawnIndex = new Map<string, number>()\n for (const step of mergedSteps) {\n const handle = step.subagent\n if (handle) {\n const arr = laneStepsByHandle.get(handle)\n if (arr) arr.push(step)\n else {\n laneStepsByHandle.set(handle, [step])\n laneSpawnIndex.set(handle, step.index)\n }\n continue\n }\n const parent = step.parent_index\n if (parent != null && parent !== step.index && posByIndex.has(parent)) {\n const siblings = childrenByParent.get(parent) ?? []\n siblings.push(step)\n childrenByParent.set(parent, siblings)\n } else {\n topLevelSteps.push(step)\n }\n }\n\n // Interleave top-level steps and lanes by index, so a lane appears exactly where\n // its child was spawned in the parent's timeline.\n type DisplayRow = { index: number; step?: AgentStepEvent; lane?: string }\n const displayRows: DisplayRow[] = [\n ...topLevelSteps.map((s) => ({ index: s.index, step: s })),\n ...[...laneStepsByHandle.keys()].map((h) => ({ index: laneSpawnIndex.get(h) ?? 0, lane: h })),\n ].sort((a, b) => a.index - b.index)\n\n // Display numbers: top-level rows read 1..N (lanes count as a row); a fold's\n // inner rows read \"<parent>.<n>\".\n const displayNumber = new Map<number, string>()\n displayRows.forEach((r, i) => {\n if (r.lane) {\n // Lane inner steps read \"<lane>.<n>\".\n laneStepsByHandle\n .get(r.lane)\n ?.filter((s) => !s.subagent_status)\n .forEach((c, ci) => displayNumber.set(c.index, `${i + 1}.${ci + 1}`))\n return\n }\n displayNumber.set(r.step!.index, String(i + 1))\n childrenByParent\n .get(r.step!.index)\n ?.forEach((c, ci) => displayNumber.set(c.index, `${i + 1}.${ci + 1}`))\n })\n\n const lastStepIndex = mergedSteps[mergedSteps.length - 1].index\n\n const renderRow = (step: AgentStepEvent, depth: number, isLastInList: boolean) => {\n const i = posByIndex.get(step.index)!\n const presentation = getAgentStepPresentation(step, docInfo)\n const { tool, Icon } = presentation\n const { label, summary, isMultiLine, details } = getStepDisplay(step, docInfo)\n const accent = stepAccent(step, tool)\n const duration = stepDurations[i]\n const isLastStep = step.index === lastStepIndex\n const isActive = step.index === currentStepIndex\n\n // Goal-step model tier icon (auto mode) — the tier the router picked. It\n // stands in for the goal step's raw outcome (\"fast, all 0 docs\"), so it\n // carries a tooltip: an unlabelled glyph would just be cryptic noise.\n const tier = step.step === 'goal' ? step.model_recommendation : null\n const TierIcon = tier ? MODEL_TIER_ICON_MAP[tier] : null\n\n // The last step during streaming renders its duration through a leaf that\n // subscribes to the message timer directly, keeping the 10 Hz tick\n // contained so AgentSteps and its parent stay stable across timer updates.\n const useLiveDuration = isLastStep && liveTimer != null && step.t != null\n const durationNode: React.ReactNode = useLiveDuration ? (\n <MessageLiveSeconds\n {...liveTimer!}\n offsetSeconds={step.t!}\n fallbackSeconds={totalElapsedTime ?? null}\n minDisplaySeconds={0.05}\n />\n ) : duration != null ? (\n `${duration.toFixed(1)}s`\n ) : null\n\n // The goal step's outcome is internal routing (\"fast, all 0 docs\") — cryptic\n // to a reader and redundant with the model-tier icon beside the label. Tool\n // outcomes (\"15 passages retrieved\") are real feedback, so those stay.\n const showOutcome = step.outcome && step.step !== 'goal'\n // A green tick on \"exit 1\" claims the step succeeded when it didn't — the\n // code agent's first attempt failing then retrying is exactly the story the\n // trace should tell honestly.\n const outcomeFailed = !!step.outcome && isFailureOutcome(step.outcome)\n\n // Raw tool params are a developer affordance, and only when the backend\n // gave us no summary to show instead.\n const hasSummary = step.detail?.some((d) => (d as { summary?: string }).summary)\n const toolParams =\n isDeveloper && step.detail && !step.step && !hasSummary\n ? step.detail.flatMap((d) => getToolParams(d as Record<string, unknown>))\n : []\n\n const criteria =\n step.step === 'goal_progress' && step.detail && step.detail.length > 0\n ? (step.detail as Array<{\n criterion?: string\n text?: string\n status?: string\n note?: string\n }>)\n : null\n\n const criteriaView: GoalCriterionView[] | null = criteria\n ? criteria.map((c, idx) => ({\n key: c.criterion ?? String(idx),\n text: c.text || c.criterion || '',\n note: c.note,\n met: isCriterionMet(c.status),\n }))\n : null\n const folded = childrenByParent.get(step.index)\n\n return (\n <StepRow\n key={step.index}\n index={step.index}\n number={displayNumber.get(step.index) ?? String(i + 1)}\n depth={depth}\n isLast={isLastInList}\n isActive={isActive}\n accent={accent}\n icon={<Icon size={12} strokeWidth={2.25} />}\n kind={step.narration ? 'narration' : (step.step ?? 'tool')}\n title={isActive ? presentation.description : label}\n titleTestId={isActive ? 'agent-expanded-current-step-description' : undefined}\n badge={\n TierIcon ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"flex shrink-0 items-center self-center\">\n <TierIcon size={12} className={accent.fg} aria-hidden />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{MODEL_TIER_LABELS[tier!] ?? tier}</TooltipContent>\n </Tooltip>\n ) : undefined\n }\n meta={\n <>\n {isDeveloper && (\n <StepModelIcon modelName={step.usage?.model} tag={getModelTag(step.usage?.model)} />\n )}\n {isDeveloper && stepTokens[i] != null && (\n <span>{formatTokens(stepTokens[i]!)} tok</span>\n )}\n {/* Not on the active row: this step's cost is a frozen snapshot of the ONE LLM call\n that produced it; next to a spinner it would read as \"still counting\". */}\n {!isActive && stepGbp[i] != null && <span>{formatGbp(stepGbp[i]!)}</span>}\n {durationNode != null && <span>{durationNode}</span>}\n </>\n }\n >\n {summary &&\n !isActive &&\n (step.narration ? (\n /* Narration is PROSE (headings, bold, lists): render markdown, not raw asterisks.\n Tool summaries stay plain text: one-line headlines where a clamp matters. */\n <StepNarration index={step.index}>\n <ConnectedMarkdown isStreaming={false}>{summary}</ConnectedMarkdown>\n </StepNarration>\n ) : (\n <StepSummary index={step.index} multiLine={isMultiLine}>\n {summary}\n </StepSummary>\n ))}\n\n {/* What the narrative displaced: the tool's target or a plan's checklist. Dimmer than\n the summary: it answers \"on what?\", not \"doing what?\". */}\n {details.map((d, di) => (\n <StepDetail key={di} index={step.index}>\n {d}\n </StepDetail>\n ))}\n\n {showOutcome && (\n <StepOutcome index={step.index} failed={outcomeFailed}>\n {step.outcome}\n </StepOutcome>\n )}\n\n {toolParams.length > 0 && (\n <StepParams>{toolParams.map((p) => `${p.key}=${p.value}`).join(' ')}</StepParams>\n )}\n\n {step.routing && (\n <details className=\"mt-1 text-xs text-muted-foreground\" data-testid=\"routing-details\">\n <summary className=\"cursor-pointer\">Routing details</summary>\n <dl className=\"mt-2 space-y-2\">\n <div>\n <dt className=\"font-medium\">Answer model</dt>\n <dd>\n {step.routing.selected_model}\n {step.routing.model_recommendation\n ? ` (${step.routing.model_recommendation})`\n : ''}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">Default document search</dt>\n <dd>\n {step.routing.selected_doc_ext_ids.length\n ? step.routing.selected_doc_ext_ids\n .map((id) => docInfo[id]?.name ?? step.routing!.document_titles[id] ?? id)\n .join(', ')\n : 'No documents selected'}\n </dd>\n <dd>The complete document catalogue remains available for direct reading.</dd>\n </div>\n <div>\n <dt className=\"font-medium\">Always available tools</dt>\n <dd>\n {step.routing.always_available_tool_names\n .map((name) => name.replaceAll('_', ' '))\n .join(', ') || 'None'}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">Additional tools</dt>\n <dd>\n {step.routing.selected_tool_names == null\n ? 'All enabled tools retained'\n : step.routing.selected_tool_names\n .filter((name) => !step.routing!.always_available_tool_names.includes(name))\n .map((name) => name.replaceAll('_', ' '))\n .join(', ') || 'None'}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">History</dt>\n <dd>\n {step.routing.retained_message_ext_ids.length} messages retained\n {step.routing.history_retained_by_policy\n ? '; full history preserved by policy'\n : ''}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium\">Router</dt>\n <dd>\n {step.routing.router_model} · {step.routing.elapsed_seconds.toFixed(3)}s\n {step.routing.input_tokens != null\n ? ` · ${step.routing.input_tokens.toLocaleString()} input tokens`\n : ''}\n </dd>\n </div>\n {step.routing.status === 'fallback' && (\n <div>\n <dt className=\"font-medium\">Fallback</dt>\n <dd>\n Context and authorized tools retained (\n {step.routing.fallback_reason ?? 'router unavailable'}).\n </dd>\n </div>\n )}\n </dl>\n </details>\n )}\n\n {criteriaView && <GoalCriteria criteria={criteriaView} />}\n\n {/* Sub-agent steps nest under the tool step that spawned them, COLLAPSED: a\n deep_research run emits a dozen inner rows that buried the parent trace. The parent\n keeps the count so the work is never hidden, just folded. */}\n {folded && folded.length > 0 && (\n <SubStepGroup\n parentIndex={step.index}\n summary={summariseSubSteps(folded)}\n openClassName={accent.fg}\n renderSteps={() =>\n folded.map((c, ci, arr) => renderRow(c, depth + 1, ci === arr.length - 1))\n }\n />\n )}\n </StepRow>\n )\n }\n\n let summaryNode: React.ReactNode = null\n if (contextUsage?.spent_gbp != null) {\n const runStats = computeRunStats(steps)\n // Prefer the run's true cumulative totals (summed across every LLM call this turn made) over\n // total_input/total_output, which mirror only the last call's context.\n const totalInputTokens = contextUsage.all_llm_calls?.input_tokens ?? contextUsage.total_input\n const totalOutputTokens = contextUsage.all_llm_calls?.output_tokens ?? contextUsage.total_output\n const leftParts = [\n `${displayRows.length} step${displayRows.length !== 1 ? 's' : ''}`,\n `${runStats.toolCalls} tool call${runStats.toolCalls !== 1 ? 's' : ''}`,\n ]\n if (totalElapsedTime != null) leftParts.push(`${totalElapsedTime.toFixed(1)}s`)\n leftParts.push(`${formatTokens(totalInputTokens)} in`)\n if (totalOutputTokens > 0) leftParts.push(`${formatTokens(totalOutputTokens)} out`)\n summaryNode = (\n <StepTraceSummary\n left={leftParts.join(' · ')}\n isNearBudget={isNearAiUsageBudget(contextUsage)}\n total={`Total: ${formatGbp(contextUsage.spent_gbp)}`}\n />\n )\n }\n\n return (\n <StepTrace className={className} summary={summaryNode}>\n {displayRows.map((row, i) => {\n if (row.lane) {\n return (\n <LaneBinding\n key={`lane-${row.lane}`}\n handle={row.lane}\n steps={laneStepsByHandle.get(row.lane)!}\n number={i + 1}\n renderRow={renderRow}\n isStreaming={isStreaming}\n />\n )\n }\n const parent = row.step!\n return renderRow(\n parent,\n 0,\n i === displayRows.length - 1 && !childrenByParent.has(parent.index)\n )\n })}\n </StepTrace>\n )\n}\n\n/** Binds a sub-agent's lifecycle steps to the `SubAgentLane` block. */\nfunction LaneBinding({\n handle,\n steps,\n number,\n renderRow,\n isStreaming,\n}: {\n handle: string\n steps: AgentStepEvent[]\n number: number\n renderRow: (step: AgentStepEvent, depth: number, isLastInList: boolean) => React.ReactNode\n isStreaming: boolean\n}) {\n // The spawn marker (`subagent_status: \"running\"`) carries the child's task; a `done`/`failed`\n // marker closes it; in between are the child's own steps.\n const spawn = steps.find((s) => s.subagent_status === 'running')\n const closed = steps.find((s) => s.subagent_status === 'done' || s.subagent_status === 'failed')\n const failed = steps.some((s) => s.subagent_status === 'failed')\n const inner = steps.filter((s) => !s.subagent_status)\n const task = (spawn?.content || spawn?.focus || '').trim()\n const running = !closed && isStreaming\n // What the child is doing RIGHT NOW: its latest step's focus/label.\n const latest = inner[inner.length - 1]\n return (\n <SubAgentLane\n handle={handle}\n number={number}\n // Name the lane by its JOB, never \"sub-1\": the handle is only a stable key.\n job={subagentJobLabel(task) || `Sub-agent ${handle}`}\n task={task}\n status={running ? 'running' : failed ? 'failed' : 'done'}\n innerCount={inner.length}\n liveFocus={latest ? latest.focus?.trim() || getAgentStepLabel(latest) : ''}\n renderSteps={() => inner.map((s, i) => renderRow(s, 1, i === inner.length - 1))}\n />\n )\n}\n\n/** Summarise folded sub-steps by what they did, e.g. \"3 searches, 2 reads\". */\nfunction summariseSubSteps(steps: AgentStepEvent[]): string {\n const counts = new Map<string, number>()\n for (const s of steps) {\n const noun = subStepNoun(getStepTool(s))\n counts.set(noun, (counts.get(noun) ?? 0) + 1)\n }\n return [...counts.entries()]\n .map(([noun, n]) => `${n} ${n === 1 ? noun : pluralise(noun)}`)\n .join(', ')\n}\n\n/** `met` (and `absent_from_corpus`, which the gate accepts) tick; anything else stays open. */\nfunction isCriterionMet(status?: string): boolean {\n return status === 'met' || status === 'absent_from_corpus'\n}\n\n/**\n * Does this outcome describe a failure?\n *\n * Outcomes are free text from the backend (\"exit 0 · 1.2s\", \"15 passages\n * retrieved\", \"timed out · 30.0s\"), so this reads the few shapes that carry a\n * verdict and defaults to \"not a failure\" for the rest — a false alarm on a\n * successful step is worse than a neutral chip.\n */\nfunction isFailureOutcome(outcome: string): boolean {\n const o = outcome.toLowerCase()\n if (/\\bexit\\s+0\\b/.test(o)) return false\n return /\\bexit\\s+[1-9]/.test(o) || /timed out|timeout|failed|error\\b/.test(o)\n}\n\n/** What one inner step *is*, for the collapsed summary line. */\nfunction subStepNoun(tool: string | undefined): string {\n switch (tool) {\n case 'search_inside_documents':\n case 'search_conversations':\n case 'web_search':\n return 'search'\n case 'read_document':\n case 'read_url':\n case 'view_document_pages':\n case 'get_table_of_contents':\n return 'read'\n case 'execute_code':\n case 'spawn_coding_agent':\n return 'run'\n case 'create_plan':\n return 'plan'\n default:\n return 'step'\n }\n}\n\nfunction pluralise(noun: string): string {\n return noun.endsWith('h') ? `${noun}es` : `${noun}s`\n}\n\nexport const AgentSteps = React.memo(AgentStepsComponent, (prev, next) => {\n return (\n prev.isStreaming === next.isStreaming &&\n prev.className === next.className &&\n prev.totalElapsedTime === next.totalElapsedTime &&\n prev.steps === next.steps &&\n prev.liveTimer === next.liveTimer &&\n prev.hideLive === next.hideLive\n )\n})\n","/**\n * RunningSubagents — the live roster of a turn's sub-agents, shown indented under\n * the agent's own status line in the main turn bar (NOT in the steps drawer).\n *\n * One compact line per sub-agent, named by its JOB (not \"sub-1\"): a running child\n * shows a spinner + its current focus; a finished child shows a check (or an alert\n * if it failed). This is the \"watch my team work\" view — the agent up top, its\n * sub-agents beneath it, each reporting its own progress.\n *\n * Each line EXPANDS on its own chevron to reveal that child's own steps, the same\n * affordance the main bar uses for the agent's steps — a sub-agent is not a black\n * box. This is the only place a RUNNING child's steps can be read: the steps drawer\n * drops running lanes (`hideLive`) precisely because they live here.\n *\n * Purely derived from the step stream via {@link extractSubagentLanes}.\n */\n\nimport { useMemo } from 'react'\nimport {\n extractSubagentLanes,\n findLeafForTaskMessage,\n mergeAgentSteps,\n type AgentStepEvent,\n} from '@arbidocs/sdk/browser'\nimport { useConversationData } from '@arbidocs/react'\nimport { SubagentRoster } from '../../agents/runs/SubagentRoster'\nimport { AgentSteps } from './AgentSteps'\n\ninterface RunningSubagentsProps {\n steps: AgentStepEvent[]\n className?: string\n}\n\n/**\n * Each sub-agent's own steps, keyed by handle and ready to render as a plain\n * timeline.\n *\n * A child's steps are the ones carrying ITS handle — grouping is by identity, not\n * arrival order, because several children run concurrently and their events\n * interleave on the wire. The spawn/done lifecycle markers are dropped (the roster\n * line already reports that status), and the handle is stripped so AgentSteps\n * renders ordinary numbered rows instead of re-grouping them into a nested lane\n * card inside the lane we just opened.\n */\nfunction groupStepsByHandle(steps: AgentStepEvent[]): Map<string, AgentStepEvent[]> {\n const byHandle = new Map<string, AgentStepEvent[]>()\n for (const step of mergeAgentSteps(steps)) {\n if (!step.subagent || step.subagent_status) continue\n const arr = byHandle.get(step.subagent)\n const row = { ...step, subagent: undefined }\n if (arr) arr.push(row)\n else byHandle.set(step.subagent, [row])\n }\n return byHandle\n}\n\n/**\n * Thin wrapper so the data-fetching inner component (and its `useConversationData`\n * call) never mounts on a turn with no sub-agents — a plain turn shouldn't pay for\n * (or require a QueryClientProvider around) the \"open thread\" lookup.\n */\nexport function RunningSubagents({ steps, className }: RunningSubagentsProps) {\n const lanes = extractSubagentLanes(steps)\n if (lanes.length === 0) return null\n return <RunningSubagentsRoster steps={steps} lanes={lanes} className={className} />\n}\n\nfunction RunningSubagentsRoster({\n steps,\n lanes,\n className,\n}: RunningSubagentsProps & { lanes: ReturnType<typeof extractSubagentLanes> }) {\n // Only used for the \"open thread\" affordance's branch lookup — cheap (React\n // Query dedupes against the same conversation's already-fetched threads).\n const { threads, setParentMessageId: selectThread } = useConversationData()\n // Memoised so an expanded child's step array keeps a stable identity across the\n // bar's frequent re-renders (it ticks a live timer). Rebuilding it every render\n // busts AgentSteps' memo, which re-runs its \"follow the run\" auto-scroll and\n // livelocks the bar against the conversation's own scrolling.\n const stepsByHandle = useMemo(() => groupStepsByHandle(steps), [steps])\n const rosterLanes = useMemo(\n () =>\n lanes.map((lane) => ({\n handle: lane.handle,\n status: lane.status,\n task: lane.task || lane.job,\n stepCount: lane.steps,\n canOpenThread: !!lane.taskMessageExtId,\n })),\n [lanes]\n )\n\n const openThread = (handle: string) => {\n const taskMessageExtId = lanes.find((lane) => lane.handle === handle)?.taskMessageExtId\n if (!taskMessageExtId) return\n const leafId = findLeafForTaskMessage(threads, taskMessageExtId)\n if (leafId) selectThread(leafId)\n }\n\n return (\n <SubagentRoster\n lanes={rosterLanes}\n className={className}\n onOpenThread={openThread}\n // `isStreaming={false}`: these rows are the child's SETTLED steps — the\n // roster line carries \"running\".\n renderSteps={(handle) => (\n <AgentSteps\n steps={stepsByHandle.get(handle) ?? []}\n isStreaming={false}\n className=\"!border-b-0\"\n />\n )}\n />\n )\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { ChevronRight, Download } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { downloadTableAsCsv } from '../../chat/table-csv'\nimport { notify } from '@arbidocs/react/shell'\n\n/**\n * A markdown table inside an assistant answer, with a \"Download CSV\" button.\n *\n * The table scrolls sideways inside its own box when it is wider than the answer, so\n * no column is clipped. The button sits in a row above the table, so it never covers a\n * header, and only shows on hover or keyboard focus (always on touch screens), so it\n * doesn't clutter the answer; it stays in the tab order so keyboard users can always reach it.\n *\n * A table's sideways scrollbar sits at its bottom edge, often far below the screen, and phones\n * hide scrollbars until you scroll. So while columns are still off to the right, a fade on the\n * right edge and a labelled \"Scroll right\" button in the row above the table say there is more.\n * The button scrolls the table on tap and sits outside the table, so it never covers a header.\n * Both go away once you reach the end.\n */\nexport function AnswerTable({\n children,\n className,\n ...props\n}: React.ComponentPropsWithoutRef<'table'>): React.JSX.Element {\n const wrapperRef = useRef<HTMLDivElement>(null)\n const scrollRef = useRef<HTMLDivElement>(null)\n const [hasMoreRight, setHasMoreRight] = useState(false)\n\n const checkOverflow = useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n const more = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n // Equality-guarded so scrolling or resizing doesn't re-render when nothing changed.\n setHasMoreRight((prev) => (prev === more ? prev : more))\n }, [])\n\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n checkOverflow()\n const observer = new ResizeObserver(checkOverflow)\n observer.observe(el)\n if (el.firstElementChild) observer.observe(el.firstElementChild)\n return () => observer.disconnect()\n }, [checkOverflow])\n\n const scrollRight = useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n el.scrollBy({ left: 240, behavior: 'smooth' })\n }, [])\n\n const handleDownload = useCallback(async () => {\n const table = wrapperRef.current?.querySelector('table')\n if (!table || !wrapperRef.current) return\n try {\n const filename = await downloadTableAsCsv(table, wrapperRef.current)\n notify.success(`Saved ${filename}`)\n } catch (error) {\n console.error('Failed to download table as CSV', error)\n notify.error('Could not download the table as CSV')\n }\n }, [])\n\n return (\n <div ref={wrapperRef} className=\"group/answer-table w-fit min-w-0 max-w-full\">\n <div className=\"flex items-center justify-end gap-2 pb-1\">\n {hasMoreRight && (\n <button\n type=\"button\"\n onClick={scrollRight}\n data-testid=\"answer-table-scroll-right\"\n className=\"flex items-center gap-1 rounded border border-border bg-background/90 px-1.5 py-0.5 text-xs text-foreground shadow-sm transition-colors hover:bg-muted\"\n >\n <span>Scroll right</span>\n <ChevronRight size={12} aria-hidden=\"true\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={handleDownload}\n data-testid=\"answer-table-download-csv\"\n aria-label=\"Download table as CSV\"\n title=\"Download as CSV\"\n className=\"flex items-center gap-1 rounded border border-border bg-background/90 px-1.5 py-0.5 text-xs text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground focus-visible:opacity-100 group-hover/answer-table:opacity-100 group-focus-within/answer-table:opacity-100 pointer-coarse:opacity-100\"\n >\n <Download size={12} aria-hidden=\"true\" />\n <span>CSV</span>\n </button>\n </div>\n {/* Wide tables scroll sideways inside the bubble instead of running past its edge. */}\n <div className=\"relative min-w-0 max-w-full\">\n <div\n ref={scrollRef}\n onScroll={checkOverflow}\n className=\"scrollbar-subtle max-w-full overflow-x-auto pb-1\"\n data-testid=\"answer-table-scroll\"\n >\n {/* Each column keeps a readable width, so on a phone the table scrolls sideways\n instead of squeezing every column to a word or two per line. */}\n <table\n data-testid=\"markdown-table\"\n {...props}\n className={cn('[&_td]:min-w-36 [&_th]:min-w-36', className)}\n >\n {children}\n </table>\n </div>\n {hasMoreRight && (\n <div\n aria-hidden=\"true\"\n data-testid=\"answer-table-fade\"\n className=\"pointer-events-none absolute inset-y-0 right-0 w-10 bg-linear-to-l from-background to-transparent\"\n />\n )}\n </div>\n </div>\n )\n}\n","/**\n * Open a cited or retrieved passage in the viewer: its document (the version it was quoted from),\n * its page and the passage itself.\n */\n\nimport { useCallback } from 'react'\nimport { useDocuments, type Chunk } from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { citedVersionRef } from '../../facts/cited-version-ref'\n\nexport function useOpenChunk(): (chunk: Chunk) => void {\n const { openDocument } = useBlocksEnvironment()\n const { data: documents } = useDocuments()\n return useCallback(\n (chunk: Chunk) => {\n const meta = chunk.metadata\n if (!meta?.doc_ext_id) return\n // A passage of an older version opens that version.\n const listed = documents?.find((d) => d.external_id === meta.doc_ext_id)\n openDocument(citedVersionRef(meta.doc_ext_id, meta.doc_version, listed?.current_version), {\n page: meta.page_number ?? undefined,\n passageId: meta.chunk_ext_id ?? undefined,\n })\n },\n [openDocument, documents]\n )\n}\n","import { useMemo } from 'react'\nimport { useDocuments } from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\n\n/**\n * Workspace display names keyed by document external id: the same label the document list and\n * viewer show. Citation chunks carry the raw upload name instead, so answers can name a file\n * differently from the workspace.\n */\nexport function useWorkspaceDocTitles(): ReadonlyMap<string, string> {\n const { data } = useDocuments()\n return useMemo(\n () =>\n new Map<string, string>(\n (data ?? []).map((doc) => [doc.external_id, getDocumentTitle(doc)] as [string, string])\n ),\n [data]\n )\n}\n","import React, { useCallback } from 'react'\nimport {\n CitationRenderer as CitationRendererCore,\n useArbiHost,\n useArbiSessionState,\n useArbiSessionStore,\n type ChunkActivation,\n type CitationRendererProps as CitationRendererCoreProps,\n type CitationState,\n type RenderMarkdown,\n type ToolResponses,\n} from '@arbidocs/react'\nimport { notify } from '@arbidocs/react/shell'\nimport type { MarkdownRendererProps } from '@arbidocs/react/ui'\nimport { workspaceDocIdFromHref } from '../../chat/doc-links'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { ConnectedMarkdown, ExternalLink, InternalDocLink } from './ConnectedMarkdown'\nimport { AnswerTable } from './AnswerTable'\nimport { useOpenChunk } from './useOpenChunk'\nimport { useWorkspaceDocTitles } from './useWorkspaceDocTitles'\n\n/** The markdown element overrides, as the kit's renderer takes them. */\ntype Components = NonNullable<MarkdownRendererProps['components']>\n\n/**\n * An answer with its citations, bound to the session.\n *\n * The presentational behaviour lives in the token-neutral core at `@arbidocs/react`\n * (`CitationRenderer`). This binding wires the session into the core's injected callbacks (the\n * open citation, the viewed passage) and hands it the conversation's markdown and links. Whether\n * the conversation is on screen (the citation popover shows only then) is the host's\n * (`ArbiChatHost.useIsChatInView`).\n */\n\nexport interface ConnectedCitationRendererProps {\n content: string\n citations?: Record<string, string[]>\n citationData?: ToolResponses\n className?: string\n messageId: string\n isStreaming?: boolean\n}\n\n/** Whether the conversation is on screen; without a host answer, it is. */\nconst alwaysInView = () => true\n\n// Reactive popover state, read as a hook so the subscription stays local to each popover: the\n// top-level renderer never re-renders on citation state changes.\nfunction useCitationState(): CitationState {\n const activeCitationKey = useArbiSessionState((s) => s.activeCitationKey)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const useIsChatInView = useArbiHost().chat?.useIsChatInView ?? alwaysInView\n return { activeCitationKey, viewingPassageId, isOnConversationPage: useIsChatInView() }\n}\n\n// Module-scope so the reference is stable: it is a dependency of the renderer's markdown components.\nconst notifyCitation: NonNullable<CitationRendererCoreProps['notify']> = (message, kind) =>\n notify[kind ?? 'info'](message)\n\n// Answer tables get a \"Download CSV\" button. Cached per core components object so the\n// merged reference stays stable and memoised markdown blocks don't re-parse.\nconst answerComponentsCache = new WeakMap<Partial<Components>, Partial<Components>>()\nfunction withAnswerTable(components: Partial<Components>): Partial<Components> {\n let merged = answerComponentsCache.get(components)\n if (!merged) {\n merged = { ...components, table: AnswerTable }\n answerComponentsCache.set(components, merged)\n }\n return merged\n}\n\n// Hand the conversation's markdown to the core (KaTeX, Mermaid, document pills). Module-scope so\n// the reference is stable across renders.\nconst renderMarkdown: RenderMarkdown = ({ components, isStreaming, children }) => (\n <ConnectedMarkdown components={withAnswerTable(components)} isStreaming={isStreaming}>\n {children}\n </ConnectedMarkdown>\n)\n\n/**\n * Links inside an answer, as the citation core sees them.\n *\n * The core's own `a` override handles `#cite-N` and hands EVERYTHING else to the\n * injected `ExternalLink` — and because component overrides are merged custom-last,\n * that override replaces the one in `MarkdownRenderer`, including its\n * workspace-document case. So a link to a document the answer just saved got the\n * \"Open External Link\" confirmation; and since the model writes the href as a bare\n * `doc-…` id, `window.open` then resolved it RELATIVE to the app and opened the\n * document in-app anyway. Confirmation dialog and correct destination, both.\n *\n * Injecting this wrapper instead of the raw `ExternalLink` puts the decision back\n * in the adapter — the one file that is supposed to know what a document is —\n * without teaching the token-neutral core about workspaces.\n */\nfunction LinkInAnswer({ href, children, ...props }: React.ComponentPropsWithoutRef<'a'>) {\n const docId = workspaceDocIdFromHref(href, useBlocksEnvironment().runtimeConfig.deploymentDomain)\n if (docId) {\n return (\n <InternalDocLink docId={docId} href={href} {...props}>\n {children}\n </InternalDocLink>\n )\n }\n return (\n <ExternalLink href={href} {...props}>\n {children}\n </ExternalLink>\n )\n}\n\nconst ConnectedCitationRendererComponent: React.FC<ConnectedCitationRendererProps> = (props) => {\n const session = useArbiSessionStore()\n const openChunk = useOpenChunk()\n const docTitles = useWorkspaceDocTitles()\n\n const onOpenCitation = useCallback(\n (citationKey: string) => session.setActiveCitationKey(citationKey),\n [session]\n )\n\n const onActivateChunk = useCallback(\n ({ messageId, citationNum, chunk }: ChunkActivation) => {\n session.setActiveCitationKey(`${messageId}-${citationNum}`)\n if (chunk.metadata.chunk_ext_id) openChunk(chunk)\n },\n [session, openChunk]\n )\n\n const onCloseCitation = useCallback(() => {\n session.setActiveCitationKey(null)\n const viewing = session.getState().viewingDocument\n if (viewing?.passageId) session.setViewingDocument({ id: viewing.id, passageId: null })\n }, [session])\n\n const onDismissCitation = useCallback(() => session.setActiveCitationKey(null), [session])\n\n return (\n <CitationRendererCore\n {...props}\n renderMarkdown={renderMarkdown}\n ExternalLink={LinkInAnswer}\n onOpenCitation={onOpenCitation}\n onActivateChunk={onActivateChunk}\n useCitationState={useCitationState}\n onCloseCitation={onCloseCitation}\n onDismissCitation={onDismissCitation}\n notify={notifyCitation}\n docTitles={docTitles}\n />\n )\n}\n\nexport const ConnectedCitationRenderer = React.memo(ConnectedCitationRendererComponent)\n","/**\n * MessageDetailsModal Component\n *\n * Displays detailed message information including execution trace in a collapsible JSON tree.\n * Similar to browser developer console JSON viewer.\n */\n\nimport type { ReactNode } from 'react'\nimport { Dialog, DialogContent } from '@arbidocs/react/ui'\nimport { useArbiSessionState, useMessageDetails } from '@arbidocs/react'\nimport { Loader2, FileText } from 'lucide-react'\nimport { MessageJsonTree } from '../../settings/MessageJsonTree'\nimport { ModalBreadcrumbHeader, ModalCrumbs } from '../../settings/ModalBreadcrumbHeader'\n\nexport interface MessageDetailsModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n messageExtId: string | null\n /** The open workspace, for the breadcrumb: its name and the host's icon for it. */\n workspace?: { name: string; icon?: ReactNode } | null\n}\n\nexport function MessageDetailsModal({\n open,\n onOpenChange,\n messageExtId,\n workspace,\n}: MessageDetailsModalProps) {\n const {\n data: messageDetails,\n isLoading,\n error,\n } = useMessageDetails(messageExtId, { enabled: open && !!messageExtId })\n\n const currentConversationId = useArbiSessionState((s) => s.conversationId)\n\n // Get conversation title from message details once loaded\n const conversationTitle =\n messageDetails?.conversation_ext_id === currentConversationId\n ? 'Current Conversation'\n : 'Message'\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n presentation=\"sheet\"\n className=\"max-w-4xl max-h-[calc(100dvh-2rem)] overflow-hidden flex flex-col\"\n data-testid=\"message-details-modal\"\n >\n <ModalBreadcrumbHeader\n icon={<FileText size={20} />}\n title=\"Message Details\"\n subtitle={\n workspace || currentConversationId ? (\n <ModalCrumbs\n items={[\n ...(workspace\n ? [\n {\n icon: workspace.icon,\n label: workspace.name,\n },\n ]\n : []),\n ...(currentConversationId ? [{ label: conversationTitle }] : []),\n ]}\n />\n ) : undefined\n }\n description=\"Full message data including execution trace and metadata\"\n />\n\n <div className=\"flex-1 overflow-auto p-4 bg-muted/20 rounded-md\">\n {isLoading && (\n <div\n className=\"flex items-center justify-center h-64\"\n data-testid=\"message-details-loading\"\n >\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n )}\n\n {error && (\n <div\n className=\"text-destructive p-4 border border-destructive/20 rounded-md\"\n data-testid=\"message-details-error\"\n >\n Error loading message details: {String(error)}\n </div>\n )}\n\n {messageDetails && (\n <div data-testid=\"message-details-content\">\n <MessageJsonTree data={messageDetails} name=\"message\" defaultExpanded={true} />\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The open workspace and its shield (its initial in its kind's colour), for a notice or a\n * dialog's breadcrumb about something in it.\n */\nimport type { ReactNode } from 'react'\nimport { getWorkspaceKind, useArbiSessionState, useWorkspaces } from '@arbidocs/react'\nimport { ShieldIcon } from '@arbidocs/react/ui'\nimport { workspaceKindColor } from '../../shell/Workspace'\n\nexport function useOpenWorkspaceIcon() {\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: workspaces } = useWorkspaces()\n const workspace = workspaces?.find((w) => w.external_id === workspaceId)\n const icon = (size: number): ReactNode =>\n workspace ? (\n <ShieldIcon\n char={workspace.name.charAt(0)}\n workspaceColor={workspaceKindColor(getWorkspaceKind(workspace))}\n size={size}\n />\n ) : undefined\n return { workspaceId, workspace, icon }\n}\n","import { createContext } from 'react'\nimport type { AskAgain } from '@arbidocs/react'\n\n/**\n * Re-run the question of a stopped answer. The conversation view provides it, since only it\n * knows how the question must go: straight back to ARBI, or through the task's review when the\n * task waits for one. Without a provider, \"Ask again\" falls back to editing the question.\n */\nexport const AskAgainContext = createContext<AskAgain | null>(null)\n","import { useConversationActivity, useDocuments, useConversationItems } from '@arbidocs/react'\nimport { getDocumentTitle } from '@arbidocs/react/ui'\nimport { WorkflowStepChip } from '../../chat/WorkflowStepChip'\nimport { fromPlanSteps, type TaskPlanStep } from '../../agents/workflows/planSteps'\nimport {\n splitDocRef,\n stepPhase,\n stepStatesFromActivity,\n type WorkflowActivityEvent,\n} from '../../agents/workflows/run'\nimport { stepDocuments } from '../../agents/workflows/StepDocuments'\nimport { stepKindOf } from '../../agents/workflows/stepKinds'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\nexport interface WorkflowStepMessageProps {\n messageId: string\n conversationId?: string | null\n /** The step the message starts (its `tools.workflow_step`). */\n step: string\n content: string\n}\n\n/**\n * A message the server sent to start a workflow step: the step's chip, centred, in its kind's\n * colour and its current phase (the run's plan and activity, as the thread's top bar reads them),\n * expandable to the full instruction.\n */\nexport function WorkflowStepMessage({\n messageId,\n conversationId,\n step,\n content,\n}: WorkflowStepMessageProps) {\n const { conversations } = useConversationItems()\n // The same cached query as the thread's bar: no extra request.\n const activity = useConversationActivity(conversationId ?? undefined, { live: true })\n const plan = conversations.find((c) => c.external_id === conversationId)?.plan\n const steps = fromPlanSteps((plan?.steps ?? []) as TaskPlanStep[])\n const found = steps.find((s) => s.id === step)\n const states = stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[])\n const { data: documents = [] } = useDocuments()\n const { openDocument } = useBlocksEnvironment()\n // The step's document (its latest version), one click from its chip.\n const ref = found ? stepDocuments(steps, states, step).at(-1) : undefined\n const docId = ref ? splitDocRef(ref).id : undefined\n const doc = documents.find((d) => d.external_id === docId)\n return (\n <WorkflowStepChip\n step={step}\n title={found?.title}\n kind={found ? stepKindOf(found) : undefined}\n phase={found && activity.data ? stepPhase(steps, states, step) : undefined}\n document={\n docId\n ? {\n name: doc ? getDocumentTitle(doc) : docId,\n onOpen: () => {\n openDocument(docId)\n },\n }\n : undefined\n }\n content={content}\n messageId={messageId}\n />\n )\n}\n","/**\n * ConnectedMessage\n *\n * Renders a single message in the conversation, connected to the session and the host.\n * This component:\n * - Displays user and assistant messages with appropriate styling\n * - Handles message editing and context actions\n * - Supports markdown content rendering with syntax highlighting\n * - Manages message state (loading, error, edit mode)\n * - Coordinates with branch controls for forked conversations\n */\n\nimport {\n MessageArtifactCard,\n workflowStepOf,\n type MessageArtifact,\n useCreateFact,\n useCreateFacts,\n useDocuments,\n useWorkspaceUsers,\n useConversationWorkspace,\n stripSpeakerPrefix,\n transcriptSegmentOf,\n useThinkingContent,\n useConversationItems,\n resolveConfigModel,\n useArbiSession,\n useArbiSessionState,\n useArbiSessionStore,\n useAvailableModels,\n useConfig,\n useDeleteMessage,\n useUserSettings,\n useLinkMentions,\n} from '@arbidocs/react'\nimport { useMessageChatArtifact, useAssistantCopy } from '@arbidocs/react/shell'\nimport {\n formatFriendlyDate,\n getDocumentTitle,\n isImageDocument,\n getUserDisplayName,\n} from '@arbidocs/react/ui'\nimport React, { useState, useRef, useEffect, useMemo, useCallback, useContext } from 'react'\nimport type { ChatMessage as MessageType } from '@arbidocs/sdk/browser'\nimport { ErrorBoundary } from '../../components/ErrorBoundary'\nimport {\n MessageRoot,\n MessageContent,\n MessageAuthor,\n MessageBubble,\n MessageByline,\n MessageSubagentBadge,\n MessageBody,\n MessageNarration,\n MessageFooter,\n MessageActionButton,\n MessageActionMenu,\n type MessageActionMenuItem,\n} from '../../chat/Message'\nimport { buildDeepLinkPath } from '../../lib/deep-link'\nimport { Copy, Check, Clock, Edit3, Link, Trash2, Milestone, Share2, RotateCcw } from 'lucide-react'\nimport { AssistantEntity } from '../../agents/tasks/AssistantEntity'\nimport { AgentSteps } from './AgentSteps'\nimport { ConnectedCitationRenderer } from './ConnectedCitationRenderer'\nimport { ConnectedMarkdown } from './ConnectedMarkdown'\nimport { MessageDetailsModal } from './MessageDetailsModal'\nimport { MessageLiveSeconds } from './MessageLiveSeconds'\nimport { buildCitationChunkData } from '@arbidocs/sdk/browser'\nimport { artifactKindFromFileName, viewerTabForArtifactMode } from '@arbidocs/react/artifacts'\nimport { findMessageDocument } from '../../chat/generatedDocuments'\nimport { useOpenWorkspaceIcon } from './useOpenWorkspaceIcon'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { DocumentUser } from '../files/fields/DocumentUser'\nimport { buildFactCitations } from '../../facts/fact-citations'\nimport { chronologyFactBodies } from '../../facts/fact-chronology'\nimport { topLevelAgentSteps } from '@arbidocs/sdk/browser'\nimport { copyMessageToClipboard } from '../../chat/message-copy'\nimport { getCurrentAgentStepPresentation } from '../../agents/runs/step-presentation'\nimport { getSubagentBranchRecord } from '@arbidocs/sdk/browser'\nimport { AskAgainContext } from './AskAgainContext'\nimport { WorkflowStepMessage } from './WorkflowStepMessage'\nimport { TranscriptEntry } from '../../calls/connected/TranscriptEntry'\nimport { useTranscriptRuns } from '../../calls/connected/transcript-runs-context'\n\nexport interface ConnectedMessageProps {\n message: MessageType\n index: number\n className?: string\n ['data-message-id']?: string\n branchControl?: React.ReactNode\n subagentLinks?: React.ReactNode\n messageHistory?: MessageType[]\n participantTint?: string\n}\n\nconst MessageComponent = ({\n message,\n index,\n branchControl,\n subagentLinks,\n messageHistory,\n participantTint,\n ...rest\n}: ConnectedMessageProps) => {\n const [isCopied, setIsCopied] = useState(false)\n const [factSaved, setFactSaved] = useState(false)\n const [isStepsExpanded, setIsStepsExpanded] = useState(false)\n const [showDetailsModal, setShowDetailsModal] = useState(false)\n const messageRef = useRef<HTMLDivElement>(null)\n\n const session = useArbiSessionStore()\n const environment = useBlocksEnvironment()\n // Stored @mentions become chips, the assistant's under the host's name for it as well.\n const linkMentions = useLinkMentions()\n const { notify } = environment\n const editingMessageId = useArbiSessionState((state) => state.editingMessageId)\n const isEditing = editingMessageId === message.external_id\n const { conversations } = useConversationItems()\n const isShared = !!conversations?.find(\n (conversation) => conversation.external_id === message.conversation_ext_id\n )?.is_shared\n const assistantTint = isShared ? 'var(--color-secondary)' : 'var(--color-primary)'\n const deleteMessage = useDeleteMessage()\n\n // Get user settings to check developer status\n const { data: userSettings } = useUserSettings()\n const isDeveloper = userSettings?.developer === true\n\n const role = (message.role || '').toLowerCase()\n const isUser = role === 'user'\n const isTopLevel = index === 0\n\n // A sub-agent task message is a `role: user` message ARBI generates itself\n // to hand a task to a delegate — it is created_by the human (the human did\n // delegate it), so it would otherwise render pixel-identical to a message\n // that human actually typed: same \"You\" pill, same bubble. Sitting right\n // next to the human's real ask, two visually-identical \"You\" bubbles read\n // as a duplicate-send bug, not \"the system rephrased this for a delegate\".\n const subagentTaskRecord = isUser ? getSubagentBranchRecord(message) : null\n\n // Get current user and workspace users to determine message author\n const currentUser = useArbiSession().user\n const {\n workspaceId: selectedWorkspaceId,\n workspace: currentWorkspace,\n icon: workspaceIcon,\n } = useOpenWorkspaceIcon()\n const { data: workspaceUsers = [] } = useWorkspaceUsers()\n\n // Inline artifact (drafted document) linked to this assistant message —\n // surfaces the draft in the conversation, not only a docked panel.\n const streaming = useMessageChatArtifact(message.external_id)\n const { data: workspaceDocs } = useDocuments()\n const linkedArtifact = useMemo((): MessageArtifact | undefined => {\n if (!message.external_id) return undefined\n if (streaming) return streaming\n const doc = findMessageDocument(workspaceDocs, message.external_id)\n if (!doc) return undefined\n // A saved artifact's mode is its file's extension: .html/.jsx are live artifacts, an image is\n // an image, and anything else is a document draft (stored by the server as .docx).\n const kind = artifactKindFromFileName(doc.file_name)\n return {\n docExtId: doc.external_id,\n title: getDocumentTitle(doc),\n isComplete: true,\n mode: isImageDocument(doc) ? 'image' : (kind ?? 'markdown'),\n }\n }, [streaming, workspaceDocs, message.external_id])\n const handleOpenArtifact = useCallback(\n (docExtId: string) => {\n // Open on the tab that fits the artifact: a document draft in the Word editor, an html/react\n // artifact on its Preview, an image on its media view.\n session.setDocumentViewer({ tab: viewerTabForArtifactMode(linkedArtifact?.mode) })\n environment.openDocument(docExtId)\n },\n [linkedArtifact?.mode, session, environment]\n )\n\n // Find the user object for the message author\n const messageAuthorUser = useMemo(() => {\n if (!isUser) return null\n\n // Check if message is from current user\n const isCurrentUser = message.created_by_ext_id === currentUser?.external_id\n if (isCurrentUser && currentUser) {\n // Current user from auth store is already User-compatible\n return currentUser\n }\n\n // Find the workspace user who created this message\n const workspaceUser = workspaceUsers.find(\n (wu) => wu.user.external_id === message.created_by_ext_id\n )\n return workspaceUser?.user || null\n }, [isUser, message.created_by_ext_id, currentUser, workspaceUsers])\n\n // Someone else's typed message: left-aligned, under their person pill each time the author\n // changes (my own stay on the right; transcript lines are centred for everyone).\n const isOtherPerson =\n isUser && !!message.created_by_ext_id && message.created_by_ext_id !== currentUser?.external_id\n const startsAuthorRun = useMemo(() => {\n if (!isOtherPerson) return false\n const prev = messageHistory && index > 0 ? messageHistory[index - 1] : null\n if (!prev) return true\n const prevIsTranscript = !!transcriptSegmentOf(prev.tools ?? prev.meta?.tools)\n return (\n prev.role !== 'user' ||\n prevIsTranscript ||\n prev.created_by_ext_id !== message.created_by_ext_id\n )\n }, [isOtherPerson, messageHistory, index, message.created_by_ext_id])\n\n // Get config for this message to extract model info\n // For user messages, get the config from the immediately following assistant message\n const configId = useMemo(() => {\n if (!isUser) {\n return message.config_ext_id\n }\n\n // For user messages, get the next message (which should be the assistant response)\n if (messageHistory && index + 1 < messageHistory.length) {\n const nextMessage = messageHistory[index + 1]\n if (nextMessage.role === 'assistant') {\n return nextMessage.config_ext_id\n }\n }\n\n return message.config_ext_id // fallback\n }, [isUser, message.config_ext_id, messageHistory, index])\n\n const { data: messageConfig } = useConfig(configId || 'default')\n\n // Extract the model that actually ran for the message footer.\n //\n // Source of truth is the assistant response itself, not the request config:\n // assistant messages persist `tools.stream_events.events` which hydrate into\n // `message.agentSteps`. Each step's `usage.model` is the LLM the backend\n // actually called for that step (resolved post-FilterPlan in auto mode).\n //\n // The 'answering' step is the LLM call that produced the response content,\n // so it's the most accurate source. We fall back to the last step with a\n // recorded model (handles edge cases like a still-streaming answering step\n // or non-standard step ordering), and finally to the goal step's\n // `selected_model` for messages mid-stream that haven't recorded usage yet.\n //\n // The request config can't be used here — assistant messages typically\n // have `config_ext_id = null`, so it would just read the user's *current*\n // default config (not what ran), and in auto mode it stores the\n // placeholder `AGENT_MODEL_NAME = \"auto\"` which isn't a real model.\n const modelName = useMemo(() => {\n const steps = message.agentSteps\n if (!steps?.length) return null\n const answering = steps.find((s) => s.step === 'answering' && s.usage?.model)\n if (answering?.usage?.model) return answering.usage.model\n for (let i = steps.length - 1; i >= 0; i--) {\n const used = steps[i].usage?.model\n if (used) return used\n }\n return steps.find((s) => s.selected_model)?.selected_model ?? null\n }, [message.agentSteps])\n\n // Look up model tag for the footer icon (matches ModelSelector's tag icons)\n const { data: availableModels } = useAvailableModels()\n const modelTag = useMemo(() => {\n if (!modelName || !availableModels?.models) return null\n const info = availableModels.models.find((m) => m.model_name === modelName)\n return info?.tags?.[0] || null\n }, [modelName, availableModels])\n\n // Use model name directly for footer label — matches the ModelSelector dropdown\n const modelDisplayName = modelName\n\n // Extract citations and convert to the format CitationRenderer expects\n const activeCitations = useMemo(() => {\n const tools = message.tools || message.meta?.tools\n const modelCitations = tools?.model_citations\n const toolResponses =\n modelCitations && 'tool_responses' in modelCitations ? modelCitations.tool_responses : null\n\n if (!toolResponses || typeof toolResponses !== 'object') {\n return null\n }\n\n // Schema format: citation number as key, CitationData object as value\n // Convert to simple Record<string, string[]> for CitationRenderer\n const citationMap: Record<string, string[]> = {}\n\n Object.entries(toolResponses).forEach(([citationNum, citationData]) => {\n if (citationData && typeof citationData === 'object' && 'chunk_ids' in citationData) {\n // Frontend only needs chunk_ids from CitationData\n const citation = citationData as { chunk_ids: string[] }\n citationMap[citationNum] = citation.chunk_ids\n }\n })\n\n return Object.keys(citationMap).length > 0 ? citationMap : null\n }, [message.tools, message.meta?.tools])\n\n // Stable citation-data object so CitationRenderer (memo'd) doesn't re-render per token\n const citationData = useMemo(() => buildCitationChunkData(message), [message])\n\n // Keep faded until WebSocket confirms completion (isLoading becomes false/undefined).\n // Assistant-only: the user's own message is also stamped isLoading=true while its\n // response streams (see the chat stream handlers (@arbidocs/react)) purely to suppress the orphan-alert\n // flash, so it must not be treated as \"still generating\" for footer purposes.\n const isGenerating = !isUser && message.isLoading === true\n const isFailed = message.status === 'failed'\n // The person stopped this answer; the server keeps whatever had streamed so far.\n const isStopped = !isUser && message.status === 'cancelled'\n const isQueued = isUser && message.status === 'queued'\n\n // Kept purely to STRIP a leaked `<think>…</think>` block out of the body, so a\n // model that emits one does not show raw reasoning (or a stray `</think>`) as\n // its answer. The extracted reasoning itself is discarded and shown nowhere:\n // the backend already streams real reasoning on its own channel\n // (`reasoning_content` → a reasoning output item → a row in the steps trace),\n // so surfacing this legacy copy would only duplicate it.\n const { responseContent } = useThinkingContent({\n content: message.content || '',\n modelName,\n isUser,\n isGenerating,\n })\n\n // Split the body at the settled/live boundary the stream stamped on it.\n // Before it: prose the model has moved on from, which dims. After it: what is\n // being written now, which never dims — so the answer's opacity is constant\n // from its first token and nothing un-fades at the end.\n //\n // The boundary only exists while a turn is streaming. Once the answer is\n // committed the narration has already left the body, so everything is live.\n const settledLength = isGenerating ? (message.settledNarrationLength ?? 0) : 0\n const settledNarration = settledLength ? responseContent.slice(0, settledLength).trimEnd() : ''\n const liveContent = settledLength ? responseContent.slice(settledLength) : responseContent\n\n // The server still has this turn running, but this client is not streaming it (e.g. it\n // left the thread mid-stream and cleared its local loading flag). It is not finished, so\n // do not claim it is. The attach re-connects once the thread is viewed again.\n const isRunningOnServer =\n !isUser && (message.status === 'in_progress' || message.status === 'queued')\n // A follow-up's answer waiting behind the running turn: saved with status `queued` until its\n // turn starts. Nothing is being worked on yet, so it reads as queued, not as working. Once this\n // client streams it (the row may still say `queued` until the next refetch) it is working.\n const isQueuedAnswer = !isUser && message.status === 'queued' && !isGenerating\n\n // A running turn may spend many seconds on tool steps before its first token. Show that\n // inside the bubble, since the footer step label sits well away from the answer. The same\n // line covers a turn the server still runs while this client is not streaming it.\n // A pending question means the turn is paused on the person, not working. Its card is docked\n // by the composer, out of sight from the bubble, so the bubble says whose move it is. Only while\n // the turn is live: a stopped or settled turn must not claim to be waiting on the person.\n const isAwaitingAnswer =\n (isGenerating || isRunningOnServer) && !isStopped && !!message.pendingUserInput\n const showWorkingIndicator =\n (isGenerating || isRunningOnServer) &&\n !isQueuedAnswer &&\n !responseContent.trim() &&\n !linkedArtifact &&\n !isAwaitingAnswer\n\n // What the run is doing right now (e.g. \"Thinking\", \"Searching the web\"). Without it the\n // bubble says only \"Working on the answer…\" for the whole wait, and the progress lives in\n // the step bar far below. Same step the bar shows, so the two never disagree.\n const workingStepLabel = showWorkingIndicator\n ? getCurrentAgentStepPresentation(message.agentSteps ?? [])?.description\n : undefined\n\n // A settled turn can finish with no answer text (the model returned nothing). Say so\n // rather than leave an empty bubble, unless the turn produced a drafted document.\n const showEmptyAnswer =\n !isUser &&\n !isGenerating &&\n !isRunningOnServer &&\n !isFailed &&\n !isStopped &&\n !responseContent.trim() &&\n !linkedArtifact\n\n // A stopped answer with nothing streamed has no body to show.\n const isEmptyStopped = isStopped && !responseContent.trim()\n\n // \"Ask again\" on a stopped answer re-runs its question: the conversation view sends it again\n // (AskAgainContext). Where no view provides that, fall back to the question's own edit action,\n // or, for the first question (it has no edit action), to putting its text in the composer.\n const stoppedQuestion = useMemo(() => {\n if (!isStopped || !messageHistory || !message.parent_message_ext_id) return null\n const parentIndex = messageHistory.findIndex(\n (m) => m.external_id === message.parent_message_ext_id\n )\n const parent = parentIndex >= 0 ? messageHistory[parentIndex] : null\n if (!parent || (parent.role || '').toLowerCase() !== 'user') return null\n return { question: parent, isEditable: parentIndex > 0 }\n }, [isStopped, messageHistory, message.parent_message_ext_id])\n\n const askAgain = useContext(AskAgainContext)\n const askStoppedQuestionAgain = (retry: { question: MessageType; isEditable: boolean }) => {\n if (askAgain) askAgain(retry.question, message)\n else if (retry.isEditable) startEditing(retry.question)\n else session.setDraft(retry.question.content)\n }\n\n // The clean text a fact would carry PLUS its per-claim citations (each cited\n // statement's span + the chunks and quotes backing it), so a fact saved from\n // this answer keeps the chat's click-a-statement → highlight-passage\n // behaviour. The text stays clean — the mapping rides in `citations`. Whether\n // saving makes sense: a finished (not streaming, not failed) answer with real\n // content — never an empty, mid-stream, or citation-only (\"cite-1\") message.\n const factData = useMemo(\n () => buildFactCitations(responseContent, activeCitations, citationData),\n [responseContent, activeCitations, citationData]\n )\n const factText = factData.text\n const canCreateFact = !isUser && !isGenerating && !isFailed && factText.length > 2\n\n // Count the rows the drawer actually renders: raw events collapse (heartbeats,\n // same-index follow-ups) AND sub-agent steps fold under their parent, so both\n // `agentSteps.length` and a merged count would promise rows that aren't there.\n const visibleStepCount = useMemo(\n () => (message.agentSteps ? topLevelAgentSteps(message.agentSteps).length : 0),\n [message.agentSteps]\n )\n\n // The settled turn's elapsed time. The live ticker for the in-flight turn is\n // owned by the docked AgentControlBar (MessageLiveSeconds); Message itself only\n // reads the FINAL value from Zustand (written once when generation ends), so it\n // does not re-render at the 100 ms timer cadence.\n const timerKey = `${message.conversation_ext_id || 'new'}:${message.external_id}`\n const finalElapsedSeconds =\n useArbiSessionState((state) => state.messageTimers[timerKey]?.elapsedTime) ??\n message.agentStepsTotalElapsed ??\n 0\n\n // Reset copy state after delay\n useEffect(() => {\n let timeout: NodeJS.Timeout\n if (isCopied) {\n timeout = setTimeout(() => setIsCopied(false), 2000)\n }\n return () => clearTimeout(timeout)\n }, [isCopied])\n\n // Clear the \"fact created\" confirmation when this component is reused for a\n // different message (React.memo + list virtualization), so a stale green\n // check never appears on a message whose fact was never created.\n useEffect(() => {\n setFactSaved(false)\n }, [message.external_id])\n\n // Steps stay collapsed by default — the user can click the step-count chip to\n // expand. The trace is rich info but noisy for short prompts (e.g. a fresh PA\n // session's bootstrap rituals — IDENTITY.md reads, memory_search — feel like\n // garbage when the user typed a trivial message). Keep the rendered chat\n // clean; let power users opt in.\n\n const { openShare } = environment\n\n const handleCopyLink = () => {\n if (!selectedWorkspaceId || !message.conversation_ext_id || !message.external_id) {\n notify('Unable to copy link', 'error')\n return\n }\n\n const path = buildDeepLinkPath({\n workspaceId: selectedWorkspaceId,\n conversationId: message.conversation_ext_id,\n messageId: message.external_id,\n })\n\n const domain = environment.runtimeConfig.deploymentDomain\n const fullUrl = domain ? `https://${domain}${path}` : `${window.location.origin}${path}`\n\n navigator.clipboard\n .writeText(fullUrl)\n .then(() =>\n notify(\n React.createElement(\n 'span',\n {},\n React.createElement(\n 'a',\n {\n href: fullUrl,\n target: '_blank',\n rel: 'noopener noreferrer',\n className: 'text-blue-text hover:underline',\n onClick: (e: React.MouseEvent) => e.stopPropagation(),\n },\n 'Message link'\n ),\n ' copied to clipboard'\n ),\n 'success',\n { icon: workspaceIcon(20), workspaceId: selectedWorkspaceId }\n )\n )\n .catch(() => notify('Failed to copy link', 'error'))\n }\n\n const handleCopy = async () => {\n try {\n // For assistant messages, find the preceding user message\n let precedingUserMessage: string | undefined\n if (!isUser && message.parent_message_ext_id && messageHistory) {\n const parentMessage = messageHistory.find(\n (m) => m.external_id === message.parent_message_ext_id\n )\n if (parentMessage?.role === 'user') {\n precedingUserMessage = parentMessage.content\n }\n }\n\n await copyMessageToClipboard({\n messageRef,\n responseContent,\n messageContent: message.content,\n isUser,\n selectedWorkspaceId,\n conversationExtId: message.conversation_ext_id,\n messageExtId: message.external_id,\n activeCitations,\n citationData,\n precedingUserMessage,\n deploymentDomain: environment.runtimeConfig.deploymentDomain,\n })\n setIsCopied(true)\n notify('Message copied to clipboard', 'success')\n } catch (err) {\n console.error('Copy error:', err)\n // Ultimate fallback - try plain text\n const plainTextContent = isUser ? message.content : responseContent\n navigator.clipboard\n .writeText(plainTextContent)\n .then(() => {\n setIsCopied(true)\n notify('Message copied to clipboard', 'success')\n })\n .catch((err) => {\n console.error('All copy attempts failed:', err)\n notify('Could not copy message', 'error')\n })\n }\n }\n\n // Turn this assistant answer into a workspace Fact. The stored text is the\n // answer's markdown with citation links flattened to their label (a fact is\n // curated knowledge, not a link back into this thread); the answer's model\n // citations ride along as the fact's sources AND its per-statement claims, so\n // the fact stays as clickable as the answer. The fact is saved in the\n // conversation's workspace (named on the request), whichever one is open. A\n // chronology table saves as one dated fact per row, so the Timeline can place\n // each event.\n const factWorkspaceId = useConversationWorkspace(message.conversation_ext_id)\n const createFact = useCreateFact(factWorkspaceId)\n const createFacts = useCreateFacts(factWorkspaceId)\n const handleCreateFact = async () => {\n if (!canCreateFact || createFact.isPending || createFacts.isPending) return\n if (!factWorkspaceId) {\n notify('Cannot create fact: no workspace open', 'error')\n return\n }\n const chronology = chronologyFactBodies(factText, factData.citations)\n try {\n if (chronology) {\n await createFacts.mutateAsync({ facts: chronology })\n notify(`${chronology.length} facts created from the table`, 'success')\n } else {\n await createFact.mutateAsync({\n text: factText,\n shared: false,\n confirmed: true,\n tag_ext_ids: [],\n citations: factData.citations,\n })\n notify('Fact created from message', 'success')\n }\n setFactSaved(true)\n } catch (err) {\n console.error('Create fact error:', err)\n notify('Could not create fact', 'error')\n }\n }\n\n // Puts a user message back in the composer for editing; sending it branches a new answer.\n const startEditing = (target: MessageType) => {\n session.startEditing(target.external_id || '', target.content)\n\n // The edit runs on the config this message ran with, and the picker shows its model.\n if (messageConfig && 'QueryLLM' in messageConfig) {\n session.setChatModelName(resolveConfigModel(messageConfig))\n if (configId) session.setChatModel(configId)\n }\n }\n const handleEditStart = () => startEditing(message)\n\n const handleDeleteFailedMessage = async () => {\n if (!message.external_id) return\n try {\n await deleteMessage.mutateAsync(message.external_id)\n notify('Failed message deleted', 'success')\n } catch {\n notify('Failed to delete message', 'error')\n }\n }\n\n // Toggle handler removed - citations always show when available\n\n const settledForHeader = !isGenerating || isFailed\n const statusLabel = isFailed\n ? 'Response failed'\n : isStopped\n ? 'Stopped'\n : finalElapsedSeconds >= 0.05\n ? `Answered in ${finalElapsedSeconds.toFixed(1)}s`\n : 'Complete'\n const timeLabel = formatFriendlyDate(message.created_at || '')\n const messageId = message.external_id\n // A meeting thread's transcript lines: runs of one speaker, and each speaker's newest line.\n const assistant = useAssistantCopy()\n const transcriptRuns = useTranscriptRuns()\n const messageRole = isUser ? 'user' : 'assistant'\n\n const menuItems: MessageActionMenuItem[] = [\n ...(isUser\n ? [\n ...(!isTopLevel\n ? [\n {\n id: 'edit',\n label: 'Edit message',\n icon: <Edit3 size={14} />,\n onSelect: handleEditStart,\n testId: `edit-message-button-${messageId}`,\n },\n ]\n : []),\n {\n id: 'copy',\n label: 'Copy message',\n icon: <Copy size={14} />,\n onSelect: handleCopy,\n testId: `copy-message-button-${messageId}`,\n },\n ]\n : []),\n ...(isDeveloper\n ? [\n {\n id: 'details',\n label: 'View details',\n onSelect: () => setShowDetailsModal(true),\n testId: `message-details-button-${messageId}`,\n },\n ]\n : []),\n {\n id: 'copy-link',\n label: 'Copy link',\n icon: <Link size={14} className=\"mr-2\" />,\n onSelect: handleCopyLink,\n testId: `copy-link-button-${messageId}`,\n },\n ...(message.conversation_ext_id && selectedWorkspaceId && openShare\n ? [\n {\n id: 'share',\n label: 'Share via email',\n icon: <Share2 size={14} className=\"mr-2\" />,\n onSelect: () =>\n openShare({\n resourceType: 'conversation',\n resourceExtId: message.conversation_ext_id!,\n workspaceExtId: selectedWorkspaceId,\n isPrivate: !isShared,\n }),\n testId: `share-conversation-button-${messageId}`,\n },\n ]\n : []),\n ...(isFailed\n ? [\n {\n id: 'delete-failed',\n label: 'Delete failed message',\n icon: <Trash2 size={14} className=\"mr-2\" />,\n onSelect: handleDeleteFailedMessage,\n tone: 'danger' as const,\n testId: `delete-message-button-${messageId}`,\n },\n ]\n : []),\n ]\n\n const actions = (\n <>\n {branchControl}\n {isUser ? (\n <MessageActionMenu\n items={menuItems}\n heading={\n <>\n <div>\n {messageAuthorUser\n ? `${messageAuthorUser.given_name} ${messageAuthorUser.family_name ?? ''}`.trim()\n : 'Participant'}\n </div>\n <div className=\"text-xs text-muted-foreground\">{timeLabel}</div>\n </>\n }\n testId={`message-actions-menu-${messageId}`}\n />\n ) : (\n <>\n <MessageActionButton\n onClick={(e) => {\n e.stopPropagation()\n handleCreateFact()\n }}\n disabled={createFact.isPending || !canCreateFact}\n isDone={factSaved}\n title={factSaved ? 'Fact created' : 'Create a fact from this message'}\n aria-label=\"Create a fact from this message\"\n data-testid={`create-fact-button-${messageId}`}\n >\n {factSaved ? <Check size={16} /> : <Milestone size={16} />}\n </MessageActionButton>\n <MessageActionButton\n onClick={(e) => {\n e.stopPropagation()\n handleCopy()\n }}\n isDone={isCopied}\n title={isCopied ? 'Copied!' : 'Copy message with formatting'}\n data-testid={`copy-message-button-${messageId}`}\n >\n {isCopied ? <Check size={16} /> : <Copy size={16} />}\n </MessageActionButton>\n <MessageActionMenu\n items={menuItems}\n heading={\n <>\n <div>{modelDisplayName || assistant.name}</div>\n <div className=\"text-xs text-muted-foreground\">\n {timeLabel} · {statusLabel}\n </div>\n </>\n }\n testId={`message-actions-menu-${messageId}`}\n />\n </>\n )}\n </>\n )\n\n // A stopped answer with no text and no steps has nothing for the footer to carry: its avatar\n // would float alone under the stopped note. Keep the footer when steps exist (Show steps).\n const isBareStopped = isEmptyStopped && visibleStepCount === 0\n\n const footer = settledForHeader && !isBareStopped && (\n <MessageFooter\n role={messageRole}\n align={isOtherPerson ? 'start' : 'end'}\n leading={\n isUser ? (\n // Someone else's author is the pill above their run; only mine is marked here.\n !isOtherPerson && messageAuthorUser && <DocumentUser user={messageAuthorUser} />\n ) : (\n <span\n className=\"inline-flex rounded-full p-1\"\n style={{\n backgroundColor: `color-mix(in srgb, ${assistantTint} 8%, transparent)`,\n color: assistantTint,\n }}\n // The model that wrote the answer: an icon whose tooltip names it.\n data-testid={`message-model-${messageId}`}\n >\n <AssistantEntity\n name={modelDisplayName}\n modelName={modelName}\n tag={modelTag}\n size={20}\n variant=\"icon\"\n />\n </span>\n )\n }\n actions={actions}\n steps={\n !isUser\n ? {\n count: visibleStepCount,\n open: isStepsExpanded,\n onOpenChange: setIsStepsExpanded,\n panel: message.agentSteps ? (\n <AgentSteps\n steps={message.agentSteps}\n isStreaming={false}\n totalElapsedTime={message.agentStepsTotalElapsed ?? undefined}\n className=\"border-b-0\"\n contextUsage={message.finalContextUsage}\n />\n ) : null,\n }\n : undefined\n }\n />\n )\n\n const stoppedNote = isStopped && !isGenerating && (\n <p\n className=\"mt-2 flex flex-wrap items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`message-stopped-${messageId}`}\n >\n <span>\n {isEmptyStopped\n ? 'You stopped this answer before it wrote anything.'\n : 'You stopped this answer.'}\n </span>\n {stoppedQuestion && (\n <button\n type=\"button\"\n onClick={() => askStoppedQuestionAgain(stoppedQuestion)}\n className=\"inline-flex items-center gap-1 underline-offset-2 hover:text-foreground hover:underline\"\n data-testid={`retry-stopped-answer-button-${messageId}`}\n >\n <RotateCcw size={12} aria-hidden=\"true\" />\n Ask again\n </button>\n )}\n </p>\n )\n\n // The server's instruction that starts a workflow step reads as that step, not as raw text.\n const workflowStep = isUser ? workflowStepOf(message.tools ?? message.meta?.tools) : undefined\n if (workflowStep)\n return (\n <WorkflowStepMessage\n messageId={messageId}\n conversationId={message.conversation_ext_id}\n step={workflowStep}\n content={message.content ?? ''}\n />\n )\n\n // A call's transcript line in its meeting thread: a compact attributed line, not a comment.\n const transcriptSegment = isUser\n ? transcriptSegmentOf(message.tools ?? message.meta?.tools)\n : undefined\n if (transcriptSegment) {\n const speaker =\n transcriptSegment.speaker_ext_id === currentUser?.external_id\n ? currentUser\n : workspaceUsers.find((wu) => wu.user.external_id === transcriptSegment.speaker_ext_id)\n ?.user\n const speakerName = speaker ? getUserDisplayName(speaker) : null\n const isMe = transcriptSegment.speaker_ext_id === currentUser?.external_id\n return (\n <TranscriptEntry\n speakerId={transcriptSegment.speaker_ext_id}\n speakerName={isMe ? 'Me' : speakerName || 'Former member'}\n text={stripSpeakerPrefix(message.content ?? '', speakerName)}\n at={transcriptSegment.started_at ?? message.created_at}\n continued={!!messageId && transcriptRuns.continued.has(messageId)}\n />\n )\n }\n\n return (\n <ErrorBoundary testId=\"message-error-boundary\">\n <MessageRoot\n role={messageRole}\n messageId={messageId}\n tone={isFailed ? 'error' : subagentTaskRecord ? 'subagent' : 'default'}\n {...rest}\n >\n <MessageContent\n role={messageRole}\n messageId={messageId}\n align={isOtherPerson ? 'start' : 'end'}\n >\n {startsAuthorRun && messageAuthorUser && (\n <MessageAuthor>\n <DocumentUser user={messageAuthorUser} variant=\"pill\" />\n </MessageAuthor>\n )}\n <MessageBubble\n ref={messageRef}\n role={messageRole}\n messageId={messageId}\n isEditing={isEditing}\n // Other people's messages share ONE surface (the chats' peer bubble: card + hairline),\n // whoever wrote them: a per-person tint at 4% read as beige for one hue and as no\n // bubble at all for another. My own keep their tint; the assistant its own.\n participantTint={\n isFailed || isEmptyStopped || isOtherPerson\n ? undefined\n : isUser\n ? participantTint\n : assistantTint\n }\n className={isOtherPerson ? 'border border-border bg-card' : undefined}\n >\n {!isUser && isGenerating && (\n <MessageByline\n messageId={messageId}\n identity={\n // Stays the ARBI identity while streaming: the model name arrives\n // with the first step that reports one and would swap the author\n // mid-answer. The model is shown in the footer once settled.\n <AssistantEntity size={16} />\n }\n timeLabel={timeLabel}\n isSettled={settledForHeader}\n isFailed={isFailed}\n statusLabel={statusLabel}\n />\n )}\n {/* Marks this as ARBI's own instruction to a delegate, not something the human\n typed (see `subagentTaskRecord`). */}\n {subagentTaskRecord && <MessageSubagentBadge messageId={messageId} />}\n {/* While the turn runs this holds EVERYTHING the model has said. Only SUPERSEDED\n prose dims (a real opacity, not a colour token); the live segment is solid so\n the answer's opacity never changes and nothing un-fades at the end. The single\n commit at `response.completed` swaps in the server's answer and its citations. */}\n <MessageBody messageId={messageId}>\n {settledNarration ? (\n <MessageNarration messageId={messageId}>\n <ConnectedMarkdown isStreaming={false}>{settledNarration}</ConnectedMarkdown>\n </MessageNarration>\n ) : null}\n {liveContent ? (\n role === 'assistant' ? (\n <ConnectedCitationRenderer\n content={liveContent}\n citations={activeCitations || undefined}\n citationData={citationData}\n messageId={message.external_id || 'unknown'}\n isStreaming={isGenerating}\n />\n ) : (\n <ConnectedMarkdown isStreaming={isGenerating}>\n {/* ``/pa `` is internal routing: show the user's actual text. Stored\n @mentions become chips. */}\n {linkMentions(\n isUser && liveContent.startsWith('/pa ') ? liveContent.slice(4) : liveContent,\n message.mentions\n )}\n </ConnectedMarkdown>\n )\n ) : null}\n {showWorkingIndicator && (\n // One line of running text, not a flex row: in a narrow column (the viewer docked\n // beside the chat) flex items each shrank and wrapped on their own, as columns.\n <div>\n <p\n className=\"text-muted-foreground italic\"\n data-testid={`message-thinking-${messageId}`}\n >\n <span className=\"mr-2 inline-block h-2 w-2 animate-pulse rounded-full bg-current align-middle\" />\n Working on the answer…\n {workingStepLabel && (\n <>\n {' '}\n <span\n className=\"not-italic\"\n data-testid={`message-thinking-step-${messageId}`}\n >\n · {workingStepLabel}\n </span>\n </>\n )}\n {/* Total wait stays visible as individual steps change in the control bar.\n Only a turn this client is streaming has a clock to show. */}\n {isGenerating && (\n <>\n {' '}\n <span\n className=\"whitespace-nowrap not-italic\"\n data-testid={`message-thinking-elapsed-${messageId}`}\n >\n ·{' '}\n <MessageLiveSeconds\n conversationId={message.conversation_ext_id}\n messageId={messageId}\n isUser={false}\n isGenerating={isGenerating}\n suffix=\"s elapsed\"\n />\n </span>\n </>\n )}\n </p>\n {isGenerating && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-testid={`message-wait-help-${messageId}`}\n >\n You can stop this answer or choose Ask for status from the menu beside Stop.\n </p>\n )}\n </div>\n )}\n {isQueuedAnswer && !responseContent.trim() && (\n <p\n className=\"flex items-center gap-2 text-muted-foreground\"\n data-testid={`message-queued-${messageId}`}\n >\n <Clock className=\"size-3.5 shrink-0\" aria-hidden />\n Queued\n </p>\n )}\n {isAwaitingAnswer && (\n <p\n className=\"font-medium text-foreground\"\n data-testid={`message-awaiting-answer-${messageId}`}\n >\n Waiting for your answer below\n </p>\n )}\n {showEmptyAnswer && (\n <p\n className=\"text-muted-foreground italic\"\n data-testid={`message-empty-answer-${messageId}`}\n >\n ARBI finished without an answer. Ask again or request changes to retry.\n </p>\n )}\n </MessageBody>\n {/* A follow-up sent mid-answer waits its turn. The bubble stays solid (a faded\n bubble read as lost), so the state is said in words. */}\n {isQueued && (\n <p\n className=\"mt-1 flex items-center gap-1.5 text-xs text-muted-foreground\"\n data-testid={`message-queued-${messageId}`}\n >\n <Clock className=\"size-3 shrink-0\" aria-hidden />\n Queued, ARBI will answer after the current reply\n </p>\n )}\n\n {/* Inline drafted-document affordance */}\n {!isUser && linkedArtifact && (\n <MessageArtifactCard artifact={linkedArtifact} onOpen={handleOpenArtifact} />\n )}\n\n {/* Sub-agent thread links sit OUTSIDE the settled-only footer: a delegated thread\n must be openable whether this turn is streaming or long done. */}\n {!isUser && subagentLinks}\n </MessageBubble>\n {footer}\n {/* Below the footer, not in the bubble, for every stopped answer: the steps popover\n opens upward over the bubble and would hide the note while the trace is open. */}\n {stoppedNote}\n </MessageContent>\n\n <MessageDetailsModal\n open={showDetailsModal}\n onOpenChange={setShowDetailsModal}\n messageExtId={message.external_id || null}\n workspace={\n currentWorkspace\n ? {\n name: currentWorkspace.name,\n icon: workspaceIcon(16),\n }\n : null\n }\n />\n </MessageRoot>\n </ErrorBoundary>\n )\n}\n\n/**\n * Custom comparison for React.memo to prevent unnecessary re-renders during streaming.\n *\n * Most fields are read directly off `prevProps.message` / `nextProps.message`\n * — we deliberately do NOT peek into `messageHistory[index + 1]` for\n * assistant messages, because during streaming every message's\n * `messageHistory` reference changes on every rAF flush and a neighbor-index\n * read would cascade re-renders across the whole list.\n *\n * Exception: a USER message's model-switch indicator is derived from the\n * NEXT message's `config_ext_id` (the assistant response — see the\n * `configId` useMemo at line ~106). For user messages we must re-render\n * when that specific neighbor's config changes, or the indicator stays\n * stale after an assistant completes. Assistant messages still only look\n * at their own config_ext_id, so the cascade stays contained.\n */\nfunction areMessagesEqual(\n prevProps: ConnectedMessageProps,\n nextProps: ConnectedMessageProps\n): boolean {\n if (prevProps.participantTint !== nextProps.participantTint) return false\n // Always re-render if the message content or loading state changed\n if (prevProps.message.content !== nextProps.message.content) return false\n if (prevProps.message.isLoading !== nextProps.message.isLoading) return false\n if (prevProps.message.status !== nextProps.message.status) return false\n if (prevProps.message.external_id !== nextProps.message.external_id) return false\n if (prevProps.message.created_at !== nextProps.message.created_at) return false\n if (prevProps.message.config_ext_id !== nextProps.message.config_ext_id) return false\n if (prevProps.message.mentions !== nextProps.message.mentions) return false\n\n // User messages derive their model indicator from the next (assistant)\n // message's config — catch changes there so the indicator refreshes when\n // the assistant response arrives / switches model.\n if (prevProps.message.role === 'user') {\n const prevNext = prevProps.messageHistory?.[prevProps.index + 1]\n const nextNext = nextProps.messageHistory?.[nextProps.index + 1]\n if (prevNext?.config_ext_id !== nextNext?.config_ext_id) return false\n }\n\n // Re-render if message metadata changed (tools contain citations)\n if (prevProps.message.tools !== nextProps.message.tools) return false\n if (prevProps.message.meta !== nextProps.message.meta) return false\n\n // Re-render if agent steps or pending user input changed\n if (prevProps.message.agentSteps !== nextProps.message.agentSteps) return false\n if (prevProps.message.pendingUserInput !== nextProps.message.pendingUserInput) return false\n\n // Re-render if structural props changed\n if (prevProps.index !== nextProps.index) return false\n\n // branchControl is React node - compare by reference (will be same if parent doesn't re-render)\n if (prevProps.branchControl !== nextProps.branchControl) return false\n if (prevProps.subagentLinks !== nextProps.subagentLinks) return false\n\n return true\n}\n\nexport const ConnectedMessage = React.memo(MessageComponent, areMessagesEqual)\n","/**\n * Conversation Branch Controls binding\n *\n * Maps a conversation `BranchPoint` onto the `BranchControls` block (position label + previous /\n * next arrows) and wires the optional side-by-side threads preview to the store. Renders nothing\n * when the fork has only one branch.\n */\n\nimport React from 'react'\nimport {\n BranchControls as BranchControlsView,\n type BranchControlsLabels,\n} from '../../chat/BranchControls'\nimport type { BranchPoint } from '@arbidocs/react'\nimport { ErrorBoundary } from '../../components/ErrorBoundary'\n\n/**\n * Users see these alternatives as versions of one message (an edit, or \"Ask again\" on a stopped\n * answer), so the copy says so instead of the internal term \"branch\".\n */\nconst VERSION_LABELS: Partial<BranchControlsLabels> = {\n branchOf: (current, total) => `Version ${current} of ${total}`,\n previousBranch: 'Previous version',\n nextBranch: 'Next version',\n}\nconst VERSION_PREVIEW_HINT =\n 'This message has more than one version. Click to compare the answers side by side.'\n\ninterface BranchControlsProps {\n branchPoint: BranchPoint\n /** Switch between branches. */\n switchBranch: (branchPoint: BranchPoint, targetIndex: number) => void\n /** Open the threads preview (the versions side by side). Absent: no preview button. */\n onPreview?: () => void\n}\n\n/** A message's versions (an edit, an \"Ask again\"): which one this is, and the others. */\nexport const ConnectedBranchControls: React.FC<BranchControlsProps> = ({\n branchPoint,\n switchBranch,\n onPreview,\n}) => {\n return (\n <ErrorBoundary testId=\"branch-controls-error-boundary\">\n <BranchControlsView\n index={branchPoint.currentBranchIndex}\n count={branchPoint.branches.length}\n onSwitch={(target) => switchBranch(branchPoint, target)}\n onPreview={onPreview}\n previewHint={VERSION_PREVIEW_HINT}\n labels={VERSION_LABELS}\n />\n </ErrorBoundary>\n )\n}\n","/**\n * ThreadsPreviewModal - Dialog wrapper for ThreadVisualizer\n * Shows thread visualization for the current conversation\n */\n\nimport { Dialog, DialogContent, EntityIcon, getEntityLabel } from '@arbidocs/react/ui'\nimport { ModalBreadcrumbHeader, ModalCrumbs } from '../../settings/ModalBreadcrumbHeader'\nimport { ThreadVisualizer } from '../../chat/ThreadVisualizer'\nimport { Network } from 'lucide-react'\nimport { useArbiSessionState, useConversationData, useConversationItems } from '@arbidocs/react'\nimport { useOpenWorkspaceIcon } from './useOpenWorkspaceIcon'\n\ninterface ConnectedThreadsPreviewProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\n/** The open conversation's threads as a map: pick one to show it. */\nexport function ConnectedThreadsPreview(props: ConnectedThreadsPreviewProps) {\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n // Its data hooks only mount while it is open.\n return props.open && currentConversationId ? (\n <ThreadsPreviewDialog {...props} currentConversationId={currentConversationId} />\n ) : null\n}\n\nfunction ThreadsPreviewDialog({\n open,\n onOpenChange,\n currentConversationId,\n}: ConnectedThreadsPreviewProps & { currentConversationId: string }) {\n const { workspace: currentWorkspace, icon: workspaceIcon } = useOpenWorkspaceIcon()\n const { conversations } = useConversationItems()\n const { threads, setParentMessageId } = useConversationData()\n\n const currentConv = conversations?.find((conv) => conv.external_id === currentConversationId)\n const conversationTitle = currentConv?.title\n ? `Re: ${currentConv.title}`\n : `Private ${getEntityLabel('CONVERSATION')}`\n\n // Calculate dynamic width based on thread count\n const modalWidth = Math.min(\n Math.max(400 + (threads?.length || 0) * 200, 600),\n typeof window !== 'undefined' ? window.innerWidth * 0.9 : 800\n )\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onOpenChange(false)}>\n <DialogContent\n presentation=\"sheet\"\n className=\"max-h-panel flex flex-col overflow-hidden p-0\"\n style={{ width: `${modalWidth}px`, maxWidth: '95vw' }}\n >\n <ModalBreadcrumbHeader\n className=\"mb-0 p-6 pb-3 pr-12\"\n icon={<Network className=\"size-5\" />}\n title=\"Threads preview\"\n subtitle={\n <ModalCrumbs\n items={[\n {\n icon: workspaceIcon(16),\n label: currentWorkspace ? currentWorkspace.name : 'Workspace',\n },\n {\n icon: <EntityIcon entityType=\"CONVERSATION\" className=\"size-4\" />,\n label: conversationTitle,\n },\n ]}\n />\n }\n description=\"Visualize conversation threads\"\n />\n\n <div className=\"flex-1 min-h-0\" style={{ height: '70vh' }}>\n {/* The map loads mermaid itself on first render. */}\n <ThreadVisualizer\n threads={threads || []}\n switchToThread={(threadId: string) => {\n onOpenChange(false)\n setParentMessageId(threadId)\n }}\n showHeader={true}\n showDownloadButton={true}\n className=\"h-full\"\n />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Row heights for the virtualised chat thread (MessageList).\n *\n * The list only measures rows it has rendered; every other row counts at an estimated height, and\n * the thread's scroll height (and so the scrollbar's thumb) is the sum. A flat estimate far below a\n * real answer's height (a 2,000px answer counted as 120px) made the thumb jump away from the\n * pointer while it was dragged, and a drag to the top stopped hundreds of pixels short of it.\n * Rows are estimated from their text instead, and once measured their height is remembered across\n * remounts (leaving a thread and coming back) for the rest of the session.\n */\n\nconst MAX_REMEMBERED_ROWS = 4000\nconst rememberedHeights = new Map<string, number>()\n\n/** Remember a row's measured height (by message or activity id). */\nexport function rememberRowHeight(id: string, height: number): void {\n if (!id || !(height > 0)) return\n rememberedHeights.delete(id)\n rememberedHeights.set(id, height)\n if (rememberedHeights.size > MAX_REMEMBERED_ROWS) {\n const oldest = rememberedHeights.keys().next().value\n if (oldest !== undefined) rememberedHeights.delete(oldest)\n }\n}\n\n/** A row's measured height from earlier in the session, if it was ever rendered. */\nexport function rememberedRowHeight(id: string | undefined): number | undefined {\n return id ? rememberedHeights.get(id) : undefined\n}\n\n/** Test helper: forget every remembered height. */\nexport function forgetRowHeights(): void {\n rememberedHeights.clear()\n}\n\n// Rough typography of a chat message body (text-base, leading-relaxed).\nconst LINE_HEIGHT_PX = 26\nconst AVERAGE_CHAR_PX = 8.5\nconst TABLE_ROW_PX = 52\n// Bubble padding, author line and footer (steps bar, actions) around the text.\nconst ASSISTANT_CHROME_PX = 110\nconst USER_CHROME_PX = 72\nconst ACTIVITY_ROW_PX = 48\nconst MIN_ROW_PX = 60\n\n/**\n * Estimated height of a message row whose text is `content`, laid out `width` pixels wide. Close\n * enough (within a few lines) that the scrollbar stays put as rows are measured.\n */\nexport function estimateMessageRowHeight(\n content: string | null | undefined,\n role: string | undefined,\n width: number\n): number {\n const chrome = role === 'user' ? USER_CHROME_PX : ASSISTANT_CHROME_PX\n const text = content ?? ''\n if (!text) return Math.max(MIN_ROW_PX, chrome)\n // A user's bubble is narrower than the column; an answer spans it, less its padding.\n const textWidth = Math.max(160, (role === 'user' ? width * 0.75 : width) - 80)\n const charsPerLine = Math.max(16, Math.floor(textWidth / AVERAGE_CHAR_PX))\n let height = 0\n for (const line of text.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) {\n height += LINE_HEIGHT_PX / 2\n } else if (trimmed.startsWith('|')) {\n // Markdown table row; the separator row (|---|) draws nothing\n if (!/^\\|[\\s:|-]+\\|?$/.test(trimmed)) height += TABLE_ROW_PX\n } else {\n height += Math.ceil(trimmed.length / charsPerLine) * LINE_HEIGHT_PX\n }\n }\n return Math.round(Math.max(MIN_ROW_PX, height + chrome))\n}\n\n/** Estimated height of a thread activity row (\"Alex joined\", \"Assigned to …\"). */\nexport function estimateActivityRowHeight(): number {\n return ACTIVITY_ROW_PX\n}\n","'use client'\n\nimport { flashMessage } from '../../chat/flashMessage'\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useCallback,\n useMemo,\n useState,\n type RefObject,\n} from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { useConnectedThreadActivity } from '../tasks/useConnectedThreadActivity'\nimport { ConnectedMessage as MessageComponent } from './ConnectedMessage'\nimport type { ChatMessage as Message } from '@arbidocs/sdk/browser'\nimport { ConnectedBranchControls } from './ConnectedBranchControls'\nimport { ConnectedThreadsPreview } from './ConnectedThreadsPreview'\nimport { RunningSubagents } from './RunningSubagents'\nimport { findMainSiblingLeaf, sliceToSubagentThread } from '@arbidocs/sdk/browser'\nimport {\n estimateActivityRowHeight,\n estimateMessageRowHeight,\n rememberRowHeight,\n rememberedRowHeight,\n} from '../../chat/messageRowSize'\nimport { MessageList as BlocksMessageList } from '../../chat/MessageList'\nimport { useStreamAnnouncement } from '../../chat/useStreamAnnouncement'\nimport { getParticipantTints } from '../../chat/participant-tints'\nimport { ThreadActivity } from '../../agents/tasks/TaskFlow'\nimport {\n useArbiSessionState,\n useArbiSessionStore,\n useBranchNavigation,\n useConversationData,\n useUserSettings,\n} from '@arbidocs/react'\nimport { stripThinking } from '../../lib/think'\n\nexport interface ConnectedMessageListProps {\n messages: Message[]\n /** Embedded hosts supply their own scroll surface rather than the app dock. */\n scrollElementRef?: RefObject<HTMLDivElement | null>\n}\n\n/** Activity kinds that only echo a message in the thread; shown in the header ribbon instead. */\n// Echoes of messages the transcript already shows (a stopped answer carries its own stopped note).\nconst TRANSCRIPT_HIDDEN_ACTIVITY = new Set([\n 'created',\n 'participant_joined',\n 'assistant_responded',\n 'assistant_stopped',\n])\n\n// Width a row's text is laid out at before the list has rendered (the thread column's width).\nconst DEFAULT_ROW_WIDTH_PX = 736\n/** Tries (every 100 ms) to bring a deep-linked message into the virtualised list: 3 s. */\nconst DEEP_LINK_MOVE_ATTEMPTS = 30\n\n// Measures a rendered row and remembers its height for the rest of the session, so the thread's\n// height (and its scrollbar) is right from the first frame when it is opened again. Module scope so\n// `useVirtualizer`'s options stay stable across renders.\nconst measureMessageElement =\n typeof window !== 'undefined'\n ? (element: Element | null) => {\n const height = element?.getBoundingClientRect().height ?? 0\n const id = element?.getAttribute('data-message-id')\n if (id) rememberRowHeight(id, height)\n return height\n }\n : undefined\n\n/** The thread's scroll surface: re-resolved once the one it had is gone from the page. */\nfunction resolveScrollContainer(current: HTMLElement | null): HTMLElement {\n if (current?.isConnected) return current\n return (\n (document.querySelector('[data-scroll-container]') as HTMLElement | null) ||\n document.documentElement\n )\n}\n\n/**\n * ConnectedMessageList renders the chat thread using @tanstack/react-virtual.\n *\n * Scroll architecture:\n * The scroll container is `[data-scroll-container]` in DockZone — NOT this component.\n * The virtualizer is configured with getScrollElement pointing to that outer container\n * so it integrates with the existing useScrollBehavior hook without modification.\n *\n * Auto-scroll:\n * useScrollBehavior drives auto-scroll by setting container.scrollTop = container.scrollHeight.\n * This continues to work because the virtualizer's total size div occupies the full\n * estimated height inside the scroll container.\n *\n * Deep-link / leaf scroll:\n * useScrollBehavior queries `[data-message-id]` DOM nodes. Those attributes are preserved\n * on each virtual row wrapper, so they work for messages currently in the viewport.\n * Deep links first scroll the virtualizer to the target index, materializing off-screen\n * rows before useScrollBehavior centers and highlights the destination.\n *\n * Streaming:\n * The last message is always included in the virtual items list. The auto-scroll mechanism\n * in useScrollBehavior continuously scrolls to scrollHeight during streaming, which keeps\n * the last item in view and therefore rendered.\n */\nexport function ConnectedMessageList({ messages, scrollElementRef }: ConnectedMessageListProps) {\n const session = useArbiSessionStore()\n const [previewOpen, setPreviewOpen] = useState(false)\n const participantTints = useMemo(\n () =>\n getParticipantTints(\n messages.map((message) =>\n message.role === 'assistant' ? '' : (message.created_by_ext_id ?? '')\n )\n ),\n [messages]\n )\n const { parentMessageId, setParentMessageId, threads } = useConversationData()\n const { data: userSettings } = useUserSettings()\n const showThreadVisualization = userSettings?.show_thread_visualization ?? false\n\n const { getBranchControlForMessage, switchBranch } = useBranchNavigation(\n threads,\n parentMessageId,\n messages,\n setParentMessageId\n )\n\n // A sub-agent's branch is deliberately excluded from useBranchNavigation\n // (see its own docs) — it's a delegation, not a reply variant, so there is\n // no \"previous branch\" arrow back to the conversation it was spawned from.\n // This is the one way back once RunningSubagents has opened one.\n const mainSiblingLeaf = findMainSiblingLeaf(threads ?? [], messages)\n\n // A sub-agent's own thread renders as its own small transcript — the\n // instruction handed to it and its reply — not the full shared history\n // leading up to it. The human's real earlier messages aren't part of this\n // delegation; `mainSiblingLeaf` above is how you get back to them. `messages`\n // (unsliced) is still what feeds branch navigation and gets passed down as\n // `messageHistory`, so ancestor-relative lookups elsewhere keep working.\n const displayMessages = sliceToSubagentThread(messages)\n\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n const isGenerating =\n useArbiSessionState((state) => state.generating[currentConversationId || '']?.isGenerating) ??\n false\n\n // A turn is live while generation runs and the thread's last message is still loading, the same\n // signal the scroll hook follows (see the list tail below).\n const isLiveTurn = isGenerating && messages[messages.length - 1]?.isLoading === true\n\n // Screen readers: say \"responding\" once and read the finished answer once, never the tokens.\n const lastMessage = displayMessages[displayMessages.length - 1]\n const statusMessage = useStreamAnnouncement({\n isStreaming: isGenerating,\n text: lastMessage?.role === 'assistant' ? stripThinking(lastMessage.content ?? '') : '',\n resetKey: currentConversationId,\n })\n\n // Ref to the scroll container ([data-scroll-container] in DockZone).\n // We look it up on mount and pass it to the virtualizer.\n const scrollContainerRef = useRef<HTMLElement | null>(null)\n\n const getScrollContainer = useCallback((): HTMLElement => {\n scrollContainerRef.current =\n scrollElementRef?.current ?? resolveScrollContainer(scrollContainerRef.current)\n return scrollContainerRef.current\n }, [scrollElementRef])\n\n // Re-resolve on mount so SSR/test environments can also supply the element.\n useEffect(() => {\n scrollContainerRef.current = scrollElementRef?.current ?? resolveScrollContainer(null)\n }, [scrollElementRef])\n\n const { items: activityItems } = useConnectedThreadActivity(currentConversationId)\n const transcript = [\n ...displayMessages.map((message, index) => ({\n type: 'message' as const,\n message,\n index,\n id: message.external_id,\n createdAt: message.created_at,\n })),\n // \"Started thread\", \"Followed Up\" and \"Answered\" only echo the message right beside them; they\n // live in the header ribbon (each entry links to its message), not in the transcript.\n ...activityItems\n .filter((item) => item.label !== 'Posted' && !TRANSCRIPT_HIDDEN_ACTIVITY.has(item.kind))\n .map((item) => ({\n type: 'activity' as const,\n item,\n id: item.id,\n createdAt: item.createdAt,\n })),\n ].sort((a, b) => Date.parse(a.createdAt ?? '') - Date.parse(b.createdAt ?? ''))\n\n // Key measurements by transcript item, not by row position. A follow-up inserted above a\n // streaming answer shifts that answer's index; keyed by index, the virtualizer would drop the\n // answer's ResizeObserver and its height would freeze at the first paint, overlapping the rows\n // below it until a reload.\n const getTranscriptItemKey = useCallback(\n (index: number) => transcript[index]?.id ?? index,\n [transcript]\n )\n\n // A row not rendered yet counts at the height it had when last seen, else at an estimate from\n // its text: far closer than a flat guess, so the scrollbar holds still as rows are measured.\n const estimateTranscriptItemSize = useCallback(\n (index: number) => {\n const entry = transcript[index]\n if (!entry) return estimateActivityRowHeight()\n const remembered = rememberedRowHeight(entry.id)\n if (remembered !== undefined) return remembered\n if (entry.type === 'activity') return estimateActivityRowHeight()\n const width =\n document.querySelector<HTMLElement>('[data-slot=\"message-list-rows\"]')?.clientWidth ||\n DEFAULT_ROW_WIDTH_PX\n return estimateMessageRowHeight(entry.message.content, entry.message.role, width)\n },\n [transcript]\n )\n\n const rowVirtualizer = useVirtualizer({\n count: transcript.length,\n getScrollElement: getScrollContainer,\n estimateSize: estimateTranscriptItemSize,\n getItemKey: getTranscriptItemKey,\n overscan: 5,\n // measureElement lets the virtualizer measure actual rendered heights\n // after render. Both callbacks are module-scope refs for stability.\n measureElement: measureMessageElement,\n })\n\n const deepLinkMessageId = useArbiSessionState((state) => state.deepLinkMessageId)\n // Materialize an off-screen destination before useScrollBehavior centers and highlights it.\n // Without this, the destination of a ribbon click may not exist in the virtualized DOM.\n // A move made before the scroll container is laid out does nothing, so move again until the\n // destination is rendered (or give up after a few seconds).\n const positionedDeepLink = useRef<string | null>(null)\n useEffect(() => {\n if (!deepLinkMessageId) {\n positionedDeepLink.current = null\n return\n }\n if (positionedDeepLink.current === deepLinkMessageId) return\n const index = transcript.findIndex((entry) => entry.id === deepLinkMessageId)\n if (index < 0) return\n positionedDeepLink.current = deepLinkMessageId\n let attempts = 0\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n const move = () => {\n if (document.querySelector(`[data-message-id=\"${deepLinkMessageId}\"]`)) return\n rowVirtualizer.scrollToIndex(index, { align: 'center', behavior: 'auto' })\n if (++attempts < DEEP_LINK_MOVE_ATTEMPTS) timeoutId = setTimeout(move, 100)\n }\n move()\n return () => {\n clearTimeout(timeoutId)\n positionedDeepLink.current = null\n }\n }, [deepLinkMessageId, transcript, rowVirtualizer])\n\n const virtualItems = rowVirtualizer.getVirtualItems()\n useLayoutEffect(() => {\n if (!deepLinkMessageId || !deepLinkMessageId.startsWith('ntf-')) return\n const target = document.querySelector(`[data-message-id=\"${deepLinkMessageId}\"]`)\n if (!target) return\n target.scrollIntoView({ behavior: 'smooth', block: 'center' })\n flashMessage(target)\n session.setDeepLinkMessageId(null)\n }, [deepLinkMessageId, virtualItems, session])\n\n // The live region outlives the empty -> first-message switch so the first reply is announced too.\n const status = <BlocksMessageList.Status message={statusMessage} />\n if (transcript.length === 0) {\n return (\n <>\n {status}\n <BlocksMessageList.Empty />\n </>\n )\n }\n\n return (\n <>\n {status}\n <BlocksMessageList.Root isBusy={isGenerating}>\n {/* Viewing a sub-agent's branch has no \"previous branch\" arrow (see useBranchNavigation):\n this is the way back to the conversation it was delegated from. */}\n {mainSiblingLeaf && (\n <BlocksMessageList.Banner onBack={() => setParentMessageId(mainSiblingLeaf)} />\n )}\n <BlocksMessageList.Rows totalSize={rowVirtualizer.getTotalSize()}>\n {virtualItems.map((virtualItem) => {\n const entry = transcript[virtualItem.index]\n if (entry.type === 'activity') {\n return (\n <BlocksMessageList.Row\n key={entry.id}\n ref={rowVirtualizer.measureElement}\n index={virtualItem.index}\n start={virtualItem.start}\n messageId={entry.id}\n setSize={transcript.length}\n >\n {/* A thread call's log card replaces the plain activity line. */}\n {entry.item.card ?? (\n <ThreadActivity item={entry.item}>\n {entry.item.onOpenDocument && (\n <button\n className=\"mt-1 hover:underline text-primary\"\n onClick={entry.item.onOpenDocument}\n >\n {entry.item.docTitle}\n </button>\n )}\n </ThreadActivity>\n )}\n </BlocksMessageList.Row>\n )\n }\n const message = entry.message\n const messageId = message.external_id\n const branchPoint = messageId ? getBranchControlForMessage(messageId) : null\n\n // Key by external_id when available so React reuses DOM across reorder / prepend;\n // fall back to index for optimistic sends that have no id yet.\n return (\n <BlocksMessageList.Row\n key={message.external_id ?? `msg-${virtualItem.index}`}\n ref={rowVirtualizer.measureElement}\n index={virtualItem.index}\n start={virtualItem.start}\n messageId={message.external_id}\n setSize={transcript.length}\n >\n <MessageComponent\n message={message}\n index={entry.index}\n messageHistory={messages}\n participantTint={participantTints.get(\n message.role === 'assistant'\n ? 'assistant:arbi'\n : (message.created_by_ext_id ?? '')\n )}\n branchControl={\n branchPoint ? (\n <ConnectedBranchControls\n branchPoint={branchPoint}\n switchBranch={switchBranch}\n onPreview={\n showThreadVisualization && currentConversationId\n ? () => setPreviewOpen(true)\n : undefined\n }\n />\n ) : undefined\n }\n subagentLinks={\n message.role === 'assistant' ? (\n <RunningSubagents steps={message.agentSteps ?? []} />\n ) : undefined\n }\n />\n </BlocksMessageList.Row>\n )\n })}\n </BlocksMessageList.Rows>\n {/* The library tail is ~8rem tall, sized for a footer inside the list. While a turn\n runs, its live bar is docked right below the list, so the full tail would open a\n gap between the answer and its own steps. The full tail returns in the same render\n the turn settles (its message stops loading), so the scroll hook's end-of-stream\n settle to the bottom already sees it and the view is not left short of the end. */}\n {isLiveTurn ? <div className=\"h-4\" aria-hidden=\"true\" /> : <BlocksMessageList.Tail />}\n </BlocksMessageList.Root>\n <ConnectedThreadsPreview open={previewOpen} onOpenChange={setPreviewOpen} />\n </>\n )\n}\n","'use client'\n\nimport { forwardRef, memo, type RefObject } from 'react'\nimport { ConnectedMessageList as MessageList } from './ConnectedMessageList'\nimport type { ChatMessage as Message } from '@arbidocs/sdk/browser'\n\ninterface MessageAreaProps {\n messages: Message[]\n scrollElementRef?: RefObject<HTMLDivElement | null>\n}\n\n// NOTE: do NOT add `overflow-y-auto` to the wrapper. The actual scroll surface\n// is `[data-scroll-container]` in DockZone, which is what MessageList's\n// virtualizer is wired to. A second overflow container nested inside the first\n// creates an inner scrollbar that toggles on/off as streaming content grows\n// past the viewport — visible as a screen-wide flicker.\nconst MessageAreaComponent = forwardRef<HTMLDivElement, MessageAreaProps>(\n ({ messages, scrollElementRef }, ref) => {\n return (\n <div ref={ref} className=\"flex w-full flex-1 flex-col pt-4\" data-testid=\"message-area\">\n {/* Auto margin consumes only spare height: short threads sit beside the\n composer, while long threads keep their natural top-to-bottom flow. */}\n <div className=\"mt-auto w-full\" data-testid=\"message-list-bottom-anchor\">\n <MessageList messages={messages} scrollElementRef={scrollElementRef} />\n </div>\n </div>\n )\n }\n)\n\nMessageAreaComponent.displayName = 'ConnectedMessageArea'\n\n// Memoize to prevent re-renders when parent re-renders due to newMessage changes\n// Only re-render if messages actually change (not the callback)\nexport const ConnectedMessageArea = memo(MessageAreaComponent, (prevProps, nextProps) => {\n // Only re-render if messages change\n return (\n prevProps.messages === nextProps.messages &&\n prevProps.scrollElementRef === nextProps.scrollElementRef\n )\n})\n","/**\n * ConnectedCompactConversation: the open conversation in a narrow panel (an add-in's task pane, an\n * embedded panel): its messages and a composer with Send and Stop. The same engine as the full\n * conversation (`useConversationTurn`): streaming, caching, branching, stop and retry.\n */\n\nimport { Button } from '@arbidocs/react/ui'\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { ArrowDown, MessageSquare, Send, Square } from 'lucide-react'\nimport {\n selectDraft,\n useArbiSessionState,\n useArbiSessionStore,\n useAutoSendDraft,\n useConversationData,\n useConversationTurn,\n} from '@arbidocs/react'\nimport { useAssistantCopy } from '@arbidocs/react/shell'\nimport { CompactChatContext } from '../../chat/CompactChatContext'\nimport { EmptyState } from '../../components/EmptyState'\nimport { ComposerContainer } from '../../chat/Composer'\nimport { ConnectedMessageArea as MessageArea } from './ConnectedMessageArea'\nimport { ConnectedModelSelector } from '../config/ConnectedModelSelector'\nimport { ConversationComposer } from './ConversationComposer'\nimport { useSlashSkillWorkflows } from '../workflows/useSlashSkillWorkflows'\n\nexport function ConnectedCompactConversation({ attachments }: { attachments?: ReactNode } = {}) {\n const containerRef = useRef<HTMLDivElement>(null)\n const scrollRef = useRef<HTMLDivElement>(null)\n const following = useRef(true)\n const [showLatest, setShowLatest] = useState(false)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { selectedWorkspaceId, parentMessageId, messageHistory } = useConversationData()\n\n const {\n isGenerating,\n handleSendMessage: sendDraft,\n handleAbortGeneration,\n } = useConversationTurn({\n selectedWorkspaceId,\n parentMessageId,\n })\n\n // The slash menu's skills run in this conversation, as in the full chat: the launch sets the\n // draft and asks for it to be sent (`autoSendDraft`), and a typed `/skill text` opens the form\n // instead of being sent.\n const session = useArbiSessionStore()\n const slashWorkflows = useSlashSkillWorkflows({ landing: 'current-chat' })\n useAutoSendDraft(sendDraft)\n const skills = useMemo(() => ({ openFor: slashWorkflows.openFor }), [slashWorkflows.openFor])\n const handleSendMessage = () => {\n if (slashWorkflows.openForDraft(selectDraft(session.getState()))) {\n session.setDraft('')\n return\n }\n void sendDraft()\n }\n\n const assistant = useAssistantCopy()\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n\n useEffect(() => {\n following.current = true\n setShowLatest(false)\n }, [currentConversationId])\n\n useEffect(() => {\n const viewport = scrollRef.current\n const content = containerRef.current\n if (!viewport || !content) return\n const follow = () => {\n if (following.current) viewport.scrollTop = viewport.scrollHeight\n }\n follow()\n const observer = new ResizeObserver(follow)\n observer.observe(content)\n observer.observe(viewport)\n return () => observer.disconnect()\n }, [messageHistory.length > 0, currentConversationId])\n\n return (\n <CompactChatContext.Provider value>\n <div className=\"flex flex-col flex-1 min-h-0\" data-arbi-compact data-testid=\"embedded-chat\">\n {slashWorkflows.launcher}\n {/* Message area */}\n <div className=\"relative flex flex-col flex-1 min-h-0 overflow-hidden bg-muted/25\">\n <div\n ref={scrollRef}\n className=\"flex-1 min-h-0 overflow-y-auto overscroll-contain scrollbar-themed px-4\"\n tabIndex={0}\n aria-label=\"Conversation messages\"\n data-testid=\"embedded-transcript\"\n onWheel={(event) => {\n if (event.deltaY < 0) following.current = false\n }}\n onTouchMove={() => {\n following.current = false\n }}\n onKeyDown={(event) => {\n if (\n ['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' '].includes(\n event.key\n )\n )\n following.current = false\n }}\n onPointerDown={(event) => {\n // A scrollbar drag is user input; ordinary scroll events also come from row\n // measurement and layout changes, so they must never cancel following on their own.\n const viewport = event.currentTarget\n if (\n event.target === viewport &&\n event.clientX >= viewport.getBoundingClientRect().right - 20\n ) {\n following.current = false\n }\n }}\n onScroll={(event) => {\n const node = event.currentTarget\n const atBottom = node.scrollHeight - node.clientHeight - node.scrollTop <= 1\n if (!following.current) {\n following.current = atBottom\n setShowLatest(!atBottom)\n }\n }}\n >\n {messageHistory.length > 0 ? (\n <MessageArea\n ref={containerRef}\n messages={messageHistory}\n scrollElementRef={scrollRef}\n />\n ) : (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n icon={MessageSquare}\n title={currentConversationId ? 'Opening your conversation' : 'How can I help?'}\n description={currentConversationId ? 'Loading messages...' : undefined}\n className=\"w-full bg-transparent px-4 py-8\"\n />\n </div>\n )}\n </div>\n </div>\n\n {/* Input area */}\n <div className=\"shrink-0 w-full border-t border-border bg-background px-3 py-2 z-10\">\n <ComposerContainer>\n <ConversationComposer\n handleSendMessage={handleSendMessage}\n isGenerating={isGenerating}\n inputRef={inputRef}\n placeholder={assistant.askPlaceholder}\n shouldOfferFollowUp={false}\n compact\n skills={skills}\n leftButton={\n <>\n {attachments}\n {showLatest && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 shrink-0\"\n aria-label=\"Latest message\"\n title=\"Latest message\"\n onClick={() => {\n following.current = true\n const viewport = scrollRef.current\n if (viewport) viewport.scrollTop = viewport.scrollHeight\n setShowLatest(false)\n }}\n >\n <ArrowDown className=\"size-4\" />\n </Button>\n )}\n </>\n }\n modelSelector={\n <ConnectedModelSelector\n variant=\"compact\"\n className=\"h-8 max-w-32 border-0 px-2 text-xs\"\n />\n }\n rightButton={\n isGenerating ? (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"destructive\"\n className=\"h-8 w-8 flex-shrink-0\"\n aria-label=\"Stop generating\"\n onClick={handleAbortGeneration}\n data-testid=\"embedded-stop-button\"\n >\n <Square className=\"h-3.5 w-3.5 animate-pulse\" fill=\"currentColor\" />\n </Button>\n ) : (\n <CompactSendButton onClick={handleSendMessage} />\n )\n }\n />\n </ComposerContainer>\n </div>\n </div>\n </CompactChatContext.Provider>\n )\n}\n\n/** The send button reads the draft itself, so typing does not re-render the conversation. */\nfunction CompactSendButton({ onClick }: { onClick: () => void }) {\n const draftMessage = useArbiSessionState(selectDraft)\n\n return (\n <Button\n type=\"button\"\n size=\"icon\"\n className=\"h-8 w-8 flex-shrink-0\"\n aria-label=\"Send message\"\n disabled={draftMessage === ''}\n onClick={onClick}\n data-testid=\"embedded-send-button\"\n >\n <Send className=\"h-3.5 w-3.5\" />\n </Button>\n )\n}\n","/**\n * ConnectedConversationDocumentPicker: which of the workspace's documents the open conversation\n * reads, as a scrollable checkbox list (an embedded panel's). It writes the session's conversation\n * documents, so the next turn sends them.\n */\n\nimport {\n Button,\n Checkbox,\n Popover,\n PopoverContent,\n PopoverTrigger,\n getDocumentTitle,\n} from '@arbidocs/react/ui'\nimport { Paperclip, Upload, Search, X, FileText, Eye } from 'lucide-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport {\n useArbiSessionState,\n useArbiSessionStore,\n useDocuments,\n useUploadDocuments,\n useWorkspaceRole,\n} from '@arbidocs/react'\n\nconst EMPTY_DOCS: Array<{ docId: string; isPinned: boolean }> = []\n\nexport interface ConnectedConversationDocumentPickerProps {\n /** The ids now selected, after each change (a host keeps them for its own commands, say). */\n onSelectionChange?: (docIds: string[]) => void\n}\n\nexport function ConnectedConversationDocumentPicker({\n onSelectionChange,\n}: ConnectedConversationDocumentPickerProps) {\n const session = useArbiSessionStore()\n const { openDocument } = useBlocksEnvironment()\n const upload = useUploadDocuments()\n const role = useWorkspaceRole()\n const canUpload = role !== null && role !== 'guest'\n const inputRef = useRef<HTMLInputElement>(null)\n const [expanded, setExpanded] = useState(false)\n const [uploadError, setUploadError] = useState<string | null>(null)\n const [uploadNotice, setUploadNotice] = useState<string | null>(null)\n const [search, setSearch] = useState('')\n const currentConversationId = useArbiSessionState((state) => state.conversationId)\n const convKey = currentConversationId || 'new'\n const inConversationDocuments = useArbiSessionState(\n (state) => state.conversationDocuments[convKey] || EMPTY_DOCS\n )\n\n const { data: documentsData, isLoading, error: documentsError } = useDocuments()\n const documents = documentsData || []\n const visible = documents.filter((doc) =>\n getDocumentTitle(doc, 'Untitled').toLowerCase().includes(search.toLowerCase())\n )\n useEffect(() => {\n setExpanded(false)\n setUploadNotice(null)\n setUploadError(null)\n setSearch('')\n }, [currentConversationId])\n\n const selectedDocIds = inConversationDocuments.map((d) => d.docId)\n\n const handleToggle = (docId: string) => {\n const selected = selectedDocIds.includes(docId)\n session.setConversationDocuments(\n convKey,\n selected\n ? inConversationDocuments.filter((d) => d.docId !== docId)\n : [...inConversationDocuments, { docId, isPinned: false }]\n )\n onSelectionChange?.(\n selected ? selectedDocIds.filter((id) => id !== docId) : [...selectedDocIds, docId]\n )\n }\n\n async function addFiles(files: File[]) {\n if (!canUpload) return\n setExpanded(false)\n setUploadError(null)\n setUploadNotice(null)\n const original = session.getState()\n const workspaceId = original.workspaceId\n const key = original.conversationId || 'new'\n try {\n const result = await upload.mutateAsync({ files })\n const ids = result.doc_ext_ids ?? []\n // Read the current selection after the upload; the reader may have changed it meanwhile.\n const current = session.getState()\n if (current.workspaceId !== workspaceId || (current.conversationId || 'new') !== key) return\n const selected = current.conversationDocuments[key] || EMPTY_DOCS\n const merged = [\n ...selected,\n ...ids\n .filter((id) => !selected.some((d) => d.docId === id))\n .map((docId) => ({ docId, isPinned: false })),\n ]\n session.setConversationDocuments(key, merged)\n onSelectionChange?.(merged.map((d) => d.docId))\n setUploadNotice(\n ids.length\n ? `${ids.length} file${ids.length === 1 ? '' : 's'} added to this chat.`\n : 'No new files added. Files may already exist in this workspace.'\n )\n } catch (error) {\n setExpanded(true)\n setUploadError(error instanceof Error ? error.message : 'Could not upload files. Try again.')\n }\n }\n\n return (\n <div className=\"flex min-w-0 items-center\" data-testid=\"embedded-document-selector\">\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n aria-label=\"Upload files\"\n onChange={(event) => {\n const files = Array.from(event.target.files ?? [])\n event.target.value = ''\n if (files.length) void addFiles(files)\n }}\n />\n <Popover open={expanded} onOpenChange={setExpanded}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2 text-xs\"\n aria-label={`Documents${selectedDocIds.length ? ` (${selectedDocIds.length} selected)` : ''}`}\n >\n <Paperclip className=\"size-4\" />\n {upload.isPending ? 'Uploading…' : 'Docs'}\n {selectedDocIds.length > 0 && (\n <span className=\"rounded bg-primary/10 px-1 text-primary\">\n {selectedDocIds.length}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={10}\n collisionPadding={12}\n className=\"w-[min(22rem,calc(100vw-1.5rem))] overflow-hidden p-0\"\n aria-label=\"Conversation documents\"\n >\n <div className=\"flex items-center justify-between gap-2 border-b border-border p-3\">\n <span className=\"text-sm font-semibold\">Documents</span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={upload.isPending || !canUpload}\n title={\n !canUpload ? 'You do not have permission to upload to this workspace.' : undefined\n }\n onClick={() => inputRef.current?.click()}\n >\n <Upload className=\"size-3.5\" /> Upload files\n </Button>\n </div>\n <label className=\"m-2 flex items-center gap-2 rounded-md border border-input px-2\">\n <Search className=\"size-3.5 text-muted-foreground\" />\n <input\n aria-label=\"Find documents\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder=\"Find a document…\"\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none\"\n />\n </label>\n {uploadError && (\n <p role=\"alert\" className=\"px-3 pb-2 text-sm text-destructive\">\n {uploadError}\n </p>\n )}\n <div\n className=\"max-h-[min(45dvh,16rem)] overflow-y-auto px-2 pb-2\"\n data-testid=\"embedded-documents-list\"\n >\n {isLoading ? (\n <p className=\"p-2 text-sm text-muted-foreground\">Loading files…</p>\n ) : documentsError ? (\n <p role=\"alert\" className=\"p-2 text-sm text-destructive\">\n Could not load workspace files.\n </p>\n ) : visible.length === 0 ? (\n <p className=\"p-2 text-sm text-muted-foreground\">\n {search ? 'No matching documents.' : 'No files yet. Upload a file to get started.'}\n </p>\n ) : (\n visible.map((doc) => {\n const docId = doc.external_id\n const selected = selectedDocIds.includes(docId)\n const title = getDocumentTitle(doc, 'Untitled')\n return (\n <div\n key={docId}\n className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-2 hover:bg-muted\"\n data-testid={`embedded-document-${docId}`}\n >\n <Checkbox\n id={`embedded-doc-${docId}`}\n aria-label={title}\n checked={selected}\n onCheckedChange={() => handleToggle(docId)}\n />\n <FileText className=\"size-4 shrink-0 text-muted-foreground\" />\n <label htmlFor={`embedded-doc-${docId}`} className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\" title={doc.file_name || title}>\n {title}\n </span>\n <span className=\"block text-xs text-muted-foreground\">\n {doc.file_type?.toUpperCase() ||\n doc.file_name?.split('.').pop()?.toUpperCase()}\n {doc.status && ` · ${doc.status}`}\n </span>\n </label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0\"\n aria-label={`View ${title}`}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n setExpanded(false)\n openDocument(docId)\n }}\n >\n <Eye className=\"size-4\" />\n </Button>\n </div>\n )\n })\n )}\n </div>\n {selectedDocIds.length > 0 && (\n <div className=\"flex items-center justify-between border-t border-border px-3 py-2 text-xs text-muted-foreground\">\n <span>{selectedDocIds.length} selected</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs\"\n onClick={() => {\n session.setConversationDocuments(convKey, [])\n onSelectionChange?.([])\n }}\n >\n <X className=\"size-3\" /> Clear\n </Button>\n </div>\n )}\n </PopoverContent>\n </Popover>\n {uploadNotice && (\n <span className=\"sr-only\" role=\"status\">\n {uploadNotice}\n </span>\n )}\n </div>\n )\n}\n","/**\n * Forgot password: sign in with the recovery key (a saved file, or the recovery link's key), then\n * set a new password. The `AccountRecoveryDialog` block over the host's `Arbi`.\n *\n * Both kinds of recovery key work: the plain one (64 bytes) directly, and an SSO account's (104\n * bytes, sealed to the SSO account), which opens once the user is signed in at the provider.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport { RECOVERY_KEY_ERRORS, decryptRecoveryKey, validateRecoveryKeyFile } from '@arbidocs/client'\nimport { AccountRecoveryDialog } from '../../auth/RecoveryDialogs'\nimport { parseAuthError } from '../../auth/auth-error'\nimport { useAuthPages, useSsoSignIn } from './support'\n\n/** sessionStorage: a recovery in progress, kept across the SSO provider's sign-in. */\nexport const PENDING_RECOVERY_KEY = 'arbi_pending_recovery'\n\nexport interface ConnectedForgotPasswordProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Signed in with the recovery key: set a new password next. */\n onRecovered: () => void\n /** The email, when the recovery link carried it. */\n initialEmail?: string\n /** The key from the recovery link (skips the file picker). */\n initialRecoveryKey?: Uint8Array\n /** Whether that key is an SSO account's (sealed to the SSO account). */\n initialIsKeyEncrypted?: boolean\n}\n\nexport function ConnectedForgotPassword({\n open,\n onOpenChange,\n onRecovered,\n initialEmail,\n initialRecoveryKey,\n initialIsKeyEncrypted = false,\n}: ConnectedForgotPasswordProps) {\n const arbi = useArbi()\n const sso = useSsoSignIn()\n const { onRecovered: onSiteRecovered } = useAuthPages()\n const [showSsoPrompt, setShowSsoPrompt] = useState(false)\n const [email, setEmail] = useState(initialEmail ?? '')\n const [recoveryKey, setRecoveryKey] = useState<Uint8Array | null>(initialRecoveryKey ?? null)\n const [isKeyEncrypted, setIsKeyEncrypted] = useState(initialIsKeyEncrypted)\n const [fileName, setFileName] = useState<string | null>(\n initialRecoveryKey ? 'recovery link' : null\n )\n const [error, setError] = useState<string | null>(null)\n const [isProcessing, setIsProcessing] = useState(false)\n\n // Take the prefill whenever the dialog opens: the initial state above is read once, and the\n // recovery link may open the dialog after it mounted empty.\n useEffect(() => {\n if (!open) return\n if (initialEmail !== undefined) setEmail(initialEmail)\n if (initialRecoveryKey !== undefined) {\n setRecoveryKey(initialRecoveryKey)\n setIsKeyEncrypted(initialIsKeyEncrypted)\n setFileName('recovery link')\n }\n }, [open, initialEmail, initialRecoveryKey, initialIsKeyEncrypted])\n\n const processFile = useCallback(\n async (file: File) => {\n setError(null)\n setIsKeyEncrypted(false)\n\n const result = await validateRecoveryKeyFile(file)\n if (!result.valid || !result.data) {\n setError(result.error || RECOVERY_KEY_ERRORS.INVALID_SIZE)\n setRecoveryKey(null)\n setFileName(null)\n return\n }\n if (result.isEncrypted) {\n // An SSO account's key opens with the SSO account: sign in there first.\n if (!sso.user?.sub) {\n setError(RECOVERY_KEY_ERRORS.ENCRYPTED_KEY_REQUIRES_SSO)\n setRecoveryKey(null)\n setFileName(null)\n return\n }\n setIsKeyEncrypted(true)\n }\n setRecoveryKey(result.data)\n setFileName(file.name)\n },\n [sso.user?.sub]\n )\n\n const handleClose = () => {\n setEmail('')\n setRecoveryKey(null)\n setIsKeyEncrypted(false)\n setFileName(null)\n setError(null)\n onOpenChange(false)\n }\n\n const handleRecover = async () => {\n setError(null)\n if (!email) {\n setError('Please enter your email address')\n return\n }\n if (!recoveryKey) {\n setError('Please upload your recovery key file')\n return\n }\n\n setIsProcessing(true)\n setShowSsoPrompt(false)\n try {\n let signingPrivateKey = recoveryKey\n if (isKeyEncrypted) {\n if (!sso.user?.sub) {\n setError(RECOVERY_KEY_ERRORS.ENCRYPTED_KEY_REQUIRES_SSO)\n return\n }\n try {\n signingPrivateKey = await decryptRecoveryKey(recoveryKey, sso.user?.sub)\n } catch {\n setError(RECOVERY_KEY_ERRORS.DECRYPTION_FAILED)\n return\n }\n }\n\n // Best-effort: with an SSO session at hand, send its token. The server needs it for an\n // SSO-linked account; for a purely local one it changes nothing. Without one, an SSO-linked\n // account is refused below and the SSO prompt shows.\n const ssoToken = (await sso.getToken().catch(() => null)) ?? undefined\n await arbi.loginWithKey(email, signingPrivateKey, { ssoToken })\n\n handleClose()\n onSiteRecovered?.()\n onRecovered()\n } catch (err) {\n console.error('Recovery login error:', err)\n const detail =\n typeof err === 'object' && err !== null && 'detail' in err\n ? String((err as { detail: unknown }).detail)\n : ''\n if (/requires SSO login|SSO/i.test(detail)) {\n setShowSsoPrompt(true)\n setError(null)\n } else {\n setError(\n parseAuthError(err, {\n messageMap: { 'Incorrect username or password': RECOVERY_KEY_ERRORS.AUTH_FAILED },\n defaultMessage:\n 'Failed to authenticate with recovery key. Please check your email and try again.',\n })\n )\n }\n } finally {\n setIsProcessing(false)\n }\n }\n\n // Keep the recovery, then sign in at the provider. Back on the sign-in page, the recovery\n // resumes from what was kept, so the user does not click the recovery link again.\n const handleSsoSignInForRecovery = async () => {\n try {\n sessionStorage.setItem(\n PENDING_RECOVERY_KEY,\n JSON.stringify({\n email,\n keyB64: btoa(String.fromCharCode(...(recoveryKey ?? new Uint8Array()))),\n isEncrypted: isKeyEncrypted,\n })\n )\n } catch {\n // Best effort: without storage the user clicks the recovery link again.\n }\n await sso.signIn({ returnTo: '/recover' })\n }\n\n return (\n <AccountRecoveryDialog\n open={open}\n onClose={handleClose}\n email={email}\n onEmailChange={setEmail}\n isKeyFromLink={!!(initialRecoveryKey && recoveryKey)}\n keyFileName={fileName}\n isKeyEncrypted={isKeyEncrypted}\n onKeyFile={processFile}\n error={error}\n needsSsoSignIn={showSsoPrompt || (isKeyEncrypted && !sso.isAuthenticated)}\n onSsoSignIn={handleSsoSignInForRecovery}\n isProcessing={isProcessing}\n canSubmit={!!email && !!recoveryKey}\n onSubmit={handleRecover}\n />\n )\n}\n","/**\n * Signup Backup\n *\n * Runs at registration, with no extra dialog: always offers the password to\n * the browser's password manager, and downloads the recovery key unless the\n * user opted out via the signup checkbox.\n */\n\nimport { promptSaveCredential } from '../../auth/credential-storage'\nimport { downloadRecoveryFile } from '@arbidocs/react'\n\ninterface SignupBackupOptions {\n email: string\n password: string\n signingPrivateKey: Uint8Array\n /** Download the recovery key file (the checkbox, on by default). */\n saveRecoveryKey: boolean\n /** Auth0 sub for SSO users — the recovery key is then encrypted. */\n auth0Sub?: string | null\n}\n\nexport async function backUpOnSignup({\n email,\n password,\n signingPrivateKey,\n saveRecoveryKey,\n auth0Sub,\n}: SignupBackupOptions): Promise<void> {\n // Never blocks registration: promptSaveCredential swallows its own errors.\n await promptSaveCredential(email, password)\n\n if (!saveRecoveryKey) return\n try {\n await downloadRecoveryFile({ signingPrivateKey, email, auth0Sub })\n } catch (err) {\n // A failed download must not block account creation.\n console.warn('[SIGNUP] Recovery key download failed:', err)\n }\n}\n","/**\n * What the sign-in page does: local sign-in (or an offline unlock with no network), registration\n * (then straight in), the verification email and the hand-over to SSO. Every sign-in goes through\n * the host's `Arbi` (`arbi.login`), so the SDK opens the identity, stores the keys and signs the\n * session in, and the site's sign-in hooks run around it.\n */\n\nimport { useCallback, useState } from 'react'\nimport { useArbi } from '@arbidocs/react'\nimport { parseAuthError } from '../../auth/auth-error'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { backUpOnSignup } from './signup-backup'\nimport { useOptionalConnection } from '../ConnectionProvider'\nimport { useAuthPages, useSsoSignIn } from './support'\nimport type { LoginFormActions, LoginFormState } from './useLoginForm'\n\nconst BAD_CREDENTIALS =\n 'This username/password combination is not valid. Please double-check your credentials and try again.'\n\nexport function useLoginActions({\n formState,\n formActions,\n onError,\n}: {\n formState: LoginFormState\n formActions: LoginFormActions\n /** Show a refusal in the form itself. Default: a notice. */\n onError?: (message: string) => void\n}) {\n const arbi = useArbi()\n const signInLayer = useOptionalConnection()\n const sso = useSsoSignIn()\n const environment = useBlocksEnvironment()\n // Errors go to the form's own place when it has one; everything else is a notice.\n const environmentNotify = environment.notify\n const notify = useCallback<typeof environmentNotify>(\n (...args) =>\n args[1] === 'error' && onError && typeof args[0] === 'string'\n ? onError(args[0])\n : environmentNotify(...args),\n [environmentNotify, onError]\n )\n const { passwordRules, onRegistered, onUnlockedOffline } = useAuthPages()\n\n // True from the moment a login/registration submit starts doing real work until it fails.\n // Deliberately NOT cleared on success: after the API call there is still key setup, session\n // storage and the signed-in app's download before this page is replaced, and the button must not\n // flip back to \"Sign in\" and look idle then.\n const [isAuthenticating, setIsAuthenticating] = useState(false)\n const [isRequestingCode, setIsRequestingCode] = useState(false)\n\n const {\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n cooldownSeconds,\n } = formState\n const { setVerificationSent, setIsRedirecting, startCooldown, validateEmailWithError } =\n formActions\n\n /** Hand over to the SSO provider. */\n const handleSsoLogin = useCallback(\n (connection?: string) => {\n arbi.session?.setSsoMode(true)\n setIsRedirecting(true)\n sso.signIn(connection ? { connection } : undefined).catch((error) => {\n console.error('Error during SSO redirect:', error)\n setIsRedirecting(false)\n notify(\n 'There was a problem connecting to the authentication service. Please try again.',\n 'error'\n )\n })\n },\n [arbi, sso, setIsRedirecting, notify]\n )\n\n /** Send the verification email (a link and a three-word code). */\n const handleRequestVerificationCode = useCallback(async () => {\n if (cooldownSeconds > 0) {\n notify(`Please wait ${cooldownSeconds} seconds before requesting again`, 'warning')\n return\n }\n if (!validateEmailWithError(email)) return\n\n setIsRequestingCode(true)\n try {\n const sent = await arbi.requestVerification(email)\n setVerificationSent(true)\n notify(sent, 'success')\n startCooldown(30)\n } catch (error: unknown) {\n console.error('Verification email error:', error)\n const { detail, message } = error as { detail?: string; message?: string }\n notify(detail || message || 'Unable to send verification email.', 'error')\n } finally {\n setIsRequestingCode(false)\n }\n }, [\n arbi,\n cooldownSeconds,\n email,\n validateEmailWithError,\n setVerificationSent,\n startCooldown,\n notify,\n ])\n\n /** Local (non-SSO) sign-in; offline, an unlock on this device. */\n const handleLocalLogin = useCallback(\n async (opts?: {\n isFreshRegistration?: boolean\n /** Sign in with these, not the form's (a sign-in link's). */\n credentials?: { email: string; password: string }\n }) => {\n arbi.session?.setSsoMode(false)\n const loginEmail = opts?.credentials?.email ?? email\n const loginPassword = opts?.credentials?.password ?? password\n\n if (!loginPassword) {\n notify('Please fill in all required fields.', 'error')\n return\n }\n if (!validateEmailWithError(loginEmail)) return\n\n // Offline: unlock locally from the saved session instead of calling the backend. The\n // password still derives the key client-side; it is the same login box with no\n // /v1/user/login. This is what lets you back in (and back to your offline files) after a\n // \"log out (this device)\" with no network.\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n try {\n await arbi.unlock(loginEmail, loginPassword)\n onUnlockedOffline?.()\n } catch (err: unknown) {\n notify(\n err instanceof Error && err.message === 'no-session'\n ? 'You need to be online to log in on this device.'\n : BAD_CREDENTIALS,\n 'error'\n )\n }\n return\n }\n\n // A demo site (`defaultHost` with no backend configured) enters its demo workspace.\n if (signInLayer && !signInLayer.apiConfigured) {\n await signInLayer.login(loginEmail, loginPassword)\n return\n }\n\n setIsAuthenticating(true)\n try {\n const login = await arbi.login(loginEmail, loginPassword)\n // The single welcome toast comes with the signed-in app; none here. Where to land is the\n // site's: a fresh registration hands its login over.\n if (opts?.isFreshRegistration) onRegistered?.(login)\n return login\n } catch (error: unknown) {\n setIsAuthenticating(false)\n console.error('Login error:', error)\n notify(\n parseAuthError(error, {\n messageMap: { 'Incorrect username or password': BAD_CREDENTIALS },\n }),\n 'error'\n )\n }\n },\n [\n arbi,\n signInLayer,\n email,\n password,\n validateEmailWithError,\n notify,\n onRegistered,\n onUnlockedOffline,\n ]\n )\n\n /** Registration, then straight in. */\n const handleRegister = useCallback(\n async (saveRecoveryKey = true) => {\n arbi.session?.setSsoMode(false)\n\n if (!password || !confirmPassword || !firstName || !lastName || !verificationCode) {\n notify('Please fill in all required fields.', 'error')\n return\n }\n if (!validateEmailWithError(email)) return\n if (password !== confirmPassword) {\n notify('Passwords do not match. Please ensure both password fields are identical.', 'error')\n return\n }\n const passwordError = passwordRules.error(password)\n if (passwordError) {\n notify(passwordError, 'error')\n return\n }\n\n setIsAuthenticating(true)\n try {\n const { signingPrivateKey } = await arbi.register({\n email,\n password,\n verificationCode: verificationCode.trim(),\n firstName,\n lastName,\n })\n // Password manager save always; recovery key download unless opted out. After the\n // account exists: each attempt generates a new random identity, so a recovery file saved\n // for a failed attempt would recover nothing.\n await backUpOnSignup({ email, password, signingPrivateKey, saveRecoveryKey })\n // No success toast: the button already says \"Creating your account…\", and the next thing\n // the user sees (the site's first landing) is the confirmation.\n await handleLocalLogin({ isFreshRegistration: true })\n } catch (error: unknown) {\n setIsAuthenticating(false)\n console.error('Registration error:', error)\n notify(parseAuthError(error), 'error')\n }\n },\n [\n arbi,\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n validateEmailWithError,\n passwordRules,\n handleLocalLogin,\n notify,\n ]\n )\n\n return {\n isAuthenticating,\n isRequestingCode,\n handleSsoLogin,\n handleLocalLogin,\n handleRegister,\n handleRequestVerificationCode,\n }\n}\n","/**\n * Login Form State Hook\n *\n * Manages all form state, validation, and cooldown timer for login/registration.\n */\n\nimport { useState, useEffect, useRef, useMemo, useCallback } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { splitAuthHash, withTrailingFragment } from './auth-hash'\nimport { useAuthPages } from './support'\n\nexport interface LoginFormState {\n email: string\n password: string\n confirmPassword: string\n firstName: string\n lastName: string\n verificationCode: string\n verificationSent: boolean\n emailVerified: boolean\n /**\n * Whether the actual code/name/password inputs are on screen. Separate from\n * `verificationSent` so that sending the email doesn't itself dump the whole\n * form in front of the visitor — they land on a \"check your email\" notice\n * with a manual-entry fallback, and this flips true only once they choose\n * that fallback (or arrive via a link that already carries a code).\n */\n showVerificationForm: boolean\n /** An email arrived in the URL without a code — request one on arrival. */\n pendingAutoRequest: boolean\n cooldownSeconds: number\n error: { message: string } | null\n success: { message: string } | null\n isRegistering: boolean\n isRedirecting: boolean\n}\n\nexport interface LoginFormActions {\n setEmail: (email: string) => void\n setPassword: (password: string) => void\n setConfirmPassword: (confirmPassword: string) => void\n setFirstName: (firstName: string) => void\n setLastName: (lastName: string) => void\n setVerificationCode: (code: string) => void\n setVerificationSent: (sent: boolean) => void\n setShowVerificationForm: (shown: boolean) => void\n setPendingAutoRequest: (pending: boolean) => void\n resetEmailEntry: () => void\n setError: (error: { message: string } | null) => void\n setSuccess: (success: { message: string } | null) => void\n setIsRegistering: (isRegistering: boolean) => void\n switchMode: (isRegistering: boolean) => void\n setIsRedirecting: (isRedirecting: boolean) => void\n startCooldown: (seconds: number) => void\n clearForm: () => void\n validateEmail: (email: string) => boolean\n validateEmailWithError: (email: string) => boolean\n}\n\nexport function useLoginForm() {\n const { notify } = useBlocksEnvironment()\n const { onReturnPath } = useAuthPages()\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [firstName, setFirstName] = useState('')\n const [lastName, setLastName] = useState('')\n const [verificationCode, setVerificationCode] = useState('')\n const [verificationSent, setVerificationSent] = useState(false)\n const [emailVerified, setEmailVerified] = useState(false)\n const [showVerificationForm, setShowVerificationForm] = useState(false)\n const [pendingAutoRequest, setPendingAutoRequest] = useState(false)\n const [cooldownSeconds, setCooldownSeconds] = useState(0)\n const [error, setError] = useState<{ message: string } | null>(null)\n const [success, setSuccess] = useState<{ message: string } | null>(null)\n const [isRegistering, setIsRegistering] = useState(() => {\n if (typeof window === 'undefined') return false\n const tab = new URLSearchParams(window.location.search).get('tab')\n return tab === 'register'\n })\n const [isRedirecting, setIsRedirecting] = useState(false)\n\n const cooldownIntervalRef = useRef<NodeJS.Timeout | null>(null)\n\n // Cleanup cooldown interval on unmount\n useEffect(() => {\n return () => {\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n cooldownIntervalRef.current = null\n }\n }\n }, [])\n\n // Handle URL hash parameters for verification codes and errors\n useEffect(() => {\n // A call invitation appends the call key fragment (`#k=…&v=…`) after our own hash\n // parameters; split it off so it rides along to the `next` destination.\n const { params: hashParams, trailingFragment } = splitAuthHash(window.location.hash)\n const errorParam = hashParams.get('error')\n const errorDescriptionParam = hashParams.get('error_description')\n const emailParam = hashParams.get('verify')\n const codeParam = hashParams.get('code')\n\n if (errorParam || errorDescriptionParam) {\n console.error('Auth0 error detected:', errorParam, errorDescriptionParam)\n setIsRedirecting(false)\n setError({\n message: errorDescriptionParam || 'Authentication error. Please try again.',\n })\n window.history.replaceState(null, '', window.location.pathname + window.location.search)\n }\n\n // Handle verification details from the URL hash. Two shapes:\n // #verify=<email>&code=<code> invitation link — both fields prefilled\n // #verify=<email> \"verify email\" hand-off from the marketing\n // site — we request the code on arrival so\n // the visitor only types it back in (see the\n // auto-request effect in Login).\n // The hash (not the query) carries the address so it never reaches server\n // logs, and it is scrubbed either way once read.\n // An invite for a specific shared document/conversation additionally\n // carries `&next=<path>` (see ARBI's send_invitation_email) — stash it as\n // the post-auth return URL right away so it survives all the way through\n // registration/login, the same generic mechanism an already-registered\n // user's deep link already rides (resolvePostAuthReturnUrl / App.tsx).\n const nextParam = hashParams.get('next')\n if (nextParam) {\n onReturnPath?.(withTrailingFragment(decodeURIComponent(nextParam), trailingFragment))\n }\n if (emailParam) {\n setIsRegistering(true)\n const decodedEmail = decodeURIComponent(emailParam).trim()\n setEmail(decodedEmail)\n if (codeParam) {\n const formattedCode = codeParam.toUpperCase().replace(/\\s+/g, '-')\n setVerificationCode(formattedCode)\n setVerificationSent(true)\n setEmailVerified(true)\n // The emailed link already carries a code, so it's the one thing that\n // should drop the visitor straight into the form — no manual-entry\n // link to click first.\n setShowVerificationForm(true)\n } else {\n setPendingAutoRequest(true)\n }\n window.history.replaceState(null, '', window.location.pathname + window.location.search)\n }\n // The URL is read once, on arrival (it is scrubbed right after).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const validateEmail = useCallback((emailToValidate: string): boolean => {\n const atIndex = emailToValidate.indexOf('@')\n if (atIndex === -1) return false\n const domainPart = emailToValidate.substring(atIndex + 1)\n return domainPart.includes('.')\n }, [])\n\n const validateEmailWithError = useCallback(\n (emailToValidate: string): boolean => {\n if (!emailToValidate) {\n notify('Please enter your email address.', 'error')\n return false\n }\n if (!validateEmail(emailToValidate)) {\n notify('Please enter a valid email address.', 'error')\n return false\n }\n return true\n },\n [validateEmail, notify]\n )\n\n const clearCooldown = useCallback(() => {\n setCooldownSeconds(0)\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n cooldownIntervalRef.current = null\n }\n }, [])\n\n /**\n * Step back to an editable email field after a code has been sent.\n *\n * The address is locked while a verification is outstanding, so without this\n * a typo — or a wrong address auto-requested from a marketing link — is a\n * dead end short of reloading the page. The cooldown is dropped too: it\n * throttles repeat sends to one address, and this is a different one. Repeat\n * sends are rate-limited server-side regardless.\n */\n const resetEmailEntry = useCallback(() => {\n setEmailVerified(false)\n setVerificationSent(false)\n setShowVerificationForm(false)\n setVerificationCode('')\n setPendingAutoRequest(false)\n clearCooldown()\n }, [clearCooldown])\n\n const startCooldown = useCallback((seconds: number) => {\n setCooldownSeconds(seconds)\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n }\n cooldownIntervalRef.current = setInterval(() => {\n setCooldownSeconds((prev) => {\n if (prev <= 1) {\n if (cooldownIntervalRef.current) {\n clearInterval(cooldownIntervalRef.current)\n cooldownIntervalRef.current = null\n }\n return 0\n }\n return prev - 1\n })\n }, 1000)\n }, [])\n\n /**\n * Flip between the Login and Register tabs. The email field is shared, but a\n * password typed on one form must never sit masked in the other, so both\n * password fields are cleared on every switch.\n */\n const switchMode = useCallback((registering: boolean) => {\n setIsRegistering(registering)\n setPassword('')\n setConfirmPassword('')\n }, [])\n\n const clearForm = useCallback(() => {\n setEmailVerified(false)\n setEmail('')\n setPassword('')\n setConfirmPassword('')\n setFirstName('')\n setLastName('')\n setVerificationCode('')\n setVerificationSent(false)\n setShowVerificationForm(false)\n setPendingAutoRequest(false)\n setError(null)\n setSuccess(null)\n clearCooldown()\n }, [clearCooldown])\n\n const state: LoginFormState = {\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n verificationSent,\n emailVerified,\n showVerificationForm,\n pendingAutoRequest,\n cooldownSeconds,\n error,\n success,\n isRegistering,\n isRedirecting,\n }\n\n const actions: LoginFormActions = {\n setEmail,\n setPassword,\n setConfirmPassword,\n setFirstName,\n setLastName,\n setVerificationCode,\n setVerificationSent,\n setShowVerificationForm,\n setPendingAutoRequest,\n resetEmailEntry,\n setError,\n setSuccess,\n setIsRegistering,\n switchMode,\n setIsRedirecting,\n startCooldown,\n clearForm,\n validateEmail,\n validateEmailWithError,\n }\n\n return { ...state, ...actions }\n}\n\n/**\n * Memoized registration submit button state\n */\nexport function useRegisterSubmitState(\n isRegistering: boolean,\n isPending: boolean,\n password: string,\n confirmPassword: string,\n email: string,\n firstName: string,\n lastName: string,\n verificationCode: string,\n isPasswordValid: (password: string) => boolean\n) {\n const isDisabled = useMemo(() => {\n if (!isRegistering) return false\n return (\n isPending ||\n !isPasswordValid(password) ||\n password !== confirmPassword ||\n !email ||\n !firstName ||\n !lastName ||\n !verificationCode\n )\n }, [\n isRegistering,\n isPending,\n password,\n confirmPassword,\n email,\n firstName,\n lastName,\n verificationCode,\n isPasswordValid,\n ])\n\n const isDefault = useMemo(() => {\n if (!isRegistering) return false\n return (\n email &&\n password &&\n confirmPassword &&\n firstName &&\n lastName &&\n verificationCode &&\n isPasswordValid(password) &&\n password === confirmPassword\n )\n }, [\n isRegistering,\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n isPasswordValid,\n ])\n\n return { isDisabled, isDefault }\n}\n","import { useEffect } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useAuthPages, useSsoSignIn } from './support'\n\n/**\n * Back on the sign-in page from the SSO provider's email verification: verified\n * (`?success=true&code=success`, or a token in the fragment) goes straight on to the provider's\n * sign-in, asking for consent again; failed (`?success=false`) says so, or hands the provider's\n * message to the site (`auth.onVerificationFailed`).\n */\nexport function useSsoVerificationRedirect(): void {\n const sso = useSsoSignIn()\n const { notify } = useBlocksEnvironment()\n const { onVerificationFailed } = useAuthPages()\n\n useEffect(() => {\n const urlParams = new URLSearchParams(window.location.search)\n const success = urlParams.get('success') || null\n const code = urlParams.get('code') || null\n const message = urlParams.get('message') || null\n const accessToken = window.location.hash.includes('access_token=')\n\n if ((success === 'true' && code === 'success') || accessToken) {\n notify('Verified! Redirecting...', 'success')\n try {\n void sso.signIn({ consent: true })\n } catch (error) {\n console.error('Error during login redirect:', error)\n notify(\n 'Error during login redirect. Please click \"Login with Arbi.City\" to continue.',\n 'error'\n )\n }\n } else if (success === 'false') {\n if (message && onVerificationFailed) onVerificationFailed(message)\n else notify('Email verification failed. Please try again.', 'error')\n }\n // The URL is read once, on arrival.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n}\n","/**\n * The sign-in page: login and registration (a verification email, then the form), the\n * verification link from an invitation, an offline unlock, forgot password with a recovery key or\n * the recovery link (`/recover`), and the hand-over to SSO. The reference composition of the auth\n * blocks over the host's `Arbi`; the site gives its look and follow-ups once, as the host\n * configuration's `auth` (and `sso`), see `./support`.\n */\n\nimport { useEffect, useRef, useState, type FormEvent, type ReactElement } from 'react'\nimport { BadgeCheck } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useIsOnline } from '@arbidocs/react/document-tools/core'\nimport { initSodium, parseRecoveryUrl, prewarmKeyPairs } from '@arbidocs/client'\nimport {\n AuthDivider,\n AuthField,\n AuthFieldBadge,\n AuthHeading,\n AuthInput,\n AuthLink,\n AuthNote,\n AuthOfflineBadge,\n AuthSubmitButton,\n AuthTabs,\n RevealablePasswordInput,\n} from '../../auth/AuthForm'\nimport { AuthLayout } from '../../auth/AuthLayout'\nimport { AuthConsent } from '../../auth/AuthFooter'\nimport { PasswordStrengthInput } from '../../auth/PasswordStrengthInput'\nimport { AppleIcon, GoogleIcon, LinkedInIcon, useArbi } from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { prefetchChunk } from '../../shell/reload-policy'\nimport { ConnectedPasswordChangeDialog } from '../ConnectedSettings'\nimport { ConnectedForgotPassword, PENDING_RECOVERY_KEY } from './ConnectedForgotPassword'\nimport { useAuthPages, useSsoSignIn } from './support'\nimport { useLoginActions } from './useLoginActions'\nimport { useFragmentCredentials } from './fragment-credentials'\nimport { useLoginForm, useRegisterSubmitState } from './useLoginForm'\nimport { useSsoVerificationRedirect } from './useSsoVerificationRedirect'\n\nconst NO_RECOVERY_KEY_WARNING =\n 'Without your password or a recovery key, we cannot recover your account or data.'\n\n/** Compile the libsodium wasm while the visitor types, not inside the sign-in click. Once only. */\nlet sodiumWarmed = false\nfunction warmSodium() {\n if (sodiumWarmed) return\n sodiumWarmed = true\n const run = () => void prefetchChunk(initSodium)\n if (typeof window.requestIdleCallback === 'function') window.requestIdleCallback(run)\n else window.setTimeout(run, 200)\n}\n\n/**\n * The full sign-in and registration page. An embedded host's narrow pane signs in with\n * `ConnectedCompactLogin`.\n */\nexport function ConnectedLoginPage(): ReactElement {\n const sso = useSsoSignIn()\n const auth = useAuthPages()\n const { notify } = useBlocksEnvironment()\n const isSsoOnly = !!auth.ssoOnly\n const allowRegistration = auth.allowRegistration ?? true\n const isOnline = useIsOnline()\n const passwordRules = auth.passwordRules\n\n // Form state and actions\n // Back from the SSO provider's email verification: straight on to its sign-in.\n useSsoVerificationRedirect()\n const formState = useLoginForm()\n const deploymentDomain = useArbi().getDeploymentDomain()\n const {\n email,\n password,\n confirmPassword,\n firstName,\n lastName,\n verificationCode,\n verificationSent,\n emailVerified,\n showVerificationForm,\n pendingAutoRequest,\n isRegistering,\n isRedirecting,\n setEmail,\n setPassword,\n setConfirmPassword,\n setFirstName,\n setLastName,\n setVerificationCode,\n setIsRegistering,\n switchMode,\n setIsRedirecting,\n setPendingAutoRequest,\n setVerificationSent,\n setShowVerificationForm,\n validateEmailWithError,\n clearForm,\n } = formState\n\n const {\n isAuthenticating,\n isRequestingCode,\n handleSsoLogin,\n handleLocalLogin,\n handleRegister,\n handleRequestVerificationCode,\n } = useLoginActions({\n formState,\n formActions: formState,\n })\n\n // Register button state\n const { isDisabled: isRegisterSubmitDisabled } = useRegisterSubmitState(\n isRegistering,\n isAuthenticating,\n password,\n confirmPassword,\n email,\n firstName,\n lastName,\n verificationCode,\n passwordRules.isValid\n )\n\n // The visitor started to sign in: warm the crypto, and whatever the site warms.\n const handleIntent = () => {\n warmSodium()\n auth.onIntent?.()\n }\n\n // Offline: you can only unlock locally (not register), so force the Login tab.\n // The header also swaps its toggle for an offline pill (see offlineIndicator)\n // so it's clear why the password unlocks on-device with the backend unreachable.\n useEffect(() => {\n if (!isOnline || !allowRegistration) setIsRegistering(false)\n }, [isOnline, allowRegistration, setIsRegistering])\n\n // A sign-in link (mock and demo deployments that opt in): straight in, the form prefilled\n // should it fail.\n useFragmentCredentials({\n enabled: !!auth.fragmentSignIn,\n onCredentials: ({ email: linkEmail, password: linkPassword, next }) => {\n setEmail(linkEmail)\n if (next) auth.onReturnPath?.(next)\n void handleLocalLogin({ credentials: { email: linkEmail, password: linkPassword } })\n },\n })\n\n // Visitors who entered their address on the marketing site arrive at\n // /login#verify=<email> — the address is already known, so send the code\n // immediately rather than making them press Request for it. Ref-guarded\n // because StrictMode double-mounts effects and each run would send a second\n // email. Skipped when the local form is not usable at all (SSO-only, or\n // offline with the backend unreachable).\n const autoRequestFiredRef = useRef(false)\n const emailInputRef = useRef<HTMLInputElement>(null)\n useEffect(() => {\n if (!pendingAutoRequest || autoRequestFiredRef.current) return\n if (isSsoOnly || !isOnline || !allowRegistration) return\n autoRequestFiredRef.current = true\n setPendingAutoRequest(false)\n void handleRequestVerificationCode()\n }, [\n pendingAutoRequest,\n isSsoOnly,\n isOnline,\n allowRegistration,\n setPendingAutoRequest,\n handleRequestVerificationCode,\n ])\n\n // Terms acceptance state\n const [termsAccepted, setTermsAccepted] = useState(false)\n // Download the recovery key on signup (opt-out; unchecking shows a warning)\n const [saveRecoveryKey, setSaveRecoveryKey] = useState(true)\n const [showPassword, setShowPassword] = useState(false)\n\n // Forgot password modal state\n const [showForgotPasswordModal, setShowForgotPasswordModal] = useState(false)\n const [showChangePasswordModal, setShowChangePasswordModal] = useState(false)\n const [prefilledRecovery, setPrefilledRecovery] = useState<{\n email: string\n recoveryKey: Uint8Array\n isEncrypted: boolean\n } | null>(null)\n\n // Handle recovery success - open change password dialog in recovery mode\n const handleRecoverySuccess = () => {\n setShowForgotPasswordModal(false)\n setShowChangePasswordModal(true)\n }\n\n // On mount: pre-open the forgot-password modal in two cases.\n //\n // 1. Landed on /recover with email + #KEY=... in the URL — parse, prefill,\n // scrub URL so the key bytes don't linger in browser history.\n // 2. Landed on /login after an Auth0 redirect that started from the\n // recovery flow — restore from sessionStorage so the user doesn't have\n // to re-click their recovery link (set by ForgotPasswordModal's\n // handleSsoSignInForRecovery).\n useEffect(() => {\n // Case 1: /recover URL\n if (window.location.pathname === '/recover') {\n const recovery = parseRecoveryUrl(window.location.search, window.location.hash)\n if (!recovery) return\n setPrefilledRecovery(recovery)\n setShowForgotPasswordModal(true)\n window.history.replaceState(null, '', '/login')\n return\n }\n\n // Case 2: returned from Auth0 with a pending recovery in sessionStorage\n try {\n const raw = sessionStorage.getItem(PENDING_RECOVERY_KEY)\n if (!raw) return\n sessionStorage.removeItem(PENDING_RECOVERY_KEY)\n const parsed = JSON.parse(raw) as { email: string; keyB64: string; isEncrypted: boolean }\n const bin = atob(parsed.keyB64)\n const recoveryKey = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) recoveryKey[i] = bin.charCodeAt(i)\n setPrefilledRecovery({\n email: parsed.email,\n recoveryKey,\n isEncrypted: parsed.isEncrypted,\n })\n setShowForgotPasswordModal(true)\n } catch (err) {\n console.error('Failed to restore recovery state from sessionStorage:', err)\n }\n }, [])\n\n // SSO only: hand straight over to the provider\n useEffect(() => {\n if (isSsoOnly && !sso.isLoading && !isRedirecting) {\n handleSsoLogin()\n }\n }, [isSsoOnly, sso.isLoading, isRedirecting, handleSsoLogin])\n\n // Reset redirecting state after the provider settled\n useEffect(() => {\n if (!sso.isLoading && isRedirecting) {\n const timer = setTimeout(() => {\n setIsRedirecting(false)\n }, 500)\n return () => clearTimeout(timer)\n }\n }, [sso.isLoading, isRedirecting, setIsRedirecting])\n\n // Show loading screen during SSO redirect\n if ((isRedirecting && sso.isLoading) || isSsoOnly) {\n return <>{auth.loading ?? null}</>\n }\n\n const showVerifiedBadge = isRegistering && emailVerified\n\n const handleFormSubmit = (e: FormEvent) => {\n e.preventDefault()\n if (isRegistering) {\n if (!termsAccepted) {\n notify('You must acknowledge the Terms of Use and Privacy Policy.', 'error')\n return\n }\n handleRegister(saveRecoveryKey)\n } else {\n handleLocalLogin()\n }\n }\n\n // Offline: the header swaps its tabs for a pill so it's clear why the password\n // unlocks on-device with the backend unreachable.\n const offlineIndicator = (\n <AuthOfflineBadge title=\"No connection — sign in to unlock your offline files on this device\" />\n )\n\n const loginRegisterToggle = (\n <AuthTabs\n ariaLabel=\"Login or register\"\n value={isRegistering ? 'register' : 'login'}\n onChange={(tab) => switchMode(tab === 'register')}\n tabs={[\n { value: 'login', label: 'Login' },\n { value: 'register', label: 'Register', testId: 'register-switch' },\n ]}\n />\n )\n\n // The site's panel beside the form — the same on both Login and Register.\n const aside = isSsoOnly ? undefined : auth.aside\n\n const isStepTwo = isRegistering && verificationSent && showVerificationForm\n\n return (\n <AuthLayout\n brand={auth.brand}\n corner={auth.corner}\n headerRight={\n isSsoOnly\n ? undefined\n : !isOnline\n ? offlineIndicator\n : allowRegistration\n ? loginRegisterToggle\n : undefined\n }\n aside={aside}\n >\n {auth.banner}\n {!isSsoOnly && (\n <>\n <AuthHeading\n title={isRegistering ? 'Create your account' : (auth.heading?.title ?? 'Welcome back')}\n description={isRegistering ? undefined : auth.heading?.description}\n />\n <div data-testid=\"login-form-container\">\n {/* Login/Registration Form */}\n\n <form\n className=\"space-y-4\"\n aria-label={isRegistering ? 'Sign up with email' : 'Sign in with email'}\n onSubmit={handleFormSubmit}\n onFocusCapture={handleIntent}\n aria-busy={isAuthenticating}\n >\n {/* The address locks once a code is out, so the way back sits beside it: a typo, or\n a wrong address carried in from a marketing link, would otherwise need a reload.\n One control does it — clearing the form frees the address and returns to step 1. */}\n <AuthField\n htmlFor=\"email\"\n label={isRegistering ? 'Email' : (auth.emailLabel ?? 'Email')}\n required\n labelAction={\n isRegistering && verificationSent ? (\n <AuthLink onClick={clearForm} data-testid=\"clear-button\">\n Clear form\n </AuthLink>\n ) : undefined\n }\n trailing={\n // Shown once the address is locked in with a code in hand — i.e. the emailed\n // link, or a code typed in. The server checks the code when the account is made.\n showVerifiedBadge ? (\n <AuthFieldBadge\n testId=\"email-verified-badge\"\n icon={<BadgeCheck className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n Verified\n </AuthFieldBadge>\n ) : undefined\n }\n >\n <AuthInput\n ref={emailInputRef}\n type=\"email\"\n placeholder=\"you@company.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n data-testid=\"email-input\"\n name=\"email\"\n id=\"email\"\n autoComplete=\"email\"\n required\n className={showVerifiedBadge ? 'pr-24' : ''}\n // Locked, not disabled: a disabled input is faded (opacity-50) and reads as a\n // hint, so the address the code went to would look empty.\n readOnly={isRegistering && verificationSent}\n disabled={isAuthenticating}\n />\n </AuthField>\n\n {/* Step 1 — the whole window is \"enter an email, get a code\". Nothing else is shown,\n because nothing else can be completed until the address is verified. */}\n {isRegistering && !verificationSent && (\n <div className=\"space-y-3 pt-1\">\n <Button\n type=\"button\"\n onClick={handleRequestVerificationCode}\n className=\"w-full\"\n disabled={isRequestingCode || !email}\n data-testid=\"verify-email-button\"\n >\n {isRequestingCode ? 'Sending…' : 'Email me a verification link'}\n </Button>\n {/* Fallback for anyone who already has a code — an invitation forwarded as text,\n a code from an earlier attempt, a link opened on another device. Sending a\n second email would invalidate the code they are holding, so this only unlocks\n the form. The address is still validated, because it is about to be locked and\n submitted with the code. */}\n <AuthLink\n onClick={() => {\n // Say why nothing happened, and point at the field to fill in.\n if (!email) {\n emailInputRef.current?.focus()\n notify(\n 'Enter your email address first, then choose \"I already have my code\".',\n 'error'\n )\n return\n }\n if (!validateEmailWithError(email)) return\n setVerificationSent(true)\n setShowVerificationForm(true)\n }}\n className=\"w-full text-center\"\n data-testid=\"already-have-code-button\"\n >\n I already have my code\n </AuthLink>\n </div>\n )}\n\n {/* Step 1.5 — the code is out, but the code/name/password form stays off screen until\n the visitor needs it. Most people just click the link in the email, so leading\n with the full form here would show fields almost nobody fills in. */}\n {isRegistering && verificationSent && !showVerificationForm && (\n <div className=\"space-y-2 pt-1\" data-testid=\"verification-sent-notice\">\n <AuthNote>We've sent a link to your email — click it to continue.</AuthNote>\n <AuthLink\n onClick={() => setShowVerificationForm(true)}\n className=\"w-full text-center\"\n data-testid=\"enter-code-manually-button\"\n >\n Enter code manually instead\n </AuthLink>\n </div>\n )}\n\n {/* Step 2 — the rest of the form, unlocked once a code has been sent AND the visitor\n asked to see it (or arrived via an emailed link that already carries a code — see\n useLoginForm's hash effect, which sets both flags together for that case). */}\n {isStepTwo && (\n <>\n {/* The code field has no Request button beside it: requesting is step 1's whole\n job, so repeating it here just invites a second email and a second cooldown. */}\n {!showVerifiedBadge && (\n <AuthField htmlFor=\"verificationCode\" label=\"Verification Code\" required>\n <AuthInput\n type=\"text\"\n // The code is three dash-joined words, which is not guessable from an empty\n // box — and the onChange below rewrites whitespace to dashes, so showing the\n // shape up front stops it looking like the field is mangling input.\n placeholder=\"THREE-WORD-CODE\"\n value={verificationCode}\n onChange={(e) => {\n const value = e.target.value.toUpperCase().replace(/\\s+/g, '-')\n setVerificationCode(value)\n }}\n data-testid=\"verification-code-input\"\n name=\"verificationCode\"\n id=\"verificationCode\"\n autoComplete=\"off\"\n required\n className=\"w-full\"\n />\n </AuthField>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <AuthField htmlFor=\"firstName\" label=\"First Name\" required>\n <AuthInput\n type=\"text\"\n placeholder=\"\"\n value={firstName}\n onChange={(e) => setFirstName(e.target.value)}\n data-testid=\"firstname-input\"\n name=\"firstName\"\n id=\"firstName\"\n autoComplete=\"given-name\"\n required\n />\n </AuthField>\n <AuthField htmlFor=\"lastName\" label=\"Last Name\" required>\n <AuthInput\n type=\"text\"\n placeholder=\"\"\n value={lastName}\n onChange={(e) => setLastName(e.target.value)}\n data-testid=\"lastname-input\"\n name=\"lastName\"\n id=\"lastName\"\n autoComplete=\"family-name\"\n required\n />\n </AuthField>\n </div>\n\n <PasswordStrengthInput\n password={password}\n confirmPassword={confirmPassword}\n onPasswordChange={setPassword}\n onConfirmPasswordChange={setConfirmPassword}\n showConfirmation={true}\n passwordLabel=\"Password\"\n confirmLabel=\"Confirm Password\"\n layout=\"side-by-side\"\n showStrengthIndicator={true}\n getUnmetRequirement={passwordRules.unmet}\n />\n </>\n )}\n\n {/* Password Field for Login */}\n {!isRegistering && (\n <AuthField htmlFor=\"password\" label=\"Password\" required>\n <RevealablePasswordInput\n isRevealed={showPassword}\n onToggleReveal={() => setShowPassword((v) => !v)}\n placeholder=\"\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n // Argon2 (~70 ms on a fast desktop, ~300 ms+ on a phone) is the CPU cost of\n // signing in. It is deterministic, so start it as the user leaves the field and\n // the click only has to sign + send.\n onBlur={() => {\n if (email && password) prewarmKeyPairs(email, password, deploymentDomain)\n }}\n data-testid=\"password-input\"\n name=\"password\"\n id=\"password\"\n autoComplete=\"current-password\"\n required\n disabled={isAuthenticating}\n />\n <AuthLink\n onClick={() => setShowForgotPasswordModal(true)}\n className=\"mt-2\"\n data-testid=\"forgot-password-link\"\n >\n Forgot your password?\n </AuthLink>\n </AuthField>\n )}\n\n {/* Terms + recovery-key checkboxes — step 2, next to the actual account creation */}\n {isStepTwo && (\n <AuthConsent\n termsAccepted={termsAccepted}\n onTermsAcceptedChange={setTermsAccepted}\n saveRecoveryKey={saveRecoveryKey}\n onSaveRecoveryKeyChange={setSaveRecoveryKey}\n termsLink={auth.consent?.termsLink ?? { href: '#', label: 'Terms of Use' }}\n privacyLink={auth.consent?.privacyLink ?? { href: '#', label: 'Privacy Policy' }}\n noRecoveryKeyWarning={\n auth.consent?.noRecoveryKeyWarning ?? NO_RECOVERY_KEY_WARNING\n }\n />\n )}\n\n {/* Submit Button — step 2 only; in step 1 (and step 1.5, waiting on the emailed link)\n the primary action is \"Verify Email\" / \"Enter code manually\" above. */}\n {(!isRegistering || isStepTwo) && (\n <div className=\"space-y-3 pt-1\">\n <AuthSubmitButton\n isBusy={isAuthenticating}\n disabled={isAuthenticating || (isRegistering && isRegisterSubmitDisabled)}\n testId={isRegistering ? 'register-submit' : 'login-submit'}\n >\n {isRegistering\n ? isAuthenticating\n ? 'Creating your account…'\n : 'Create account'\n : isAuthenticating\n ? 'Signing in…'\n : 'Sign in'}\n </AuthSubmitButton>\n </div>\n )}\n </form>\n\n {(!isRegistering || !verificationSent) && sso.available && (\n <div className=\"mt-6 space-y-4\">\n <AuthDivider label=\"or continue with\" />\n <div className=\"grid grid-cols-3 gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"min-w-0 gap-2 px-2\"\n aria-label=\"Continue with LinkedIn\"\n disabled={sso.isLoading || isRedirecting || isAuthenticating}\n onClick={() => handleSsoLogin('linkedin')}\n data-testid={\n isRegistering ? 'register-with-linkedin-button' : 'login-with-linkedin-button'\n }\n >\n <LinkedInIcon size={16} aria-hidden={true} />\n LinkedIn\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"min-w-0 gap-2 px-2\"\n aria-label=\"Continue with Google\"\n disabled={sso.isLoading || isRedirecting || isAuthenticating}\n onClick={() => handleSsoLogin('google-oauth2')}\n data-testid={\n isRegistering ? 'register-with-google-button' : 'login-with-google-button'\n }\n >\n <GoogleIcon size={16} aria-hidden={true} />\n Google\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"min-w-0 gap-2 px-2\"\n aria-label=\"Continue with Apple\"\n disabled={sso.isLoading || isRedirecting || isAuthenticating}\n onClick={() => handleSsoLogin('apple')}\n data-testid={\n isRegistering ? 'register-with-apple-button' : 'login-with-apple-button'\n }\n >\n <AppleIcon size={16} aria-hidden={true} />\n Apple\n </Button>\n </div>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* SSO Login Button. Hidden where the provider cannot run (Auth0 on a non-secure origin, a\n dev server reached over a LAN address) — email + password still works. */}\n {!isRegistering && sso.available && (\n <AuthLink onClick={() => handleSsoLogin()} data-testid=\"login-with-arbi-button\">\n Continue with Arbicity\n </AuthLink>\n )}\n\n {/* Footer links (the consent checkboxes live inside the form for register mode) */}\n {!isRegistering && auth.footer}\n\n {/* Forgot Password Modal */}\n <ConnectedForgotPassword\n open={showForgotPasswordModal}\n onOpenChange={(open) => {\n setShowForgotPasswordModal(open)\n if (!open) setPrefilledRecovery(null)\n }}\n onRecovered={handleRecoverySuccess}\n initialEmail={prefilledRecovery?.email}\n initialRecoveryKey={prefilledRecovery?.recoveryKey ?? undefined}\n initialIsKeyEncrypted={prefilledRecovery?.isEncrypted ?? false}\n />\n\n {/* Change Password Dialog (Recovery Mode) */}\n <ConnectedPasswordChangeDialog\n open={showChangePasswordModal}\n onClose={() => setShowChangePasswordModal(false)}\n recoveryMode\n />\n </AuthLayout>\n )\n}\n","/** The pieces of a name an identity provider may give us. Providers fill these inconsistently. */\nexport interface NameSource {\n given_name?: string | null\n family_name?: string | null\n name?: string | null\n}\n\nexport interface ResolvedName {\n given_name: string\n family_name: string\n}\n\nconst clean = (value?: string | null): string => value?.trim() ?? ''\n\n/**\n * One rule for splitting an SSO profile into first and last name, used everywhere the app shows or registers one.\n *\n * A provider can send `family_name` without `given_name` (or neither). The full `name` then has to be split without\n * counting the surname twice: with only a surname known it is stripped off the end of `name`; with nothing known\n * the first word is the first name and the rest is the surname. Names known to the backend (`preferred`) win.\n */\nexport function resolveSsoName(\n profile: NameSource,\n preferred: NameSource = {},\n emailFallback?: string\n): ResolvedName {\n const fullName = clean(profile.name)\n let given = clean(preferred.given_name) || clean(profile.given_name)\n let family = clean(preferred.family_name) || clean(profile.family_name)\n\n if (!given && fullName) {\n const surnameAtEnd =\n family &&\n fullName.length > family.length &&\n fullName.toLowerCase().endsWith(family.toLowerCase())\n given = surnameAtEnd\n ? fullName.slice(0, fullName.length - family.length).trim()\n : fullName.split(/\\s+/)[0]\n }\n if (!family && given && fullName.toLowerCase().startsWith(given.toLowerCase())) {\n family = fullName.slice(given.length).trim()\n }\n if (!given && emailFallback) given = emailFallback.split('@')[0]\n\n return { given_name: given, family_name: family }\n}\n","/**\n * Finishing a sign-in through SSO, once the provider has signed the person in: what their account\n * is for the provider's email (`arbi.sso.status`), then, with the master password, register a new\n * account (and back it up), link a local one, or sign in. One implementation for the full-page\n * callback (`ConnectedSsoCallback`) and the compact sign-in of embedded hosts.\n */\nimport type { components, LoginResult } from '@arbidocs/client'\nimport type { useArbi } from '@arbidocs/react'\nimport { backUpOnSignup } from './signup-backup'\nimport { resolveSsoName } from './sso-name'\nimport type { SsoUser } from './support'\n\nexport type SsoAccountStatus = components['schemas']['SSOStatusResponse']\n\ntype Arbi = ReturnType<typeof useArbi>\n\n/** What the provider's account is on this deployment (`new_user`, `sso_exists`, `local_exists`). */\nexport function ssoAccountStatus(arbi: Arbi, token: string, user: SsoUser) {\n return arbi.sso.status({ token, email: user.email!, picture: user.picture })\n}\n\nexport interface CompleteSsoSignIn {\n token: string\n user: SsoUser\n status: SsoAccountStatus\n /** The master password: a new one for `new_user`, the account's otherwise. */\n password: string\n /** A new account: download its recovery key (default on). */\n saveRecoveryKey?: boolean\n}\n\n/**\n * Sign in with the master password by account status. A new account is registered (the SSO token\n * stands in for the verification code), backed up, and signed in with the provider's name and\n * picture; `registered` says so. A local account is linked to SSO (`linked`).\n */\nexport async function completeSsoSignIn(\n arbi: Arbi,\n { token, user, status, password, saveRecoveryKey = true }: CompleteSsoSignIn\n): Promise<{ login: LoginResult | undefined; registered: boolean; linked: boolean }> {\n const email = user.email!\n if (status.status === 'new_user') {\n const { given_name: firstName, family_name: lastName } = resolveSsoName(user, status, email)\n const { signingPrivateKey } = await arbi.sso.register({\n token,\n email,\n password,\n firstName,\n lastName,\n picture: user.picture,\n })\n // After the account exists: each attempt makes a new identity, so a recovery file saved for a\n // failed attempt would recover nothing.\n await backUpOnSignup({\n email,\n password,\n signingPrivateKey,\n saveRecoveryKey,\n auth0Sub: user.sub,\n })\n const login = await arbi.sso.login({\n token,\n email,\n password,\n profile: { ...resolveSsoName(user, status), picture: user.picture ?? null },\n })\n return { login, registered: true, linked: false }\n }\n // An existing account: the backend's profile is authoritative (the person may have edited it).\n const linked = status.status === 'local_exists'\n const signIn = linked ? arbi.sso.link : arbi.sso.login\n const login = await signIn({ token, email, password })\n return { login: login ?? undefined, registered: false, linked }\n}\n","/**\n * The compact sign-in of embedded hosts (an Office task pane, a browser extension): email and\n * password, or SSO in a popup (the host opens it, `onSsoSignIn`) followed by the master password\n * the account's keys are derived from. The same actions as the sign-in page (`useLoginActions`)\n * and the same SSO completion as the callback page (`completeSsoSignIn`), arranged for a narrow\n * pane, with errors shown in place. The full sign-in page is `ConnectedLoginPage`.\n */\nimport { useState, type FormEvent, type ReactElement } from 'react'\nimport { Loader2, LogIn } from 'lucide-react'\nimport { Button, Input } from '@arbidocs/react/ui'\nimport { useArbi } from '@arbidocs/react'\nimport { parseAuthError } from '../../auth/auth-error'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { completeSsoSignIn, ssoAccountStatus } from './sso-sign-in'\nimport { useAuthPages, type SsoUser } from './support'\nimport { useLoginActions } from './useLoginActions'\nimport { useLoginForm } from './useLoginForm'\n\nexport interface ConnectedCompactLoginProps {\n /**\n * Sign in at the SSO provider in a popup: the provider's token and user, or `null` when the\n * popup closed without one. Absent: no SSO.\n */\n onSsoSignIn?: () => Promise<{ accessToken: string; user: SsoUser } | null>\n /** Signed in, with the person's first name. */\n onSignedIn?: (name: string) => void\n /** The product name in the copy (\"Sign in with …\", \"your … master password\"). */\n appName?: string\n /** The SSO provider's name on its buttons. Default: the product name. */\n ssoName?: string\n}\n\nconst firstName = (user: { given_name?: string | null } | undefined, fallback: string) =>\n user?.given_name || fallback.split('@')[0]\n\nexport function ConnectedCompactLogin({\n onSsoSignIn,\n onSignedIn,\n appName = 'ARBI',\n ssoName = appName,\n}: ConnectedCompactLoginProps): ReactElement {\n const arbi = useArbi()\n const auth = useAuthPages()\n const { notify } = useBlocksEnvironment()\n const isSsoOnly = !!auth.ssoOnly\n const [error, setError] = useState<string | null>(null)\n const formState = useLoginForm()\n const { email, password, setEmail, setPassword } = formState\n const { isAuthenticating, handleLocalLogin } = useLoginActions({\n formState,\n formActions: formState,\n onError: setError,\n })\n\n // SSO: the provider signed in; the master password finishes it.\n const [sso, setSso] = useState<{ accessToken: string; user: SsoUser } | null>(null)\n const [masterPassword, setMasterPassword] = useState('')\n\n const signInLocally = async (e: FormEvent) => {\n e.preventDefault()\n setError(null)\n const login = await handleLocalLogin()\n if (login) onSignedIn?.(firstName(login.response?.user, email))\n }\n\n const finishSso = async () => {\n if (!sso?.user.email) {\n setError('User email not available')\n return\n }\n try {\n const status = await ssoAccountStatus(arbi, sso.accessToken, sso.user)\n const { login } = await completeSsoSignIn(arbi, {\n token: sso.accessToken,\n user: sso.user,\n status,\n password: masterPassword,\n })\n const name = login?.response?.user.given_name ?? sso.user.given_name ?? sso.user.name\n setError(null)\n setSso(null)\n setMasterPassword('')\n const shown = name ?? sso.user.email.split('@')[0]\n notify(`Welcome, ${shown}!`, 'success')\n onSignedIn?.(shown)\n } catch (err) {\n console.error('[SSO] Error during authentication:', err)\n setError(parseAuthError(err, { defaultMessage: 'Authentication failed. Please try again.' }))\n }\n }\n\n const startSso = async () => {\n if (!onSsoSignIn) return\n try {\n const result = await onSsoSignIn()\n if (result) setSso(result)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Authentication failed. Please try again.')\n }\n }\n\n const cancelSso = () => {\n setSso(null)\n setMasterPassword('')\n setError(null)\n }\n\n return (\n <div className=\"space-y-4\" data-testid=\"embedded-auth\">\n {error && (\n <div\n className=\"bg-destructive/10 text-destructive p-3 rounded-md\"\n data-testid=\"embedded-auth-error\"\n >\n <p className=\"text-sm\">{error}</p>\n </div>\n )}\n\n {sso ? (\n <form\n onSubmit={(e) => {\n e.preventDefault()\n if (masterPassword) void finishSso()\n }}\n className=\"space-y-3\"\n >\n <p className=\"text-sm text-muted-foreground\">\n Enter your {appName} <strong>master password</strong> — the encryption passphrase you\n set when you first registered, not your {ssoName} sign-in password.\n </p>\n <Input\n type=\"password\"\n placeholder=\"Enter master password\"\n value={masterPassword}\n onChange={(e) => setMasterPassword(e.target.value)}\n autoFocus\n data-testid=\"embedded-auth-password-input\"\n />\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!masterPassword}\n data-testid=\"embedded-auth-continue-button\"\n >\n Continue\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={cancelSso}\n data-testid=\"embedded-auth-cancel-button\"\n >\n Cancel\n </Button>\n </form>\n ) : isSsoOnly ? (\n <>\n <p className=\"text-sm text-muted-foreground\">\n Please sign in with your organization account.\n </p>\n <Button\n onClick={() => void startSso()}\n className=\"w-full\"\n data-testid=\"embedded-auth-sso-button\"\n >\n <LogIn className=\"mr-2 h-4 w-4\" />\n Sign in with {ssoName}\n </Button>\n </>\n ) : (\n <>\n <form onSubmit={(e) => void signInLocally(e)} className=\"space-y-3\">\n <Input\n type=\"email\"\n placeholder=\"Email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={isAuthenticating}\n data-testid=\"embedded-auth-email-input\"\n />\n <Input\n type=\"password\"\n placeholder=\"Password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n disabled={isAuthenticating}\n data-testid=\"embedded-auth-password-input\"\n />\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isAuthenticating}\n data-testid=\"embedded-auth-signin-button\"\n >\n {isAuthenticating ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Signing in...\n </>\n ) : (\n 'Sign In'\n )}\n </Button>\n </form>\n\n {onSsoSignIn && (\n <>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <span className=\"w-full border-t\" />\n </div>\n <div className=\"relative flex justify-center text-sm uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">Or</span>\n </div>\n </div>\n\n <Button\n onClick={() => void startSso()}\n className=\"w-full\"\n variant=\"outline\"\n data-testid=\"embedded-auth-sso-option-button\"\n >\n <LogIn className=\"mr-2 h-4 w-4\" />\n Sign in with {ssoName} (SSO)\n </Button>\n </>\n )}\n </>\n )}\n </div>\n )\n}\n","import { createContext, useContext, useEffect, useState, useRef, type ReactNode } from 'react'\nimport {\n DocumentReview,\n useArbiSessionState,\n useArbiSessionStore,\n useDocument,\n useDocuments,\n useDownloadDocuments,\n useUploadDocuments,\n useWorkspaceRole,\n} from '@arbidocs/react'\nimport { Button, Input, getDocumentTitle } from '@arbidocs/react/ui'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { ArrowLeft, ChevronRight, Download, FileText, MessageSquare, Upload } from 'lucide-react'\nimport { ArbiHost, useHost } from '../../provider/host'\nimport type { OpenDocumentOptions } from '../../provider/environment'\nimport { MobileAppBar } from '../../shell/MobileBars'\nimport { Sidebar } from '../../shell/Sidebar'\n\ninterface OpenFile {\n id: string\n options?: OpenDocumentOptions\n workspaceId: string | null\n}\ninterface Navigation {\n section: 'main' | 'documents' | 'document'\n file: OpenFile | null\n main: () => void\n documents: () => void\n open: (id: string, options?: OpenDocumentOptions) => void\n}\nconst Context = createContext<Navigation | null>(null)\nexport function useEmbeddedNavigation() {\n return useContext(Context)\n}\n\n/** Local navigation: the same session, one visible section, no implicit workspace switch. */\nexport function EmbeddedNavigation({ children }: { children: ReactNode }) {\n const host = useHost()\n const session = useArbiSessionStore()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: availableDocuments } = useDocuments()\n const [section, setSection] = useState<Navigation['section']>('main')\n const [file, setFile] = useState<OpenFile | null>(null)\n useEffect(() => {\n setSection('main')\n setFile(null)\n }, [workspaceId])\n const main = () => setSection('main')\n const documents = () => setSection('documents')\n const open = (id: string, options?: OpenDocumentOptions) => {\n if (options?.workspaceId && options.workspaceId !== workspaceId) return\n if (!availableDocuments?.some((doc) => doc.external_id === parseVersionRef(id).docId)) return\n session.setActiveCitationKey(null)\n setFile({ id, options, workspaceId })\n setSection('document')\n }\n return (\n <Context.Provider value={{ section, file, main, documents, open }}>\n <ArbiHost\n config={{\n environment: {\n ...host.environment,\n openDocument: host.environment?.openDocument ?? open,\n },\n }}\n >\n {children}\n </ArbiHost>\n </Context.Provider>\n )\n}\n\n/** Reuses the main app's mobile bar and sidebar navigation, contained in this embedded window. */\nexport function EmbeddedTopbar({\n title,\n workspace,\n actions,\n}: {\n title: string\n workspace: ReactNode\n actions: ReactNode\n}) {\n const nav = useEmbeddedNavigation()\n const [menu, setMenu] = useState(false)\n const { data: docs = [] } = useDocuments()\n const file = docs.find(\n (d) => d.external_id === (nav?.file ? parseVersionRef(nav.file.id).docId : '')\n )\n const destination =\n nav?.section === 'documents' ? 'Documents' : file ? getDocumentTitle(file) : 'Document'\n const go = (to: 'main' | 'documents') => {\n setMenu(false)\n if (to === 'main') nav?.main()\n else nav?.documents()\n }\n return (\n <>\n <MobileAppBar\n showMenu\n onMenu={() => setMenu(true)}\n className=\"h-12 sm:flex bg-primary text-primary-foreground [&_button]:text-primary-foreground [&_button:hover]:bg-primary-foreground/10\"\n title={\n nav?.section === 'main' ? (\n workspace\n ) : (\n <div className=\"flex min-w-0 items-center gap-1 text-sm\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => go('main')} className=\"h-8 px-1\">\n <ArrowLeft className=\"size-3.5\" /> Main\n </Button>\n <ChevronRight className=\"size-3 shrink-0 opacity-60\" />\n <span className=\"truncate\">{destination}</span>\n </div>\n )\n }\n actions={actions}\n />\n {menu && (\n <Sidebar.Root\n mode=\"drawer\"\n expanded\n contained\n onBackdropClick={() => setMenu(false)}\n aria-label=\"Embedded navigation\"\n >\n <Sidebar.DrawerHeader\n logo={<span className=\"font-semibold\">{title}</span>}\n onClose={() => setMenu(false)}\n />\n <Sidebar.Nav\n items={[\n {\n id: 'chat',\n label: 'Chat',\n icon: <MessageSquare className=\"size-4\" />,\n active: nav?.section === 'main',\n onSelect: () => go('main'),\n },\n {\n id: 'documents',\n label: 'Documents',\n icon: <FileText className=\"size-4\" />,\n active: nav?.section !== 'main',\n onSelect: () => go('documents'),\n },\n ]}\n />\n </Sidebar.Root>\n )}\n </>\n )\n}\n\n/** The Documents section is a sibling of Chat; opening a document never mounts a second pane. */\nexport function EmbeddedDocuments() {\n const nav = useEmbeddedNavigation()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: docs = [], isLoading, error } = useDocuments()\n const [search, setSearch] = useState('')\n const upload = useUploadDocuments()\n const role = useWorkspaceRole()\n const input = useRef<HTMLInputElement>(null)\n const [uploadError, setUploadError] = useState<string | null>(null)\n if (!nav || nav.section === 'main') return null\n if (nav.section === 'document' && nav.file?.workspaceId === workspaceId)\n return <EmbeddedDocument file={nav.file} />\n return (\n <section className=\"flex min-h-0 flex-1 flex-col\" aria-label=\"Documents\">\n <div className=\"flex shrink-0 items-center gap-2 p-3\">\n <Input\n aria-label=\"Search documents\"\n placeholder=\"Search documents…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <input\n ref={input}\n className=\"hidden\"\n type=\"file\"\n multiple\n aria-label=\"Upload workspace documents\"\n onChange={(event) => {\n const files = Array.from(event.target.files ?? [])\n event.target.value = ''\n if (files.length && role && role !== 'guest') {\n setUploadError(null)\n void upload\n .mutateAsync({ files })\n .catch((error: unknown) =>\n setUploadError(error instanceof Error ? error.message : 'Upload failed.')\n )\n }\n }}\n />\n <Button\n size=\"icon\"\n variant=\"outline\"\n aria-label=\"Upload documents\"\n title=\"Upload documents\"\n disabled={!role || role === 'guest' || upload.isPending}\n onClick={() => input.current?.click()}\n >\n <Upload className=\"size-4\" />\n </Button>\n </div>\n {uploadError && (\n <p role=\"alert\" className=\"px-3 pb-2 text-xs text-destructive\">\n {uploadError}\n </p>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto p-2\">\n {isLoading ? (\n <p className=\"p-3 text-sm text-muted-foreground\">Loading documents…</p>\n ) : error ? (\n <p role=\"alert\" className=\"p-3 text-sm text-destructive\">\n Could not load documents.\n </p>\n ) : (\n docs\n .filter((d) => getDocumentTitle(d).toLowerCase().includes(search.toLowerCase()))\n .map((doc) => (\n <Button\n key={doc.external_id}\n variant=\"ghost\"\n className=\"h-auto w-full justify-start gap-3 whitespace-normal px-3 py-3 text-left\"\n onClick={() => nav.open(doc.external_id)}\n >\n <FileText className=\"size-5 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{getDocumentTitle(doc)}</span>\n <span className=\"block truncate text-xs font-normal text-muted-foreground\">\n {doc.file_name} · {doc.status}\n </span>\n </span>\n </Button>\n ))\n )}\n {!isLoading && !error && docs.length === 0 && (\n <p className=\"p-3 text-sm text-muted-foreground\">No documents in this workspace.</p>\n )}\n </div>\n </section>\n )\n}\n\nfunction EmbeddedDocument({ file }: { file: OpenFile }) {\n const baseId = parseVersionRef(file.id).docId\n const { data: doc, isLoading, error } = useDocument(baseId, { pollWhileProcessing: true })\n const { downloadDocument, isDownloading } = useDownloadDocuments()\n if (isLoading) return <p className=\"p-4 text-sm text-muted-foreground\">Loading document…</p>\n if (error || !doc || (doc.workspace_ext_id && doc.workspace_ext_id !== file.workspaceId))\n return (\n <p role=\"alert\" className=\"p-4 text-sm text-destructive\">\n This document could not be opened.\n </p>\n )\n return (\n <section className=\"flex min-h-0 flex-1 flex-col\" aria-label=\"Document viewer\">\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-b border-border px-3 py-1\">\n <span\n className=\"min-w-0 truncate text-xs text-muted-foreground\"\n title={doc.file_name ?? undefined}\n >\n {doc.file_name}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={isDownloading}\n onClick={() => void downloadDocument({ ...doc, external_id: file.id })}\n >\n <Download className=\"size-3.5\" /> Original\n </Button>\n </div>\n {['queued', 'processing'].includes(doc.status?.toLowerCase() ?? '') ? (\n <p role=\"status\" className=\"p-4 text-sm text-muted-foreground\">\n Processing document…\n </p>\n ) : (\n <DocumentReview\n docId={file.id}\n doc={{ ...doc, doctags: [] }}\n workspaceId={file.workspaceId ?? undefined}\n activeChunkId={file.options?.passageId}\n className=\"min-h-0 flex-1 rounded-none border-0 [&>div:first-child]:hidden\"\n />\n )}\n </section>\n )\n}\n","import { useAssistantCopy } from '@arbidocs/react/shell'\nimport { browserSessionStateStorage } from '@arbidocs/client'\nimport { useMemo, useState, type ReactNode } from 'react'\nimport {\n useArbi,\n useArbiSession,\n useArbiSessionState,\n useArbiSessionStore,\n useWorkspaces,\n} from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { LogOut, Plus } from 'lucide-react'\nimport { ArbiHost } from '../../provider/host'\nimport {\n ConnectedCompactLogin,\n type ConnectedCompactLoginProps,\n} from '../auth/ConnectedCompactLogin'\nimport { ConnectedCompactConversation } from '../conversation/ConnectedCompactConversation'\nimport { ConnectedConversationDocumentPicker } from '../conversation/ConnectedConversationDocumentPicker'\nimport { defaultHost } from '../defaultHost'\nimport { useOptionalConnection } from '../ConnectionProvider'\nimport { useSelectWorkspace } from '../useSelectWorkspace'\nimport {\n EmbeddedNavigation,\n EmbeddedTopbar,\n EmbeddedDocuments,\n useEmbeddedNavigation,\n} from './EmbeddedNavigation'\n\nexport interface EmbeddedChatPanelProps {\n signedIn: boolean\n login: ReactNode\n header: ReactNode\n platformHeader?: ReactNode\n platformFooter?: ReactNode\n footer?: ReactNode\n onDocumentSelectionChange?: (ids: string[]) => void\n}\n/** Shared layout and chat engine; platform shells supply authentication and native actions. */\nexport function EmbeddedChatPanel(props: EmbeddedChatPanelProps) {\n return (\n <EmbeddedNavigation>\n <EmbeddedPanelContent {...props} />\n </EmbeddedNavigation>\n )\n}\n\nfunction EmbeddedPanelContent({\n signedIn,\n login,\n header,\n platformHeader,\n platformFooter,\n footer,\n onDocumentSelectionChange,\n}: EmbeddedChatPanelProps) {\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const navigation = useEmbeddedNavigation()\n if (!signedIn)\n return (\n <div className=\"h-full min-h-0 overflow-y-auto p-4\" data-testid=\"embedded-panel-login\">\n {login}\n {footer}\n </div>\n )\n return (\n <div\n className=\"relative flex flex-col h-full min-h-0 min-w-0 overflow-hidden bg-background font-sans text-foreground\"\n data-testid=\"embedded-panel\"\n >\n <div className=\"shrink-0\">{header}</div>\n <div className=\"grid min-h-0 flex-1 grid-cols-1 grid-rows-1\">\n <div\n className={cn(\n 'col-start-1 row-start-1 flex min-h-0 flex-col',\n navigation?.section !== 'main' && 'invisible pointer-events-none'\n )}\n >\n {platformHeader && <div className=\"shrink-0\">{platformHeader}</div>}\n {workspaceId ? (\n <ConnectedCompactConversation\n key={workspaceId}\n attachments={\n <ConnectedConversationDocumentPicker\n onSelectionChange={onDocumentSelectionChange}\n />\n }\n />\n ) : (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Select a workspace to start chatting.\n </p>\n )}\n {platformFooter && <div className=\"shrink-0\">{platformFooter}</div>}\n </div>\n {workspaceId && navigation?.section !== 'main' && (\n <div className=\"col-start-1 row-start-1 flex min-h-0 flex-col bg-background\">\n <EmbeddedDocuments />\n </div>\n )}\n </div>\n {footer && <div className=\"shrink-0\">{footer}</div>}\n </div>\n )\n}\n\nfunction EmbeddedWorkspaceHeader({ title }: { title: string }) {\n const navigation = useEmbeddedNavigation()\n const session = useArbiSessionStore()\n const generating = useArbiSessionState(\n (state) => state.generating[state.conversationId || '']?.isGenerating ?? false\n )\n const arbi = useArbi()\n const signedIn = useArbiSession()\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const { data: workspaces = [], isLoading, error: listError } = useWorkspaces()\n const select = useSelectWorkspace()\n const connection = useOptionalConnection()\n const [pending, setPending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n async function choose(id: string) {\n if (!id) return\n setPending(true)\n setError(null)\n try {\n await select(id)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not open the workspace.')\n } finally {\n setPending(false)\n }\n }\n return (\n <>\n <EmbeddedTopbar\n title={title}\n workspace={\n <select\n aria-label=\"Workspace\"\n className=\"h-8 min-w-0 w-full rounded-md bg-transparent px-1 text-sm font-medium text-primary-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-foreground/60\"\n value={workspaceId ?? ''}\n disabled={isLoading || pending}\n onChange={(event) => void choose(event.target.value)}\n >\n <option className=\"bg-background text-foreground\" value=\"\" disabled>\n {title} · Select workspace…\n </option>\n {workspaces.map((workspace) => (\n <option\n className=\"bg-background text-foreground\"\n key={workspace.external_id}\n value={workspace.external_id}\n >\n {workspace.name}\n </option>\n ))}\n </select>\n }\n actions={\n <>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-primary-foreground/80 hover:bg-primary-foreground/10 hover:text-primary-foreground\"\n aria-label=\"New chat\"\n title=\"New chat\"\n disabled={generating}\n onClick={() => {\n session.clearConversationError(session.getState().conversationId || 'new')\n session.startNewConversation()\n navigation?.main()\n }}\n >\n <Plus className=\"size-4\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 text-primary-foreground/80 hover:bg-primary-foreground/10 hover:text-primary-foreground\"\n aria-label=\"Sign out\"\n title={`Sign out ${signedIn.user?.email ?? ''}`}\n onClick={async () => {\n try {\n if (connection) connection.logout()\n else await arbi.logout()\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not sign out.')\n }\n }}\n >\n <LogOut className=\"size-4\" />\n </Button>\n </>\n }\n />\n {(error || listError) && (\n <p role=\"alert\" className=\"shrink-0 px-3 py-1 text-xs text-destructive\">\n {error ?? 'Could not load workspaces.'}\n </p>\n )}\n </>\n )\n}\n\nexport interface ConnectedEmbeddedChatProps extends Pick<\n EmbeddedChatPanelProps,\n 'platformHeader' | 'platformFooter' | 'footer' | 'onDocumentSelectionChange'\n> {\n /** The panel's name. Default: the host's assistant name (\"ARBI\"). */\n title?: string\n /** Override the ready-made frame with ordinary utility classes. */\n className?: string\n login?: ConnectedCompactLoginProps\n}\n/** Use under an existing ArbiHost, sharing its React Query, identity and current workspace. */\nexport function ConnectedEmbeddedChat({\n title: titleProp,\n className,\n login,\n ...props\n}: ConnectedEmbeddedChatProps) {\n const session = useArbiSession()\n const assistantName = useAssistantCopy().name\n const title = titleProp ?? assistantName\n return (\n <div\n className={cn(\n 'h-[calc(100dvh-2rem)] sm:h-[min(40rem,calc(100dvh-2rem))] w-full max-w-md min-h-0 overflow-hidden rounded-2xl border border-border bg-background shadow-xl',\n className\n )}\n >\n <EmbeddedChatPanel\n {...props}\n signedIn={session.status === 'signed-in'}\n header={<EmbeddedWorkspaceHeader title={title} />}\n login={\n <>\n <h1 className=\"font-semibold mb-4\">{title}</h1>\n <ConnectedCompactLogin {...login} />\n </>\n }\n />\n </div>\n )\n}\n\nexport interface ArbiChatProps extends ConnectedEmbeddedChatProps {\n apiUrl: string\n /** Override the standard panel sizing and frame. */\n className?: string\n deploymentDomain?: string\n}\n/** Standalone live chat. No automatic choice of the first available workspace. */\nexport function ArbiChat({ apiUrl, deploymentDomain, className, ...props }: ArbiChatProps) {\n const host = useMemo(\n () =>\n defaultHost(\n {\n apiUrl,\n deploymentDomain,\n requireWorkspaceSelection: true,\n demoUser: { name: '', email: '' },\n },\n { sessionStorage: browserSessionStateStorage(`embed:${apiUrl}`) }\n ),\n [apiUrl, deploymentDomain]\n )\n return (\n <ArbiHost key={`${apiUrl}|${deploymentDomain ?? ''}`} config={host}>\n <ConnectedEmbeddedChat {...props} className={className} />\n </ArbiHost>\n )\n}\n"]}
|