@arbidocs/blocks 0.4.144 → 0.4.146

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/agents/index.cjs +264 -264
  2. package/dist/agents/index.js +7 -7
  3. package/dist/{chunk-ON3TKY5Y.js → chunk-5YHEHEJT.js} +242 -4
  4. package/dist/chunk-5YHEHEJT.js.map +1 -0
  5. package/dist/{chunk-7NGAWGA3.js → chunk-A6IU4GIW.js} +190 -7
  6. package/dist/chunk-A6IU4GIW.js.map +1 -0
  7. package/dist/{chunk-BUWBXJ2N.cjs → chunk-C3CGJK7A.cjs} +192 -6
  8. package/dist/chunk-C3CGJK7A.cjs.map +1 -0
  9. package/dist/{chunk-X3TGXEFS.js → chunk-C44TDH54.js} +6 -6
  10. package/dist/{chunk-X3TGXEFS.js.map → chunk-C44TDH54.js.map} +1 -1
  11. package/dist/{chunk-YFY3TQ6Q.cjs → chunk-COCGRJLA.cjs} +7 -7
  12. package/dist/{chunk-YFY3TQ6Q.cjs.map → chunk-COCGRJLA.cjs.map} +1 -1
  13. package/dist/{chunk-45LRMW54.js → chunk-DN2KI4BU.js} +8 -10
  14. package/dist/chunk-DN2KI4BU.js.map +1 -0
  15. package/dist/{chunk-R26BK7YL.cjs → chunk-DTROMMDX.cjs} +4 -4
  16. package/dist/{chunk-R26BK7YL.cjs.map → chunk-DTROMMDX.cjs.map} +1 -1
  17. package/dist/{chunk-65THHQVB.cjs → chunk-ECW2R2KF.cjs} +27 -27
  18. package/dist/{chunk-65THHQVB.cjs.map → chunk-ECW2R2KF.cjs.map} +1 -1
  19. package/dist/{chunk-RI6DZA5X.js → chunk-EF4ZLKRM.js} +3 -3
  20. package/dist/{chunk-RI6DZA5X.js.map → chunk-EF4ZLKRM.js.map} +1 -1
  21. package/dist/chunk-EV7W64B6.js +134 -0
  22. package/dist/chunk-EV7W64B6.js.map +1 -0
  23. package/dist/{chunk-WS5EX7DN.cjs → chunk-EYKISBDO.cjs} +5 -5
  24. package/dist/{chunk-WS5EX7DN.cjs.map → chunk-EYKISBDO.cjs.map} +1 -1
  25. package/dist/{chunk-JZNXRMLH.cjs → chunk-GAYMJWTC.cjs} +8 -10
  26. package/dist/chunk-GAYMJWTC.cjs.map +1 -0
  27. package/dist/{chunk-I7WG3JRD.js → chunk-H4D7WKDY.js} +3 -3
  28. package/dist/{chunk-I7WG3JRD.js.map → chunk-H4D7WKDY.js.map} +1 -1
  29. package/dist/{chunk-2FJMTZNJ.js → chunk-IJST4EBM.js} +8 -8
  30. package/dist/{chunk-2FJMTZNJ.js.map → chunk-IJST4EBM.js.map} +1 -1
  31. package/dist/{chunk-3RJN2VTL.js → chunk-IXWJGOM2.js} +3 -3
  32. package/dist/{chunk-3RJN2VTL.js.map → chunk-IXWJGOM2.js.map} +1 -1
  33. package/dist/{chunk-CYNF5PZI.js → chunk-J5CWKFSC.js} +3 -3
  34. package/dist/{chunk-CYNF5PZI.js.map → chunk-J5CWKFSC.js.map} +1 -1
  35. package/dist/{chunk-TP6PLDNM.cjs → chunk-KMZWKSKO.cjs} +8 -8
  36. package/dist/{chunk-TP6PLDNM.cjs.map → chunk-KMZWKSKO.cjs.map} +1 -1
  37. package/dist/{chunk-C4WSHRR6.cjs → chunk-KPZZ5FHE.cjs} +32 -12
  38. package/dist/chunk-KPZZ5FHE.cjs.map +1 -0
  39. package/dist/{chunk-O2ODDTMA.cjs → chunk-LPYEUD2D.cjs} +9 -9
  40. package/dist/{chunk-O2ODDTMA.cjs.map → chunk-LPYEUD2D.cjs.map} +1 -1
  41. package/dist/{chunk-RA3ZJ45L.cjs → chunk-MFMASSEO.cjs} +25 -44
  42. package/dist/chunk-MFMASSEO.cjs.map +1 -0
  43. package/dist/chunk-NHZK64TQ.js +75 -0
  44. package/dist/chunk-NHZK64TQ.js.map +1 -0
  45. package/dist/{chunk-BPBSSMRB.js → chunk-NRFAWUVD.js} +3 -3
  46. package/dist/{chunk-BPBSSMRB.js.map → chunk-NRFAWUVD.js.map} +1 -1
  47. package/dist/chunk-NWNVWO6L.cjs +80 -0
  48. package/dist/chunk-NWNVWO6L.cjs.map +1 -0
  49. package/dist/{chunk-XGZX22ET.cjs → chunk-O2GW5IY6.cjs} +38 -38
  50. package/dist/{chunk-XGZX22ET.cjs.map → chunk-O2GW5IY6.cjs.map} +1 -1
  51. package/dist/{chunk-33ZOUJXA.js → chunk-OBWYM25Y.js} +13 -32
  52. package/dist/chunk-OBWYM25Y.js.map +1 -0
  53. package/dist/{chunk-Y3KA6X7B.js → chunk-OVR3XMYL.js} +4 -4
  54. package/dist/{chunk-Y3KA6X7B.js.map → chunk-OVR3XMYL.js.map} +1 -1
  55. package/dist/{chunk-ABUO6PIQ.cjs → chunk-RB7GX2VT.cjs} +12 -12
  56. package/dist/{chunk-ABUO6PIQ.cjs.map → chunk-RB7GX2VT.cjs.map} +1 -1
  57. package/dist/chunk-RXK3XP62.cjs +144 -0
  58. package/dist/chunk-RXK3XP62.cjs.map +1 -0
  59. package/dist/{chunk-LYUO3E6V.js → chunk-SZOFGU7W.js} +3 -3
  60. package/dist/{chunk-LYUO3E6V.js.map → chunk-SZOFGU7W.js.map} +1 -1
  61. package/dist/{chunk-A6J2IBUG.js → chunk-T5B7FM7S.js} +4 -4
  62. package/dist/{chunk-A6J2IBUG.js.map → chunk-T5B7FM7S.js.map} +1 -1
  63. package/dist/{chunk-YNIBUKV5.js → chunk-TBEVGWY3.js} +32 -14
  64. package/dist/chunk-TBEVGWY3.js.map +1 -0
  65. package/dist/{chunk-MJCCBMM5.cjs → chunk-TC3RQNEX.cjs} +6 -80
  66. package/dist/chunk-TC3RQNEX.cjs.map +1 -0
  67. package/dist/{chunk-QIMVTGKS.cjs → chunk-U73KPFYH.cjs} +255 -2
  68. package/dist/chunk-U73KPFYH.cjs.map +1 -0
  69. package/dist/{chunk-HFGXA5CL.cjs → chunk-UTTTJSQU.cjs} +4 -4
  70. package/dist/{chunk-HFGXA5CL.cjs.map → chunk-UTTTJSQU.cjs.map} +1 -1
  71. package/dist/{chunk-DLBUFHLY.js → chunk-VTTZZ4FN.js} +4 -74
  72. package/dist/chunk-VTTZZ4FN.js.map +1 -0
  73. package/dist/{chunk-5FTIHRZH.cjs → chunk-XVUOMWMD.cjs} +4 -4
  74. package/dist/{chunk-5FTIHRZH.cjs.map → chunk-XVUOMWMD.cjs.map} +1 -1
  75. package/dist/{chunk-444XKG46.js → chunk-YKQ2DPIP.js} +3 -3
  76. package/dist/{chunk-444XKG46.js.map → chunk-YKQ2DPIP.js.map} +1 -1
  77. package/dist/{chunk-HEMU73OP.cjs → chunk-YSHIC4NJ.cjs} +4 -4
  78. package/dist/{chunk-HEMU73OP.cjs.map → chunk-YSHIC4NJ.cjs.map} +1 -1
  79. package/dist/citations/index.cjs +12 -12
  80. package/dist/citations/index.js +3 -3
  81. package/dist/connect/docx.cjs +11 -11
  82. package/dist/connect/docx.js +8 -8
  83. package/dist/connect/index.cjs +1079 -333
  84. package/dist/connect/index.cjs.map +1 -1
  85. package/dist/connect/index.d.ts +2 -0
  86. package/dist/connect/index.js +953 -222
  87. package/dist/connect/index.js.map +1 -1
  88. package/dist/connection/ConnectedNotificationRelevance.d.ts +4 -1
  89. package/dist/connection/ConnectedSettings.d.ts +3 -2
  90. package/dist/connection/ai.d.ts +27 -72
  91. package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +35 -0
  92. package/dist/connection/settings-page/ConnectedMailSettings.d.ts +13 -0
  93. package/dist/connection/settings-page/ConnectedPremiumModels.d.ts +1 -0
  94. package/dist/connection/settings-page/ConnectedPrivacySettings.d.ts +12 -0
  95. package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +29 -0
  96. package/dist/connection/settings-page/SessionStatusIcon.d.ts +7 -0
  97. package/dist/connection/settings-page/index.d.ts +6 -0
  98. package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +53 -0
  99. package/dist/connection/workspace-settings/index.d.ts +2 -0
  100. package/dist/connection/workspace-settings/useConnectedWorkspaceSettings.d.ts +85 -0
  101. package/dist/connection/workspaceData.d.ts +6 -6
  102. package/dist/facts/index.cjs +3 -3
  103. package/dist/facts/index.js +2 -2
  104. package/dist/files/index.cjs +3 -3
  105. package/dist/files/index.js +2 -2
  106. package/dist/home/index.cjs +20 -20
  107. package/dist/home/index.js +4 -4
  108. package/dist/index.cjs +468 -632
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.ts +1 -0
  111. package/dist/index.js +23 -204
  112. package/dist/index.js.map +1 -1
  113. package/dist/provider/BlocksProvider.d.ts +5 -1
  114. package/dist/provider/settings-section.d.ts +9 -0
  115. package/dist/retrieval/index.cjs +4 -4
  116. package/dist/retrieval/index.js +2 -2
  117. package/dist/settings/AppearanceSettings.d.ts +18 -0
  118. package/dist/settings/ServerConnectionControls.d.ts +16 -0
  119. package/dist/settings/SettingsPage.d.ts +31 -0
  120. package/dist/settings/index.cjs +178 -241
  121. package/dist/settings/index.cjs.map +1 -1
  122. package/dist/settings/index.d.ts +3 -1
  123. package/dist/settings/index.js +86 -198
  124. package/dist/settings/index.js.map +1 -1
  125. package/dist/shell/index.cjs +44 -44
  126. package/dist/shell/index.js +3 -3
  127. package/dist/site/index.cjs +74 -73
  128. package/dist/site/index.js +3 -2
  129. package/dist/studio/index.cjs +78 -77
  130. package/dist/studio/index.cjs.map +1 -1
  131. package/dist/studio/index.js +10 -9
  132. package/dist/studio/index.js.map +1 -1
  133. package/dist/workflow-canvas/index.cjs +25 -25
  134. package/dist/workflow-canvas/index.js +8 -8
  135. package/dist/workspaces/CommonWorkspaceToggle.d.ts +15 -0
  136. package/dist/workspaces/index.cjs +41 -110
  137. package/dist/workspaces/index.cjs.map +1 -1
  138. package/dist/workspaces/index.d.ts +1 -0
  139. package/dist/workspaces/index.js +7 -104
  140. package/dist/workspaces/index.js.map +1 -1
  141. package/node_modules/@arbidocs/coedit/package.json +1 -1
  142. package/package.json +4 -4
  143. package/dist/chunk-33ZOUJXA.js.map +0 -1
  144. package/dist/chunk-45LRMW54.js.map +0 -1
  145. package/dist/chunk-7NGAWGA3.js.map +0 -1
  146. package/dist/chunk-BUWBXJ2N.cjs.map +0 -1
  147. package/dist/chunk-C4WSHRR6.cjs.map +0 -1
  148. package/dist/chunk-DLBUFHLY.js.map +0 -1
  149. package/dist/chunk-JZNXRMLH.cjs.map +0 -1
  150. package/dist/chunk-MJCCBMM5.cjs.map +0 -1
  151. package/dist/chunk-ON3TKY5Y.js.map +0 -1
  152. package/dist/chunk-QIMVTGKS.cjs.map +0 -1
  153. package/dist/chunk-RA3ZJ45L.cjs.map +0 -1
  154. package/dist/chunk-YNIBUKV5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/connection/ArbiAppProvider.tsx","../../src/connection/ConnectedTaskAccessRequest.tsx","../../src/connection/ConnectedWorkspaceActivity.tsx","../../src/connection/notification-center/items.ts","../../src/connection/notification-center/NotificationEvent.tsx","../../src/connection/notification-center/NotificationCenter.tsx","../../src/connection/notification-center/ConnectedNotificationCenter.tsx","../../src/connection/ConnectedNotificationRelevance.tsx","../../src/connection/ConnectedSkillUpload.tsx","../../src/connection/ConnectedSkillsLibrary.tsx","../../src/connection/ConnectedAgentCreator.tsx","../../src/connection/ConnectedWorkflowHistory.tsx","../../src/connection/StreamedArtifact.tsx","../../src/connection/useWorkflowThread.ts","../../src/connection/WorkflowRunThread.tsx","../../src/connection/WorkflowRunnerDialogs.tsx","../../src/connection/ConnectedWorkflowRunner.tsx","../../src/connection/ConnectedTagTable.tsx","../../src/connection/useConnectedShellWorkspaces.ts","../../src/connection/ConnectedSettings.tsx","../../src/connection/useConnectedDocxNotifications.ts","../../src/connection/useConnectedWorkNotifications.ts","../../src/connection/mail/attachments.ts","../../src/connection/mail/ConnectedMailAccounts.tsx","../../src/connection/mail/useWordBody.ts","../../src/connection/mail/MailComposerForm.tsx","../../src/connection/mail/mailbox.ts","../../src/connection/mail/ConnectedMailComposer.tsx","../../src/connection/mail/ConnectedMailSetup.tsx","../../src/connection/mail/ConnectedMailbox.tsx","../../src/connection/mail/ConnectedMailMessage.tsx","../../src/connection/calendar/AddCalendarDialogs.tsx","../../src/connection/calendar/CalendarAccountsPanel.tsx","../../src/connection/calendar/copy.ts","../../src/connection/calendar/CopyField.tsx","../../src/connection/calendar/OpenAccessPanel.tsx","../../src/connection/calendar/BookingPagesPanel.tsx","../../src/connection/calendar/RoomsDirectoryPanel.tsx","../../src/connection/calendar/CalendarSettingsDialog.tsx","../../src/connection/calendar/EventScheduling.tsx","../../src/connection/calendar/EventEditorDialog.tsx","../../src/connection/calendar/InvitationsPanel.tsx","../../src/connection/calendar/PublishCalendarDialog.tsx","../../src/connection/calendar/ShareCalendarDialog.tsx","../../src/connection/calendar/store.ts","../../src/connection/calendar/types.ts","../../src/connection/calendar/ConnectedUpcomingEvents.tsx","../../src/connection/calendar/useWebinarAttendee.ts","../../src/connection/calendar/ConnectedCalendar.tsx","../../src/connection/calendar/ConnectedMailInviteCard.tsx","../../src/connection/calendar/ConnectedPublicBooking.tsx","../../src/connection/ConnectedAgentChatPanel.tsx"],"names":["useConnection","jsx","ArbiWebSocketProvider","useState","QueryClient","QueryClientProvider","ArbiProvider","ConnectionProvider","useConversations","useRunConversation","jsxs","Button","useWorkspaceActivity","useWorkspaceUsers","useMemo","WorkspaceActivityList","isDeploymentUserNotification","isWorkspaceNotificationType","signatureNotificationPhrase","signatureRequestMeta","describeServerNotification","Fragment","getWorkspaceActionText","getWorkspaceSentPhrase","BOX_SEAT_REFUSED","BOX_SEAT_REFUSED_TITLE","documentActivityPhrase","isSignatureNotificationType","inputRequestTitle","WORK_NOTIFICATION_LABELS","Activity","getNotificationTypeMeta","icon","useEffect","Bell","Info","UserCheck","TriStateFilterMenu","DraggableHeader","TabHeader","GridView","SelectionBar","SelectionBarAction","Trash2","Loader2","useArbi","initials","UserEntity","EntityPill","ShieldIcon","workspaceKindColor","getWorkspaceKind","useArbiSessionState","useDocuments","documentDisplayName","DocumentEntity","useNotifications","useDeleteNotifications","useMarkNotificationsRead","useNotify","useCallback","useWorkspaces","useWorkspaceNotificationLevel","WorkspaceNotificationMenu","useFollowThread","ThreadFollowMenuItem","ThreadFollowButton","useBlocksEnvironment","useUploadSkillFiles","useRef","cn","Label","importSkillFile","Upload","importSkillFromUrl","Input","Link2","EntityIcon","useSkills","useSetSkillVisibility","useDeleteSkill","buildLibrarySkills","filterLibrarySkills","useSkillSource","SKILL_SOURCE_LABELS","SKILL_TYPE_LABELS","workflowToSkillMarkdown","SKILL_MAIN_FILENAME","downloadBlob","Search","SkillViewToggle","SkillFilterChips","Plus","SkillTile","ArrowLeft","SkillGenerateForm","SkillLibraryDetail","parseSkillFrontmatter","skillSlug","serializeSkill","SkillEditForm","Textarea","DEFAULT_AGENT_CAPABILITIES","DEFAULT_AGENT_TEMPLATES","DEFAULT_AGENT_TYPES","useAgentModels","useMcpTools","useAgentConfig","useAgentWorkspaces","useCreateAgent","useSaveAgentConfig","useGrantAgentAccess","useRevokeAgentAccess","useGenerateAgentAvatar","stripPersonaPreamble","isValidAgentName","res","composePersona","AgentCreator","AgentAvatarField","MultiSelect","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","AgentConnectInstructions","formatDate","fmtDate","useWorkflowRuns","TaskRunsDialog","formatRelativeTime","useConversationActivity","useAgents","useConnectedWorkspace","useConnectedWorkspaceRole","PersonPill","TaskActivityDialog","lazy","artifacts","useStreamedArtifact","ArtifactCanvas","StreamedArtifactFrame","Suspense","stepFields","initialRunInputs","useCreateWork","useActOnStep","workflowSteps","fromPlanSteps","stepStatesFromActivity","useConversationThreads","runThreadTitle","toPlanSteps","useWorkflowView","useArbiChat","ChatPage","useOptionalDocumentTools","splitDocRef","fetchDocumentPdf","ModalScaffold","SignDocumentDialog","DocumentToolsProvider","ConnectedNativeDocxEditor","useTags","useLayoutEffect","files","MessageSquare","AiAnswer","WorkflowRunner","ExternalLink","WorkflowStepBar","stepLevels","stepDocuments","stepKindOf","useTagKindSchema","useSetTagValues","useUpdateTagKindSchema","useInvalidateTagData","tagTableDocx","DOCX_MIME_TYPE","TagTable","useShellWorkspaces","errorText","useProfile","useUpdateProfile","useRequestEmailChange","useConfirmEmailChange","useNameEditor","useAvatarCrop","useEmailChange","SettingsSection","UserCircle","ProfileCard","AvatarPicker","ImageCropModal","useIdentityVerification","IdentityVerificationCard","IdentityVerificationDialog","RequireVerified","usePasswordChange","usePasswordChangeForm","PasswordChangeDialog","KeyRound","SettingsCard","SettingsActionRow","EMAIL_NOTIFICATION_CATEGORIES","EMAIL_NOTIFICATION_KEYS","useNotificationPreferences","NotificationCategoryList","toNotificationCategories","useSessions","useCurrentSessionId","useTerminateSession","toActiveSessionViews","SettingsRow","Radio","ActiveSessionsDialog","useSignOut","useIsOnline","LogoutDialog","toLogoutSessionViews","useDeleteAccount","useDeleteAccountFlow","SettingsDangerZone","DeleteAccountDialog","toDeleteBlockerViews","useQueryClient","useQuery","useArbiWebSocket","useWorkNotifications","mailDraftIdFromContent","accountPath","client","bytesToBase64","fileAttachment","useMailClient","defaultMailAlias","useClaimNativeAlias","useMailOnline","isAliasTakenError","nextAliasSuggestion","aliasTakenMessage","useConnectMailAccount","useDisconnectMailAccount","useRegisterOpenDocument","useMailDraftEditor","PlainMailBodyEditor","useMailProjects","parseMailRecipients","useSaveMailDraft","useSendMail","useMailDraftReplaced","X","createPortal","Paperclip","MailDocumentPicker","Tooltip","TooltipTrigger","TooltipContent","Send","useMailPolicy","useMailAccounts","useMailUnlock","useMailFolders","useMailMessages","useMailDraftCompose","draftMailCompose","useMailMessage","replyMailCompose","emptyMailCompose","MailIcon","useMailCache","mailJson","MailOfflineUnavailableError","FilesFilterBar","FilterInput","FolderFilterButton","FolderPickerRow","Settings","MailGrid","error","MailMessageView","ConfirmDialog","useSubscribeCalendar","normalizeFeedUrl","DialogFooter","useHolidayCountries","useAddHolidayCalendar","selectClass","CheckCircle2","AlertTriangle","useStartCalendarAccountOAuth","useSyncCalendarAccount","useUpdateCalendarAccount","useDisconnectCalendarAccount","describeCalendarError","RefreshCw","Switch","useCalDavProfiles","useConnectCalDavAccount","useCalendarSupport","useCalendarAccounts","useConnectOAuthAccount","useResumeCalendarAccountConnect","ACCOUNT_VENDOR","useCopyText","Check","Copy","useRevokeAppPassword","setupSteps","create","useCreateAppPassword","useCreateFeed","useCalendars","useAppPasswords","splitAppPasswords","WEEKDAY_NAMES","bookingToForm","emptyBookingForm","useSaveBookingPage","validateBookingForm","formToBookingBody","bookingLink","slugify","WeeklyHoursEditor","useBookingPages","useCalendarSettings","useDeleteBookingPage","detectTimeZone","CalendarCheck","Pencil","useCreateRoom","formatBusy","safeZone","defaultRoomWindow","wallToUtc","useRooms","DoorOpen","useSaveCalendarSettings","toSettingsValue","Tabs","TabsList","TabsTrigger","TabsContent","CalendarSettingsForm","attendeeKey","isAllDayDraft","draftRangeUtc","utcToDate","useFreeBusy","freeBusyToRows","useFindTime","CalendarSearch","SchedulingAssistant","toSuggestionViews","applySuggestion","RoomFinder","useSearchContacts","EventEditor","formatEventWhen","formatInZone","useCalendarInvitations","useRespondToEvent","useDecideCounter","Popover","PopoverTrigger","Inbox","PopoverContent","ProposeTimeDialog","usePublishCalendar","useCalendarShares","useShareCalendar","useUnshareCalendar","persist","createJSONStorage","useCalendarEvents","upcomingOf","formatPlainDate","conferenceUrl","canJoinEvent","Video","isWebinarConference","useSyncExternalStore","useFetchCalendarEvent","todayInZone","useCalendarOverlays","useCalendarOutbox","calendarToListItem","buildGridEvents","pendingCreateToGrid","useSyncAccountsOnOpen","useCreateEvent","useUpdateEvent","useDeleteEvent","useMoveEvent","useCreateCalendar","useUpdateCalendar","useDeleteCalendar","useImportCalendar","useRefreshCalendar","newEventDraft","parseOverlayLink","needsScope","buildTimeChangeRequest","eventToDraft","buildDeleteTarget","validateDraft","CALENDAR_DEFAULT_LABELS","buildCreateBody","event","isQueuedCalendarWrite","buildEditRequest","useCalendarEvent","MiniMonth","CalendarList","CalendarGrid","printCalendar","Printer","EventDetails","ScopeDialog","CalendarFormDialog","isCalendarAttachment","useMailAttachmentText","parseIcsInvite","useCalendarEventByUid","when","CalendarDays","CalendarX","cancelPublicBooking","PublicBookingError","publicBookingMessage","formatSlotRange","addDays","getPublicBookingPage","groupSlotsByDay","bookPublicSlot","Clock","MapPin","Globe","takeOpenDocumentForTurn","useAgentSession","useStartAgentSession","useCloseAgentSession"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Composition root for a host app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function ArbiAppProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl} deploymentDomain={config.deploymentDomain}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","import { useConversations, useRunConversation } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useConnection } from './ConnectionProvider'\n\n/** Approval for a parked agent run, scoped to the currently selected task. */\nexport function ConnectedTaskAccessRequest({ conversationId }: { conversationId?: string }) {\n const { workspaceId } = useConnection()\n const tasks = useConversations(workspaceId ?? undefined, { live: true })\n const run = useRunConversation()\n const task = tasks.data?.find((item) => item.external_id === conversationId)\n if (!task?.pending_auth_request_id || !task.is_owner) return null\n return (\n <section\n className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-card p-3\"\n data-testid=\"task-chat-access-request\"\n >\n <p className=\"flex-1 text-sm\">This task is waiting for temporary workspace access.</p>\n <Button\n disabled={run.isPending}\n onClick={() => run.mutate(task.external_id)}\n data-testid=\"task-chat-allow-access\"\n >\n {run.isPending ? 'Allowing access…' : 'Allow access and run'}\n </Button>\n {run.error && (\n <p role=\"alert\" className=\"w-full text-sm text-destructive\">\n {run.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { useMemo } from 'react'\nimport { useWorkspaceActivity, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n WorkspaceActivityList,\n type WorkspaceActivityItem,\n type WorkspaceActivityListProps,\n type WorkspaceActivityTarget,\n} from '../activity'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceActivityProps extends Pick<\n WorkspaceActivityListProps,\n 'formatTime' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace to show; default the selected one. */\n workspaceId?: string\n /** Open an entry's thread, document version or run (the host owns its routes). */\n onOpen: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** Entries per page (1–100, server default 30). */\n pageSize?: number\n}\n\n/** The selected workspace's activity feed, newest first, a page at a time. */\nexport function ConnectedWorkspaceActivity({\n workspaceId: workspaceProp,\n onOpen,\n pageSize,\n ...listProps\n}: ConnectedWorkspaceActivityProps) {\n const { workspaceId: selected, status, ensureWorkspaceOpen } = useConnection()\n const workspaceId = workspaceProp ?? selected ?? undefined\n const live = status === 'authenticated' && !!workspaceId\n const feed = useWorkspaceActivity(workspaceId, {\n enabled: live,\n limit: pageSize,\n // Titles and names decrypt only while the session has the workspace open.\n beforeFetch: workspaceId === selected ? ensureWorkspaceOpen : undefined,\n })\n const members = useWorkspaceUsers(workspaceId, {\n enabled: live && workspaceId === selected,\n beforeFetch: ensureWorkspaceOpen,\n })\n const names = useMemo(\n () =>\n new Map(\n (members.data ?? []).map((m) => [\n m.user.external_id,\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n ])\n ),\n [members.data]\n )\n const items = useMemo(\n () => (feed.data?.pages ?? []).flatMap((page) => page.items as WorkspaceActivityItem[]),\n [feed.data]\n )\n return (\n <WorkspaceActivityList\n {...listProps}\n items={items}\n isLoading={feed.isLoading}\n isError={feed.isError}\n hasMore={feed.hasNextPage}\n isLoadingMore={feed.isFetchingNextPage}\n onLoadMore={() => void feed.fetchNextPage()}\n onRetry={() => void feed.refetch()}\n onOpen={onOpen}\n nameOf={(id) => names.get(id)}\n />\n )\n}\n","/**\n * The notification centre's one list: the persisted notifications (both what the user received\n * and what they sent, from `/v1/notifications`) and the session log (the shared notify store's own\n * entries), merged newest first, with the category and type filters over it.\n */\nimport type { components } from '@arbidocs/client'\nimport type { AppNotification } from '@arbidocs/react/shell'\nimport { isDeploymentUserNotification, isWorkspaceNotificationType } from '@arbidocs/react'\n\nexport type NotificationRow = components['schemas']['NotificationResponse']\n\n/**\n * One entry of the list.\n *\n * - `kind: 'incoming'` — a persisted notification the user received; read from their side\n * (shows the sender).\n * - `kind: 'activity'` — the user's own: a notification they sent (`persisted: true`) or a\n * session-log entry (`persisted: false`); read from the sender's side.\n *\n * `persisted` is what the user sees as the category: persisted entries survive in the\n * notifications table (\"Notifications\"); session entries are this browser's log (\"Session log\").\n */\nexport interface NotificationCenterItem {\n id: string\n timestamp: number\n kind: 'incoming' | 'activity'\n persisted: boolean\n /** Every persisted entry. */\n row?: NotificationRow\n /** Every session-log entry. */\n entry?: AppNotification\n}\n\nexport type NotificationFilterType = 'notifications' | 'session' | 'workspace' | 'contact_accepted'\nexport type NotificationFilterState = Map<NotificationFilterType, 'include' | 'exclude' | null>\n\n/** Whose side a persisted row is read from: received rows are incoming, sent ones are activity. */\nfunction sideOf(row: NotificationRow, userId: string): 'incoming' | 'activity' | null {\n const isSender = row.sender.external_id === userId\n const isRecipient = row.recipient.external_id === userId\n if (row.type === 'contact_accepted') return isRecipient ? 'incoming' : 'activity'\n // A Box admin's notice (one row per admin): the inviter / new user is its sender but it is not\n // their activity — listing it would show them each admin, once per admin.\n if (isDeploymentUserNotification(row.type)) return isRecipient ? 'incoming' : null\n if (isSender) return 'activity'\n if (isRecipient) return 'incoming'\n return null\n}\n\n/** The merged list, newest first. */\nexport function buildNotificationCenterItems(\n rows: readonly NotificationRow[],\n session: readonly AppNotification[],\n userId: string\n): NotificationCenterItem[] {\n const items: NotificationCenterItem[] = []\n for (const row of rows) {\n const kind = sideOf(row, userId)\n if (kind)\n items.push({\n id: row.external_id,\n timestamp: new Date(row.created_at).getTime(),\n kind,\n persisted: true,\n row,\n })\n }\n for (const entry of session)\n items.push({ id: entry.id, timestamp: entry.ts, kind: 'activity', persisted: false, entry })\n return items.sort((a, b) => b.timestamp - a.timestamp)\n}\n\n/** Per-type counts of the received notifications, for the filter badges. */\nexport function countNotificationTypes(items: readonly NotificationCenterItem[]): {\n workspace: number\n contact_accepted: number\n} {\n const counts = { workspace: 0, contact_accepted: 0 }\n for (const item of items) {\n if (item.kind !== 'incoming' || !item.row) continue\n if (isWorkspaceNotificationType(item.row.type)) counts.workspace++\n else if (item.row.type === 'contact_accepted') counts.contact_accepted++\n }\n return counts\n}\n\n/**\n * The items the active \"include\" filters select, OR-combined: an item shows when it matches any.\n * With no active filter everything shows. The category filters track `persisted`, the same\n * differentiator as the Category column.\n */\nexport function filterNotificationCenterItems(\n items: NotificationCenterItem[],\n filters: NotificationFilterState\n): NotificationCenterItem[] {\n const active = new Set<NotificationFilterType>()\n filters.forEach((state, type) => {\n if (state === 'include') active.add(type)\n })\n if (active.size === 0) return items\n return items.filter((item) => {\n if (active.has('notifications') && item.persisted) return true\n if (active.has('session') && !item.persisted) return true\n const type = item.row?.type\n if (!type) return false\n if (active.has('workspace') && isWorkspaceNotificationType(type)) return true\n return active.has('contact_accepted') && type === 'contact_accepted'\n })\n}\n","/**\n * The Event cell of the notification centre: what happened, as a sentence around the people and\n * documents involved, with the action that opens it. A received notification reads from the\n * recipient's side (\"[Priya] mentioned you in a conversation\"), a sent one from the sender's\n * (\"You mentioned [Sam] in a conversation\"), a session-log entry as it was toasted.\n */\nimport type { ComponentType, ReactElement, ReactNode } from 'react'\nimport {\n BOX_SEAT_REFUSED,\n BOX_SEAT_REFUSED_TITLE,\n WORK_NOTIFICATION_LABELS,\n describeServerNotification,\n documentActivityPhrase,\n getWorkspaceActionText,\n getWorkspaceSentPhrase,\n inputRequestTitle,\n isDeploymentUserNotification,\n isSignatureNotificationType,\n isWorkspaceNotificationType,\n signatureNotificationPhrase,\n signatureRequestMeta,\n type NotificationTarget,\n type SignatureNotificationType,\n} from '@arbidocs/react'\nimport type { NotificationCenterItem, NotificationRow } from './items'\n\nexport type NotificationUser = NotificationRow['sender']\n\nexport interface NotificationDocumentChipProps {\n documentId: string\n workspaceId?: string | null\n /** Open the document. */\n onOpen: () => void\n /** What to show when the document is not known here (its name is encrypted per workspace). */\n fallback: ReactNode\n}\n\n/** How the host draws people, workspaces and documents in the list. */\nexport interface NotificationCenterRenderers {\n /** A person's pill. */\n renderUser: (user: NotificationUser) => ReactNode\n /** A workspace's badge (the Category of a workspace's notification), or null when the host\n * does not know the workspace (the type's own category shows instead). */\n renderWorkspace: (workspaceId: string) => ReactNode | null\n /** A signature notification's document: its chip when known, else `fallback`. */\n DocumentChip: ComponentType<NotificationDocumentChipProps>\n}\n\nconst ACTION_CLASS =\n 'ml-auto flex-shrink-0 rounded-md bg-accent px-2 py-0.5 text-xs font-medium text-primary transition-colors hover:bg-primary/10'\nconst PHRASE_CLASS = 'min-w-0 shrink-[2] truncate text-sm'\n\nfunction ActionButton({ label, onClick }: { label: string; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className={ACTION_CLASS}\n data-testid=\"notification-action-button\"\n >\n {label}\n </button>\n )\n}\n\n/** \"[person] {phrase}\" — the row line most notifications are. */\nfunction PersonLine({ person, children }: { person: ReactNode; children: ReactNode }) {\n return (\n <div className=\"flex h-full items-center gap-1.5 text-muted-foreground\">\n {person}\n {children}\n </div>\n )\n}\n\nfunction SignatureEvent({\n row,\n isIncoming,\n open,\n renderers,\n}: {\n row: NotificationRow\n isIncoming: boolean\n open: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n}): ReactElement {\n const type = row.type as SignatureNotificationType\n const { lead, showPerson, verb, tail } = signatureNotificationPhrase(type, isIncoming)\n const { documentId } = signatureRequestMeta(row.content)\n const target = describeServerNotification(row)?.target\n const openIt = () => target && open(target)\n const { DocumentChip } = renderers\n const unnamed = (\n <>\n <span className=\"min-w-0 truncate text-sm\">\n {type === 'signature_requested' ? 'a document' : 'the document'}\n </span>\n {/* Named, the document's own chip opens it (its line is too narrow to share with a\n button); unnamed (another workspace), Open does. */}\n {documentId && <ActionButton label=\"Open\" onClick={openIt} />}\n </>\n )\n // Two short lines, so a narrow panel still shows who and which document: the person and what\n // they did, then the document and Open. The fixed wording gives way first; the person's name\n // never yields to it.\n const wording = 'min-w-0 shrink-[100] truncate text-sm'\n return (\n <div\n className=\"flex h-full min-w-0 flex-col justify-center gap-0.5 text-muted-foreground\"\n data-testid=\"notification-signature\"\n >\n <div className=\"flex min-w-0 items-center gap-1.5 leading-5\">\n {lead && <span className={wording}>{lead}</span>}\n {showPerson && (\n <span\n className=\"flex max-w-full min-w-0 shrink-0\"\n data-testid=\"notification-signature-person\"\n >\n {renderers.renderUser(isIncoming ? row.sender : row.recipient)}\n </span>\n )}\n {verb && <span className={wording}>{verb}</span>}\n </div>\n <div className=\"flex min-w-0 items-center gap-1.5 leading-5\">\n {documentId ? (\n <DocumentChip\n documentId={documentId}\n workspaceId={row.workspace_ext_id}\n onOpen={openIt}\n fallback={unnamed}\n />\n ) : (\n unnamed\n )}\n {tail && <span className={wording}>{tail.trim()}</span>}\n </div>\n </div>\n )\n}\n\nfunction PersistedEvent({\n item,\n row,\n open,\n renderers,\n}: {\n item: NotificationCenterItem\n row: NotificationRow\n open: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n}): ReactElement {\n const { sender, recipient } = row\n const type = row.type as string\n const isIncoming = item.kind === 'incoming'\n const user = renderers.renderUser\n const target = () => describeServerNotification(row)?.target\n const openTarget = () => {\n const t = target()\n if (t) open(t)\n }\n\n // Workspace membership — the workspace itself is the Category. Received: \"[sender] added you\n // as collaborator\"; sent: \"You added [member] as collaborator\".\n if (isWorkspaceNotificationType(type)) {\n if (isIncoming)\n return (\n <PersonLine person={user(sender)}>\n <span className={PHRASE_CLASS}>{getWorkspaceActionText(type)}</span>\n </PersonLine>\n )\n const { before, after } = getWorkspaceSentPhrase(type)\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className={PHRASE_CLASS}>{before}</span>\n {user(recipient)}\n {after && <span className={PHRASE_CLASS}>{after}</span>}\n </div>\n )\n }\n\n if (type === 'contact_accepted') {\n if (isIncoming)\n return (\n <PersonLine person={user(sender)}>\n <span className={`${PHRASE_CLASS} italic`}>\n {row.content || 'accepted your invitation to join the platform'}\n </span>\n </PersonLine>\n )\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className={`${PHRASE_CLASS} italic`}>\n {row.content || 'Accepted an invitation to join the platform'}\n </span>\n </div>\n )\n }\n\n // A workspace access request: received, \"Review\" opens the grant flow.\n if (type === 'workspace_access_request') {\n if (isIncoming)\n return (\n <PersonLine person={user(sender)}>\n <span className={PHRASE_CLASS}>requested workspace access</span>\n <ActionButton label=\"Review\" onClick={openTarget} />\n </PersonLine>\n )\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className={PHRASE_CLASS}>Requested workspace access from</span>\n {user(recipient)}\n </div>\n )\n }\n\n // A Box admin's notice: someone was invited or joined. Same sentence as the bell and toast,\n // with \"Manage users\" to the portal when the link is a trusted portal URL.\n if (isDeploymentUserNotification(type)) {\n const entry = describeServerNotification(row)\n return (\n <div\n className=\"flex h-full items-center gap-1.5 text-sm text-muted-foreground\"\n data-testid=\"notification-deployment-user\"\n >\n <span className=\"min-w-0 truncate\" title={entry?.title}>\n {entry?.title}\n </span>\n {entry?.target && <ActionButton label={entry.actionLabel ?? 'Open'} onClick={openTarget} />}\n </div>\n )\n }\n\n // Self-notifications: a refused Box seat, a signup bonus, a reward.\n const selfLine =\n type === BOX_SEAT_REFUSED\n ? BOX_SEAT_REFUSED_TITLE\n : type === 'signup_reward'\n ? `Signup bonus — ${row.content || 'You earned a signup bonus'}`\n : type === 'referral_reward'\n ? `Reward earned — ${row.content || 'You earned a reward'}`\n : null\n if (selfLine)\n return (\n <div className=\"flex items-center h-full text-sm text-muted-foreground\">\n <span className=\"min-w-0 truncate\">{selfLine}</span>\n </div>\n )\n\n // An @mention: name the person and offer \"Open\" to jump to the message.\n if (type === 'mention' || type === 'docx_mention') {\n const inDocument = type === 'docx_mention'\n return (\n <div className=\"flex h-full items-center gap-1.5 text-muted-foreground\">\n {!isIncoming && <span className=\"text-sm\">You mentioned</span>}\n {isIncoming ? user(sender) : user(recipient)}\n <span className={PHRASE_CLASS}>\n {inDocument\n ? isIncoming\n ? 'mentioned you in a document comment'\n : 'in a document comment'\n : isIncoming\n ? 'mentioned you in a conversation'\n : 'in a conversation'}\n </span>\n {(row.conversation_ext_id || inDocument) && (\n <ActionButton label=\"Open\" onClick={openTarget} />\n )}\n </div>\n )\n }\n\n // A reply in a thread you take part in, or a new version of a document you own. Only\n // received: nobody is sent their own.\n if (type === 'thread_reply' || type === 'document_activity') {\n return (\n <div\n className=\"flex h-full items-center gap-1.5 text-muted-foreground\"\n data-testid=\"notification-relevance\"\n >\n {user(sender)}\n <span className={PHRASE_CLASS}>\n {type === 'thread_reply' ? 'replied in a thread' : documentActivityPhrase(row.content)}\n </span>\n <ActionButton label=\"Open\" onClick={openTarget} />\n </div>\n )\n }\n\n if (isSignatureNotificationType(type))\n return <SignatureEvent row={row} isIncoming={isIncoming} open={open} renderers={renderers} />\n\n // Work notifications — a task is a conversation, so the notification links straight to it.\n const workLabel =\n type === 'agent_input_requested'\n ? inputRequestTitle(row.content)\n : WORK_NOTIFICATION_LABELS[type]\n if (workLabel)\n return (\n <div\n className=\"flex h-full items-center gap-1.5 text-sm text-muted-foreground\"\n title={workLabel}\n data-testid=\"notification-work\"\n >\n <span className={`min-w-0 truncate ${type === 'workflow_failed' ? 'text-red-text' : ''}`}>\n {workLabel}\n </span>\n {row.conversation_ext_id && (\n <ActionButton\n label=\"Open\"\n onClick={() =>\n open({\n kind: 'conversation',\n workspaceId: row.workspace_ext_id ?? undefined,\n conversationId: row.conversation_ext_id!,\n ...(row.message_ext_id ? { messageId: row.message_ext_id } : {}),\n })\n }\n />\n )}\n </div>\n )\n\n return (\n <div className=\"flex items-center h-full text-sm text-muted-foreground\">\n {type || 'Notification'}\n </div>\n )\n}\n\n/** A session-log entry: its message as toasted (+ its action while this session lasts). */\nfunction SessionEvent({ item }: { item: NotificationCenterItem }): ReactElement | null {\n const entry = item.entry\n if (!entry) return null\n return (\n <div\n className=\"flex h-full items-center gap-2 text-sm text-muted-foreground\"\n title={entry.title}\n >\n {entry.html ? (\n <span className=\"min-w-0 truncate\" dangerouslySetInnerHTML={{ __html: entry.html }} />\n ) : (\n <span className=\"min-w-0 truncate\">{entry.title}</span>\n )}\n {entry.onSelect && entry.actionLabel && (\n <ActionButton label={entry.actionLabel} onClick={entry.onSelect} />\n )}\n </div>\n )\n}\n\nexport function NotificationEvent({\n item,\n open,\n renderers,\n}: {\n item: NotificationCenterItem\n open: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n}): ReactElement | null {\n if (!item.persisted) return <SessionEvent item={item} />\n if (!item.row) return null\n return <PersistedEvent item={item} row={item.row} open={open} renderers={renderers} />\n}\n","/**\n * The notification centre page: one time-sorted list of what the user received, what they sent\n * and this session's log, with category/type filters, bulk delete and paging. Presentational:\n * {@link ConnectedNotificationCenter} supplies the data; the host draws people, workspaces and\n * documents ({@link NotificationCenterRenderers}) and owns where an entry leads.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport type { ColDef, GridApi, GridState, ICellRendererParams } from 'ag-grid-community'\nimport { Activity, Bell, Info, Loader2, Trash2, UserCheck } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { getNotificationTypeMeta, type NotificationTarget } from '@arbidocs/react'\nimport { GridView } from '../../files/GridView'\nimport { SelectionBar, SelectionBarAction } from '../../files/SelectionBar'\nimport { TabHeader } from '../../shell/TabHeader'\nimport { DraggableHeader } from '../../settings/DraggableHeader'\nimport { TriStateFilterMenu, type TriStateOption } from '../../settings/TriStateFilterMenu'\nimport {\n countNotificationTypes,\n filterNotificationCenterItems,\n type NotificationCenterItem,\n type NotificationFilterState,\n type NotificationFilterType,\n} from './items'\nimport { NotificationEvent, type NotificationCenterRenderers } from './NotificationEvent'\n\nexport interface NotificationCenterProps {\n /** Every entry, newest first (see `buildNotificationCenterItems`). */\n items: NotificationCenterItem[]\n isLoading?: boolean\n /** More persisted notifications exist beyond the loaded ones. */\n hasMore?: boolean\n isLoadingMore?: boolean\n onLoadMore?: () => void\n /** Delete entries (persisted ones on the server, session ones from the log). */\n onDelete: (items: NotificationCenterItem[]) => void\n /** Open where an entry leads. */\n onOpen: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n /** \"Today, 14:05\" for an entry's time. */\n formatTime: (timestamp: number) => string\n /** The entry to scroll to and highlight (e.g. the one picked in the bell). */\n focusId?: string | null\n /** Header content on the right (e.g. a panel mode switcher). */\n headerRight?: ReactNode\n /** Label of the Workspace type filter (a host's own word for a workspace). */\n workspaceLabel?: string\n /** Persisted column state (order, width, sort), read once at mount, and its changes. */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n}\n\n/** Icon + label for the Category column: the notification type's, or \"Session log\". */\nfunction categoryOf(item: NotificationCenterItem): { icon: ReactNode; label: string } {\n if (!item.persisted)\n return { icon: <Activity size={16} className=\"text-muted-foreground\" />, label: 'Session log' }\n const meta = getNotificationTypeMeta(item.row?.type)\n const Icon = meta.Icon\n return { icon: <Icon size={16} className={meta.iconClassName} />, label: meta.label }\n}\n\nfunction useColumns(\n formatTime: (timestamp: number) => string,\n onOpen: (target: NotificationTarget) => void,\n renderers: NotificationCenterRenderers\n): ColDef<NotificationCenterItem>[] {\n return useMemo(\n () => [\n {\n colId: 'timestamp',\n headerName: 'Time',\n field: 'timestamp',\n width: 150,\n filter: false,\n sortable: true,\n sort: 'desc',\n cellRenderer: (params: ICellRendererParams<NotificationCenterItem>) => {\n // The unread dot is for what you received.\n const isNew = params.data?.kind === 'incoming' && params.data.row && !params.data.row.read\n return (\n <div className=\"flex items-center h-full gap-2\">\n {isNew && <div className=\"w-2.5 h-2.5 rounded-full bg-primary flex-shrink-0\" />}\n <span className=\"text-sm text-muted-foreground\">\n {params.value ? formatTime(params.value) : 'Unknown'}\n </span>\n </div>\n )\n },\n },\n {\n colId: 'event',\n headerName: 'Event',\n flex: 1,\n minWidth: 160,\n // A docked panel leaves this column ~150px: keep the cell's own padding small so the\n // sentence (who, what, which document) gets the room rather than the gutters.\n cellClass: 'px-2!',\n filter: false,\n sortable: false,\n cellRenderer: (params: ICellRendererParams<NotificationCenterItem>) =>\n params.data ? (\n <NotificationEvent item={params.data} open={onOpen} renderers={renderers} />\n ) : null,\n },\n {\n colId: 'category',\n headerName: 'Category',\n width: 130,\n filter: false,\n sortable: true,\n valueGetter: (params) => (params.data ? categoryOf(params.data).label : ''),\n cellRenderer: (params: ICellRendererParams<NotificationCenterItem>) => {\n if (!params.data) return null\n // A workspace's notification collapses into the workspace's badge — it IS its category.\n const workspaceId = params.data.row?.workspace_ext_id\n const workspace = workspaceId ? renderers.renderWorkspace(workspaceId) : null\n if (workspace) return <div className=\"flex items-center h-full\">{workspace}</div>\n const { icon, label } = categoryOf(params.data)\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className=\"flex-shrink-0\">{icon}</span>\n <span className=\"min-w-0 shrink-[2] truncate text-sm\">{label}</span>\n </div>\n )\n },\n },\n ],\n [formatTime, onOpen, renderers]\n )\n}\n\nexport function NotificationCenter({\n items,\n isLoading = false,\n hasMore = false,\n isLoadingMore = false,\n onLoadMore,\n onDelete,\n onOpen,\n renderers,\n formatTime,\n focusId,\n headerRight,\n workspaceLabel = 'Workspace',\n gridState,\n onGridStateChange,\n}: NotificationCenterProps) {\n const [selected, setSelected] = useState<NotificationCenterItem[]>([])\n const [filters, setFilters] = useState<NotificationFilterState>(new Map())\n const [filterOpen, setFilterOpen] = useState(false)\n const [gridApi, setGridApi] = useState<GridApi<NotificationCenterItem> | null>(null)\n\n const filtered = useMemo(() => filterNotificationCenterItems(items, filters), [items, filters])\n const typeCounts = useMemo(() => countNotificationTypes(items), [items])\n const persistedCount = useMemo(() => items.filter((i) => i.persisted).length, [items])\n const hasUnread = useMemo(\n () => items.some((i) => i.kind === 'incoming' && i.row && !i.row.read),\n [items]\n )\n\n // Scroll the focused entry into view whenever the list changes under it.\n useEffect(() => {\n if (!gridApi || gridApi.isDestroyed()) return\n gridApi.redrawRows()\n if (focusId) {\n const row = gridApi.getRowNode(focusId)\n if (row) gridApi.ensureNodeVisible(row, 'middle')\n }\n }, [gridApi, focusId, filtered])\n\n const columnDefs = useColumns(formatTime, onOpen, renderers)\n\n const options = useMemo(\n (): TriStateOption<NotificationFilterType>[] => [\n {\n id: 'notifications',\n label: 'Notifications',\n icon: <Bell className=\"h-4 w-4\" />,\n count: persistedCount,\n },\n {\n id: 'session',\n label: 'Session log',\n icon: <Activity className=\"h-4 w-4\" />,\n count: items.length - persistedCount,\n },\n {\n id: 'workspace',\n label: workspaceLabel,\n icon: <Info className=\"h-4 w-4\" />,\n count: typeCounts.workspace,\n },\n {\n id: 'contact_accepted',\n label: 'Invitation Accepted',\n icon: <UserCheck className=\"h-4 w-4\" />,\n count: typeCounts.contact_accepted,\n },\n ],\n [items.length, persistedCount, typeCounts, workspaceLabel]\n )\n\n const tabs = [\n {\n id: 'notifications',\n label: 'Notifications',\n icon: (\n <div className=\"relative\">\n <Bell className=\"w-5 h-5\" />\n {hasUnread && (\n <div className=\"absolute -top-0.5 -right-0.5 w-2.5 h-2.5 rounded-full bg-primary border border-background\" />\n )}\n </div>\n ),\n // Filter-aware: the filtered total whenever a filter applies.\n count: filtered.length,\n actions: (\n <TriStateFilterMenu\n testId=\"notifications-filter-button\"\n title=\"Filter\"\n open={filterOpen}\n onOpenChange={setFilterOpen}\n filterStates={filters}\n onFiltersChange={setFilters}\n options={options}\n groups={[\n { label: 'Category', options: ['notifications', 'session'] },\n { label: 'Type', options: ['workspace', 'contact_accepted'] },\n ]}\n />\n ),\n },\n ]\n\n return (\n <div className=\"flex flex-col h-full bg-background\" data-testid=\"notifications-page\">\n <DraggableHeader>\n <TabHeader\n tabs={tabs}\n activeTabId=\"notifications\"\n onTabChange={() => {}}\n variant=\"underline\"\n // One tab in a narrow panel — keep the label visible (the default 640 breakpoint\n // would hide it as \"compact\").\n compactBreakpoint={380}\n rightContent={headerRight}\n />\n </DraggableHeader>\n\n <div data-testid=\"notifications-list\" className=\"flex flex-1 flex-col min-h-0 px-3 pt-1\">\n <div className=\"flex-1 min-h-0\">\n <GridView<NotificationCenterItem>\n items={filtered}\n columnDefs={columnDefs}\n getItemId={(item) => item.id}\n selection={{ mode: 'multiple', selected, onSelectionChange: setSelected }}\n isLoading={isLoading}\n height=\"100%\"\n persistState={!!onGridStateChange}\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n emptyState={{\n icon: <Bell size={48} className=\"text-muted-foreground/60\" />,\n title: 'No notifications',\n message: 'Notifications and activity will appear here',\n }}\n // Through the prop, not gridOptions: GridView needs its own onGridReady to keep the\n // grid api, without which a ticked row never reaches onSelectionChange.\n onGridReady={({ api }) => setGridApi(api)}\n gridOptions={{\n getRowClass: (params) => (params.data?.id === focusId ? 'bg-accent/40' : undefined),\n onRowDataUpdated: ({ api }) => {\n if (focusId) {\n const row = api.getRowNode(focusId)\n if (row) api.ensureNodeVisible(row, 'middle')\n }\n },\n suppressMenuHide: false,\n headerHeight: 40,\n rowHeight: 48,\n animateRows: true,\n suppressCellFocus: true,\n suppressRowClickSelection: true,\n tooltipInteraction: true,\n tooltipShowDelay: 200,\n tooltipHideDelay: 500,\n defaultColDef: { sortable: true, filter: false, resizable: true },\n }}\n />\n </div>\n {filtered.length > 0 && (\n <SelectionBar count={selected.length} onClear={() => setSelected([])}>\n {(isCompact) => (\n <SelectionBarAction\n icon={Trash2}\n label=\"Delete\"\n onClick={() => {\n if (selected.length === 0) return\n onDelete(selected)\n setSelected([])\n }}\n disabled={selected.length === 0}\n isCompact={isCompact}\n className=\"text-red-text hover:text-red-text hover:bg-red-bg border-red-border\"\n testId=\"bulk-delete-notifications\"\n />\n )}\n </SelectionBar>\n )}\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center py-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onLoadMore}\n disabled={isLoadingMore}\n data-testid=\"notifications-load-more-button\"\n >\n {isLoadingMore ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Loading…\n </>\n ) : (\n 'Load more'\n )}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * The notification centre on a live session: the persisted notifications (`/v1/notifications`,\n * a page at a time) and the shared notify store's session log in one list. Viewing it marks what\n * you received read. Any host mounts it; it draws people, workspaces and documents with the\n * shared entities unless the host passes its own, and the host routes where an entry leads.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n documentDisplayName,\n getWorkspaceKind,\n useArbi,\n useArbiSessionState,\n useDeleteNotifications,\n useDocuments,\n useMarkNotificationsRead,\n useNotifications,\n useWorkspaces,\n type NotificationTarget,\n} from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport { DocumentEntity, EntityPill, ShieldIcon, UserEntity } from '@arbidocs/react/ui'\nimport { workspaceKindColor } from '../../shell/Workspace'\nimport { buildNotificationCenterItems, type NotificationCenterItem } from './items'\nimport { NotificationCenter, type NotificationCenterProps } from './NotificationCenter'\nimport type {\n NotificationCenterRenderers,\n NotificationDocumentChipProps,\n NotificationUser,\n} from './NotificationEvent'\n\nexport interface ConnectedNotificationCenterProps extends Pick<\n NotificationCenterProps,\n 'focusId' | 'headerRight' | 'workspaceLabel' | 'gridState' | 'onGridStateChange'\n> {\n /** Open where an entry leads (the host owns its routes). An external page (`url`) opens in a\n * new tab without it. */\n onOpen: (target: NotificationTarget) => void\n /** The host's own people / workspace / document renderers (default: the shared entities). */\n renderers?: Partial<NotificationCenterRenderers>\n /** \"Today, 14:05\"; default the local date and time. */\n formatTime?: (timestamp: number) => string\n /** Persisted notifications per page (default 100). */\n pageSize?: number\n}\n\ntype Workspace = NonNullable<ReturnType<typeof useWorkspaces>['data']>[number]\n\nconst PAGE_SIZE = 100\n\nfunction localTime(timestamp: number): string {\n const date = new Date(timestamp)\n const time = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n const today = new Date()\n const yesterday = new Date(today)\n yesterday.setDate(today.getDate() - 1)\n if (date.toDateString() === today.toDateString()) return `Today, ${time}`\n if (date.toDateString() === yesterday.toDateString()) return `Yesterday, ${time}`\n return `${date.toLocaleDateString([], { month: 'short', day: 'numeric' })}, ${time}`\n}\n\nfunction DefaultUser({ user }: { user: NotificationUser }) {\n const arbi = useArbi()\n const isMe = arbi.isLoggedIn && arbi.user.identity()?.externalId === user.external_id\n const name = [user.given_name, user.family_name].filter(Boolean).join(' ') || user.email\n const initials = name\n .split(/\\s+/)\n .map((part) => part.charAt(0))\n .join('')\n .slice(0, 2)\n .toUpperCase()\n return (\n <UserEntity\n size=\"xs\"\n variant=\"pill\"\n showTooltip={false}\n interactive={false}\n isMe={isMe}\n displayName={isMe ? 'You' : name}\n initials={initials}\n picture={user.picture}\n />\n )\n}\n\nfunction WorkspaceBadge({ workspace }: { workspace: Workspace }) {\n return (\n <EntityPill\n icon={\n <ShieldIcon\n char={workspace.name.charAt(0)}\n workspaceColor={workspaceKindColor(getWorkspaceKind(workspace))}\n size={16}\n />\n }\n label={workspace.name}\n size=\"sm\"\n shape=\"rounded\"\n labelMaxWidth=\"max-w-[10ch]\"\n />\n )\n}\n\n/** A document of the open workspace by name; another workspace's names are not decrypted here. */\nfunction DefaultDocumentChip({\n documentId,\n workspaceId,\n onOpen,\n fallback,\n}: NotificationDocumentChipProps) {\n const openWorkspace = useArbiSessionState((s) => s.workspaceId)\n const inOpenWorkspace = !workspaceId || workspaceId === openWorkspace\n const { data: documents } = useDocuments(openWorkspace ?? undefined, {\n enabled: inOpenWorkspace && !!openWorkspace,\n })\n const doc = inOpenWorkspace ? documents?.find((d) => d.external_id === documentId) : undefined\n const name = documentDisplayName(doc)\n if (!doc || !name) return <>{fallback}</>\n return (\n <span className=\"flex min-w-0 flex-1\" title={`Open ${name}`}>\n <DocumentEntity\n doc={doc}\n fullWidth\n onClick={(e) => {\n e.stopPropagation()\n onOpen()\n }}\n className=\"min-w-0\"\n data-testid=\"notification-signature-document\"\n />\n </span>\n )\n}\n\nconst renderUser = (user: NotificationUser) => <DefaultUser user={user} />\n\nexport function ConnectedNotificationCenter({\n onOpen,\n renderers,\n formatTime = localTime,\n pageSize = PAGE_SIZE,\n ...pageProps\n}: ConnectedNotificationCenterProps) {\n const arbi = useArbi()\n const userId = (arbi.isLoggedIn && arbi.user.identity()?.externalId) || ''\n const [limit, setLimit] = useState(pageSize)\n const { data: rows = [], isLoading, isFetching } = useNotifications({ limit })\n const deleteRows = useDeleteNotifications()\n const { mutate: markRead } = useMarkNotificationsRead()\n const history = useNotify((s) => s.notifications)\n const removeEntries = useNotify((s) => s.removeNotifications)\n\n // The session log: the store's own entries (entries a source synced in are persisted rows).\n const session = useMemo(() => history.filter((n) => !n.source), [history])\n const items = useMemo(\n () => buildNotificationCenterItems(rows, session, userId),\n [rows, session, userId]\n )\n\n // Viewing the list is seeing it: mark unread rows addressed to me read. That includes\n // self-addressed rows (quota, rewards), which sit in my activity but count in the bell.\n useEffect(() => {\n const unread = rows\n .filter((n) => n.recipient.external_id === userId && !n.read)\n .map((n) => n.external_id)\n if (unread.length > 0) markRead(unread)\n }, [rows, userId, markRead])\n\n const onDelete = useCallback(\n (selected: NotificationCenterItem[]) => {\n const persisted = selected.filter((i) => i.persisted && i.row).map((i) => i.row!.external_id)\n const local = selected.filter((i) => !i.persisted && i.entry).map((i) => i.entry!.id)\n if (persisted.length > 0) deleteRows.mutate(persisted)\n if (local.length > 0) removeEntries(local)\n },\n [deleteRows, removeEntries]\n )\n\n const open = useCallback(\n (target: NotificationTarget) => {\n if (target.kind === 'url') window.open(target.url, '_blank', 'noopener,noreferrer')\n else onOpen(target)\n },\n [onOpen]\n )\n\n // The workspace list is read only for the default badge (a host's renderer has its own).\n const { data: workspaces } = useWorkspaces({\n enabled: arbi.isLoggedIn && !renderers?.renderWorkspace,\n })\n const merged = useMemo((): NotificationCenterRenderers => {\n const byId = new Map((workspaces ?? []).map((w) => [w.external_id, w]))\n return {\n renderUser,\n renderWorkspace: (workspaceId) => {\n const workspace = byId.get(workspaceId)\n return workspace ? <WorkspaceBadge workspace={workspace} /> : null\n },\n DocumentChip: DefaultDocumentChip,\n ...renderers,\n }\n }, [renderers, workspaces])\n\n return (\n <NotificationCenter\n {...pageProps}\n items={items}\n isLoading={isLoading}\n // A full page means there may be more on the server.\n hasMore={rows.length === limit}\n isLoadingMore={isFetching}\n onLoadMore={() => setLimit((current) => current + pageSize)}\n onDelete={onDelete}\n onOpen={open}\n renderers={merged}\n formatTime={formatTime}\n />\n )\n}\n","import { useFollowThread, useWorkspaceNotificationLevel } from '@arbidocs/react'\nimport {\n ThreadFollowButton,\n ThreadFollowMenuItem,\n WorkspaceNotificationMenu,\n type ThreadFollowLabels,\n type WorkspaceNotificationMenuProps,\n} from '../activity'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceNotificationMenuProps extends Pick<\n WorkspaceNotificationMenuProps,\n 'onOpenActivity' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace; default the selected one. */\n workspaceId?: string\n}\n\n/** The bell menu that follows, mutes or resets a workspace, saved to the user settings. */\nexport function ConnectedWorkspaceNotificationMenu({\n workspaceId: workspaceProp,\n ...menuProps\n}: ConnectedWorkspaceNotificationMenuProps) {\n const { workspaceId: selected, status } = useConnection()\n const workspaceId = workspaceProp ?? selected\n const { level, setLevel, isLoading, isSaving } = useWorkspaceNotificationLevel(workspaceId, {\n enabled: status === 'authenticated',\n })\n if (!workspaceId) return null\n return (\n <WorkspaceNotificationMenu\n {...menuProps}\n level={level}\n onLevelChange={setLevel}\n disabled={isLoading || isSaving}\n />\n )\n}\n\nexport interface ConnectedThreadFollowProps {\n conversationId: string | null | undefined\n /** `button` (default): a bell toggle; `menu-item`: an item of a thread's options menu. */\n as?: 'button' | 'menu-item'\n labels?: Partial<ThreadFollowLabels>\n testId?: string\n}\n\n/** Follow or unfollow a thread (pushed everything in it), saved to the user settings. */\nexport function ConnectedThreadFollow({\n conversationId,\n as = 'button',\n ...props\n}: ConnectedThreadFollowProps) {\n const { status } = useConnection()\n const { following, setFollowing, isLoading, isSaving } = useFollowThread(conversationId, {\n enabled: status === 'authenticated',\n })\n if (!conversationId) return null\n const Control = as === 'menu-item' ? ThreadFollowMenuItem : ThreadFollowButton\n return (\n <Control\n {...props}\n following={following}\n onFollowingChange={setFollowing}\n disabled={isLoading || isSaving}\n />\n )\n}\n","/**\n * Add a skill someone gave you: a file from your computer (`.md` or `.zip`) or a link to one. Both\n * go through the one skill upload (`useUploadSkillFiles`); the skill then appears in every skill\n * list once it is processed.\n */\n\nimport { useRef, useState } from 'react'\nimport { useUploadSkillFiles } from '@arbidocs/react'\nimport { Button, Input, Label, cn } from '@arbidocs/react/ui'\nimport { Link2, Upload } from 'lucide-react'\nimport {\n importSkillFile,\n importSkillFromUrl,\n type SkillImportResult,\n} from '../agents/skills/skillImport'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport interface ConnectedSkillUploadLabels {\n title: string\n description: string\n fromFile: string\n chooseFile: string\n fromLink: string\n linkPlaceholder: string\n add: string\n cancel: string\n /** The notification once a skill is added. */\n added: (slug: string) => string\n failed: string\n}\n\nexport const DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS: ConnectedSkillUploadLabels = {\n title: 'Add a skill',\n description: 'Bring in a skill someone sent you, from a file or a link.',\n fromFile: 'From a file',\n chooseFile: 'Choose a file',\n fromLink: 'From a link',\n linkPlaceholder: 'https://…/SKILL.md',\n add: 'Add',\n cancel: 'Cancel',\n added: (slug) => `${slug} added`,\n failed: 'Could not add the skill',\n}\n\nexport interface ConnectedSkillUploadProps {\n /** Added (its slug) or cancelled (nothing). Absent: no Cancel, and the form stays. */\n onDone?: (addedSlug?: string) => void\n labels?: Partial<ConnectedSkillUploadLabels>\n className?: string\n}\n\nexport function ConnectedSkillUpload({ onDone, labels, className }: ConnectedSkillUploadProps) {\n const l = { ...DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS, ...labels }\n const { notify } = useBlocksEnvironment()\n const upload = useUploadSkillFiles()\n const fileRef = useRef<HTMLInputElement>(null)\n const [url, setUrl] = useState('')\n const [busy, setBusy] = useState(false)\n\n const add = async (read: () => Promise<SkillImportResult>) => {\n setBusy(true)\n try {\n const { slug, entries } = await read()\n await upload.mutateAsync(\n entries.map((e) => ({\n folder: e.folder,\n fileName: e.fileName,\n content: new Blob([e.content], { type: 'text/markdown' }),\n }))\n )\n notify(l.added(slug), 'success')\n setUrl('')\n onDone?.(slug)\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : l.failed, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div\n className={cn('flex flex-col gap-6 overflow-y-auto p-4', className)}\n data-testid=\"skills-add-view\"\n >\n <div className=\"space-y-2\">\n <h3 className=\"text-base font-semibold\">{l.title}</h3>\n <p className=\"text-sm text-muted-foreground\">{l.description}</p>\n </div>\n <div className=\"space-y-2\">\n <Label>{l.fromFile}</Label>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".md,.markdown,.zip\"\n className=\"hidden\"\n data-testid=\"skills-add-file-input\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) void add(() => importSkillFile(file))\n }}\n />\n <div>\n <Button\n variant=\"outline\"\n disabled={busy}\n onClick={() => fileRef.current?.click()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-file\"\n >\n <Upload className=\"mr-1.5 size-4\" />\n {l.chooseFile}\n </Button>\n </div>\n </div>\n <form\n className=\"space-y-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (url.trim()) void add(() => importSkillFromUrl(url))\n }}\n >\n <Label htmlFor=\"skills-add-url\">{l.fromLink}</Label>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input\n id=\"skills-add-url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder={l.linkPlaceholder}\n inputMode=\"url\"\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-input\"\n />\n <Button\n type=\"submit\"\n disabled={busy || !url.trim()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-submit\"\n >\n <Link2 className=\"mr-1.5 size-4\" />\n {l.add}\n </Button>\n </div>\n </form>\n {onDone && (\n <div>\n <Button variant=\"ghost\" onClick={() => onDone()} className=\"pointer-coarse:min-h-11\">\n {l.cancel}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * The skills library bound to the connection: one place to find, read, copy, change, share, export\n * and add skills. The host's built-in skills, your own and the ones others shared sit in one list\n * with search, filter chips and a gallery or list view; picking one opens its detail beside the\n * list (over it on a phone). Running a skill and drafting a new one with the assistant are the\n * host's (`onRun`, `onDraft`): the library has no run UI of its own.\n *\n * \"Make a copy\" needs no server feature: a shared skill is read and saved again as your own (the\n * same path as adding a skill from a file); a built-in is written out as a SKILL.md first. Your copy\n * has the original's name, so it is used instead of the original until you delete it.\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport {\n useArbi,\n useDeleteSkill,\n useSetSkillVisibility,\n useSkillSource,\n useSkills,\n useUploadSkillFiles,\n} from '@arbidocs/react'\nimport { Button, EntityIcon, Input, Textarea, cn } from '@arbidocs/react/ui'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport { ArrowLeft, Plus, Search, Upload } from 'lucide-react'\nimport {\n SkillFilterChips,\n SkillTile,\n SkillViewToggle,\n type SkillBrowserView,\n} from '../agents/skills/SkillBrowserParts'\nimport { SkillEditForm, SkillGenerateForm } from '../agents/skills/SkillForms'\nimport { SkillLibraryDetail } from '../agents/skills/SkillLibraryDetail'\nimport {\n SKILL_SOURCE_LABELS,\n SKILL_TYPE_LABELS,\n buildLibrarySkills,\n filterLibrarySkills,\n type LibrarySkill,\n type SkillSource,\n} from '../agents/skills/skillLibrary'\nimport {\n parseSkillFrontmatter,\n serializeSkill,\n SKILL_MAIN_FILENAME,\n} from '../agents/skills/skillFiles'\nimport { skillSlug, workflowToSkillMarkdown } from '../agents/workflows/skillMarkdown'\nimport type { WorkflowDefinition } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { ConnectedSkillUpload } from './ConnectedSkillUpload'\n\ntype Mode = 'detail' | 'new' | 'edit' | 'add'\n\nconst SKILL_FOLDER = 'skills/'\nconst NAME_PATTERN = /^[a-z0-9-]{1,64}$/\nconst icon = <EntityIcon entityType=\"SKILL\" />\n\nconst errorText = (error: unknown, fallback: string) =>\n error instanceof Error && error.message ? error.message : fallback\nconst statusOf = (error: unknown) =>\n error && typeof error === 'object' && 'status' in error\n ? (error as { status?: number }).status\n : undefined\n\nexport interface ConnectedSkillsLibraryProps {\n /** The host's built-in skills (prompt workflows with their own forms). */\n builtins?: WorkflowDefinition[]\n /** Open on this skill. */\n initialSlug?: string\n /** Run a skill: the host opens its run dialog with it selected. */\n onRun: (slug: string) => void\n /** \"New skill\", described: the host hands the text to the assistant (e.g. as a chat draft). */\n onDraft: (text: string) => void\n /** The instructions editor. Default: a plain text area. */\n renderEditor?: (markdown: string, onChange: (markdown: string) => void) => ReactNode\n}\n\nexport function ConnectedSkillsLibrary({\n builtins = [],\n initialSlug,\n onRun,\n onDraft,\n renderEditor,\n}: ConnectedSkillsLibraryProps) {\n const arbi = useArbi()\n const { confirm, notify } = useBlocksEnvironment()\n const { data: listings } = useSkills()\n const upload = useUploadSkillFiles()\n const setVisibility = useSetSkillVisibility()\n const deleteSkill = useDeleteSkill()\n\n const [mode, setMode] = useState<Mode>('detail')\n const [selected, setSelected] = useState<string | null>(initialSlug ?? null)\n const [query, setQuery] = useState('')\n const [source, setSource] = useState<SkillSource | 'all'>('all')\n const [type, setType] = useState('all')\n const [view, setView] = useState<SkillBrowserView>('gallery')\n const [isBusy, setIsBusy] = useState(false)\n\n const all = useMemo(() => buildLibrarySkills(builtins, listings ?? []), [builtins, listings])\n const shown = useMemo(\n () => filterLibrarySkills(all, { query, source, type }),\n [all, query, source, type]\n )\n const current = all.find((s) => s.slug === selected) ?? null\n const { data: currentText, isLoading: textLoading } = useSkillSource(current?.docExtId)\n\n // A skill that is gone (deleted) leaves nothing selected.\n useEffect(() => {\n if (selected && !current && all.length > 0) setSelected(null)\n }, [selected, current, all.length])\n\n const count = (s: SkillSource) => all.filter((x) => x.source === s).length\n const sourceOptions = [\n { id: 'all', label: 'All', count: all.length },\n { id: 'builtin', label: SKILL_SOURCE_LABELS.builtin, count: count('builtin') },\n { id: 'mine', label: SKILL_SOURCE_LABELS.mine, count: count('mine') },\n { id: 'shared', label: SKILL_SOURCE_LABELS.shared, count: count('shared') },\n ]\n const types = [...new Set(all.map((s) => s.type))]\n const typeOptions = [\n { id: 'all', label: 'Any kind' },\n ...types.map((t) => ({ id: t, label: SKILL_TYPE_LABELS[t] ?? t })),\n ]\n\n const pick = (slug: string) => {\n setSelected(slug)\n setMode('detail')\n }\n\n /** A stored skill's SKILL.md, or a built-in written out as one. */\n const markdownOf = async (skill: LibrarySkill): Promise<string> => {\n if (!skill.docExtId) return workflowToSkillMarkdown(skill.workflow)\n const response = await arbi.documents.download(skill.docExtId)\n if (!response.ok) throw new Error(`Could not read the skill (${response.status})`)\n return response.text()\n }\n\n /**\n * Save `markdown` as the user's own skill of this name (it then replaces any original): private,\n * unless it is a shared skill of theirs being changed (it stays shared).\n */\n const saveAs = (slug: string, markdown: string, shared = false) =>\n upload.mutateAsync([\n {\n folder: `${SKILL_FOLDER}${slug}`,\n fileName: SKILL_MAIN_FILENAME,\n content: new Blob([markdown], { type: 'text/markdown' }),\n shared,\n },\n ])\n\n const busy = async (work: () => Promise<void>) => {\n setIsBusy(true)\n try {\n await work()\n } finally {\n setIsBusy(false)\n }\n }\n\n const makeCopy = (skill: LibrarySkill) =>\n busy(async () => {\n try {\n await saveAs(skill.slug, await markdownOf(skill))\n notify(\n 'Your copy is ready. It is used instead of the original; delete it to go back.',\n 'success'\n )\n setSelected(skill.slug)\n } catch (error) {\n notify(errorText(error, 'Could not make a copy'), 'error')\n }\n })\n\n const toggleShare = (skill: LibrarySkill) => {\n if (!skill.docExtId) return\n const docExtId = skill.docExtId\n const next = skill.isShared ? 'mine' : 'global'\n return busy(async () => {\n try {\n await setVisibility.mutateAsync({ docExtId, visibility: next })\n notify(next === 'global' ? 'Shared with everyone' : 'Made private', 'success')\n } catch (error) {\n notify(\n statusOf(error) === 409 || errorText(error, '').includes('409')\n ? 'Someone has already shared a skill with this name. Rename yours first.'\n : 'Could not change who can see this skill',\n 'error'\n )\n }\n })\n }\n\n const remove = async (skill: LibrarySkill) => {\n if (!skill.docExtId) return\n const docExtId = skill.docExtId\n const ok = await confirm({\n message: skill.replacesBuiltin\n ? `Delete your copy of \"${skill.title}\"? The original will be used again.`\n : `Delete \"${skill.title}\"? This cannot be undone.`,\n title: 'Delete skill',\n })\n if (!ok) return\n await busy(async () => {\n try {\n await deleteSkill.mutateAsync(docExtId)\n notify(`${skill.title} deleted`, 'success')\n setSelected(null)\n } catch {\n notify('Could not delete the skill', 'error')\n }\n })\n }\n\n const exportFile = async (skill: LibrarySkill) => {\n try {\n downloadBlob(\n new Blob([await markdownOf(skill)], { type: 'text/markdown' }),\n SKILL_MAIN_FILENAME\n )\n } catch (error) {\n notify(errorText(error, 'Could not export the skill'), 'error')\n }\n }\n\n const rightVisible = mode !== 'detail' || current !== null\n const backToList = () => {\n setMode('detail')\n setSelected(null)\n }\n const done = (slug?: string) => {\n if (slug) setSelected(slug)\n setMode('detail')\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 border-t border-border\">\n <div\n className={cn(\n 'flex min-h-0 w-full flex-col md:w-[26rem] md:shrink-0 md:border-r md:border-border',\n rightVisible && 'max-md:hidden'\n )}\n data-testid=\"skills-list-pane\"\n >\n <div className=\"flex flex-col gap-3 p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search skills\"\n aria-label=\"Search skills\"\n className=\"pl-9 pointer-coarse:min-h-11\"\n data-testid=\"skills-browser-search\"\n />\n </div>\n <SkillViewToggle value={view} onChange={setView} />\n </div>\n <SkillFilterChips\n label=\"Show\"\n value={source}\n onChange={(id) => setSource(id as SkillSource | 'all')}\n options={sourceOptions}\n />\n {types.length > 1 && (\n <SkillFilterChips\n label=\"Kind\"\n value={type}\n onChange={setType}\n options={typeOptions}\n testIdPrefix=\"skills-type\"\n />\n )}\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n onClick={() => setMode('new')}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-new\"\n >\n <Plus className=\"mr-1 size-4\" />\n New skill\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setMode('add')}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add\"\n >\n <Upload className=\"mr-1 size-4\" />\n Add a skill\n </Button>\n </div>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 pb-3\" data-testid=\"skills-list\">\n {shown.length === 0 ? (\n <p className=\"py-10 text-center text-sm text-muted-foreground\">\n No skills match. Try another word or filter.\n </p>\n ) : (\n <div\n className={cn(\n 'gap-2',\n view === 'gallery'\n ? 'grid grid-cols-[repeat(auto-fill,minmax(9.5rem,1fr))]'\n : 'flex flex-col'\n )}\n >\n {shown.map((skill) => (\n <SkillTile\n key={skill.slug}\n name={skill.title}\n testId={`skill-tile-${skill.slug}`}\n description={skill.description}\n sourceLabel={\n skill.isShared\n ? `${SKILL_SOURCE_LABELS.mine}, shared`\n : SKILL_SOURCE_LABELS[skill.source]\n }\n type={skill.type}\n icon={icon}\n layout={view}\n selected={skill.slug === selected}\n onSelect={() => pick(skill.slug)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div\n className={cn('flex min-h-0 min-w-0 flex-1 flex-col', !rightVisible && 'max-md:hidden')}\n data-testid=\"skills-detail-pane\"\n >\n {rightVisible && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={backToList}\n className=\"m-2 self-start pointer-coarse:min-h-11 md:hidden\"\n data-testid=\"skills-back\"\n >\n <ArrowLeft className=\"mr-1 size-4\" />\n All skills\n </Button>\n )}\n {mode === 'new' && (\n <SkillGenerateForm\n icon={icon}\n onGenerate={(desc) => {\n onDraft(`/create-skill ${desc}`.trim() + ' ')\n notify('Sent to the chat: the assistant will draft your skill.', 'info')\n }}\n onManual={() => setMode('edit')}\n />\n )}\n {mode === 'edit' && (\n <SkillEditor\n skill={current?.source === 'mine' ? current : null}\n text={current?.source === 'mine' ? currentText : undefined}\n renderEditor={renderEditor}\n onSave={async (slug, markdown, isEditing) => {\n await saveAs(slug, markdown, isEditing && !!current?.isShared)\n notify(isEditing ? `${slug} saved` : `${slug} added`, 'success')\n done(slug)\n }}\n onCancel={() => done()}\n isSaving={upload.isPending}\n />\n )}\n {mode === 'add' && <ConnectedSkillUpload onDone={done} />}\n {mode === 'detail' && current && (\n <SkillLibraryDetail\n skill={current}\n icon={icon}\n instructions={\n current.docExtId\n ? currentText\n ? parseSkillFrontmatter(currentText, SKILL_MAIN_FILENAME).content\n : ''\n : current.workflow.run.kind === 'prompt'\n ? current.workflow.run.promptTemplate\n : ''\n }\n isLoading={!!current.docExtId && textLoading}\n actions={{\n onRun: () => onRun(current.slug),\n onCopy: () => void makeCopy(current),\n onEdit: () => setMode('edit'),\n onToggleShare: () => void toggleShare(current),\n onExport: () => void exportFile(current),\n onDelete: () => void remove(current),\n isBusy,\n }}\n />\n )}\n {mode === 'detail' && !current && (\n <div className=\"flex flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground max-md:hidden\">\n Pick a skill to read it, run it or make a copy.\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Write or change a skill: a name, a short description and the instructions. Saving a skill of the\n * same name replaces it.\n */\nfunction SkillEditor({\n skill,\n text,\n renderEditor,\n onSave,\n onCancel,\n isSaving,\n}: {\n /** The skill being changed (yours); absent when writing a new one. */\n skill: LibrarySkill | null\n /** Its SKILL.md, once read. */\n text: string | undefined\n renderEditor?: ConnectedSkillsLibraryProps['renderEditor']\n onSave: (slug: string, markdown: string, isEditing: boolean) => Promise<void>\n onCancel: () => void\n isSaving: boolean\n}) {\n const { notify } = useBlocksEnvironment()\n const isEditing = !!skill\n const [name, setName] = useState(skill?.slug ?? '')\n const [description, setDescription] = useState('')\n const [body, setBody] = useState('')\n const [seeded, setSeeded] = useState(!isEditing)\n const [nameError, setNameError] = useState<string | null>(null)\n\n // Seed from the existing content once it has been read.\n if (isEditing && !seeded && text !== undefined) {\n const parsed = parseSkillFrontmatter(text, SKILL_MAIN_FILENAME)\n setDescription(parsed.description ?? '')\n setBody(parsed.content ?? '')\n setSeeded(true)\n }\n\n const save = async () => {\n if (!NAME_PATTERN.test(name)) {\n setNameError('Use 1–64 lowercase letters, numbers or hyphens.')\n return\n }\n if (description.trim().length < 1) {\n notify('Add a short description.', 'error')\n return\n }\n const slug = skillSlug(name)\n try {\n await onSave(slug, serializeSkill({ name: slug, description, body }), isEditing)\n } catch (err) {\n notify(errorText(err, 'Could not save the skill'), 'error')\n }\n }\n\n return (\n <SkillEditForm\n name={name}\n onNameChange={setName}\n isNameLocked={isEditing}\n nameError={nameError}\n description={description}\n onDescriptionChange={setDescription}\n editor={\n renderEditor ? (\n renderEditor(body, setBody)\n ) : (\n <Textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n className=\"min-h-64 flex-1 font-mono text-sm\"\n aria-label=\"Instructions\"\n />\n )\n }\n isSaving={isSaving}\n isEditing={isEditing}\n onSave={save}\n onCancel={onCancel}\n labels={{ create: 'Add skill' }}\n testIds={{\n name: 'skill-edit-name',\n description: 'skill-edit-description',\n save: 'skill-edit-save',\n }}\n />\n )\n}\n","/**\n * Create or edit an agent, bound to the connection: describe what it is for (or start from a\n * template), see what it can do, save. Saving creates the agent if it is new, then pins its config:\n * the base config (the agent's own, else the library default) with its `Agents` section patched\n * (persona with its name, model, tool switches, skills, connected tools). The workspaces ticked\n * under Advanced are granted (standing access); an external agent then shows its one-time\n * connection script. An avatar can be generated once it has a name.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useAgentConfig,\n useAgentModels,\n useAgentWorkspaces,\n useCreateAgent,\n useGenerateAgentAvatar,\n useGrantAgentAccess,\n useMcpTools,\n useRevokeAgentAccess,\n useSaveAgentConfig,\n useSkills,\n useWorkspaces,\n} from '@arbidocs/react'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Label,\n} from '@arbidocs/react/ui'\nimport {\n AgentCreator,\n isValidAgentName,\n type AgentCapability,\n type AgentCreatorLabels,\n type AgentCreatorValues,\n type AgentTemplate,\n} from '../agents/definitions/AgentCreator'\nimport { AgentAvatarField, type AgentTypeOption } from '../agents/definitions/AgentEditorParts'\nimport { AgentConnectInstructions } from '../agents/definitions/AgentConnectInstructions'\nimport {\n DEFAULT_AGENT_CAPABILITIES,\n DEFAULT_AGENT_TEMPLATES,\n DEFAULT_AGENT_TYPES,\n} from '../agents/definitions/defaults'\nimport { composePersona, stripPersonaPreamble } from '../agents/definitions/persona'\nimport { MultiSelect } from '../settings/MultiSelect'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\ntype AgentsSection = Record<string, unknown>\n\n/** The agent being edited: its id, name, picture and address. */\nexport interface ConnectedAgentCreatorAgent {\n external_id: string\n given_name: string\n picture?: string | null\n email?: string | null\n}\n\nexport interface ConnectedAgentCreatorProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Present: edit it; absent: create one. */\n agent?: ConnectedAgentCreatorAgent | null\n /** The name a new agent starts with (e.g. a connection that needs `SlackAssistant`). */\n initialName?: string\n /** Saved: the new or updated agent's id. */\n onSaved?: (agentExtId: string) => void\n capabilities?: AgentCapability[]\n templates?: AgentTemplate[]\n types?: AgentTypeOption<string>[]\n /**\n * Offer to take a granted workspace back. It re-opens workspaces on the session to do it, so a\n * host whose session keeps one workspace open (the ARBI app) leaves it off.\n */\n canRevokeWorkspaces?: boolean\n labels?: Partial<AgentCreatorLabels>\n}\n\nexport function ConnectedAgentCreator({\n open,\n onOpenChange,\n agent,\n initialName,\n onSaved,\n capabilities = DEFAULT_AGENT_CAPABILITIES,\n templates = DEFAULT_AGENT_TEMPLATES,\n types = DEFAULT_AGENT_TYPES,\n canRevokeWorkspaces = false,\n labels,\n}: ConnectedAgentCreatorProps) {\n const { notify } = useBlocksEnvironment()\n const isEdit = !!agent\n const [saving, setSaving] = useState(false)\n const [skills, setSkills] = useState<string[]>([])\n const [mcpTools, setMcpTools] = useState<string[]>([])\n const [picture, setPicture] = useState<string | null>(agent?.picture ?? null)\n const [avatarBusy, setAvatarBusy] = useState(false)\n // After creating an EXTERNAL agent: its one-time connection script.\n const [connect, setConnect] = useState<{ email: string; signingKey: string } | null>(null)\n // The avatar endpoint needs the agent to exist: in create mode the first avatar click creates it\n // and remembers it, so the final save reuses it instead of making a second agent.\n const [early, setEarly] = useState<{ id: string; email: string; signingKey: string } | null>(null)\n\n const { data: models = [] } = useAgentModels({ enabled: open })\n const { data: skillsList } = useSkills({ enabled: open })\n const { data: mcpToolsList } = useMcpTools({ enabled: open })\n // The agent's pinned config (edit) or the library default (create): what the form seeds from.\n const { data: baseConfig } = useAgentConfig(agent?.external_id, { enabled: open })\n const { data: workspaces = [] } = useWorkspaces({ enabled: open })\n const { data: agentWorkspaces = [] } = useAgentWorkspaces(agent?.external_id, {\n enabled: isEdit && open,\n })\n const createAgent = useCreateAgent()\n const saveConfig = useSaveAgentConfig()\n const grantAccess = useGrantAgentAccess()\n const revokeAccess = useRevokeAgentAccess()\n const generateAvatar = useGenerateAgentAvatar()\n const agents = (baseConfig?.Agents ?? {}) as AgentsSection\n const grantedIds = useMemo(\n () => agentWorkspaces.map((w) => w.workspace_ext_id),\n [agentWorkspaces]\n )\n\n // Open only once the base config has arrived: the creator seeds from it on open, and a later\n // refetch must not clobber what the user typed.\n const ready = open && baseConfig !== undefined\n useEffect(() => {\n if (!ready) return\n setPicture(agent?.picture ?? null)\n setEarly(null)\n setSkills(Array.isArray(agents.ENABLED_SKILLS) ? (agents.ENABLED_SKILLS as string[]) : [])\n setMcpTools(Array.isArray(agents.MCP_TOOLS) ? (agents.MCP_TOOLS as string[]) : [])\n // Seed once per open.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ready])\n\n const initialValues = useMemo<Partial<AgentCreatorValues>>(\n () => ({\n name: agent?.given_name ?? initialName ?? '',\n persona: isEdit ? stripPersonaPreamble(String(agents.PERSONA ?? '')) : '',\n modelName: String(agents.AGENT_MODEL_NAME ?? ''),\n capabilities: Object.fromEntries(capabilities.map(({ key }) => [key, Boolean(agents[key])])),\n type: 'builtin',\n workspaceIds: [],\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [ready, agent]\n )\n\n const skillOptions = (skillsList ?? []).map((s) => ({ label: s.name || s.slug, value: s.slug }))\n const mcpOptions = (mcpToolsList?.tools ?? []).map((t) => ({\n label: `${t.name} (${t.server_name})`,\n value: t.name,\n }))\n\n const handleGenerateAvatar = async (values: AgentCreatorValues) => {\n setAvatarBusy(true)\n try {\n let agentExtId = agent?.external_id ?? early?.id ?? ''\n if (!agentExtId) {\n if (!isValidAgentName(values.name)) {\n notify('Give the agent a name first.', 'error')\n return\n }\n const res = await createAgent.mutateAsync(values.name)\n agentExtId = res.external_id\n setEarly({ id: res.external_id, email: res.email, signingKey: res.signing_private_key })\n }\n const who = values.persona.trim() || `an AI assistant named ${values.name}`\n const res = await generateAvatar.mutateAsync({\n agentExtId,\n prompt:\n `Square portrait avatar for an AI agent: ${who}. ` +\n 'Stylised, friendly, high-contrast, head-and-shoulders, centred, simple flat background.',\n })\n setPicture(res.picture ?? null)\n } catch {\n notify('Avatar generation failed — try again.', 'error')\n } finally {\n setAvatarBusy(false)\n }\n }\n\n const handleSubmit = async (values: AgentCreatorValues) => {\n setSaving(true)\n try {\n let agentExtId = agent?.external_id ?? early?.id ?? ''\n let created: { email: string; signingKey: string } | null = early\n if (!agentExtId) {\n const res = await createAgent.mutateAsync(values.name)\n agentExtId = res.external_id\n created = { email: res.email, signingKey: res.signing_private_key }\n }\n const name = values.name || agent?.given_name || 'Agent'\n await saveConfig.mutateAsync({\n agentExtId,\n title: `agent-${name}`,\n sections: {\n Agents: {\n PERSONA: composePersona(name, values.persona),\n ...(values.modelName ? { AGENT_MODEL_NAME: values.modelName } : {}),\n ...Object.fromEntries(capabilities.map(({ key }) => [key, !!values.capabilities[key]])),\n ENABLED_SKILLS: values.capabilities.SKILLS_ENABLED && skills.length ? skills : null,\n MCP_TOOLS: mcpTools,\n },\n },\n })\n // Workspace access is explicit: only the workspaces ticked under Advanced are granted.\n for (const workspaceId of values.workspaceIds.filter((w) => !grantedIds.includes(w))) {\n await grantAccess.mutateAsync({ agentExtId, workspaceId })\n }\n notify(isEdit ? 'Agent updated.' : 'Agent created.', 'success')\n onSaved?.(agentExtId)\n onOpenChange(false)\n // A newly created EXTERNAL agent reveals its one-time connection script.\n if (created && values.type === 'external') setConnect(created)\n } catch (e) {\n notify(`Saving the agent failed: ${e instanceof Error ? e.message : e}`, 'error')\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <>\n <AgentCreator\n open={ready}\n onOpenChange={onOpenChange}\n isEdit={isEdit}\n agentName={agent?.given_name}\n capabilities={capabilities}\n templates={templates}\n models={models}\n workspaces={workspaces.map((w) => ({ id: w.external_id, name: w.name }))}\n grantedWorkspaceIds={grantedIds}\n onRevokeWorkspace={\n canRevokeWorkspaces && agent\n ? (workspaceId) =>\n void revokeAccess\n .mutateAsync({ agentExtId: agent.external_id, workspaceId })\n .catch((e: unknown) =>\n notify(e instanceof Error ? e.message : String(e), 'error')\n )\n : undefined\n }\n revokingWorkspaceId={\n revokeAccess.isPending ? revokeAccess.variables?.workspaceId : undefined\n }\n avatar={(values) => (\n <AgentAvatarField\n picture={picture}\n isBusy={avatarBusy}\n canGenerate={isEdit || isValidAgentName(values.name)}\n onGenerate={() => handleGenerateAvatar(values)}\n />\n )}\n types={types}\n initialValues={initialValues}\n isSaving={saving}\n onSubmit={handleSubmit}\n labels={labels}\n advanced={(values) => (\n <>\n {mcpOptions.length > 0 && (\n <div className=\"flex flex-col gap-1.5\">\n <Label>Connected tools</Label>\n <p className=\"text-xs text-muted-foreground\">\n Extra tools from services you have connected. Pick which this agent may use.\n </p>\n <MultiSelect\n data={mcpOptions}\n value={mcpTools}\n onChange={setMcpTools}\n placeholder=\"None\"\n data-testid=\"agent-mcp-select\"\n />\n </div>\n )}\n {values.capabilities.SKILLS_ENABLED && (\n <div className=\"flex flex-col gap-1.5\">\n <Label>Skills</Label>\n <p className=\"text-xs text-muted-foreground\">\n Skills are instructions the agent may follow. Leave empty to allow all of yours.\n </p>\n <MultiSelect\n data={skillOptions}\n value={skills}\n onChange={setSkills}\n placeholder=\"All skills you can see\"\n data-testid=\"agent-skills-select\"\n />\n </div>\n )}\n </>\n )}\n />\n <Dialog open={connect !== null} onOpenChange={(next) => !next && setConnect(null)}>\n <DialogContent\n presentation=\"sheet\"\n className=\"max-h-[calc(100dvh-2rem)] max-w-2xl overflow-y-auto\"\n data-testid=\"agent-connect-dialog\"\n >\n <DialogHeader>\n <DialogTitle>Connect your agent</DialogTitle>\n <DialogDescription>\n This key is shown once. Run the script on the machine that will host the agent.\n </DialogDescription>\n </DialogHeader>\n {connect && (\n <AgentConnectInstructions email={connect.email} signingKey={connect.signingKey} />\n )}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","/**\n * A saved workflow's history and a task's activity, bound to the connection.\n *\n * - `ConnectedWorkflowHistory`: every run of a workflow (re-read while shown), each with when, what\n * it was (a thread, an email, an AI review, a reminder) and how it went; a run's thread opens\n * through the environment's `openConversation`, a document action's result through the host.\n * - `ConnectedTaskActivityDialog`: a task's timeline (re-read while it runs), with who did what.\n */\n\nimport { useCallback, type ReactNode } from 'react'\nimport {\n formatRelativeTime,\n useAgents,\n useConversationActivity,\n useWorkflowRuns,\n} from '@arbidocs/react'\nimport {\n TaskRunsDialog,\n type TaskRunView,\n type TaskRunsDialogLabels,\n} from '../agents/tasks/TaskRunsDialog'\nimport { TaskActivityDialog } from '../agents/tasks/TaskActivityDialog'\nimport type { TaskActivityEvent } from '../agents/tasks/TaskActivityTimeline'\nimport { PersonPill, type TaskPerson } from '../agents/tasks/PersonPill'\nimport { fmtDate } from '../lib/format'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedWorkspaceRole } from './ConnectedWorkflowsTable'\n\ntype WorkflowRun = NonNullable<ReturnType<typeof useWorkflowRuns>['data']>[number]\n\n/** What a run was, in a word. */\nconst RUN_KIND: Record<string, string> = {\n email_documents: 'Email',\n annotate_documents: 'AI Review',\n reminder: 'Reminder',\n}\nconst DOCUMENT_ACTIONS = new Set(['email_documents', 'annotate_documents'])\n\n/** A run as the history lists it: when, what, on how many documents. */\nexport function workflowRunView(\n run: WorkflowRun,\n formatDate: (iso: string) => string\n): TaskRunView {\n const documents = DOCUMENT_ACTIONS.has(run.action_type)\n ? ` · ${run.document_ext_ids.length} documents`\n : ''\n return {\n id: `execution-${run.id}`,\n // An AI review that finished has a result to open (its fields over its documents).\n resultId:\n run.action_type === 'annotate_documents' && run.status === 'completed'\n ? String(run.id)\n : undefined,\n status: run.status,\n when: `${formatDate(run.created_at)} · ${RUN_KIND[run.action_type] ?? 'Thread'}${documents}`,\n error: run.error,\n conversationId: run.conversation_ext_id ?? undefined,\n }\n}\n\nexport interface ConnectedWorkflowHistoryProps {\n /** The workflow (`null`: closed). */\n workflow: { external_id: string; name: string } | null\n onOpenChange: (open: boolean) => void\n /** In the page rather than a dialog. */\n inline?: boolean\n hideHeader?: boolean\n formatDate?: (iso: string) => string\n /** Open a document action's result (an AI review's fields): the host's. Absent: no Open. */\n onOpenResult?: (run: WorkflowRun) => void\n /** Under a failed run: e.g. a way to report it. */\n renderErrorReport?: (run: TaskRunView) => ReactNode\n labels?: Partial<TaskRunsDialogLabels>\n}\n\nexport function ConnectedWorkflowHistory({\n workflow,\n onOpenChange,\n inline,\n hideHeader,\n formatDate = fmtDate,\n onOpenResult,\n renderErrorReport,\n labels,\n}: ConnectedWorkflowHistoryProps) {\n const { openConversation } = useBlocksEnvironment()\n const { data: runs = [], isLoading } = useWorkflowRuns(workflow?.external_id)\n return (\n <TaskRunsDialog\n inline={inline}\n hideHeader={hideHeader}\n open={!!workflow}\n onOpenChange={onOpenChange}\n taskName={workflow?.name}\n renderErrorReport={renderErrorReport}\n isLoading={isLoading}\n labels={{\n title: (name) => `History — ${name}`,\n description: 'Executions and results of this workflow.',\n empty: 'This workflow hasn’t run yet.',\n ...labels,\n }}\n runs={runs.map((run) => workflowRunView(run, formatDate))}\n onOpenResult={\n onOpenResult &&\n ((id) => {\n const run = runs.find((r) => String(r.id) === id)\n if (run) onOpenResult(run)\n })\n }\n onOpenRun={(conversationId) => openConversation(conversationId)}\n />\n )\n}\n\n/** Relative time, compact for list rows. */\nconst relativeTime = (iso: string) => formatRelativeTime(iso, { style: 'short' })\n\nexport interface ConnectedTaskActivityDialogProps {\n conversationId: string\n taskName: string\n /** The run is generating right now: the timeline then re-reads itself every few seconds. */\n live?: boolean\n onClose: () => void\n /** How a person shows (the host's own pill). Default: the shared pill with their name. */\n renderPerson?: (person: TaskPerson) => ReactNode\n formatExact?: (iso: string) => string\n}\n\nexport function ConnectedTaskActivityDialog({\n conversationId,\n taskName,\n live,\n onClose,\n renderPerson: renderTaskPerson,\n formatExact = fmtDate,\n}: ConnectedTaskActivityDialogProps) {\n const activity = useConversationActivity(conversationId, { live })\n const { data: agents = [] } = useAgents()\n const { userId } = useConnectedWorkspace()\n const { members } = useConnectedWorkspaceRole()\n const renderPerson = useCallback(\n (id: string | null | undefined) => {\n const isMe = !!id && id === userId\n const member = members.find((m) => m.user.external_id === id)?.user\n const name =\n (member && [member.given_name, member.family_name].filter(Boolean).join(' ')) ||\n member?.email\n const person = { id, label: isMe ? 'You' : name || 'Someone', isMe }\n return renderTaskPerson ? renderTaskPerson(person) : <PersonPill person={person} />\n },\n [renderTaskPerson, userId, members]\n )\n const agentName = useCallback(\n (agentId: string) => agents.find((a) => a.external_id === agentId)?.given_name ?? undefined,\n [agents]\n )\n return (\n <TaskActivityDialog\n open\n onOpenChange={(open) => !open && onClose()}\n taskName={taskName}\n events={activity.data as TaskActivityEvent[] | undefined}\n isLoading={activity.isLoading}\n isError={activity.isError}\n renderPerson={renderPerson}\n agentName={agentName}\n formatRelative={relativeTime}\n formatExact={formatExact}\n />\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { ArtifactCanvas } from '@arbidocs/react'\nimport { useStreamedArtifact, type UseStreamedArtifactOptions } from '@arbidocs/react/artifacts'\nimport {\n StreamedArtifactFrame,\n type StreamedArtifactFrameLabels,\n type StreamedArtifactFrameTestIds,\n} from '../artifacts/StreamedArtifactFrame'\nimport type { ArtifactEvent } from './ai'\nimport type { StreamedArtifactEditorProps } from './StreamedArtifactEditor'\n\n// The editor (MDXEditor, Lexical) stays out of the bundle until a draft is ready to edit.\nconst StreamedArtifactEditor = lazy(() => import('./StreamedArtifactEditor'))\n\nexport interface StreamedArtifactProps\n extends\n Pick<UseStreamedArtifactOptions, 'configId' | 'parseRetry' | 'clean'>,\n Pick<\n StreamedArtifactEditorProps,\n 'editorProps' | 'onSaved' | 'onSaveError' | 'actions' | 'hideDefaultActions'\n > {\n /** The artifacts of the agent run (`useConnectedAiTask().artifacts`). */\n artifacts: ArtifactEvent[]\n workspaceId: string | undefined\n /** The agent is still working: show the live canvas. */\n busy: boolean\n /** The run failed; with no draft the canvas shows it. */\n error?: string | null\n stepCount?: number\n busyHint?: string\n emptyHint?: string\n className?: string\n /** Root test id of the editor; the preparing state is `${testId}-preparing`. */\n testId?: string\n labels?: Partial<StreamedArtifactFrameLabels>\n testIds?: Partial<StreamedArtifactFrameTestIds>\n}\n\n/**\n * An agent-drafted artifact from stream to editor, in one part. Pass the run's `artifacts` and\n * whether it is `busy`; it shows\n *\n * 1. the live `ArtifactCanvas` while the agent streams;\n * 2. \"Preparing editor...\" (the canvas stays readable underneath) while the finished draft is\n * cleaned (`cleanDraftMarkdown`), stored as version 1 of the artifact (`wpType: 'artifact'`)\n * and parsed by the backend, which can take up to about a minute;\n * 3. `ArtifactEditor` on the stored version (edit, save a new version, version list, compare\n * with track changes) when its text is ready;\n * 4. an error with Retry when storing or parsing fails.\n *\n * Needs `<ArbiProvider>` + React Query. The host imports the editor stylesheet\n * (`@mdxeditor/editor/style.css`) and defines the global `Prism` in a module it imports at app\n * start (see the Artifacts section of docs/design/blocks-package.md).\n *\n * ```tsx\n * const task = useConnectedAiTask()\n * <StreamedArtifact artifacts={task.artifacts} workspaceId={workspaceId} busy={task.status === 'running'} error={task.error} />\n * ```\n */\nexport function StreamedArtifact({\n artifacts,\n workspaceId,\n busy,\n error = null,\n stepCount,\n busyHint,\n emptyHint,\n className,\n testId = 'streamed-artifact',\n configId,\n parseRetry,\n clean,\n editorProps,\n onSaved,\n onSaveError,\n actions,\n hideDefaultActions,\n labels,\n testIds,\n}: StreamedArtifactProps) {\n const streamed = useStreamedArtifact({\n artifacts,\n workspaceId,\n settled: !busy && !error,\n configId,\n parseRetry,\n clean,\n })\n const canvas = (\n <ArtifactCanvas\n artifacts={artifacts}\n className={streamed.phase === 'streaming' ? className : undefined}\n busy={busy}\n busyHint={busyHint}\n stepCount={stepCount}\n error={error}\n emptyHint={emptyHint}\n />\n )\n return (\n <StreamedArtifactFrame\n phase={streamed.phase}\n canvas={canvas}\n className={className}\n error={streamed.error?.message}\n onRetry={streamed.retry}\n labels={labels}\n testIds={{ preparing: `${testId}-preparing`, error: `${testId}-error`, ...testIds }}\n >\n <Suspense fallback={canvas}>\n {streamed.docId && (\n <StreamedArtifactEditor\n key={streamed.docId}\n workspaceId={workspaceId}\n docId={streamed.docId}\n title={streamed.artifact?.title ?? 'Draft'}\n testId={testId}\n className={className}\n editorProps={editorProps}\n onSaved={onSaved}\n onSaveError={onSaveError}\n actions={actions}\n hideDefaultActions={hideDefaultActions}\n />\n )}\n </Suspense>\n </StreamedArtifactFrame>\n )\n}\n","/**\n * A stepped workflow run that lives in a work thread on the server. The thread's plan carries the\n * steps; its activity log says where each step is; the work runner starts each agent step as a\n * turn in the thread. This hook reads all of that and does the person's part: it starts the thread\n * (with the run's inputs and the steps' prompts composed from them), completes forms, uploads and\n * reviews, skips, and retries a failed step. A run whose first open step is an agent or action\n * step starts when the person presses Start: the thread is created and the server starts that\n * step. `WorkflowRunner` shows the result.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useActOnStep,\n useArbi,\n useConversationActivity,\n useConversationThreads,\n useConversations,\n useCreateWork,\n useWorkspaceUsers,\n type ConversationResponse,\n} from '@arbidocs/react'\nimport { fromPlanSteps, toPlanSteps, type TaskPlanStep } from '../agents/workflows/planSteps'\nimport {\n initialRunInputs,\n runThreadTitle,\n stepFields,\n stepStatesFromActivity,\n workflowSteps,\n type StepComposeOptions,\n type WorkflowActivityEvent,\n} from '../agents/workflows/run'\nimport { useWorkflowView, type WorkflowRunView } from '../agents/workflows/useWorkflowView'\nimport type {\n WorkflowDefinition,\n WorkflowInputs,\n WorkflowStep,\n WorkflowStepState,\n} from '../agents/workflows/types'\nimport { useConnectedWorkspace } from './ConnectionProvider'\n\nexport interface UseWorkflowThreadOptions extends StepComposeOptions {\n /**\n * An existing run to show (its thread). Absent: a new run starts when its first step is done,\n * or, when that is an agent or action step, when the person starts it.\n */\n conversationId?: string\n /** The thread was created (store its id to come back to the run). */\n onStarted?: (conversationId: string) => void\n /**\n * The host's commits, by step id (`commit: true` steps): done before the step is recorded, e.g.\n * create and open the matter the run belongs in (the thread is created in the open workspace).\n * May return inputs to merge into the run.\n */\n commit?: Record<string, (inputs: WorkflowInputs) => Promise<WorkflowInputs | void>>\n /** Prefills for a new run. */\n initialInputs?: WorkflowInputs\n /** The agent that runs the agent steps (`agt-…`); absent = the person's own assistant. */\n agentId?: string\n /**\n * The files added on an upload step in this run (doc ids): sent when it is completed, so the\n * step records exactly them.\n */\n documentsFor?: (stepId: string) => string[]\n}\n\nexport interface WorkflowThread {\n view: WorkflowRunView\n /** The run's thread, once it exists. */\n conversationId: string | undefined\n conversation: ConversationResponse | undefined\n /** A workspace member's name by id. */\n nameOf: (id: string) => string | undefined\n /** The workspace's people (not agents): what a person field offers. */\n people: Array<{ value: string; label: string }>\n}\n\nconst STARTING = new Set(['pending', 'running'])\n\n/**\n * The values a form or a fielded review collected (what is recorded with it on the thread). A\n * review's blank optional fields are left out: the server checks each one given.\n */\nfunction formValues(step: WorkflowStep, inputs: WorkflowInputs): WorkflowInputs | undefined {\n const fields = stepFields(step)\n if (!fields.length) return undefined\n if (step.kind === 'form')\n return Object.fromEntries(fields.map((f) => [f.name, inputs[f.name] ?? '']))\n const given = fields.flatMap((f) => {\n const v = inputs[f.name]\n return v === undefined || v === '' ? [] : [[f.name, v] as const]\n })\n return given.length ? Object.fromEntries(given) : undefined\n}\n\n/** How many times missing answers are fetched again before giving up (about three minutes). */\nexport const ANSWER_RETRY_CAP = 16\n\n/** The wait before the `attempt`th fetch of missing answers: at once, then 1s doubling to 15s. */\nexport function answerRetryDelay(attempt: number): number {\n return attempt === 0 ? 0 : Math.min(1000 * 2 ** (attempt - 1), 15_000)\n}\n\n/**\n * Fetch again, with backoff and a cap, while `missing` (the ids of finished steps' answers not\n * read yet) is not empty. A change in what is missing starts the count again.\n */\nfunction useAnswerRetry(missing: string, refetch: () => Promise<unknown>) {\n const [attempt, setAttempt] = useState(0)\n const [prev, setPrev] = useState(missing)\n if (prev !== missing) {\n setPrev(missing)\n setAttempt(0)\n }\n const refetchRef = useRef(refetch)\n refetchRef.current = refetch\n useEffect(() => {\n if (!missing || attempt >= ANSWER_RETRY_CAP) return\n const t = setTimeout(() => {\n void refetchRef.current()\n setAttempt((a) => a + 1)\n }, answerRetryDelay(attempt))\n return () => clearTimeout(t)\n }, [missing, attempt])\n}\n\nexport function useWorkflowThread(\n workflow: WorkflowDefinition,\n options: UseWorkflowThreadOptions = {}\n): WorkflowThread {\n const arbi = useArbi()\n const { ensureWorkspaceOpen, live, workspaceId } = useConnectedWorkspace()\n const wsId = workspaceId ?? undefined\n const [threadId, setThreadId] = useState(options.conversationId)\n const [localInputs, setLocalInputs] = useState<WorkflowInputs>(() =>\n initialRunInputs(workflow, options.initialInputs)\n )\n // What the person typed: it wins over the thread's copy, which only learns a form's values when\n // that step is completed (until then it holds them blank).\n const [edits, setEdits] = useState<WorkflowInputs>({})\n const [localStates, setLocalStates] = useState<Record<string, WorkflowStepState>>({})\n const createWork = useCreateWork()\n const actOnStep = useActOnStep()\n\n const conversations = useConversations(wsId, { enabled: !!threadId, live: true })\n const members = useWorkspaceUsers(wsId, {\n enabled: live && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const nameOf = useCallback(\n (id: string) => {\n const u = members.data?.find((m) => m.user.external_id === id)?.user\n return u ? [u.given_name, u.family_name].filter(Boolean).join(' ') || u.email : undefined\n },\n [members.data]\n )\n const conversation = conversations.data?.find((c) => c.external_id === threadId)\n const steps = useMemo(\n () =>\n workflowSteps(workflow).length > 0\n ? workflowSteps(workflow)\n : fromPlanSteps((conversation?.plan?.steps ?? []) as TaskPlanStep[]),\n [workflow, conversation?.plan?.steps]\n )\n\n // Poll while an agent step is on its way (the server starts it, then runs it).\n const activity = useConversationActivity(threadId, { live: !!threadId })\n const serverStates = useMemo(\n () => stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[]),\n [activity.data]\n )\n const working = steps.some(\n (s) =>\n (s.kind === 'agent' || s.kind === 'action') &&\n STARTING.has(serverStates[s.id]?.status ?? 'pending')\n )\n const threads = useConversationThreads(wsId, threadId, { enabled: !!threadId, live: working })\n // Only answers with text: the assistant's message exists (empty) from the moment its turn\n // starts and is filled when the turn ends, which can be after the step is recorded done.\n const answers = useMemo(() => {\n const byId = new Map<string, string>()\n for (const t of threads.data?.threads ?? [])\n for (const m of t.history)\n if (m.role === 'assistant' && m.content?.trim()) byId.set(m.external_id, m.content)\n return byId\n }, [threads.data])\n\n // A step can finish as the run stops (the last one always does): nothing is polled then, and\n // the activity log no longer changes. Fetch the messages again, backing off, until every\n // finished step's answer is in (or the cap is reached; a new missing answer starts again).\n const missing = Object.values(serverStates)\n .flatMap((st) =>\n st.status === 'done' && st.responseId && !answers.has(st.responseId) ? [st.responseId] : []\n )\n .sort()\n .join(' ')\n useAnswerRetry(missing, threads.refetch)\n\n const states = useMemo(() => {\n if (!threadId) return localStates\n const out: Record<string, WorkflowStepState> = {}\n for (const [id, s] of Object.entries(serverStates))\n out[id] = { ...s, text: s.responseId ? answers.get(s.responseId) : undefined }\n return out\n }, [threadId, localStates, serverStates, answers])\n\n const inputs = useMemo(\n () =>\n threadId\n ? { ...localInputs, ...(conversation?.skill_inputs ?? {}), ...edits }\n : { ...localInputs, ...edits },\n [threadId, localInputs, conversation?.skill_inputs, edits]\n ) as WorkflowInputs\n\n const refresh = useCallback(async () => {\n await Promise.all([activity.refetch(), conversations.refetch()])\n }, [activity, conversations])\n\n const act = useCallback(\n async (\n id: string,\n body: {\n step: string\n action: 'complete' | 'skip' | 'send_back' | 'decline'\n inputs?: WorkflowInputs\n documents?: string[]\n to?: string\n note?: string\n }\n ) => {\n await actOnStep.mutateAsync({ conversationId: id, body })\n await refresh()\n },\n [actOnStep, refresh]\n )\n\n // The run starts: its thread, in the workspace now open, with the steps and the inputs so far.\n // Creating it starts the first ready agent step on the server; the steps skipped before it existed\n // are then recorded (which starts what they made ready).\n const createThread = useCallback(\n async (values: WorkflowInputs, done?: string): Promise<string> => {\n await ensureWorkspaceOpen()\n const created = await createWork.mutateAsync({\n title: runThreadTitle(workflow, values).slice(0, 60),\n description: workflow.description || null,\n prompt: null,\n skill_ref: null,\n skill_inputs: values as Record<string, unknown>,\n agent_ext_id: options.agentId ?? null,\n auth_mode: 'run_now_temp',\n plan: {\n goal: '',\n criteria: [],\n max_passes: 3,\n documents: [],\n steps: toPlanSteps(workflow, {\n inputs: values,\n resolveWorkflow: options.resolveWorkflow,\n compose: options.compose,\n }),\n },\n })\n const id = created.external_id\n setThreadId(id)\n if (done) setLocalStates((s) => ({ ...s, [done]: { status: 'done' } }))\n options.onStarted?.(id)\n for (const [stepId, st] of Object.entries(localStates))\n if (st.status === 'skipped')\n await actOnStep.mutateAsync({\n conversationId: id,\n body: { step: stepId, action: 'skip' },\n })\n return id\n },\n [ensureWorkspaceOpen, createWork, workflow, options, localStates, actOnStep]\n )\n\n const complete = useCallback(\n async (step: WorkflowStep) => {\n let values = inputs\n const commit = step.commit ? options.commit?.[step.id] : undefined\n if (commit && localStates[step.id]?.status !== 'done') {\n values = { ...values, ...((await commit(values)) ?? {}) }\n setLocalInputs(values)\n setEdits({})\n }\n const id = threadId ?? (await createThread(values, step.id))\n const documents = step.kind === 'upload' ? options.documentsFor?.(step.id) : undefined\n await act(id, {\n step: step.id,\n action: 'complete',\n inputs: formValues(step, values),\n ...(documents?.length ? { documents } : {}),\n })\n },\n [inputs, options, localStates, threadId, createThread, act]\n )\n\n // Start the ready agent or action step nothing else will start: create the run's thread (the\n // server starts the step), or run the thread again (the server could not start it before).\n const start = useCallback(async () => {\n if (!threadId) {\n await createThread(inputs)\n await refresh()\n return\n }\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n }, [threadId, createThread, inputs, arbi, refresh])\n\n const skip = useCallback(\n async (stepId: string) => {\n if (!threadId) {\n setLocalStates((s) => ({ ...s, [stepId]: { status: 'skipped' } }))\n return\n }\n await act(threadId, { step: stepId, action: 'skip' })\n },\n [threadId, act]\n )\n\n const retry = useCallback(\n async (_stepId: string) => {\n if (!threadId) return\n // Running the thread again retries its failed step.\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n },\n [arbi, threadId, refresh]\n )\n\n const sendBack = useCallback(\n async (stepId: string, to: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'send_back', to, ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n const decline = useCallback(\n async (stepId: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'decline', ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n // A run opened later opens where it is once its log has arrived (not at its first step).\n const loaded = !options.conversationId || activity.isSuccess || activity.isError\n\n // Nothing will start a ready agent or action step unless the person does: there is no thread\n // yet, or the thread's run is not under way (it could not start: `last_error` says why).\n const idle = !!conversation && !conversation.in_progress\n const anyRunning = Object.values(states).some((s) => s.status === 'running')\n const needsStart = !threadId || (idle && !anyRunning)\n const runError = idle ? (conversation?.last_error ?? null) : null\n\n const view = useWorkflowView({\n steps,\n states,\n inputs,\n setInput: (name, value) => setEdits((i) => ({ ...i, [name]: value })),\n complete,\n skip,\n retry,\n start,\n needsStart,\n runError,\n sendBack,\n decline,\n nameOf,\n loaded,\n isLocked: (id) => states[id]?.status === 'done',\n })\n\n const people = useMemo(\n () =>\n (members.data ?? [])\n .filter((m) => !m.user.external_id.startsWith('agt-'))\n .map((m) => ({\n value: m.user.external_id,\n label: nameOf(m.user.external_id) ?? m.user.external_id,\n })),\n [members.data, nameOf]\n )\n\n return { view, conversationId: threadId, conversation, nameOf, people }\n}\n","/**\n * A workflow run's thread, live and interactive: the blocks `ChatPage` held to the run's one\n * conversation (people ask follow-ups, see the answers and their sources, open documents), with\n * the current step's panel beside it (`aside`). Step messages show as their step's chip.\n */\n\nimport { useEffect, type ReactNode } from 'react'\nimport { useArbiChat } from '@arbidocs/react'\nimport { ChatPage } from '../chat/ChatPage'\nimport type { ChatCitationTarget, ChatPageLabels, WorkflowStepView } from '../chat/chat-page-types'\n\nexport interface WorkflowRunThreadProps {\n conversationId: string\n workspaceId: string | undefined\n /** The current step's panel. */\n aside?: ReactNode\n /** A step by id: its title, kind and phase (step messages show as its chip). */\n stepOf?: (stepId: string) => WorkflowStepView | undefined\n /** Scroll to and mark this message (a step's answer). */\n targetMessageId?: string\n onOpenCitation?: (target: ChatCitationTarget) => void\n labels?: Partial<ChatPageLabels>\n className?: string\n}\n\nexport function WorkflowRunThread({\n conversationId,\n workspaceId,\n aside,\n stepOf,\n targetMessageId,\n onOpenCitation,\n labels,\n className,\n}: WorkflowRunThreadProps) {\n const chat = useArbiChat({ workspaceId })\n const listed = chat.threads.some((t) => t.id === conversationId)\n const { selectThread, activeThreadId } = chat\n // The run's conversation, once the workspace's list has it.\n useEffect(() => {\n if (listed && activeThreadId !== conversationId) selectThread(conversationId)\n }, [listed, activeThreadId, conversationId, selectThread])\n\n return (\n <ChatPage\n chat={{ ...chat, threads: chat.threads.filter((t) => t.id === conversationId) }}\n singleThread\n documentsRequired={false}\n aside={aside}\n asideBreakpoint={52}\n workflowStepOf={stepOf}\n targetMessageId={targetMessageId}\n onOpenCitation={onOpenCitation}\n labels={labels}\n className={className ?? 'h-[min(78dvh,860px)] min-h-[480px] rounded-xl border border-border'}\n />\n )\n}\n","/**\n * What the connected runner opens itself when the host does not take over: the sign flow for a\n * signature step (the blocks `SignDocumentDialog` on the document's PDF), the native Word editor\n * for a tracked-changes version, and a tabular review's grid (its documents by its columns).\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useArbi, useDocuments, useTags } from '@arbidocs/react'\nimport {\n DocumentToolsProvider,\n fetchDocumentPdf,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { Loader2 } from 'lucide-react'\nimport { SignDocumentDialog } from '../document-tools/SignDocumentDialog'\nimport { ModalScaffold } from '../settings/ModalScaffold'\nimport { splitDocRef } from '../agents/workflows/run'\nimport { ConnectedNativeDocxEditor } from './docx/ConnectedNativeDocxEditor'\nimport { useConnectedWorkspace } from './ConnectionProvider'\n\nexport interface WorkflowRunnerDialogLabels {\n loadingDocument: string\n preparingDocument: string\n documentFailed: string\n reviewTitle: string\n reviewDescription: string\n document: string\n empty: string\n showMore: string\n showLess: string\n wordTitle: string\n}\n\nexport const DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS: WorkflowRunnerDialogLabels = {\n loadingDocument: 'Opening the document…',\n preparingDocument: 'The PDF is still being prepared…',\n documentFailed: 'The document could not be opened.',\n reviewTitle: 'Review',\n reviewDescription: 'Each document against each review column.',\n document: 'Document',\n empty: '—',\n showMore: 'Show more',\n showLess: 'Show less',\n wordTitle: 'Tracked changes',\n}\n\n/** How often, and how long apart, the PDF is fetched again while it is still being rendered. */\nexport const SIGN_PDF_RETRIES = 4\nexport const SIGN_PDF_RETRY_DELAY_MS = 1500\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\n/**\n * The sign flow on one document version: its PDF is fetched, then the blocks sign dialog.\n *\n * What is signed is the PDF `GET /view?version=` serves (a Word or Markdown document's rendition),\n * never the original's download, so the hash the server checks is of the bytes shown here. A\n * rendition still being written is fetched again a few times; a version superseded since the step\n * was set offers the current one instead.\n */\nexport function WorkflowSignDialog({\n docRef,\n onClose,\n labels,\n}: {\n /** `doc-…` or `doc-…@v3`. */\n docRef: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const arbi = useArbi()\n const { user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const tools = useOptionalDocumentTools()\n const { id, version: stepVersion } = splitDocRef(docRef)\n // The version the step names, until the signer opens the current one instead.\n const [version, setVersion] = useState(stepVersion)\n const [pdf, setPdf] = useState<Blob | null>(null)\n const [preparing, setPreparing] = useState(false)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let live = true\n setPdf(null)\n setFailed(false)\n setPreparing(false)\n void (async () => {\n try {\n await ensureWorkspaceOpen()\n const client = arbi.getClient().fetch\n const ref = version ? `${id}@v${version}` : id\n for (let attempt = 0; ; attempt++) {\n try {\n const blob = await fetchDocumentPdf(client, ref)\n if (live) setPdf(blob)\n return\n } catch (err) {\n if (!live || attempt >= SIGN_PDF_RETRIES) throw err\n setPreparing(true)\n await wait(SIGN_PDF_RETRY_DELAY_MS)\n if (!live) return\n }\n }\n } catch {\n if (live) setFailed(true)\n }\n })()\n return () => {\n live = false\n }\n }, [arbi, id, version, ensureWorkspaceOpen])\n\n if (!pdf)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.loadingDocument}\n size=\"sm\"\n testId=\"workflow-sign-loading\"\n >\n <ModalScaffold.Body>\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {failed ? (\n labels.documentFailed\n ) : (\n <>\n <Loader2 className=\"size-4 animate-spin\" />{' '}\n {preparing ? labels.preparingDocument : labels.loadingDocument}\n </>\n )}\n </p>\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n const dialog = (\n <SignDocumentDialog\n // A new PDF is a new signing: the form starts again on it.\n key={version ?? 'current'}\n open\n onOpenChange={(o) => !o && onClose()}\n documentId={id}\n pdfBlob={pdf}\n version={version}\n // Superseded since the step was set: sign the current version, after seeing it.\n onOpenCurrent={() => setVersion(undefined)}\n />\n )\n // A host with its own document tools keeps them (its notices, its document opening).\n return tools ? (\n dialog\n ) : (\n <DocumentToolsProvider\n client={arbi.getClient().fetch}\n user={user ? { name: user.name, email: user.email } : null}\n >\n {dialog}\n </DocumentToolsProvider>\n )\n}\n\n/** A tracked-changes version in the native Word editor. */\nexport function WorkflowWordDialog({\n docRef,\n title,\n onClose,\n labels,\n}: {\n docRef: string\n title?: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { id } = splitDocRef(docRef)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={title ?? labels.wordTitle}\n size=\"xl\"\n testId=\"workflow-word-dialog\"\n >\n <ModalScaffold.Body className=\"h-[70dvh] p-0\">\n <ConnectedNativeDocxEditor documentId={id} title={title ?? labels.wordTitle} />\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/** A tabular review's grid: each document (row) against each column (label), with its value. */\nexport function WorkflowReviewGridDialog({\n tags,\n documents,\n onClose,\n onOpenDocument,\n labels,\n}: {\n tags: string[]\n documents: string[]\n onClose: () => void\n onOpenDocument?: (docId: string) => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { workspaceId } = useConnectedWorkspace()\n const allTags = useTags(workspaceId ?? undefined)\n // The workspace's documents carry their review values (doctags); the review's rows are its own.\n const all = useDocuments(workspaceId ?? undefined)\n // The grid waits for its column names and for documents fetched since it opened: before, its\n // headers would be the raw tag ids and its cells the values cached before the review ran.\n const isLoading =\n allTags.isLoading || all.isLoading || (all.isFetching && !all.isFetchedAfterMount)\n const docs = (all.data ?? []).filter((d) => documents.includes(d.external_id))\n const columns = useMemo(\n () =>\n tags.map((id) => ({\n id,\n name: allTags.data?.find((t) => t.external_id === id)?.name ?? id,\n })),\n [tags, allTags.data]\n )\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.reviewTitle}\n description={labels.reviewDescription}\n showDescription\n size=\"xl\"\n testId=\"workflow-review-grid\"\n >\n <ModalScaffold.Body className=\"overflow-auto\">\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </p>\n ) : (\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n <th className=\"sticky left-0 z-10 border-b border-border bg-background p-2 text-left align-bottom font-medium\">\n {labels.document}\n </th>\n {columns.map((c) => (\n <th\n key={c.id}\n className=\"border-b border-border p-2 text-left align-bottom font-medium\"\n >\n <div className={`${VALUE_WIDTH} line-clamp-2 break-words`} title={c.name}>\n {c.name}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {docs.map((d) => (\n <tr key={d.external_id} data-testid={`workflow-review-grid-row-${d.external_id}`}>\n <td className=\"sticky left-0 z-10 border-b border-border bg-background p-2 align-top\">\n <DocumentName onClick={onOpenDocument && (() => onOpenDocument(d.external_id))}>\n {d.file_name ?? d.external_id}\n </DocumentName>\n </td>\n {columns.map((c) => {\n const note = d.doctags?.find((t) => t.tag_ext_id === c.id)?.note\n return (\n <td\n key={c.id}\n className=\"border-b border-border p-2 align-top text-muted-foreground\"\n >\n <ReviewValue value={note || labels.empty} labels={labels} />\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/*\n * Widths sit on a block inside each cell: an auto-layout table ignores `max-width` on a cell, so a\n * long file name or answer would otherwise widen its column, or (without wrapping) spill into the\n * next one. The grid scrolls sideways when the columns do not fit.\n */\nconst DOCUMENT_WIDTH = 'w-40 sm:w-56'\nconst VALUE_WIDTH = 'min-w-48 max-w-80'\n\n/** The row's document: its name wraps over two lines at most, the full name on hover. */\nfunction DocumentName({ onClick, children }: { onClick?: () => void; children: string }) {\n const className = `${DOCUMENT_WIDTH} line-clamp-2 break-words text-left font-medium`\n return onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n title={children}\n className={`${className} text-primary hover:underline`}\n >\n {children}\n </button>\n ) : (\n <div title={children} className={className}>\n {children}\n </div>\n )\n}\n\n/** A review value: four lines, then a toggle to read the rest in place. */\nfunction ReviewValue({ value, labels }: { value: string; labels: WorkflowRunnerDialogLabels }) {\n const ref = useRef<HTMLDivElement>(null)\n const [expanded, setExpanded] = useState(false)\n const [clamped, setClamped] = useState(false)\n useLayoutEffect(() => {\n const el = ref.current\n if (el && !expanded) setClamped(el.scrollHeight > el.clientHeight + 1)\n }, [value, expanded])\n return (\n <div className={VALUE_WIDTH}>\n <div\n ref={ref}\n title={clamped && !expanded ? value : undefined}\n className={`whitespace-pre-line break-words ${expanded ? '' : 'line-clamp-4'}`}\n >\n {value}\n </div>\n {(clamped || expanded) && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-1 text-xs font-medium text-primary hover:underline\"\n >\n {expanded ? labels.showLess : labels.showMore}\n </button>\n )}\n </div>\n )\n}\n","/**\n * A stepped workflow run in its work thread, end to end: `useWorkflowThread` keeps the run on the\n * server (the thread's plan, its activity, its turns) and `WorkflowRunner` shows it. Agent answers\n * are the thread's messages; uploads go into the open workspace; a review can notify the people\n * who should approve it, in the run's thread. The host keeps its wording, its commits\n * (`options.commit`) and its finish screen.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AiAnswer, useArbi, useDocuments, useWorkspaceUsers } from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ExternalLink, Loader2, MessageSquare } from 'lucide-react'\nimport {\n WorkflowRunner,\n type WorkflowRunnerFile,\n type WorkflowRunnerProps,\n} from '../agents/workflows/WorkflowRunner'\nimport type { WorkflowRunnerActions } from '../agents/workflows/StepParts'\nimport { WorkflowStepBar } from '../agents/workflows/WorkflowStepBar'\nimport { splitDocRef, stepLevels } from '../agents/workflows/run'\nimport { stepKindOf } from '../agents/workflows/stepKinds'\nimport { stepDocuments } from '../agents/workflows/StepDocuments'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowStepState,\n WorkflowUploadStep,\n} from '../agents/workflows/types'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useWorkflowThread, type UseWorkflowThreadOptions } from './useWorkflowThread'\nimport { WorkflowRunThread } from './WorkflowRunThread'\nimport type { ChatCitationTarget } from '../chat/chat-page-types'\nimport {\n DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS,\n WorkflowReviewGridDialog,\n WorkflowSignDialog,\n WorkflowWordDialog,\n type WorkflowRunnerDialogLabels,\n} from './WorkflowRunnerDialogs'\n\nexport interface ConnectedWorkflowRunnerLabels {\n notify: string\n /** An agent step's answer, in the thread layout: a link to it in the thread. */\n showInThread: string\n /** The thread layout's panel toggle, when the panel folds (a narrow container). */\n currentStep: string\n /** A finished step whose answer is still being fetched. */\n loadingAnswer: string\n notified: string\n openThread: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS: ConnectedWorkflowRunnerLabels = {\n notify: 'Ask to approve',\n showInThread: 'Show in the thread',\n currentStep: 'Current step',\n notified: 'Notified.',\n openThread: 'Open the thread',\n loadingAnswer: 'Fetching the answer…',\n}\n\nexport interface ConnectedWorkflowRunnerProps extends Omit<\n WorkflowRunnerProps,\n | 'run'\n | 'renderAgentOutput'\n | 'onUpload'\n | 'uploading'\n | 'files'\n | 'onRetryUpload'\n | 'onRemoveUpload'\n | 'renderReview'\n | 'actions'\n | 'nameOfDoc'\n> {\n workflow: WorkflowDefinition\n /** The run's bindings: an existing thread, commits, prompt wording, workflow lookup. */\n options?: UseWorkflowThreadOptions\n /** Open a conversation (the run's thread): the host navigates. */\n onOpenConversation?: (conversationId: string) => void\n /** The muted line an agent step shows before its answer. */\n emptyHint?: (step: WorkflowAgentStep) => string | undefined\n connectedLabels?: Partial<ConnectedWorkflowRunnerLabels>\n /**\n * Open a document (a version: `version`; at a page: `page`, from a citation): the host\n * navigates. Absent: no document links. In the thread layout a citation opens its document with\n * it too, unless `onOpenCitation` is given.\n */\n onOpenDocument?: (documentId: string, version?: number, page?: number) => void\n /**\n * The thread layout's citation open action, as `ChatPage`'s `onOpenCitation` (the cited\n * document, page and passage). Absent: `onOpenDocument`; neither: citations offer no open.\n */\n onOpenCitation?: (target: ChatCitationTarget) => void\n /** Open an email step's draft in native mail (the host's mail screen). Absent: no button. */\n onOpenDraft?: (draftId: string) => void\n /** Show an answer in the run's thread. Absent: no link. */\n onOpenMessage?: (messageId: string) => void\n /**\n * Take over what the runner otherwise opens itself: the sign flow, the Word editor for a\n * tracked-changes version, a tabular review's grid.\n */\n actions?: Pick<WorkflowRunnerActions, 'sign' | 'openRedline' | 'openReview'>\n dialogLabels?: Partial<WorkflowRunnerDialogLabels>\n /**\n * `thread` (default): once the run has its thread, the page is that thread, live (follow-ups,\n * answers with their sources, documents), with the step bar on top and the current step in a\n * compact panel beside it; steps' answers link to their message instead of being repeated.\n * Before the thread exists (the first form), and with `guided`, it is the stepper: one step at\n * a time, each answer shown in full.\n */\n layout?: 'thread' | 'guided'\n /**\n * Which of the workspace's documents an upload step lists (the files \"in this matter\"): the\n * host hides what is not the matter's own, e.g. skill files kept as workspace documents —\n * `(doc) => !(doc.folder ?? '').startsWith('skills')`. Files added on the run's upload steps are\n * always listed. Absent: every document.\n */\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean\n}\n\n/** A workspace document, as `fileFilter` sees it. */\nexport type WorkflowRunnerDocument = NonNullable<ReturnType<typeof useDocuments>['data']>[number]\n\n/** What the runner has open itself. */\ntype OpenDialog =\n | { kind: 'sign'; docRef: string }\n | { kind: 'word'; docRef: string; title: string }\n | { kind: 'review'; tags: string[]; documents: string[] }\n\nexport function ConnectedWorkflowRunner({\n workflow,\n options,\n onOpenConversation,\n emptyHint,\n connectedLabels,\n onOpenDocument,\n onOpenCitation,\n onOpenDraft,\n onOpenMessage,\n actions: hostActions,\n dialogLabels,\n layout = 'thread',\n fileFilter,\n testIdPrefix = 'workflow-run',\n ...runnerProps\n}: ConnectedWorkflowRunnerProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels }\n const dl = { ...DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS, ...dialogLabels }\n const arbi = useArbi()\n const { ensureWorkspaceOpen, userId, workspaceId } = useConnectedWorkspace()\n const wsId = workspaceId ?? undefined\n const { data: docs = [], refetch } = useDocuments(wsId)\n // The files being sent on the run's upload steps, and those that did not upload (until retried\n // or removed): the step waits for them.\n const [sending, setSending] = useState<PendingUpload[]>([])\n // The files added on each upload step in this run (doc id -> step id), and their names (listed\n // under them before the workspace's documents catch up).\n const [added, setAdded] = useState<Record<string, string>>({})\n const [addedNames, setAddedNames] = useState<Record<string, string>>({})\n const addedRef = useRef(added)\n addedRef.current = added\n const { view, conversationId, people } = useWorkflowThread(workflow, {\n ...options,\n // An upload step records exactly the files added on it (else the server's guess).\n documentsFor:\n options?.documentsFor ??\n ((stepId) =>\n Object.entries(addedRef.current).flatMap(([doc, step]) => (step === stepId ? [doc] : []))),\n })\n const [dialog, setDialog] = useState<OpenDialog | null>(null)\n const inThread = layout === 'thread' && !!conversationId\n // The message the thread scrolls to (a step's answer, picked from the panel).\n const [target, setTarget] = useState<string | undefined>(undefined)\n const nameOfDoc = useCallback(\n (id: string) => docs.find((d) => d.external_id === id)?.file_name ?? undefined,\n [docs]\n )\n const actions = useMemo<WorkflowRunnerActions>(\n () => ({\n me: userId,\n openDocument:\n onOpenDocument &&\n ((ref) => {\n const { id, version } = splitDocRef(ref)\n onOpenDocument(id, version)\n }),\n openDraft: onOpenDraft && ((draftId) => onOpenDraft(draftId)),\n // In the thread layout an answer is right there: scroll to it.\n openMessage: inThread ? setTarget : onOpenMessage,\n sign:\n hostActions?.sign ??\n ((_step, state) => {\n const w = state.waiting\n if (w?.doc_ext_id) setDialog({ kind: 'sign', docRef: w.doc_ext_id })\n }),\n openRedline:\n hostActions?.openRedline ??\n ((ref) =>\n setDialog({ kind: 'word', docRef: ref, title: nameOfDoc(splitDocRef(ref).id) ?? '' })),\n openReview:\n hostActions?.openReview ??\n ((tags, documents) => setDialog({ kind: 'review', tags, documents })),\n }),\n [userId, onOpenDocument, onOpenDraft, onOpenMessage, hostActions, nameOfDoc, inThread]\n )\n\n // A citation in the thread opens its document as the regular chat does (the host's handler).\n const openCitation = useMemo<((target: ChatCitationTarget) => void) | undefined>(\n () =>\n onOpenCitation ??\n (onOpenDocument &&\n ((t) => {\n const docId = t.documentId ?? t.passage?.documentId\n if (docId) onOpenDocument(docId, undefined, t.page ?? t.passage?.page ?? undefined)\n })),\n [onOpenCitation, onOpenDocument]\n )\n\n const uploadSeq = useRef(0)\n const sendingRef = useRef(sending)\n sendingRef.current = sending\n // Send these files for a step, one after another; one that fails stays listed with its error.\n const send = useCallback(\n async (batch: PendingUpload[]) => {\n if (!batch.length) return\n const keys = new Set(batch.map((p) => p.key))\n const mark = (key: string, patch: Partial<PendingUpload> | null) =>\n setSending((all) =>\n patch === null\n ? all.filter((p) => p.key !== key)\n : all.map((p) => (p.key === key ? { ...p, ...patch } : p))\n )\n setSending((all) => [\n ...all.filter((p) => !keys.has(p.key)),\n ...batch.map((p) => ({ ...p, status: 'uploading' as const, error: undefined })),\n ])\n try {\n // The server resolves the target workspace from the session: make sure it is open.\n await ensureWorkspaceOpen()\n } catch (e) {\n for (const p of batch) mark(p.key, { status: 'failed', error: uploadError(e) })\n return\n }\n for (const p of batch) {\n try {\n const { doc_ext_ids = [] } = (await arbi.documents.uploadFile(p.file, p.file.name)) ?? {}\n if (!doc_ext_ids.length) throw new Error('No document came back')\n setAdded((a) => ({\n ...a,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.stepId])),\n }))\n setAddedNames((n) => ({\n ...n,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.file.name])),\n }))\n mark(p.key, null)\n } catch (e) {\n mark(p.key, { status: 'failed', error: uploadError(e) })\n }\n }\n await refetch()\n },\n [arbi, ensureWorkspaceOpen, refetch]\n )\n const onUpload = useCallback(\n (files: File[], step: WorkflowUploadStep) =>\n send(\n files.map((file) => ({\n key: `upload-${++uploadSeq.current}`,\n file,\n stepId: step.id,\n status: 'uploading' as const,\n }))\n ),\n [send]\n )\n const onRetryUpload = useCallback(\n (file: WorkflowRunnerFile) => {\n const p = sendingRef.current.find((x) => x.key === file.id)\n if (p) void send([p])\n },\n [send]\n )\n const onRemoveUpload = useCallback(\n (file: WorkflowRunnerFile) => setSending((all) => all.filter((p) => p.key !== file.id)),\n []\n )\n\n const files = [\n ...sending.map<WorkflowRunnerFile>((p) => ({\n id: p.key,\n name: p.file.name,\n status: p.status === 'failed' ? 'upload-failed' : 'uploading',\n error: p.error,\n addedFor: p.stepId,\n })),\n ...runnerFiles(docs, added, fileFilter, addedNames),\n ]\n // Watch the files just added until they are read (the step waits for them).\n const reading = files.some((f) => f.addedFor && f.status === 'processing')\n useEffect(() => {\n if (!reading) return\n const t = setInterval(() => void refetch(), READ_POLL_MS)\n return () => clearInterval(t)\n }, [reading, refetch])\n\n const renderAgentOutput = (step: WorkflowAgentStep, state: WorkflowStepState | undefined) => {\n const status = state?.status\n // Beside the thread an answer is not repeated: it links to its message.\n if (inThread) {\n const id = state?.responseId\n return id && status === 'done' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setTarget(id)}\n data-testid={`${testIdPrefix}-${step.id}-show-in-thread`}\n >\n <MessageSquare className=\"size-4\" /> {l.showInThread}\n </Button>\n ) : null\n }\n if (!state?.text && status !== 'done') return null\n // Finished, its answer not read yet (the thread is fetched again until it is).\n if (!state?.text && state?.responseId) {\n return (\n <p\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-${step.id}-answer-loading`}\n >\n <Loader2 className=\"size-4 animate-spin\" /> {l.loadingAnswer}\n </p>\n )\n }\n return (\n <AiAnswer\n status={status === 'running' ? 'running' : 'done'}\n text={state?.text ?? ''}\n emptyHint={emptyHint?.(step)}\n testId={`${testIdPrefix}-${step.id}-answer`}\n />\n )\n }\n\n const runner = (compact: boolean) => (\n <WorkflowRunner\n people={people}\n {...runnerProps}\n workflow={workflow}\n run={view}\n renderAgentOutput={renderAgentOutput}\n renderReview={(step) =>\n conversationId ? (\n <ReviewNotify\n conversationId={conversationId}\n workspaceId={wsId}\n labels={l}\n testId={`${testIdPrefix}-${step.id}`}\n />\n ) : null\n }\n onUpload={onUpload}\n uploading={sending.some((p) => p.status === 'uploading')}\n files={files}\n onRetryUpload={onRetryUpload}\n onRemoveUpload={onRemoveUpload}\n actions={actions}\n nameOfDoc={nameOfDoc}\n testIdPrefix={testIdPrefix}\n hideStepBar={compact}\n compact={compact}\n className={compact ? undefined : runnerProps.className}\n />\n )\n\n return (\n <div className=\"space-y-3\">\n {conversationId && onOpenConversation && (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenConversation(conversationId)}\n data-testid={`${testIdPrefix}-open-thread`}\n >\n <ExternalLink className=\"size-4\" /> {l.openThread}\n </Button>\n </div>\n )}\n {inThread && conversationId ? (\n <>\n <WorkflowStepBar\n run={view}\n levels={stepLevels(view.steps)}\n doneTitle={\n (workflow.run.kind === 'steps' ? workflow.run.completion?.title : undefined) ??\n runnerProps.labels?.complete ??\n 'Done'\n }\n icon={(key) =>\n key && runnerProps.renderIcon ? runnerProps.renderIcon(key) : undefined\n }\n tid={(suffix) => `${testIdPrefix}-${suffix}`}\n />\n <WorkflowRunThread\n conversationId={conversationId}\n workspaceId={wsId}\n stepOf={(id) => {\n const step = view.steps.find((s) => s.id === id)\n if (!step) return undefined\n // Its document, one click from its chip: the latest version, in the host's viewer\n // (else the Word dialog).\n const states = Object.fromEntries(\n view.steps.flatMap((s) => {\n const state = view.stateOf(s.id)\n return state ? [[s.id, state]] : []\n })\n )\n const ref = stepDocuments(view.steps, states, id).at(-1)\n const open = actions.openDocument ?? actions.openRedline\n return {\n title: step.title,\n kind: stepKindOf(step),\n phase: view.phaseOf(id),\n document:\n ref && open\n ? { name: nameOfDoc(splitDocRef(ref).id) ?? ref, onOpen: () => open(ref) }\n : undefined,\n }\n }}\n targetMessageId={target}\n onOpenCitation={openCitation}\n labels={{ workflows: l.currentStep }}\n aside={runner(true)}\n />\n </>\n ) : (\n runner(false)\n )}\n {dialog?.kind === 'sign' && (\n <WorkflowSignDialog docRef={dialog.docRef} onClose={() => setDialog(null)} labels={dl} />\n )}\n {dialog?.kind === 'word' && (\n <WorkflowWordDialog\n docRef={dialog.docRef}\n title={dialog.title || undefined}\n onClose={() => setDialog(null)}\n labels={dl}\n />\n )}\n {dialog?.kind === 'review' && (\n <WorkflowReviewGridDialog\n tags={dialog.tags}\n documents={dialog.documents}\n onClose={() => setDialog(null)}\n onOpenDocument={onOpenDocument && ((id) => onOpenDocument(id))}\n labels={dl}\n />\n )}\n </div>\n )\n}\n\nconst READ_POLL_MS = 3000\n\n/** A file being sent on an upload step, or one that did not upload (`error`). */\ninterface PendingUpload {\n key: string\n file: File\n stepId: string\n status: 'uploading' | 'failed'\n error?: string\n}\n\nfunction uploadError(e: unknown): string {\n return e instanceof Error && e.message ? e.message : String(e || 'Upload failed')\n}\n\n/**\n * The upload step's files: the workspace's documents the host's `fileFilter` keeps, plus every\n * file added on one of the run's upload steps (`added`: doc id -> step id), which the step waits on.\n * A file added that the workspace does not list yet is shown as being read (`names` gives its name).\n */\nexport function runnerFiles(\n docs: WorkflowRunnerDocument[],\n added: Record<string, string>,\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean,\n names: Record<string, string> = {}\n): WorkflowRunnerFile[] {\n const listed = new Set(docs.map((d) => d.external_id))\n return [\n ...docs\n .filter((d) => !fileFilter || added[d.external_id] || fileFilter(d))\n .map((d) => ({\n id: d.external_id,\n name: d.file_name ?? d.external_id,\n status: fileStatus(d.status),\n addedFor: added[d.external_id],\n })),\n ...Object.entries(added)\n .filter(([id]) => !listed.has(id))\n .map(([id, stepId]) => ({\n id,\n name: names[id] ?? id,\n status: 'processing' as const,\n addedFor: stepId,\n })),\n ]\n}\n\n/** A document's processing status as the upload step shows it; unknown stays unknown. */\nexport function fileStatus(status: string | null | undefined): WorkflowRunnerFile['status'] {\n const s = status?.toLowerCase()\n if (!s) return undefined\n if (s === 'failed') return 'failed'\n if (s === 'completed' || s === 'empty' || s === 'low-content') return 'ready'\n return 'processing'\n}\n\n/** Who should approve: the workspace's people (not agents), notified about the run's thread. */\nfunction ReviewNotify({\n conversationId,\n workspaceId,\n labels,\n testId,\n}: {\n conversationId: string\n workspaceId: string | undefined\n labels: ConnectedWorkflowRunnerLabels\n testId: string\n}) {\n const arbi = useArbi()\n const { live, userId, ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: members = [] } = useWorkspaceUsers(workspaceId, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const people = members.filter(\n (m) =>\n !m.agent_ext_id && !m.user.external_id.startsWith('agt-') && m.user.external_id !== userId\n )\n const [picked, setPicked] = useState<string[]>([])\n const [sent, setSent] = useState(false)\n const [busy, setBusy] = useState(false)\n if (people.length === 0) return null\n const toggle = (id: string) =>\n setPicked((p) => (p.includes(id) ? p.filter((x) => x !== id) : [...p, id]))\n\n return (\n <div className=\"space-y-3\" data-testid={`${testId}-notify`}>\n <div className=\"flex flex-wrap gap-1.5\">\n {people.map((m) => {\n const name =\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email\n const on = picked.includes(m.user.external_id)\n return (\n <button\n key={m.user.external_id}\n type=\"button\"\n onClick={() => toggle(m.user.external_id)}\n aria-pressed={on}\n className={cn(\n 'rounded-full border px-2.5 py-1 text-xs',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground'\n )}\n data-testid={`${testId}-person-${m.user.external_id}`}\n >\n {name}\n </button>\n )\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={!picked.length || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await arbi.conversations.notify(conversationId, picked)\n setSent(true)\n } finally {\n setBusy(false)\n }\n }}\n data-testid={`${testId}-notify-send`}\n >\n {labels.notify}\n </Button>\n {sent && <span className=\"text-xs text-muted-foreground\">{labels.notified}</span>}\n </div>\n </div>\n )\n}\n","/**\n * `TagTable` bound to the connection: every tag of a kind in the workspace (`kind=\"issue\"`: every\n * issue), or with `parentId` a label's children. The columns are the kind's fields in the\n * workspace (`useTagKindSchema`), edited in place and saved as the kind's schema\n * (`useUpdateTagKindSchema`); the rows are the tag list filtered by kind with links (`useTags`),\n * their cells saved with `useSetTagValues`. \"Add row\" creates a tag of the kind (issues, people\n * and organisations are flat: no parent). The workspace's people fill person columns, and the\n * snapshot is filed in the workspace as a Word document (`.docx`, so it opens in the Word editor;\n * its id goes to `onExported`, so a host can open it or send it for signature) or downloaded.\n */\n\nimport { useMemo, useState } from 'react'\nimport type { components } from '@arbidocs/client'\nimport {\n useArbi,\n useInvalidateTagData,\n useSetTagValues,\n useTagKindSchema,\n useTags,\n useUpdateTagKindSchema,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { TagTable, type TagTableProps } from '../tags/TagTable'\nimport { DOCX_MIME_TYPE, tagTableDocx } from '../tags/tagTableDocx'\nimport type { TagTableData } from '../tags/tagTableModel'\nimport { useConnection } from './ConnectionProvider'\n\n/** What a tag is: a label, annotation, search, issue, person or organisation. */\ntype TagKind = NonNullable<components['schemas']['TagResponse']['kind']>\n\n/** Kinds that are flat: their tags have no parent. */\nconst FLAT_KINDS: readonly TagKind[] = ['issue', 'person', 'organisation']\n\n/** The title of a table of a kind (its export's default title). */\nconst KIND_TITLES: Record<TagKind, string> = {\n label: 'Labels',\n annotation: 'Annotations',\n search: 'Searches',\n issue: 'Issues',\n person: 'People',\n organisation: 'Organisations',\n}\n\nexport interface ConnectedTagTableProps extends Pick<\n TagTableProps,\n | 'onOpenDocument'\n | 'onOpenFact'\n | 'onOpenThread'\n | 'onOpenRow'\n | 'actions'\n | 'labels'\n | 'className'\n | 'testId'\n> {\n /** The rows are the workspace's tags of this kind, oldest first; the columns its fields. */\n kind: TagKind\n /** Only this tag's children (a label hierarchy; flat kinds have none). */\n parentId?: string\n /** How many documents, facts and threads each row lists (the rest are counted). Default 3. */\n linksLimit?: number\n /** The exported document's title; default the kind's (\"Issues\", \"People\", …). */\n exportTitle?: string\n /** The snapshot was filed: its document id. Absent: no export button. */\n onExported?: (documentId: string) => void\n /** Offer the snapshot as a `.docx` download. Default true. */\n downloadable?: boolean\n /** Read only: no cell edits, no \"Add row\", no column changes. */\n readOnly?: boolean\n}\n\nexport function ConnectedTagTable({\n kind,\n parentId,\n linksLimit = 3,\n exportTitle,\n onExported,\n downloadable = true,\n readOnly,\n ...props\n}: ConnectedTagTableProps) {\n const arbi = useArbi()\n const { workspaceId, status, ensureWorkspaceOpen } = useConnection()\n const schema = useTagKindSchema(kind)\n const rows = useTags(workspaceId ?? undefined, {\n kind,\n ...(parentId ? { parentId } : {}),\n include: ['links'],\n linksLimit,\n })\n // An annotation or a search is defined with its format, not added by name.\n const canAddRows = !readOnly && kind !== 'annotation' && kind !== 'search'\n const setValues = useSetTagValues()\n const updateSchema = useUpdateTagKindSchema()\n const invalidate = useInvalidateTagData()\n const members = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const [error, setError] = useState<string | null>(null)\n const people = (members.data ?? []).map((m) => ({\n value: m.user.external_id,\n label: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n }))\n const table: TagTableData | undefined = useMemo(\n () => (schema.data && rows.data ? { columns: schema.data.fields, rows: rows.data } : undefined),\n [schema.data, rows.data]\n )\n const fail = (e: unknown) => setError(e instanceof Error ? e.message : String(e))\n /** The snapshot as a Word file named `<title> (<date>).docx`. */\n const snapshot = (data: TagTableData) => {\n const title = exportTitle ?? KIND_TITLES[kind]\n const bytes = tagTableDocx(data, {\n title,\n nameOf: (id) => people.find((p) => p.value === id)?.label,\n })\n const stamp = new Date().toISOString().slice(0, 10)\n const name = `${title.replace(/[\\\\/:*?\"<>|]+/g, '-')} (${stamp}).docx`\n return { blob: new Blob([bytes as BlobPart], { type: DOCX_MIME_TYPE }), name }\n }\n\n return (\n <div className=\"space-y-2\">\n <TagTable\n {...props}\n table={table}\n isLoading={schema.isLoading || rows.isLoading}\n people={people}\n onChangeValue={\n readOnly\n ? undefined\n : async (tagId, fieldId, value) => {\n setError(null)\n await setValues.mutateAsync({ tagId, values: { [fieldId]: value } }).catch(fail)\n }\n }\n onChangeColumns={\n readOnly\n ? undefined\n : async (fields) => {\n setError(null)\n await ensureWorkspaceOpen()\n // A refusal (two columns of one name, a type change) stays on screen.\n await updateSchema.mutateAsync({ kind, fields }).catch((e: unknown) => {\n fail(e)\n throw e\n })\n }\n }\n onAddRow={\n !canAddRows\n ? undefined\n : async (name) => {\n setError(null)\n try {\n await ensureWorkspaceOpen()\n await arbi.tags.create({\n name,\n kind,\n ...(parentId && !FLAT_KINDS.includes(kind) ? { parentId } : {}),\n })\n await invalidate()\n } catch (e) {\n fail(e)\n }\n }\n }\n onExport={\n onExported && table\n ? async () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n await ensureWorkspaceOpen()\n const uploaded = await arbi.documents.uploadFile(blob, name)\n const id = uploaded?.doc_ext_ids?.[0]\n if (id) onExported(id)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n onDownload={\n downloadable && table\n ? () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n document.body.appendChild(link)\n link.click()\n link.remove()\n // Revoke after the click is handled: some browsers cancel the download otherwise.\n setTimeout(() => URL.revokeObjectURL(url), 0)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n />\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import {\n useShellWorkspaces,\n useWorkspaces,\n type ShellWorkspaceSource,\n type UseShellWorkspacesOptions,\n type UseShellWorkspacesResult,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type UseConnectedShellWorkspacesOptions = Omit<\n UseShellWorkspacesOptions,\n 'workspaces' | 'isLoading' | 'loadError' | 'selectedId' | 'select'\n>\n\n/**\n * `useShellWorkspaces` wired to the connection layer: the account's live workspaces, the\n * connection's single selection as the active workspace, and `open` = `setWorkspace` (opens it on\n * the server, remembers it for the next login) then `onOpened`.\n *\n * ```tsx\n * const { active, recent, open } = useConnectedShellWorkspaces({\n * seed: { workspaces: demoWorkspaces, activeId: 'demo-1' },\n * onOpened: () => navigate('/app/documents'),\n * })\n * ```\n */\nexport function useConnectedShellWorkspaces(\n options: UseConnectedShellWorkspacesOptions = {}\n): UseShellWorkspacesResult {\n const { workspaceId, setWorkspace } = useConnection()\n const query = useWorkspaces()\n return useShellWorkspaces({\n ...options,\n workspaces: Array.isArray(query.data) ? (query.data as ShellWorkspaceSource[]) : undefined,\n isLoading: query.isLoading,\n loadError: query.error,\n selectedId: workspaceId,\n select: (workspace) => setWorkspace(workspace.id),\n })\n}\n","/**\n * The account area of a settings page, bound to the ARBI SDK: each section is a blocks part wired\n * to its `@arbidocs/react` hook, so a host drops them in a `SettingsPanel` and owns only the\n * layout (see the \"Settings page recipe\" in docs/design/blocks-package.md).\n *\n * Every section toasts and confirms through the blocks environment (`useBlocksEnvironment`) and\n * renders the default test ids of its part. Anything the hooks cannot know (the recovery-key download, the billing link of a blocked\n * deletion, the password policy) is a prop.\n *\n * The hooks talk to the account client in scope (`useAccountClient` from `@arbidocs/react`):\n * `ConnectionProvider` provides one over the SDK; a host with its own session and API client\n * mounts its own `AccountClientProvider` (as ARBI-frontend does), and these sections work alike.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n ImageCropModal,\n useAvatarCrop,\n useConfirmEmailChange,\n useCurrentSessionId,\n useDeleteAccount,\n useDeleteAccountFlow,\n useEmailChange,\n useIdentityVerification,\n useNameEditor,\n useNotificationPreferences,\n usePasswordChange,\n usePasswordChangeForm,\n useProfile,\n useRequestEmailChange,\n useSessions,\n useSignOut,\n useTerminateSession,\n useUpdateProfile,\n type AvatarFileProblem,\n} from '@arbidocs/react'\nimport { useIsOnline } from '@arbidocs/react/document-tools'\nimport { Button, type IdentityStatus } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { AvatarPicker } from '../settings/AvatarPicker'\nimport { ProfileCard } from '../settings/ProfileCard'\nimport {\n IdentityVerificationCard,\n IdentityVerificationDialog,\n RequireVerified,\n type IdentityVerificationLabels,\n} from '../settings/IdentityVerification'\nimport {\n SettingsActionRow,\n SettingsCard,\n SettingsDangerZone,\n SettingsRow,\n SettingsSection,\n} from '../settings/SettingsPanel'\nimport { PasswordChangeDialog } from '../settings/PasswordChangeDialog'\nimport { ActiveSessionsDialog, DeleteAccountDialog } from '../settings/AccountDialogs'\nimport { LogoutDialog } from '../settings/LogoutDialog'\nimport { NotificationCategoryList } from '../settings/NotificationCategoryList'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport {\n EMAIL_NOTIFICATION_CATEGORIES,\n EMAIL_NOTIFICATION_KEYS,\n toActiveSessionViews,\n toDeleteBlockerViews,\n toLogoutSessionViews,\n toNotificationCategories,\n type EmailNotificationCategoryDef,\n} from '../settings/account-views'\n\n/** The error text of a failed call: the backend `detail` when it sent one. */\nfunction errorText(error: unknown, fallback: string): string {\n const body = (error as { apiError?: { detail?: unknown } } | null)?.apiError\n return typeof body?.detail === 'string' ? body.detail : fallback\n}\n\nconst AVATAR_PROBLEMS: Record<AvatarFileProblem, string> = {\n 'not-image': 'Please choose an image file',\n 'too-large': 'Image must be 5 MB or smaller',\n unreadable: \"Couldn't read that image — try a different file\",\n}\n\n// ── Profile ─────────────────────────────────────────────────────────────────\n\nexport interface ConnectedProfileCardProps {\n /** Section heading; default `Profile`. */\n title?: ReactNode\n /** Classes of the initials avatar shown without a picture (e.g. the host's per-user colour). */\n avatarClassName?: string\n /** More of the section under the card (e.g. `ConnectedIdentityVerification`). */\n children?: ReactNode\n}\n\n/** Avatar, editable name and email change of the signed-in user (`ProfileCard`). */\nexport function ConnectedProfileCard({\n title = 'Profile',\n avatarClassName = 'bg-primary text-primary-foreground',\n children,\n}: ConnectedProfileCardProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const updateProfile = useUpdateProfile()\n const requestEmailChange = useRequestEmailChange()\n const confirmEmailChange = useConfirmEmailChange()\n\n const name = useNameEditor({\n givenName: profile?.givenName,\n familyName: profile?.familyName,\n save: async (next) => {\n try {\n await updateProfile.mutateAsync(next)\n notify('Name updated', 'success')\n } catch (e) {\n notify('Failed to update name', 'error')\n throw e\n }\n },\n })\n const avatar = useAvatarCrop({\n upload: async (picture) => {\n try {\n await updateProfile.mutateAsync({ picture })\n notify('Profile picture updated', 'success')\n } catch (e) {\n notify('Failed to update picture', 'error')\n throw e\n }\n },\n onProblem: (problem) => notify(AVATAR_PROBLEMS[problem], 'error'),\n })\n const email = useEmailChange({\n requestCode: async (address) => {\n try {\n await requestEmailChange.mutateAsync(address)\n notify('Verification code sent to your new email', 'success')\n } catch (e) {\n notify(errorText(e, 'Failed to send verification code'), 'error')\n throw e\n }\n },\n confirm: async (args) => {\n try {\n await confirmEmailChange.mutateAsync(args)\n notify('Email address updated', 'success')\n } catch (e) {\n notify(errorText(e, 'Invalid or expired verification code'), 'error')\n throw e\n }\n },\n })\n\n const display = profile?.fullName || 'Unnamed'\n return (\n <SettingsSection icon={<UserCircle />} title={title}>\n <ProfileCard\n avatar={\n <>\n <AvatarPicker\n pictureUrl={profile?.picture}\n initials={initials(display)}\n fallbackClassName={avatarClassName}\n isUploading={avatar.isUploading}\n onFileChosen={avatar.onFileChosen}\n />\n <ImageCropModal\n open={avatar.pendingImage !== null}\n image={avatar.pendingImage}\n title=\"Crop your photo\"\n aspect={1}\n cropShape=\"round\"\n output={{ maxSize: 128, mimeType: 'image/jpeg', quality: 0.85 }}\n onComplete={avatar.onCropComplete}\n onCancel={avatar.onCropCancel}\n />\n </>\n }\n name={{ ...name, display, isSaving: name.isSaving }}\n email={profile?.email ?? ''}\n isSso={profile?.isSso ?? false}\n isVerified={profile?.isIdentityVerified ?? false}\n onStartEmailChange={email.onStart}\n emailChange={email.isOpen ? email : undefined}\n />\n {children}\n </SettingsSection>\n )\n}\n\n// ── Identity verification ───────────────────────────────────────────────────\n\nexport interface ConnectedIdentityVerificationProps {\n labels?: Partial<IdentityVerificationLabels>\n /** Open the host's billing (card, plan) when the fee cannot be charged. */\n onManageBilling?: () => void\n /** The host's price format; default `formatIdentityPrice`. */\n formatPrice?: (status: IdentityStatus) => string\n}\n\n/** The ID check card and its dialog, bound to the account. Renders nothing when not offered. */\nexport function ConnectedIdentityVerification({\n labels,\n onManageBilling,\n formatPrice,\n}: ConnectedIdentityVerificationProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const flow = useIdentityVerification({\n formatPrice,\n onVerifiedChange: (verified) =>\n notify(verified ? 'Identity verified' : 'Verified tick removed', 'success'),\n onNameAccepted: () => notify('Name updated to match your ID', 'success'),\n })\n return (\n <>\n <IdentityVerificationCard flow={flow} labels={labels} onManageBilling={onManageBilling} />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n onManageBilling={onManageBilling}\n />\n </>\n )\n}\n\nexport interface ConnectedRequireVerifiedProps {\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** `RequireVerified` bound to the SDK: gates `children` when the deployment requires an ID check. */\nexport function ConnectedRequireVerified({ children, labels }: ConnectedRequireVerifiedProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification()\n return (\n <RequireVerified flow={flow} accountName={profile?.fullName ?? ''} labels={labels}>\n {children}\n </RequireVerified>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\n/** The default password policy: 8 characters, an uppercase letter or symbol, a digit. */\nexport function defaultUnmetPasswordRequirement(password: string): string | null {\n if (password.length < 8) return 'Minimum 8 characters'\n if (!/[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n return 'At least one uppercase letter or special character'\n }\n if (!/[0-9]/.test(password)) return 'At least one number'\n return null\n}\n\nexport interface ConnectedPasswordChangeDialogProps {\n open: boolean\n onClose: () => void\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** After signing in with a recovery key: set a new password, no current one asked for. */\n recoveryMode?: boolean\n /** Recovery finished: continue into the app (recovery closes itself, with no success screen). */\n onRecoveryComplete?: () => void\n}\n\n/** Change (or, in recovery mode, set) the master password (`PasswordChangeDialog`). */\nexport function ConnectedPasswordChangeDialog({\n open,\n onClose,\n getUnmetRequirement = defaultUnmetPasswordRequirement,\n recoveryMode = false,\n onRecoveryComplete,\n}: ConnectedPasswordChangeDialogProps) {\n const { notify } = useBlocksEnvironment()\n const change = usePasswordChange()\n const form = usePasswordChangeForm({\n recoveryMode,\n getUnmetRequirement,\n submit: async (vars) => {\n await change.mutateAsync(vars)\n notify(\n recoveryMode\n ? 'Account recovered and password set successfully'\n : 'Password changed successfully',\n 'success'\n )\n },\n onClose,\n onRecoveryComplete,\n })\n return (\n <PasswordChangeDialog\n open={open}\n onClose={form.onCancel}\n recoveryMode={recoveryMode}\n currentPassword={form.currentPassword}\n onCurrentPasswordChange={form.onCurrentPasswordChange}\n newPassword={form.newPassword}\n onNewPasswordChange={form.onNewPasswordChange}\n confirmPassword={form.confirmPassword}\n onConfirmPasswordChange={form.onConfirmPasswordChange}\n getUnmetRequirement={getUnmetRequirement}\n error={form.error}\n isProcessing={form.isProcessing}\n isSubmitDisabled={form.isSubmitDisabled}\n onSubmit={form.onSubmit}\n isChanged={form.isChanged}\n onDone={form.onDone}\n />\n )\n}\n\nexport interface ConnectedSecuritySectionProps {\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** Extra rows under \"Change password\" (e.g. \"Save recovery key\"). */\n children?: ReactNode\n}\n\n/** The Security card: \"Change password\" and the dialog behind it. */\nexport function ConnectedSecuritySection({\n getUnmetRequirement,\n children,\n}: ConnectedSecuritySectionProps) {\n const [open, setOpen] = useState(false)\n return (\n <SettingsSection icon={<KeyRound />} title=\"Security\">\n <SettingsCard padding=\"sm\">\n <SettingsActionRow\n title=\"Change password\"\n description=\"Used to sign in and to unlock your account key. Changing it keeps everything readable and re-encrypts nothing.\"\n onClick={() => setOpen(true)}\n testId=\"change-password-button\"\n />\n {children}\n </SettingsCard>\n <ConnectedPasswordChangeDialog\n open={open}\n onClose={() => setOpen(false)}\n getUnmetRequirement={getUnmetRequirement}\n />\n </SettingsSection>\n )\n}\n\n// ── Notifications ───────────────────────────────────────────────────────────\n\nexport interface ConnectedNotificationPreferencesProps {\n /** Categories to offer; default {@link EMAIL_NOTIFICATION_CATEGORIES}. */\n categories?: readonly EmailNotificationCategoryDef[]\n title?: ReactNode\n}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\n title = 'Notifications',\n}: ConnectedNotificationPreferencesProps) {\n const keys = useMemo(\n () =>\n categories === EMAIL_NOTIFICATION_CATEGORIES\n ? EMAIL_NOTIFICATION_KEYS\n : categories.map((c) => c.key),\n [categories]\n )\n const prefs = useNotificationPreferences(keys)\n return (\n <SettingsSection title={title}>\n <SettingsCard className=\"space-y-0\">\n <NotificationCategoryList\n masterId=\"emailNotifications\"\n masterTitle=\"Email Notifications\"\n masterDescription=\"Email me about activity when I’m away\"\n masterChecked={prefs.masterChecked}\n onMasterChange={prefs.setAll}\n categories={toNotificationCategories(prefs.checked, categories)}\n onCategoryChange={prefs.setCategory}\n />\n </SettingsCard>\n </SettingsSection>\n )\n}\n\n// ── Sessions ────────────────────────────────────────────────────────────────\n\nexport interface ConnectedSessionsRowProps {\n /** Glyph per session status. */\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/** \"Active sessions\" row with the manage dialog (`ActiveSessionsDialog`); end any but this device. */\nexport function ConnectedSessionsRow({ renderSessionIcon }: ConnectedSessionsRowProps) {\n const { notify, confirm } = useBlocksEnvironment()\n const [open, setOpen] = useState(false)\n const sessions = useSessions({ enabled: open })\n const currentSessionId = useCurrentSessionId()\n const terminate = useTerminateSession()\n const views = toActiveSessionViews(sessions.data ?? [], {\n currentSessionId,\n terminatingId: terminate.isPending ? terminate.variables : null,\n renderIcon: renderSessionIcon,\n })\n return (\n <>\n <SettingsRow\n label=\"Active sessions\"\n description=\"Devices and agents currently signed in to your account.\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className=\"flex items-center gap-2\"\n data-testid=\"active-sessions-button\"\n >\n <Radio className=\"h-4 w-4\" />\n Manage\n </Button>\n </SettingsRow>\n <ActiveSessionsDialog\n open={open}\n onOpenChange={setOpen}\n isLoading={sessions.isLoading}\n sessions={views}\n onTerminate={(id) => {\n void (async () => {\n const view = views.find((v) => v.id === id)\n const label = view?.detail.split(' · ')[0]\n const ok = await confirm({\n title: 'End session',\n message: `End the session on ${label}? It will be signed out immediately.`,\n })\n if (!ok) return\n try {\n await terminate.mutateAsync(id)\n } catch {\n notify('Failed to end session. Please try again.', 'error')\n }\n })()\n }}\n />\n </>\n )\n}\n\nexport interface ConnectedLogoutDialogProps {\n open: boolean\n onClose: () => void\n /** Offer \"All sessions\"; default true (e.g. false for agent accounts). */\n canLogoutAll?: boolean\n /**\n * Ask before signing out (e.g. unsent work kept only on this device); resolve `false` to stay\n * signed in. Default: sign out at once.\n */\n confirmSignOut?: () => Promise<boolean> | boolean\n renderSessionIcon?: (status: string) => ReactNode\n}\n\n/**\n * Sign out of this device or all devices (`LogoutDialog`), listing the active sessions. \"All\n * sessions\" must reach the server, so it is disabled offline; \"This session\" always works.\n */\nexport function ConnectedLogoutDialog({\n open,\n onClose,\n canLogoutAll = true,\n confirmSignOut,\n renderSessionIcon,\n}: ConnectedLogoutDialogProps) {\n const sessions = useSessions({ enabled: open })\n const signOut = useSignOut()\n const isOnline = useIsOnline()\n const run = async (everywhere: boolean) => {\n onClose()\n if (confirmSignOut && !(await confirmSignOut())) return\n signOut.mutate({ everywhere, reason: 'manual' })\n }\n return (\n <LogoutDialog\n open={open}\n onClose={onClose}\n onLogoutThis={() => void run(false)}\n onLogoutAll={() => void run(true)}\n canLogoutAll={canLogoutAll}\n isOnline={isOnline}\n sessions={toLogoutSessionViews(sessions.data ?? [])}\n renderSessionIcon={renderSessionIcon}\n />\n )\n}\n\n// ── Danger zone ─────────────────────────────────────────────────────────────\n\nexport interface ConnectedDangerZoneProps {\n /** Link to the billing page for a deletion blocked by an active subscription. */\n renderSubscriptionLink?: () => ReactNode\n}\n\n/** \"Delete your account\": the collapsed danger zone and the two-step dialog (`DeleteAccountDialog`). */\nexport function ConnectedDangerZone({ renderSubscriptionLink }: ConnectedDangerZoneProps) {\n const { notify } = useBlocksEnvironment()\n const [zoneOpen, setZoneOpen] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const { data: profile } = useProfile()\n const userEmail = profile?.email ?? ''\n const remove = useDeleteAccount()\n const signOut = useSignOut()\n const flow = useDeleteAccountFlow({\n userEmail,\n remove: () => remove.mutateAsync(),\n onClose: () => setDialogOpen(false),\n onDeleted: () => signOut.mutate({ reason: 'account-deleted' }),\n onError: () => notify('Failed to delete account. Please try again.', 'error'),\n })\n return (\n <>\n <SettingsDangerZone\n isOpen={zoneOpen}\n onToggle={() => setZoneOpen((o) => !o)}\n title=\"Delete your account\"\n description=\"Once deleted, your account will be immediately closed and you will be logged out. This action cannot be undone.\"\n action={\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={!userEmail}\n onClick={() => setDialogOpen(true)}\n data-testid=\"delete-account-button\"\n >\n Delete Account\n </Button>\n }\n />\n <DeleteAccountDialog\n open={dialogOpen}\n onClose={flow.onClose}\n step={flow.step}\n blockers={toDeleteBlockerViews(flow.blockers, renderSubscriptionLink)}\n onContinue={flow.onContinue}\n onBack={flow.onBack}\n userEmail={userEmail}\n confirmEmail={flow.confirmEmail}\n onConfirmEmailChange={flow.onConfirmEmailChange}\n isDeleting={flow.isDeleting}\n onSubmit={flow.onSubmit}\n />\n </>\n )\n}\n","import { useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, useArbiWebSocket } from '@arbidocs/react'\nimport { useNotify, type AppNotification } from '@arbidocs/react/shell'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/** Bridge persisted document mentions to the shared bell; hosts own routing. */\nexport function useConnectedDocxNotifications(\n onOpen: (target: {\n workspaceId: string\n documentId: string\n commentId: string\n }) => void | Promise<void>\n) {\n const arbi = useArbi()\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const queries = useQueryClient()\n const source = `docx-mentions:${apiUrl}:${user?.externalId || ''}`\n const queryKey = ['docx-mentions', apiUrl, user?.externalId]\n const { data = [] } = useQuery({\n queryKey,\n queryFn: () => arbi.notifications.list({ type: 'docx_mention' }),\n enabled: status === 'authenticated',\n refetchInterval: 30_000,\n })\n useArbiWebSocket((message) => {\n if (message.type === 'docx_mention') void queries.invalidateQueries({ queryKey })\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId || !note.workspace_ext_id) continue\n try {\n const target = JSON.parse(note.content || '{}') as {\n document_id?: string\n comment_id?: string\n }\n if (!target.document_id?.startsWith('doc-') || !target.comment_id) continue\n const documentId = target.document_id,\n commentId = target.comment_id,\n workspaceId = note.workspace_ext_id\n items.push({\n id: `docx:${note.external_id}`,\n title: 'Mentioned you in a document comment',\n description: [note.sender.given_name, note.sender.family_name]\n .filter(Boolean)\n .join(' '),\n variant: 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve(onOpen({ documentId, commentId, workspaceId })).catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open the document.',\n 'error'\n )\n )\n },\n })\n } catch {\n /* Ignore invalid legacy payloads. */\n }\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n try {\n await arbi.notifications.markRead(ids)\n await queries.invalidateQueries({ queryKey })\n } catch {\n notify('Could not mark document mentions read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n if (id.startsWith('docx:')) void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter((note) => !note.read && note.recipient.external_id === user?.externalId)\n .map((note) => note.external_id)\n )\n },\n }\n}\n","import { useEffect } from 'react'\nimport { mailDraftIdFromContent, useWorkNotifications } from '@arbidocs/react'\nimport { useNotify, type AppNotification } from '@arbidocs/react/shell'\nimport type { components } from '@arbidocs/client'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport type WorkNotificationTarget =\n | { kind: 'conversation'; workspaceId: string; conversationId: string; messageId?: string }\n | { kind: 'workflow'; workspaceId?: string; workflowId: string }\n /** A draft an agent left for the user (`mail_draft_ready`): open it, e.g. `ConnectedMailbox draftId`. */\n | { kind: 'mail_draft'; draftId: string; mailbox?: string }\n\n/** Persisted work notifications in the shared bell; the consumer owns navigation. */\nexport function useConnectedWorkNotifications(\n onOpen: (target: WorkNotificationTarget) => void | Promise<void>\n) {\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const source = `work-notifications:${apiUrl}:${user?.externalId || ''}`\n const { data = [], markRead: persistRead } = useWorkNotifications({\n apiUrl,\n userId: user?.externalId,\n enabled: status === 'authenticated',\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId) continue\n const mapped = mapWorkNotification(note)\n if (!mapped) continue\n items.push({\n id: `work:${note.external_id}`,\n title: mapped.title,\n variant:\n note.type === 'workflow_failed'\n ? 'error'\n : note.type === 'conversation_done'\n ? 'success'\n : 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve()\n .then(() => onOpen(mapped.target))\n .catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open this notification.',\n 'error'\n )\n )\n },\n })\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n if (!ids.length) return\n try {\n await persistRead(ids)\n } catch {\n notify('Could not mark work notifications read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n // Only received, currently loaded work rows belong to this source.\n if (\n data.some(\n (note) =>\n `work:${note.external_id}` === id &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n )\n void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter(\n (note) =>\n !note.read &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n .map((note) => note.external_id)\n )\n },\n }\n}\n\n/** Route from explicit IDs; encrypted task text is never needed for a link. */\nexport function mapWorkNotification(note: components['schemas']['NotificationResponse']): {\n title: string\n target: WorkNotificationTarget\n} | null {\n const sender =\n [note.sender.given_name, note.sender.family_name].filter(Boolean).join(' ') || note.sender.email\n if (note.type === 'workflow_failed') {\n try {\n const payload = JSON.parse(note.content || '{}') as { workflow_ext_id?: string }\n if (!payload.workflow_ext_id?.match(/^wfl-[a-zA-Z0-9]+$/)) return null\n if (\n note.workspace_ext_id?.match(/^wrk-[a-zA-Z0-9]+$/) &&\n note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/)\n ) {\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n },\n }\n }\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'workflow',\n workflowId: payload.workflow_ext_id,\n workspaceId: note.workspace_ext_id || undefined,\n },\n }\n } catch {\n return null\n }\n }\n if (note.type === 'mail_draft_ready') {\n const draftId = mailDraftIdFromContent(note.content)\n if (!draftId) return null\n // Agent drafts land in the owner's native mailbox.\n return {\n title: `${sender} left a draft email for you to review`,\n target: { kind: 'mail_draft', draftId, mailbox: 'native' },\n }\n }\n const titles: Partial<Record<components['schemas']['NotificationType'], string>> = {\n mention: `${sender} mentioned you in a conversation`,\n workspace_access_request: `${sender} needs workspace access to run a thread`,\n conversation_ready:\n note.sender.external_id === note.recipient.external_id\n ? 'Your thread is ready'\n : `${sender}’s thread is ready`,\n conversation_done: `${sender} marked a thread done`,\n }\n const title = titles[note.type]\n if (!title || !note.workspace_ext_id || !note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/))\n return null\n return {\n title,\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n ...(note.message_ext_id ? { messageId: note.message_ext_id } : {}),\n },\n }\n}\n","import { bytesToBase64 } from '@arbidocs/client'\nimport {\n accountPath,\n fileAttachment,\n type MailAccount,\n type MailAttachment,\n type MailClient,\n} from '@arbidocs/react'\nimport type { MailOfflineSupport } from './types'\n\nexport function attachmentPath(accountId: string, messageId: string, attachmentId: string): string {\n return `${accountPath(accountId)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`\n}\n\n/** Hand a file to the browser as a download. */\nexport function saveFile(blob: Blob, name: string): void {\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n link.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/**\n * A message's attachments with their content, for a forward or a reopened draft. Offline, each\n * comes from this device (or arrives without content, and Send then names the missing file).\n */\nexport function hydrateMailAttachments(\n client: MailClient,\n account: MailAccount,\n messageId: string,\n attachments: MailAttachment[],\n { isOnline, offline }: { isOnline: boolean; offline?: MailOfflineSupport }\n): Promise<MailAttachment[]> {\n return Promise.all(\n attachments.map(async (a) => {\n if (a.content_base64 != null) return a\n if (!isOnline) {\n const file = await offline?.loadAttachment(account.id, messageId, a)\n return file\n ? { ...a, content_base64: bytesToBase64(new Uint8Array(await file.arrayBuffer())) }\n : { ...a, content_base64: null }\n }\n const response = await client.fetch(attachmentPath(account.id, messageId, a.id))\n return fileAttachment(new File([await response.blob()], a.name, { type: a.content_type }))\n })\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useConnectMailAccount,\n useDisconnectMailAccount,\n useMailClient,\n useMailOnline,\n type MailAccount,\n type MailPolicy,\n} from '@arbidocs/react'\n\n/** Whose names suggest the native address (`given.family`). */\nexport interface MailAliasUser {\n given_name?: string | null\n family_name?: string | null\n}\n\nexport interface ConnectedMailAccountsProps {\n policy: MailPolicy\n accounts: MailAccount[]\n onClose: () => void\n /** Render in place (e.g. a settings page) instead of a dialog. */\n embedded?: boolean\n user?: MailAliasUser | null\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** Extra settings under the accounts (e.g. keeping mail on this device). */\n settings?: ReactNode\n}\n\n/** Choose the native address, connect or remove external mailboxes. */\nexport function ConnectedMailAccounts({\n policy,\n accounts,\n onClose,\n embedded = false,\n user,\n oauthReturnPath,\n settings,\n}: ConnectedMailAccountsProps) {\n const { client } = useMailClient()\n const [profileId, setProfileId] = useState(policy.server_profiles[0]?.id ?? '')\n const [email, setEmail] = useState('')\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState('')\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const native = useClaimNativeAlias(onClose)\n const isOnline = useMailOnline()\n // Account changes go to the server; offline they are unavailable, and the note says why.\n const offline = !isOnline\n const onNativeError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n const connect = useConnectMailAccount()\n const disconnect = useDisconnectMailAccount()\n const authorizeOAuth = client.authorizeOAuth\n const oauth = async (vendor: string) => {\n if (!authorizeOAuth) return\n try {\n window.location.assign(\n await authorizeOAuth(\n vendor,\n oauthReturnPath ?? `${window.location.pathname}${window.location.search}`\n )\n )\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not connect account')\n }\n }\n const content = (\n <>\n {offline && (\n <p\n role=\"status\"\n className=\"mb-4 rounded bg-muted/40 px-3 py-2 text-sm text-muted-foreground\"\n >\n {\"You're offline. Creating, connecting or removing accounts needs a connection.\"}\n </p>\n )}\n {policy.native_enabled && !accounts.some((a) => a.provider === 'native') && (\n <form\n className=\"mb-5 grid gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n native.mutate(alias, { onError: onNativeError })\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Choose your email address\n <div className=\"flex items-center gap-2\">\n <input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n className=\"min-w-0 flex-1 rounded border bg-background p-2\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span>@{policy.native_domain}</span>\n </div>\n </label>\n <Button disabled={native.isPending || offline} type=\"submit\">\n Create inbox\n </Button>\n </form>\n )}\n <p className=\"mb-4 text-sm text-muted-foreground\">\n Connect an account using the providers enabled by your administrator.\n </p>\n {authorizeOAuth && (\n <div className=\"mb-4 flex flex-wrap gap-2\">\n {policy.oauth_providers.map((vendor) => (\n <Button\n key={vendor}\n variant=\"outline\"\n disabled={offline}\n onClick={() => void oauth(vendor)}\n >\n Connect {vendor === 'microsoft' ? 'Outlook' : 'Gmail'}\n </Button>\n ))}\n </div>\n )}\n {accounts.map((account) => (\n <div\n key={account.id}\n className=\"mb-2 flex items-center justify-between gap-2 rounded border p-3 text-sm\"\n >\n <div>\n <div>{account.email}</div>\n <div className=\"text-muted-foreground\">{account.display_name}</div>\n </div>\n {account.profile_id ? (\n <Button\n variant=\"ghost\"\n disabled={disconnect.isPending || offline}\n onClick={() =>\n disconnect.mutate(account.id, { onError: (err: Error) => setError(err.message) })\n }\n >\n Disconnect\n </Button>\n ) : account.provider !== 'native' ? (\n authorizeOAuth && (\n <Button\n variant=\"ghost\"\n disabled={offline}\n onClick={() => void oauth(account.provider)}\n >\n Reconnect\n </Button>\n )\n ) : (\n <span className=\"text-muted-foreground\">Native inbox</span>\n )}\n </div>\n ))}\n {policy.server_profiles.length > 0 && (\n <form\n className=\"mt-5 grid gap-3\"\n onSubmit={(event) => {\n event.preventDefault()\n setError('')\n connect.mutate(\n { profileId, email, username, password },\n {\n onSuccess: () => {\n setPassword('')\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Mail server\n <select\n aria-label=\"Mail server\"\n className=\"rounded border bg-background p-2\"\n value={profileId}\n onChange={(e) => setProfileId(e.target.value)}\n >\n {policy.server_profiles.map((profile) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-1 text-sm\">\n Email address\n <input\n required\n type=\"email\"\n autoComplete=\"email\"\n className=\"rounded border bg-background p-2\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Username\n <input\n placeholder=\"Same as email address\"\n autoComplete=\"username\"\n className=\"rounded border bg-background p-2\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Password or app password\n <input\n required\n type=\"password\"\n autoComplete=\"current-password\"\n className=\"rounded border bg-background p-2\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n </label>\n <Button type=\"submit\" disabled={connect.isPending || offline}>\n {connect.isPending ? 'Connecting…' : 'Connect mailbox'}\n </Button>\n </form>\n )}\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {accounts.length > 0 && settings}\n </>\n )\n if (embedded) return <div className=\"max-w-2xl\">{content}</div>\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n >\n <DialogContent className=\"max-h-[90dvh] max-w-lg overflow-auto\">\n <DialogTitle>Mail accounts</DialogTitle>\n <DialogDescription>\n Choose your email address or connect an external mailbox.\n </DialogDescription>\n {content}\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * A composer's body in the Word editor: its draft room (opened, reopened after a reconnect or a\n * remount, shown to the chat while open) and the room's save, send and body calls.\n *\n * The room is the body: it saves itself as it is typed into, ARBI's edits land in it as tracked\n * changes, and the draft's text and HTML are made from it on the server when it is saved or sent.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useMailDraftEditor,\n type MailClient,\n type MailCompose,\n type MailProject,\n} from '@arbidocs/react'\nimport type { NativeDocxAdapter } from '../../docx/NativeDocxEditor'\nimport type { MailWordEditor } from './types'\nimport { useRegisterOpenDocument } from '../../chat/open-document'\n\n// A compose session's room, kept across the composer remounting (docked ↔ overlay), so a new\n// message not saved yet reopens its own room instead of starting an empty one.\nconst sessionRooms = new Map<string, string>()\n\nexport interface WordBody {\n adapter: NativeDocxAdapter\n /** The editor's document key: stable for this compose session. */\n documentKey: string\n stateRef: React.MutableRefObject<(() => string | undefined) | null>\n /** Opened: saving and sending can go through the room. */\n ready: boolean\n save(compose: MailCompose): Promise<{ id: string }>\n /** Send it (`request_id`: the send's idempotency key, as `/send` takes). */\n send(compose: MailCompose & { request_id: string }): Promise<{ id: string; status: string }>\n /** The body as text and HTML (`final`: refused while suggestions wait). */\n body(final: boolean): Promise<{ text: string; html: string }>\n /** The project ARBI's work on this email is billed to (known once the room opens). */\n project?: MailProject | null\n /** Bill another project the person may bill (null: their own). */\n chooseProject(projectExtId: string | null): Promise<void>\n}\n\nexport function useWordBody({\n word,\n client,\n initial,\n sessionKey,\n roomId: givenRoomId,\n onBodyChange,\n}: {\n word: MailWordEditor\n client: MailClient\n initial: MailCompose\n /** This compose session (stable across remounts); absent: one per mount. */\n sessionKey?: string\n /** An existing room to open as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** The person changed the body (it is not in Drafts until saved). */\n onBodyChange: () => void\n}): WordBody {\n const [documentKey] = useState(\n () => `mail-${sessionKey ?? initial.draft_id ?? crypto.randomUUID()}`\n )\n const roomRef = useRef<string | undefined>(sessionRooms.get(documentKey) ?? givenRoomId)\n const [roomId, setRoomId] = useState(roomRef.current)\n const [project, setProject] = useState<MailProject | null>()\n const stateRef = useRef<(() => string | undefined) | null>(null)\n const changed = useRef(onBodyChange)\n useEffect(() => {\n changed.current = onBodyChange\n })\n // The first open, while it runs: a second one (the editor remounting, a token renewal) must join it, or a new\n // message would get a second, empty room.\n const opening = useRef<ReturnType<NonNullable<MailClient['openDraftEditor']>> | null>(null)\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...word.adapter,\n open: async () => {\n if (!roomRef.current && opening.current) return opening.current\n const request = client.openDraftEditor!(\n roomRef.current\n ? { roomId: roomRef.current }\n : { draftId: initial.draft_id ?? undefined, text: initial.text, html: initial.html }\n )\n if (!roomRef.current) opening.current = request\n try {\n const session = await request\n roomRef.current = session.room_id\n sessionRooms.set(documentKey, session.room_id)\n setRoomId(session.room_id)\n setProject(session.project ?? null)\n return session\n } finally {\n opening.current = null\n }\n },\n save: async () => {\n throw new Error('Save the draft from the composer')\n },\n onDirtyChange: (dirty) => {\n if (dirty) changed.current()\n },\n }),\n // The editor keeps its adapter for the session; the seed matters only when it first opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [word.adapter, client, documentKey]\n )\n // The open draft's room is the chat's open document, so ARBI edits it there as tracked changes.\n useRegisterOpenDocument({ documentId: roomId })\n const editor = useMailDraftEditor()\n const state = () => stateRef.current?.() ?? null\n return {\n adapter,\n documentKey,\n stateRef,\n ready: !!roomId,\n save: (compose) => editor.save(roomRef.current!, compose, state()),\n send: async (compose) => {\n const result = await editor.send(roomRef.current!, compose, state())\n sessionRooms.delete(documentKey) // sent: the room is gone\n return result\n },\n body: (final) => editor.body(roomRef.current!, final, state()),\n project,\n chooseProject: async (projectExtId) => {\n setProject(await editor.setProject(roomRef.current!, projectExtId))\n },\n }\n}\n","import { lazy, Suspense, useEffect, useMemo, useRef, useState, type RefObject } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Paperclip, Send, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n DialogDescription,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '@arbidocs/react/ui'\nimport {\n fileAttachment,\n useMailClient,\n useMailDraftReplaced,\n useMailProjects,\n useSaveMailDraft,\n useSendMail,\n useMailOnline,\n type MailAccount,\n type MailCompose,\n type MailDeliveryStatus,\n type MailMessage,\n} from '@arbidocs/react'\nimport { MailDocumentPicker } from '../../collaboration/mail/MailDocumentPicker'\nimport { PlainMailBodyEditor } from '../../collaboration/mail/PlainMailBodyEditor'\nimport { parseMailRecipients } from '../../collaboration/mail/mailCompose'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\nimport { useBlocksEnvironment, type BlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useWordBody } from './useWordBody'\n\n// The rich editor is its own chunk, on the optional peer `lexical`. If it is not installed or can't\n// be downloaded (offline before the app finished caching itself), write in plain text instead.\nconst MailBodyEditor = lazy(() =>\n import('../../collaboration/mail/MailBodyEditor').catch(() => ({\n default: PlainMailBodyEditor,\n }))\n)\n// The Word editor (a native draft's body, see MailWordEditor) is its own chunk too.\nconst NativeDocxEditor = lazy(() =>\n import('../../docx/NativeDocxEditor').then((m) => ({ default: m.NativeDocxEditor }))\n)\nconst NO_WORD: MailWordEditor = {\n adapter: {\n request: () => Promise.reject(new Error('No Word editor')),\n loadFonts: () => Promise.reject(new Error('No Word editor')),\n },\n}\n\nexport interface MailComposerFormProps {\n account?: MailAccount\n initial: MailCompose\n maxBytes: number\n ready: boolean\n /** The account's saved drafts: a new message with a draft's subject points to it. */\n drafts: MailMessage[]\n onClose: () => void\n /** Open a saved draft (from the \"already in Drafts\" notice). Absent: the notice has no button. */\n onOpenDraft?: (id: string) => void\n /** Reopen this form on a newer version of its draft, saved elsewhere (by ARBI, or in another tab). */\n onReload?: (draftId: string) => void\n /** Reports every edit so the parent can re-seed this form if it remounts (e.g. docked → overlay). */\n onChange?: (value: MailCompose) => void\n embedded?: boolean\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (saved offline): saves update it, sending removes it. */\n localDraftId?: string\n offline?: MailOfflineSupport\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor. Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote) instead of a new one. */\n roomId?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\n/**\n * Say how a send went. A mailbox on the same deployment is delivered to (or refused) before the send\n * returns, so a bounce is reported at once. Mail handed to the relay is only queued: its delivery\n * reports arrive later, in Sent.\n */\nfunction notifySent(notify: BlocksEnvironment['notify'], result: unknown) {\n const status =\n result && typeof result === 'object' && 'delivery_status' in result\n ? (result as { delivery_status?: MailDeliveryStatus | null }).delivery_status\n : null\n if (status === 'bounced')\n notify(\"Email couldn't be delivered\", 'error', { description: 'Open it in Sent to see why.' })\n else if (status === 'partially_bounced')\n notify(\"Email couldn't be delivered to every recipient\", 'error', {\n description: 'Open it in Sent to see which and why.',\n })\n else if (status === 'delivered') notify('Email delivered', 'success')\n else notify('Email queued for delivery', 'success')\n}\n\n/** Write, save and send one message. */\nexport function MailComposerForm({\n account,\n initial,\n maxBytes,\n ready,\n drafts,\n onClose,\n onOpenDraft,\n onReload,\n onChange,\n embedded = false,\n closeRequestRef,\n localDraftId: initialLocalDraftId,\n offline,\n documents,\n word,\n sessionKey,\n roomId,\n headerSlot,\n}: MailComposerFormProps) {\n const { client } = useMailClient()\n const { notify, confirm } = useBlocksEnvironment()\n const [to, setTo] = useState(initial.to.map((r) => r.email).join('; '))\n const [cc, setCc] = useState(initial.cc.map((r) => r.email).join('; '))\n const [showCc, setShowCc] = useState(initial.cc.length > 0)\n const [showBcc, setShowBcc] = useState(initial.bcc.length > 0)\n const [bcc, setBcc] = useState(initial.bcc.map((r) => r.email).join('; '))\n const [subject, setSubject] = useState(initial.subject)\n const [text, setText] = useState(initial.text)\n const [html, setHtml] = useState(initial.html)\n const [attachments, setAttachments] = useState(initial.attachments)\n const [draftId, setDraftId] = useState(initial.draft_id)\n const [error, setError] = useState('')\n const [dirty, setDirty] = useState(false)\n const [attaching, setAttaching] = useState(false)\n const [saved, setSaved] = useState(false)\n // A newer version of this draft saved elsewhere while this form had unsaved changes.\n const [replacedBy, setReplacedBy] = useState<string>()\n const isOnline = useMailOnline()\n // A native message's body opens in the Word editor when the host offers it and the server is reachable\n // (decided once: the editor is never swapped mid-message). Its room is the body; ARBI's edits are suggestions.\n const [usesWord] = useState(\n () =>\n !!word &&\n !!client.openDraftEditor &&\n account?.provider === 'native' &&\n isOnline &&\n !initialLocalDraftId\n )\n const [bodyChanged, setBodyChanged] = useState(false)\n const [wordPending, setWordPending] = useState(false)\n // The matters ARBI's work on this email can be billed to (the person's own project first).\n const projects = useMailProjects({ enabled: usesWord })\n const wordBody = useWordBody({\n word: word ?? NO_WORD,\n client,\n initial,\n sessionKey,\n roomId,\n onBodyChange: () => {\n setBodyChanged(true)\n setSaved(false)\n setDirty(true)\n },\n })\n // A draft saved while offline lives on this device until it reaches the server's Drafts.\n const [localDraftId, setLocalDraftId] = useState(initialLocalDraftId)\n const [savedLocally, setSavedLocally] = useState(false)\n const [secure, setSecure] = useState(initial.secure_delivery ?? false)\n const securePayload = useRef<unknown>(null)\n const requestId = useRef(crypto.randomUUID())\n const attemptedPayload = useRef<MailCompose | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n // Drafts are separate messages, so a new compose never replaces one on send; point to it instead.\n const sameSubjectDraft = useMemo(() => {\n const key = subject.trim().toLowerCase()\n return key\n ? drafts.find((d) => d.id !== draftId && d.subject.trim().toLowerCase() === key)\n : undefined\n }, [drafts, draftId, subject])\n const body = (): MailCompose => ({\n ...initial,\n to: parseMailRecipients(to),\n cc: parseMailRecipients(cc),\n bcc: parseMailRecipients(bcc),\n subject,\n text,\n html,\n attachments,\n draft_id: draftId,\n secure_delivery: secure,\n })\n /** Keep the draft on this device (updating the copy already there). */\n const saveOnDevice = async (compose: MailCompose) => {\n const draft = await offline!.saveDraft(account!.id, compose, localDraftId)\n setLocalDraftId(draft.id)\n }\n const save = useSaveMailDraft(\n offline && { keep: saveOnDevice, isNetworkFailure: offline.isNetworkFailure }\n )\n /** Put the message in the Outbox (with this send's request_id, so it can only go out once). */\n const queueInOutbox = async (compose: MailCompose) => {\n await offline!.queueSend({\n account: account!,\n compose,\n requestId: requestId.current,\n secure,\n securePayload: securePayload.current ?? undefined,\n })\n if (localDraftId) await offline!.deleteDraft(localDraftId)\n }\n const send = useSendMail(\n offline && { keep: queueInOutbox, isNetworkFailure: offline.isNetworkFailure }\n )\n const onSaved = (result: Awaited<ReturnType<typeof save.mutateAsync>>) => {\n setSaved(true)\n setDirty(false)\n if ('onDevice' in result) {\n setSavedLocally(true)\n return\n }\n setSavedLocally(false)\n setDraftId(result.id)\n setReplacedBy(undefined) // this version replaced the one saved elsewhere\n // The server has it now; the device copy (if this started offline) is no longer needed.\n if (localDraftId) {\n void offline?.deleteDraft(localDraftId)\n setLocalDraftId(undefined)\n }\n }\n const saveDraft = () => {\n if (usesWord) {\n // The body comes from the Word room on the server; ARBI's pending suggestions stay out of Drafts.\n if (!wordBody.ready) return setError('The editor is still opening')\n setWordPending(true)\n void wordBody\n .save(body())\n .then(\n (result) => {\n onSaved(result)\n setBodyChanged(false)\n },\n (err: Error) => setError(err.message)\n )\n .finally(() => setWordPending(false))\n return\n }\n save.mutate(\n { accountId: account!.id, compose: body() },\n { onSuccess: onSaved, onError: (err: Error) => setError(err.message) }\n )\n }\n // Saving a draft replaces it under a new id. Saved elsewhere (ARBI editing it in a private chat, another tab),\n // follow it: saves now replace the newer version; an unchanged form reopens on it, an edited one offers to.\n useMailDraftReplaced(draftId, (newId) => {\n if (save.isPending || wordPending) return // this form's own save: its answer carries the new id\n setDraftId(newId)\n if (!dirty && onReload) onReload(newId)\n else setReplacedBy(newId)\n })\n const sendMessage = async () => {\n let value = attemptedPayload.current\n if (value === null) {\n value = body()\n const recipients = [...value.to, ...value.cc, ...value.bcc]\n const problem =\n !recipients.length || recipients.length > 100\n ? 'Enter between 1 and 100 recipients'\n : recipients.some((r) => !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(r.email))\n ? 'Check the recipient email addresses'\n : value.attachments.reduce((total, a) => total + a.size, 0) > maxBytes\n ? 'Attachments exceed the email size limit'\n : null\n if (problem) return setError(problem)\n // Offline it waits in the Outbox; online the attempt is kept, so a retry resends it as is.\n if (!(offline && !isOnline)) attemptedPayload.current = value\n }\n if (usesWord) {\n if (!wordBody.ready) return setError('The editor is still opening')\n // A suggestion is never sent unreviewed: the server refuses (409) until each is accepted or rejected,\n // which is a definite refusal, so the message can be sent again once they are.\n const refused = (err: Error) => {\n setError(err.message)\n if ((err as { status?: number }).status === 409) attemptedPayload.current = null\n }\n setWordPending(true)\n try {\n if (!secure) {\n notifySent(notify, await wordBody.send({ ...value, request_id: requestId.current }))\n onClose()\n return\n }\n // Secure delivery encrypts in the browser, so it takes the body as text and HTML first.\n value = { ...value, ...(await wordBody.body(true)) }\n attemptedPayload.current = value\n } catch (err) {\n return refused(err as Error)\n } finally {\n setWordPending(false)\n }\n }\n const sending = account\n const message = value\n send.mutate(\n {\n accountId: account!.id,\n compose: message,\n requestId: requestId.current,\n // Secure delivery prepares its encrypted payload once.\n secure: secure\n ? async () => {\n if (sending?.provider !== 'native' || !client.prepareSecureMail)\n throw new Error('Choose your native inbox to send securely')\n securePayload.current ??= await client.prepareSecureMail(\n message,\n sending,\n requestId.current\n )\n return securePayload.current\n }\n : undefined,\n },\n {\n onSuccess: (result) => {\n if (result && typeof result === 'object' && 'onDevice' in result) {\n notify('Saved to your Outbox', 'info', {\n description: \"It will be sent automatically when you're back online.\",\n })\n onClose()\n return\n }\n notifySent(notify, result)\n if (localDraftId) void offline?.deleteDraft(localDraftId)\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }\n const busy = attaching || save.isPending || send.isPending || wordPending\n const locked = busy || attemptedPayload.current !== null\n const addFiles = async (files: FileList | null) => {\n if (!files) return\n const selected = Array.from(files)\n if (\n attachments.reduce((n, a) => n + a.size, 0) + selected.reduce((n, f) => n + f.size, 0) >\n maxBytes\n ) {\n setError(`Attachments must total less than ${Math.round(maxBytes / 1024 / 1024)} MB`)\n return\n }\n setAttaching(true)\n try {\n const added = await Promise.all(selected.map(fileAttachment))\n setAttachments((previous) => [...previous, ...added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach files')\n } finally {\n setAttaching(false)\n }\n }\n // A document of the open workspace, attached as its original file.\n const addDocument = async (documentId: string) => {\n if (!documents) return\n const used = attachments.reduce((n, a) => n + a.size, 0)\n setError('')\n setAttaching(true)\n try {\n const added = await documents.toAttachment(documentId, maxBytes - used)\n setAttachments((previous) => [...previous, added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach the document')\n } finally {\n setAttaching(false)\n }\n }\n const close = () => {\n if (busy) return\n const unsaved =\n !saved &&\n (dirty || !draftId) &&\n (text || subject || to || cc || bcc || attachments.length || bodyChanged)\n if (!unsaved) return onClose()\n void confirm({\n title: 'Discard changes',\n message: 'Close this message without saving your latest changes?',\n }).then((ok) => {\n if (ok) onClose()\n })\n }\n useEffect(() => {\n if (closeRequestRef) closeRequestRef.current = close\n })\n // Moving the panel between docked and overlay remounts this form, so the parent keeps the latest\n // content and the remounted form starts from it instead of the original seed.\n useEffect(() => {\n onChange?.(body())\n // eslint-disable-next-line react-hooks/exhaustive-deps -- body() is rebuilt each render; the fields are its inputs\n }, [to, cc, bcc, subject, text, html, attachments, draftId, secure])\n // Who ARBI's work on this email is billed to: a property of the message, shown in its header, not a field of it.\n const billTo = wordBody.project && (\n <label\n className=\"flex items-center gap-1 text-xs text-muted-foreground\"\n title=\"ARBI's work on this email is billed to this project\"\n >\n Billed to\n <select\n aria-label=\"Bill to\"\n className=\"max-w-[12rem] truncate rounded bg-transparent py-0.5 text-foreground hover:bg-muted/60 focus:bg-muted/60 focus:outline-none\"\n value={wordBody.project.external_id}\n disabled={busy}\n onChange={(e) => {\n const chosen = projects.data?.find((p) => p.external_id === e.target.value)\n void wordBody\n .chooseProject(chosen && !chosen.personal ? chosen.external_id : null)\n .catch((err: Error) => setError(err.message))\n }}\n >\n {(projects.data ?? [wordBody.project]).map((p) => (\n <option key={p.external_id} value={p.external_id}>\n {p.personal ? `${p.name} (personal)` : p.name}\n </option>\n ))}\n </select>\n </label>\n )\n const form = (\n <form\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n if (ready && !busy) event.currentTarget.requestSubmit()\n } else if (event.target instanceof HTMLInputElement) {\n // Recipient/subject Enter must never send an unfinished message.\n event.preventDefault()\n }\n }}\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n void sendMessage()\n }}\n className={\n embedded\n ? 'flex h-full min-h-0 w-full flex-col bg-background'\n : 'flex max-h-[95dvh] w-full max-w-3xl flex-col rounded-xl border bg-background shadow-2xl'\n }\n >\n {!embedded && (\n <header className=\"flex items-center justify-between border-b px-5 py-3\">\n <h2 className=\"font-semibold\">New message</h2>\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-label=\"Close message\"\n disabled={busy}\n onClick={close}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto px-5 py-3\">\n {sameSubjectDraft && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n A draft with this subject is already in Drafts.\n {onOpenDraft && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n onClick={() => onOpenDraft(sameSubjectDraft.id)}\n >\n Open draft\n </Button>\n )}\n </div>\n )}\n {replacedBy && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n This draft was changed elsewhere (by ARBI or in another tab). Saving keeps your version.\n {onReload && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n disabled={busy}\n onClick={() => {\n void confirm({\n title: 'Load changes',\n message: 'Discard your unsaved changes and load the changed draft?',\n }).then((ok) => {\n if (ok) onReload(replacedBy)\n })\n }}\n >\n Load changes\n </Button>\n )}\n </div>\n )}\n <p className=\"mb-2 flex items-center gap-3 border-b border-border/60 pb-3 text-xs text-muted-foreground\">\n <span className=\"w-14 shrink-0\">From</span>\n <span className=\"rounded bg-muted/50 px-2 py-1 text-foreground\">\n {account?.email ?? 'Connect a mailbox to send'}\n </span>\n </p>\n {usesWord && wordBody.project && !headerSlot && <p className=\"mb-2\">{billTo}</p>}\n {usesWord && wordBody.project && headerSlot && createPortal(billTo, headerSlot)}\n {(\n [\n ['To', to, setTo],\n ['Cc', cc, setCc],\n ['Bcc', bcc, setBcc],\n ] as const\n )\n .filter(\n ([label]) =>\n label === 'To' || (label === 'Cc' && showCc) || (label === 'Bcc' && showBcc)\n )\n .map(([label, value, setter]) => (\n <label\n key={label}\n className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\"\n >\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">{label}</span>\n <input\n aria-label={label}\n required={label === 'To' && !cc && !bcc}\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={value}\n placeholder={label === 'To' ? 'Add recipients' : ''}\n onChange={(e) => {\n setter(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n {label === 'To' && (\n <span className=\"flex shrink-0 gap-2\">\n {!showCc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowCc(true)}\n >\n Cc\n </button>\n )}\n {!showBcc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowBcc(true)}\n >\n Bcc\n </button>\n )}\n </span>\n )}\n </label>\n ))}\n <label className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\">\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">Subject</span>\n <input\n aria-label=\"Subject\"\n placeholder=\"Add a subject\"\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={subject}\n onChange={(e) => {\n setSubject(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n </label>\n <Suspense fallback={<p className=\"py-4 text-sm text-muted-foreground\">Loading editor…</p>}>\n {usesWord ? (\n <div\n // The body is the rest of the composer, edge to edge: no box around the letter.\n className=\"-mx-5 -mb-3 flex min-h-[22rem] flex-1 flex-col border-t border-border/60\"\n data-testid=\"mail-word-body\"\n // The editor's own forms (a comment, a reply) submit there: never as this message (that would send it).\n onSubmit={(event) => event.stopPropagation()}\n >\n <NativeDocxEditor\n compact\n adapter={wordBody.adapter}\n documentId={wordBody.documentKey}\n title=\"Email\"\n stateRef={wordBody.stateRef}\n />\n </div>\n ) : (\n <MailBodyEditor\n text={text}\n html={html}\n disabled={locked}\n onChange={(nextText, nextHtml) => {\n setText(nextText)\n setHtml(nextHtml)\n setSaved(false)\n }}\n />\n )}\n </Suspense>\n <div className=\"flex flex-wrap gap-2\">\n {attachments.map((attachment, index) => (\n <span\n key={`${attachment.name}-${index}`}\n className=\"flex items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-3 py-2 text-xs\"\n >\n <Paperclip className=\"size-3\" />\n {attachment.name}\n <button\n type=\"button\"\n disabled={locked}\n aria-label={`Remove ${attachment.name}`}\n onClick={() => {\n setAttachments((a) => a.filter((_, i) => i !== index))\n setSaved(false)\n setDirty(true)\n }}\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n <footer className=\"flex flex-wrap items-center gap-1 border-t border-border/60 bg-muted/20 px-4 py-2 [&_button]:h-8 [&_button]:text-xs\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!ready || locked}\n onClick={() => {\n setError('')\n saveDraft()\n }}\n >\n {save.isPending ? 'Saving…' : 'Save draft'}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={locked}\n onClick={() => fileInput.current?.click()}\n >\n <Paperclip className=\"mr-2 size-4\" />\n Attach\n </Button>\n {documents && (\n <MailDocumentPicker\n documents={documents.documents}\n disabled={locked}\n onAttach={(doc) => void addDocument(doc.id)}\n />\n )}\n <input\n ref={fileInput}\n type=\"file\"\n multiple\n hidden\n onChange={(e) => {\n void addFiles(e.target.files)\n e.target.value = ''\n }}\n />\n {saved && (\n <span className=\"whitespace-nowrap text-xs text-muted-foreground\">\n {savedLocally\n ? 'Saved on this device · syncs to Drafts when online'\n : 'Saved to Drafts'}\n </span>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n {account?.provider === 'native' && client.prepareSecureMail && (\n <Tooltip>\n <TooltipTrigger asChild showWithText>\n <label className=\"flex h-8 shrink-0 cursor-pointer items-center gap-1.5 rounded border border-border/70 px-2 text-xs text-primary\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 accent-primary\"\n checked={secure}\n disabled={locked}\n onChange={(e) => setSecure(e.target.checked)}\n />\n Secure\n </label>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n The recipient will receive a secure link to access the message through the platform.\n </TooltipContent>\n </Tooltip>\n )}\n <Button\n type=\"submit\"\n className=\"h-8 rounded bg-primary px-4 text-primary-foreground shadow-none hover:bg-primary/90\"\n disabled={!ready || busy}\n >\n <Send className=\"mr-2 size-4\" />\n {send.isPending ? 'Sending…' : attemptedPayload.current ? 'Check send result' : 'Send'}\n </Button>\n </div>\n {offline && !isOnline && (\n <p\n className=\"w-full text-[11px] text-muted-foreground\"\n data-testid=\"compose-offline-hint\"\n >\n {\n \"You're offline. Send puts this message in your Outbox; it goes out when you reconnect.\"\n }\n </p>\n )}\n </footer>\n </form>\n )\n if (embedded)\n return (\n <div role=\"dialog\" aria-label=\"Compose email\" className=\"h-full min-h-0\">\n {form}\n </div>\n )\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) close()\n }}\n >\n <DialogContent className=\"max-h-[95dvh] max-w-3xl overflow-auto p-0\">\n <DialogTitle className=\"sr-only\">Compose email</DialogTitle>\n <DialogDescription className=\"sr-only\">Write a message and attach files.</DialogDescription>\n {form}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { MailAccount } from '@arbidocs/react'\n\n/** The account a `mailbox` choice names: an account id, or `'native'` for the user's own inbox. */\nexport function resolveMailbox(\n accounts: MailAccount[] | undefined,\n mailbox: string | undefined\n): MailAccount | undefined {\n if (!accounts) return undefined\n if (mailbox === 'native') return accounts.find((a) => a.provider === 'native')\n return mailbox ? accounts.find((a) => a.id === mailbox) : undefined\n}\n","/**\n * The mail composer bound to the mail client in scope: write a new message, or open a saved draft\n * (`draftId`), save it to Drafts and send it, with files and workspace documents attached.\n *\n * Inside `ConnectedMailbox` everything is passed in; on its own it finds what it needs: the account\n * (`mailbox`, default the native inbox), the attachment limit, the unlock and the saved drafts.\n */\n\nimport { useMemo, useState, type RefObject } from 'react'\nimport {\n useMailAccounts,\n useMailClient,\n useMailDraftCompose,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAccount,\n type MailCompose,\n type MailMessage,\n} from '@arbidocs/react'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { hydrateMailAttachments } from './attachments'\nimport { MailComposerForm } from './MailComposerForm'\nimport { resolveMailbox } from './mailbox'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\n\nconst DEFAULT_MAX_BYTES = 15 * 1024 * 1024\n\nexport interface ConnectedMailComposerProps {\n /** Open this saved draft (from the account's Drafts) instead of a new message. */\n draftId?: string\n /** The message to start from (new, reply, forward). Default: empty, or the draft. */\n initial?: MailCompose\n /** Send from this account. Default: the `mailbox` account. */\n account?: MailAccount\n /** Which account to send from when `account` is not given: an id, or `'native'` (default). */\n mailbox?: string\n /** The attachment limit. Default: the deployment's. */\n maxBytes?: number\n /** Whether saving and sending can run. Default: once the account is unlocked (or offline). */\n ready?: boolean\n /** Saved drafts, for the \"already in Drafts\" notice. Default: the account's Drafts. */\n drafts?: MailMessage[]\n onClose: () => void\n onOpenDraft?: (id: string) => void\n onChange?: (value: MailCompose) => void\n /** Fill the parent (a panel) instead of opening as a dialog. */\n embedded?: boolean\n /** Receives the close request (asks before discarding unsaved changes). */\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (see {@link MailOfflineSupport}). */\n localDraftId?: string\n offline?: MailOfflineSupport\n /** Workspace documents to attach (\"From workspace\"). Absent: not offered. */\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor (see {@link MailWordEditor}). Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** A reply to this email (its id): the composer starts addressed and threaded as one; the body is `roomId`. */\n replyTo?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\nexport function ConnectedMailComposer({\n draftId,\n initial,\n account: accountProp,\n mailbox = 'native',\n maxBytes: maxBytesProp,\n ready: readyProp,\n drafts: draftsProp,\n offline,\n replyTo,\n ...rest\n}: ConnectedMailComposerProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const policy = useMailPolicy()\n const accounts = useMailAccounts({ enabled: !accountProp && !!policy.data?.enabled })\n const account = accountProp ?? resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(readyProp === undefined ? account : undefined)\n const ready = readyProp ?? (!!account && (!!unlock.data || !isOnline))\n const folders = useMailFolders(account, { enabled: !draftsProp && ready })\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const draftsList = useMailMessages(account, draftsFolderId, '', null, {\n enabled: !draftsProp && ready,\n })\n // A newer version of the draft, saved elsewhere (see MailComposerForm's onReload): reopen on it.\n const [reloaded, setReloaded] = useState<string>()\n const openId = reloaded ?? draftId\n const draft = useMailDraftCompose(\n account,\n openId,\n async (from, id) => {\n const message = await client.getMessage(from, id)\n return draftMailCompose(\n message,\n await hydrateMailAttachments(client, from, message.id, message.attachments, {\n isOnline,\n offline,\n })\n )\n },\n { enabled: (!initial || !!reloaded) && ready }\n )\n const original = useMailMessage(account, replyTo, { enabled: !!replyTo && ready })\n const start = useMemo(() => {\n if (replyTo)\n return original.data && account\n ? {\n ...replyMailCompose(original.data, { account, folderRole: 'inbox' }),\n text: '',\n html: '',\n }\n : undefined\n return reloaded ? draft.data : (initial ?? (openId ? draft.data : emptyMailCompose()))\n }, [replyTo, original.data, account, reloaded, initial, openId, draft.data])\n if (!start)\n return (draft.error ?? original.error) ? (\n <p role=\"alert\" className=\"p-4 text-sm text-destructive\">\n {(draft.error ?? original.error)?.message}\n </p>\n ) : (\n <p className=\"p-4 text-sm text-muted-foreground\">Loading draft…</p>\n )\n return (\n <MailComposerForm\n key={`${account?.id}-${openId ?? ''}`}\n account={account}\n initial={start}\n maxBytes={maxBytesProp ?? policy.data?.max_attachment_bytes ?? DEFAULT_MAX_BYTES}\n ready={ready}\n drafts={draftsProp ?? draftsList.data?.messages ?? []}\n offline={offline}\n onReload={setReloaded}\n {...rest}\n />\n )\n}\n","import { useState } from 'react'\nimport { Mail as MailIcon } from 'lucide-react'\nimport { Button, Input } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useMailOnline,\n type MailPolicy,\n} from '@arbidocs/react'\nimport type { MailAliasUser } from './ConnectedMailAccounts'\n\n/**\n * First run of Mail, in the main screen rather than a dialog: the user confirms the suggested\n * address and is straight into their inbox. External accounts (Gmail, Outlook, IMAP) stay one\n * click away, in the accounts dialog, for deployments that enable them.\n */\nexport function ConnectedMailSetup({\n policy,\n user,\n productName,\n onClaimed,\n onConnectExisting,\n}: {\n policy: MailPolicy\n user?: MailAliasUser | null\n /** The product's name in the copy (\"Set up your ARBI email\"). Default: none. */\n productName?: string\n /** The inbox exists now (the alias that was claimed). */\n onClaimed: (alias: string) => void\n onConnectExisting: () => void\n}) {\n const isOnline = useMailOnline()\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const [error, setError] = useState('')\n const claim = useClaimNativeAlias(onClaimed)\n const hasExternal = policy.oauth_providers.length > 0 || policy.server_profiles.length > 0\n const onClaimError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n\n return (\n <div\n data-testid=\"mail-setup\"\n className=\"mx-auto flex max-w-xl flex-col items-center gap-6 px-6 py-16 text-center\"\n >\n <MailIcon className=\"size-10 text-muted-foreground\" aria-hidden />\n {policy.native_enabled ? (\n <>\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">\n Set up your {productName ? `${productName} ` : ''}email\n </h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Confirm your address and you are ready to go: you can send and receive email as\n </p>\n </div>\n <form\n className=\"flex w-full flex-col items-center gap-4\"\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n claim.mutate(alias, { onError: onClaimError })\n }}\n >\n <div className=\"flex w-full items-center justify-center gap-2 text-base\">\n <Input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n autoFocus\n className=\"max-w-60 text-right\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span className=\"text-foreground\">@{policy.native_domain}</span>\n </div>\n <Button\n type=\"submit\"\n disabled={claim.isPending || !alias || !isOnline}\n title={isOnline ? undefined : 'Available when you are back online'}\n >\n {claim.isPending ? 'Setting up…' : 'Confirm'}\n </Button>\n </form>\n </>\n ) : (\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">Connect your email</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Connect an existing account to read and send email{' '}\n {productName ? `from ${productName}` : 'here'}.\n </p>\n </div>\n )}\n {hasExternal && (\n <Button\n variant={policy.native_enabled ? 'ghost' : 'default'}\n onClick={onConnectExisting}\n className={policy.native_enabled ? 'text-muted-foreground' : undefined}\n >\n {policy.native_enabled\n ? 'Connect an existing email account instead'\n : 'Connect an email account'}\n </Button>\n )}\n {!policy.native_enabled && !hasExternal && (\n <p className=\"text-sm text-muted-foreground\">\n Mail is not set up for this deployment yet. Ask your administrator.\n </p>\n )}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","/**\n * The whole mail screen bound to the mail client in scope (`MailClientProvider`, else the\n * `ArbiProvider` session): first-run setup or the accounts, the folder picker and filter, the message\n * list, the reader and the composer.\n *\n * The host owns navigation: it can ask for a draft (`draftId`), a folder (`folder`) or a new message\n * with attachments (`composeAttachments`); each is taken once and reported back (`on…Opened`), so\n * asking again for the same thing works. Device storage (offline reading, the Outbox), workspace\n * documents and saving to a workspace are optional host capabilities passed as props.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { GridState } from 'ag-grid-community'\nimport { ArrowLeft, Mail as MailIcon, Plus, Settings, X } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n accountPath,\n mailJson,\n useMailCache,\n MailOfflineUnavailableError,\n useMailAccounts,\n useMailClient,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAddress,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailFolder,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { FilterInput } from '../../shell/FilterInput'\nimport { TabHeader } from '../../shell/TabHeader'\nimport { FolderPickerRow } from '../../files/FolderPicker'\nimport { FolderFilterButton } from '../../files/bulk/FolderFilterButton'\nimport { FilesFilterBar } from '../../files/page/FilesPageParts'\nimport { TriStateFilterMenu, type TriState } from '../../settings/TriStateFilterMenu'\nimport { ConfirmDialog } from '../../settings/ConfirmDialog'\nimport { MailGrid } from '../../collaboration/mail/MailGrid'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { ConnectedMailAccounts, type MailAliasUser } from './ConnectedMailAccounts'\nimport { ConnectedMailComposer } from './ConnectedMailComposer'\nimport { resolveMailbox } from './mailbox'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { ConnectedMailSetup } from './ConnectedMailSetup'\nimport type {\n MailDocumentSource,\n MailLocalDraft,\n MailOutboxEntry,\n MailOfflineSupport,\n MailPanelProps,\n MailSaveToWorkspace,\n MailWordEditor,\n} from './types'\n\ntype MailQuickFilter = 'unread' | 'attachments' | 'secure'\n\nconst NO_DRAFTS: MailLocalDraft[] = []\nconst NO_OUTBOX: MailOutboxEntry[] = []\n\n/** Row ids of drafts kept on this device, in the Drafts list. */\nconst LOCAL_DRAFT_PREFIX = 'local-draft:'\n/** Offline with no folders saved on this device: Drafts (kept here) and the Outbox still work. */\nconst OFFLINE_FOLDERS: MailFolder[] = [\n { id: 'device:drafts', name: 'Drafts', role: 'drafts', unread: 0 },\n]\n\n/** A draft kept on this device, as a row of the Drafts folder. */\nfunction localDraftRow(draft: MailLocalDraft): MailMessage {\n return {\n id: LOCAL_DRAFT_PREFIX + draft.id,\n subject: draft.compose.subject,\n sender: [],\n to: draft.compose.to,\n cc: draft.compose.cc,\n bcc: draft.compose.bcc,\n received_at: new Date(draft.updatedAt).toISOString(),\n preview: draft.error\n ? `Saved on this device only: ${draft.error}`\n : 'Saved on this device · syncs to Drafts when online',\n unread: false,\n text: '',\n references: [],\n attachments: draft.compose.attachments.map((a) => ({ ...a, content_base64: null })),\n }\n}\n\n/** Excluded wins; with any included, an item needs one of them. */\nfunction applyQuickFilters(\n messages: MailMessage[],\n filters: Map<MailQuickFilter, TriState>\n): MailMessage[] {\n const included = [...filters].filter(([, s]) => s === 'include').map(([k]) => k)\n const excluded = [...filters].filter(([, s]) => s === 'exclude').map(([k]) => k)\n if (!included.length && !excluded.length) return messages\n return messages.filter((m) => {\n const has: Record<MailQuickFilter, boolean> = {\n unread: m.unread,\n attachments: m.attachments.length > 0,\n secure: !!m.secure_delivery,\n }\n if (excluded.some((k) => has[k])) return false\n return !included.length || included.some((k) => has[k])\n })\n}\n\n/** The default panel: the reader and composer beside the list. */\nfunction SidePanel({ isOpen, title, onClose, children }: MailPanelProps) {\n if (!isOpen) return null\n return (\n <aside\n aria-label={title}\n className=\"flex min-h-0 w-full max-w-2xl shrink-0 flex-col border-l border-border bg-background\"\n >\n <header className=\"flex items-center justify-between gap-2 border-b px-3 py-2\">\n <h2 className=\"truncate text-sm font-semibold\">{title}</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Close\"\n data-testid=\"close-mail-viewer\"\n onClick={onClose}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n <div className=\"flex min-h-0 flex-1\">{children}</div>\n </aside>\n )\n}\n\nexport interface ConnectedMailboxProps {\n /** Which mailbox: an account id, or `'native'` for the user's own inbox. Default: the first. */\n mailbox?: string\n /** Open this draft (in the native mailbox's Drafts); taken once, then `onDraftOpened`. */\n draftId?: string | null\n onDraftOpened?: () => void\n /** Open this folder (a role such as `inbox`, or an id); taken once, then `onFolderOpened`. */\n folder?: string | null\n onFolderOpened?: () => void\n /** Start a new message with these attachments; taken once, then `onComposeOpened`. */\n composeAttachments?: MailAttachment[] | null\n onComposeOpened?: () => void\n /**\n * Open a document: offered as \"Open\" on the notice after an email is saved into a workspace\n * (when `saveToWorkspace.save` resolves with the new document's id).\n */\n onOpenDocument?: (documentId: string, workspaceId: string) => void\n /** The user, for the suggested native address (`given.family`). */\n user?: MailAliasUser | null\n /** The product's name in the setup copy (\"Set up your ARBI email\"). */\n productName?: string\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** How a person is named (e.g. from contacts). Default: the name on the message, else the address. */\n personLabel?: (person: MailAddress) => string\n /** Device storage: offline reading, the Outbox, drafts written offline. Absent: online only. */\n offline?: MailOfflineSupport\n /** The open workspace's documents, attachable in the composer. */\n documents?: MailDocumentSource\n /** Saving an email into a workspace (\"Save to workspace\" on native mail). */\n saveToWorkspace?: MailSaveToWorkspace\n /** Native drafts' bodies in the Word editor, where ARBI's edits are suggestions. Absent: rich text. */\n word?: MailWordEditor\n /** \"Reply with ARBI\" on a native message: the host starts the chat that drafts it. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n /** A calendar invite card for a message with an .ics part. */\n renderInvite?: (props: {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n }) => ReactNode\n /** Where the reader and composer open. Default: a panel beside the list. */\n renderPanel?: (props: MailPanelProps) => ReactNode\n /** The reader or composer opened or closed. */\n onViewerOpenChange?: (open: boolean) => void\n /** The message list's column state, and where to persist it. */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n /** The message opened first (e.g. restored after a redirect). */\n initialMessageId?: string | null\n}\n\nexport function ConnectedMailbox({\n mailbox,\n draftId,\n onDraftOpened,\n folder: requestedFolder,\n onFolderOpened,\n composeAttachments,\n onComposeOpened,\n onOpenDocument,\n user,\n productName,\n oauthReturnPath,\n personLabel,\n offline,\n documents,\n saveToWorkspace,\n word,\n onReplyWithArbi,\n renderInvite,\n renderPanel = SidePanel,\n onViewerOpenChange,\n gridState,\n onGridStateChange,\n initialMessageId = null,\n}: ConnectedMailboxProps) {\n const { notify } = useBlocksEnvironment()\n const cache = useMailCache()\n const { client } = useMailClient()\n const [savingToWorkspace, setSavingToWorkspace] = useState(false)\n const [savePending, setSavePending] = useState(false)\n const [saveWorkspaceId, setSaveWorkspaceId] = useState('')\n const { data: policy, error: policyError } = useMailPolicy()\n const isOnline = useMailOnline()\n // Mail queries run offline too (networkMode 'always'): a host's client answers from this device,\n // or says plainly that something isn't saved here, instead of waiting forever for a connection.\n const accounts = useMailAccounts({ enabled: !!policy?.enabled })\n const [accountId, setAccountId] = useState('')\n const account =\n accounts.data?.find((a) => a.id === accountId) ??\n resolveMailbox(accounts.data, mailbox) ??\n accounts.data?.[0]\n const unlock = useMailUnlock(account)\n const [folder, setFolder] = useState('inbox')\n const [folderMenuOpen, setFolderMenuOpen] = useState(false)\n const [filterMenuOpen, setFilterMenuOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [mailFilters, setMailFilters] = useState<Map<MailQuickFilter, TriState>>(new Map())\n const [cursor, setCursor] = useState<string | null>(null)\n const [selected, setSelected] = useState<string | null>(initialMessageId)\n const [compose, setCompose] = useState<MailCompose | null>(null)\n // Set when the open compose is a draft kept on this device.\n const [composeLocalDraftId, setComposeLocalDraftId] = useState<string | undefined>()\n // Each compose the user opens (new, reply, forward, a draft) gets a fresh form. Edits reported by\n // the form (onChange) keep the same one, so moving the panel never resets what was typed.\n const [composeSession, setComposeSession] = useState(0)\n // Unique to this mailbox, so a compose session's key (which keeps its Word room) never repeats.\n const [mailboxKey] = useState(() => crypto.randomUUID())\n const openCompose = (value: MailCompose, localDraftId?: string) => {\n setComposeSession((n) => n + 1)\n setComposeLocalDraftId(localDraftId)\n setCompose(value)\n }\n const composeClose = useRef<(() => void) | null>(null)\n useEffect(() => {\n onViewerOpenChange?.(!!selected || !!compose)\n }, [selected, compose, onViewerOpenChange])\n useEffect(() => () => onViewerOpenChange?.(false), [onViewerOpenChange])\n const [settings, setSettings] = useState(false)\n // Set once the user has just created their inbox, to greet them with their new address.\n const [justCreated, setJustCreated] = useState(false)\n const [actionError, setActionError] = useState('')\n // Offline the account can't be unlocked, and needn't be: reads come from this device and sends\n // wait in the Outbox. Unlocking runs as soon as the connection is back.\n const ready = !!account && (!!unlock.data || !isOnline)\n useEffect(() => {\n // Reads that ran before the unlock finished (e.g. right after reconnecting) get another go.\n if (unlock.data) void cache.refreshFolders()\n }, [unlock.data, cache])\n const folders = useMailFolders(account, { enabled: ready })\n const outbox = offline?.useOutbox() ?? NO_OUTBOX\n const outboxRole = offline?.outboxRole\n const waitingInOutbox = outbox.filter(\n (item) => item.account.id === account?.id && item.status !== 'sent'\n ).length\n // The server's folders, plus the Outbox (the server's own when it has one, else this device's).\n const folderList = useMemo(() => {\n const base =\n folders.data ?? (offline && !isOnline && folders.error ? OFFLINE_FOLDERS : undefined)\n if (!base || !outboxRole) return base\n const withCount = (f: MailFolder) =>\n f.role === outboxRole ? { ...f, unread: f.unread + waitingInOutbox } : f\n return base.some((f) => f.role === outboxRole)\n ? base.map(withCount)\n : [...base, withCount({ id: 'device:outbox', name: 'Outbox', role: outboxRole, unread: 0 })]\n }, [folders.data, folders.error, isOnline, waitingInOutbox, offline, outboxRole])\n const folderId =\n folderList?.find((f) => f.role === folder || f.id === folder)?.id ?? folderList?.[0]?.id\n const folderRole = folderList?.find((f) => f.id === folderId)?.role ?? folder\n // Folders that exist only on this device have no server list.\n const deviceFolder = !!folderId?.startsWith('device:')\n const list = useMailMessages(account, folderId, query, cursor, {\n enabled: ready && !deviceFolder,\n refetchInterval: 60_000,\n })\n const localDrafts = offline?.useLocalDrafts(account?.id) ?? NO_DRAFTS\n // Same key as the list above when Drafts is open, so the cache is shared.\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const drafts = useMailMessages(account, draftsFolderId, '', null, {\n enabled: ready && !!compose,\n })\n // Quick filters (the dropdown inside the filter box) narrow the messages already loaded.\n const loadedMessages = useMemo(() => {\n if (folderRole !== 'drafts') return list.data?.messages\n const words = query.toLowerCase()\n const mine = localDrafts\n .map(localDraftRow)\n .filter(\n (m) =>\n !words ||\n `${m.subject} ${m.to.map((r) => r.email).join(' ')}`.toLowerCase().includes(words)\n )\n return [...mine, ...(list.data?.messages ?? [])]\n }, [folderRole, list.data, localDrafts, query])\n const filteredMessages = useMemo(\n () => applyQuickFilters(loadedMessages ?? [], mailFilters),\n [loadedMessages, mailFilters]\n )\n const mailFilterOptions = useMemo(\n () => [\n {\n id: 'unread' as const,\n label: 'Unread',\n count: (loadedMessages ?? []).filter((m) => m.unread).length,\n },\n {\n id: 'attachments' as const,\n label: 'Has attachments',\n count: (loadedMessages ?? []).filter((m) => m.attachments.length > 0).length,\n },\n {\n id: 'secure' as const,\n label: 'Secure delivery',\n count: (loadedMessages ?? []).filter((m) => m.secure_delivery).length,\n },\n ],\n [loadedMessages]\n )\n const hasActiveFilters = !!query || [...mailFilters.values()].some(Boolean)\n const detail = useMailMessage(account, selected, { enabled: ready && !compose })\n const message = detail.data\n // A new message with attachments asked for by the host (e.g. \"Email\" on a document).\n useEffect(() => {\n if (!composeAttachments?.length) return\n openCompose({ ...emptyMailCompose(), attachments: composeAttachments })\n onComposeOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [composeAttachments])\n useEffect(() => {\n if (!requestedFolder) return\n setFolder(requestedFolder)\n setCursor(null)\n setSelected(null)\n onFolderOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [requestedFolder])\n // A draft asked for by the host: it is in the native mailbox's Drafts, so it is selected once the\n // accounts are known and that account is chosen (never read from another).\n const [pendingDraft, setPendingDraft] = useState<string | null>(null)\n useEffect(() => {\n if (!draftId) return\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(null)\n setPendingDraft(draftId)\n onDraftOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [draftId])\n useEffect(() => {\n if (!pendingDraft || !accounts.data) return\n const native = accounts.data.find((a) => a.provider === 'native')\n if (native) setAccountId(native.id)\n setSelected(pendingDraft)\n setPendingDraft(null)\n }, [pendingDraft, accounts.data])\n // The host switched mailbox.\n useEffect(() => {\n const chosen = resolveMailbox(accounts.data, mailbox)\n if (!chosen) return\n setAccountId(chosen.id)\n // eslint-disable-next-line react-hooks/exhaustive-deps -- follows the host's choice only\n }, [mailbox, !!accounts.data])\n const patch = (messageId: string, body: MailMessageUpdate) =>\n mailJson(\n client.fetch,\n `${accountPath(account!.id)}/messages/${encodeURIComponent(messageId)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n // ARBI mail's Trash: Restore (back where it came from), Delete forever, Empty Trash. Mail in the Trash\n // still counts against the person's storage until it is deleted or purged.\n const nativeTrash = account?.provider === 'native' && folderRole === 'trash'\n const [confirmDelete, setConfirmDelete] = useState<'message' | 'trash' | null>(null)\n const [deleting, setDeleting] = useState(false)\n const deleteForever = async () => {\n if (!account || !isOnline || !confirmDelete) return\n setDeleting(true)\n try {\n if (confirmDelete === 'message' && selected) {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(selected)}`,\n { method: 'DELETE' }\n )\n setSelected(null)\n } else if (confirmDelete === 'trash') {\n await mailJson(client.fetch, `${accountPath(account.id)}/messages?folder=trash`, {\n method: 'DELETE',\n })\n setSelected(null)\n }\n await cache.refreshAll()\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not delete')\n } finally {\n setDeleting(false)\n setConfirmDelete(null)\n }\n }\n const update = async (body: MailMessageUpdate) => {\n if (!selected || !account || !isOnline) return\n try {\n await patch(selected, body)\n await cache.refreshAll()\n if (body.folder_id || body.action) setSelected(null)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n const response = await client.fetch(path)\n saveFile(await response.blob(), name)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const downloadAttachment = async (a: MailAttachment) => {\n if (!message || !account) return\n if (isOnline) {\n await download(attachmentPath(account.id, message.id, a.id), a.name)\n return\n }\n const file = await offline?.loadAttachment(account.id, message.id, a)\n if (!file) {\n setActionError(`${a.name} isn't saved on this device. Open it when you're back online.`)\n return\n }\n saveFile(file, a.name)\n }\n const saveEmail = async () => {\n if (!message || !account || !saveWorkspaceId || !saveToWorkspace) return\n setSavePending(true)\n try {\n const response = await client.fetch(\n `${accountPath(account.id)}/messages/${message.id}/original`\n )\n const fileName = `${message.subject.replace(/[^a-zA-Z0-9 ._-]/g, '').slice(0, 80) || 'email'}.eml`\n const workspaceId = saveWorkspaceId\n const documentId = await saveToWorkspace.save(\n workspaceId,\n new File([await response.blob()], fileName, { type: 'message/rfc822' })\n )\n setSavingToWorkspace(false)\n notify(\n 'Email saved to workspace',\n 'success',\n documentId && onOpenDocument\n ? { action: { label: 'Open', onClick: () => onOpenDocument(documentId, workspaceId) } }\n : undefined\n )\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not save email to workspace')\n } finally {\n setSavePending(false)\n }\n }\n const hydrate = (attachments: MailAttachment[]) =>\n message && account\n ? hydrateMailAttachments(client, account, message.id, attachments, { isOnline, offline })\n : Promise.resolve([])\n const editDraft = async () => {\n if (!message) return\n try {\n openCompose(draftMailCompose(message, await hydrate(message.attachments)))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not load draft attachments')\n }\n }\n const reply = async (forward = false, all = false) => {\n if (!message || !account) return\n try {\n const attachments = forward ? await hydrate(message.attachments) : []\n openCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n const failures = [policyError, accounts.error, unlock.error, folders.error, list.error]\n const offlineNotice = failures.find((e) => e instanceof MailOfflineUnavailableError)?.message\n const error =\n actionError ||\n failures.find((e) => e && !(e instanceof MailOfflineUnavailableError))?.message ||\n (detail.error instanceof MailOfflineUnavailableError ? undefined : detail.error?.message)\n return (\n <section className=\"flex h-full min-h-0 flex-col bg-background\" aria-label=\"Mail\">\n <header className=\"sticky top-0 z-10 bg-background\">\n <TabHeader\n testId=\"mail-tab-header\"\n tabs={[\n {\n id: 'mail',\n // Icon + count only, like the Files, Facts and Threads headers.\n label: '',\n count: filteredMessages.length,\n countIcon: <MailIcon className=\"size-3.5\" />,\n countPlacement: 'leading',\n presentation: 'count',\n hasActiveFilters,\n testId: 'mail-tab',\n },\n ]}\n activeTabId=\"mail\"\n onTabChange={() => {}}\n compactBreakpoint={360}\n firstTabContent={\n account ? (\n <FilesFilterBar>\n <FilterInput\n value={query}\n onChange={(q) => {\n setQuery(q)\n setCursor(null)\n }}\n hideFieldPicker\n fields={['text']}\n onFieldsChange={() => {}}\n ariaLabel=\"Filter mail\"\n labels={{ placeholder: 'Filter...' }}\n testIds={{ root: 'mail-search', input: 'mail-filter-input' }}\n className=\"min-w-28 flex-1 sm:max-w-72\"\n filter={\n <TriStateFilterMenu\n testId=\"mail-bar-filter-button\"\n open={filterMenuOpen}\n onOpenChange={setFilterMenuOpen}\n filterStates={mailFilters}\n onFiltersChange={setMailFilters}\n options={mailFilterOptions}\n groups={[{ label: 'Messages', options: ['unread', 'attachments', 'secure'] }]}\n renderChevron\n disableHoverOpen\n triggerClassName=\"inline-flex items-center gap-0.5 h-6 rounded px-1 text-muted-foreground hover:bg-foreground/10 cursor-pointer transition-colors pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n />\n }\n />\n {folderList && (\n <div className=\"flex shrink-0 items-center gap-2\">\n <FolderFilterButton\n label={folderList.find((f) => f.id === folderId)?.name ?? 'Folders'}\n isActive={false}\n open={folderMenuOpen}\n onOpenChange={setFolderMenuOpen}\n testId=\"mail-folder-button\"\n >\n {folderList.map((item) => (\n <FolderPickerRow\n key={item.id}\n label={item.name}\n count={item.unread > 0 ? item.unread : undefined}\n depth={0}\n isActive={item.id === folderId}\n onClick={() => {\n setFolder(item.id)\n setCursor(null)\n setSelected(null)\n setFolderMenuOpen(false)\n }}\n />\n ))}\n </FolderFilterButton>\n </div>\n )}\n </FilesFilterBar>\n ) : undefined\n }\n rightContent={\n <span className=\"flex items-center gap-1\">\n {account && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label=\"Mail settings\"\n data-testid=\"mail-settings-button\"\n onClick={() => setSettings(true)}\n >\n <Settings className=\"size-4\" />\n </Button>\n )}\n {nativeTrash && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!isOnline}\n data-testid=\"mail-empty-trash-button\"\n onClick={() => setConfirmDelete('trash')}\n >\n Empty Trash\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={!ready || !!compose}\n onClick={() => openCompose(emptyMailCompose())}\n >\n <Plus className=\"mr-1.5 size-4\" />\n Email\n </Button>\n </span>\n }\n />\n {/* No refresh button: native mail refreshes the moment the server pushes `native_mail_received`,\n and the list re-polls every minute (and on window focus) for every other provider. */}\n {(accounts.data?.length ?? 0) > 1 && (\n <div className=\"flex items-center gap-2 px-3 py-1\">\n <select\n aria-label=\"Mail account\"\n disabled={!!compose}\n className=\"min-w-0 max-w-64 rounded border-0 bg-transparent px-2 py-1.5 text-xs text-muted-foreground\"\n value={account?.id ?? ''}\n onChange={(e) => {\n setAccountId(e.target.value)\n setFolder('inbox')\n setCursor(null)\n setSelected(null)\n }}\n >\n {accounts.data?.map((a) => (\n <option key={a.id} value={a.id}>\n {a.email}\n </option>\n ))}\n </select>\n </div>\n )}\n </header>\n {account && offline?.renderStatus?.()}\n {error && (\n <p role=\"alert\" className=\"border-b p-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {!error && offlineNotice && (\n <p role=\"status\" className=\"border-b p-3 text-sm text-muted-foreground\">\n {offlineNotice}\n </p>\n )}\n {policy && !policy.enabled && (\n <p className=\"p-6 text-muted-foreground\">Mail is not enabled on this deployment.</p>\n )}\n {/* Setting up an inbox needs the server; offline (accounts unknown) the notice above says why. */}\n {policy?.enabled && accounts.isSuccess && !account && (\n <ConnectedMailSetup\n policy={policy}\n user={user}\n productName={productName}\n onClaimed={() => setJustCreated(true)}\n onConnectExisting={() => setSettings(true)}\n />\n )}\n {account && justCreated && (\n <div\n role=\"status\"\n data-testid=\"mail-ready-banner\"\n className=\"flex items-start justify-between gap-3 border-b bg-accent/40 px-4 py-3 text-sm\"\n >\n <p>\n <span className=\"font-semibold\">\n Your {productName ? `${productName} ` : ''}email is ready to go.\n </span>{' '}\n You can send and receive email as <span className=\"font-medium\">{account.email}</span>.\n </p>\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => setJustCreated(false)}\n >\n ×\n </button>\n </div>\n )}\n {account && (\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex min-h-0 w-full flex-col\">\n {outboxRole &&\n folderRole === outboxRole &&\n offline?.renderOutbox({\n accountId: account.id,\n onEdit: (value) => openCompose({ ...value }),\n })}\n <div className={deviceFolder ? 'hidden' : 'min-h-0 flex-1'}>\n <MailGrid\n messages={filteredMessages}\n loading={list.isPending && list.fetchStatus !== 'idle'}\n selected={selected}\n outgoing={\n folderRole === 'sent' || folderRole === 'drafts' || folderRole === outboxRole\n }\n personLabel={personLabel}\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n onSelect={(id) => {\n if (id.startsWith(LOCAL_DRAFT_PREFIX)) {\n const draft = localDrafts.find((d) => LOCAL_DRAFT_PREFIX + d.id === id)\n if (draft) openCompose({ ...draft.compose }, draft.id)\n return\n }\n setSelected(id)\n if (isOnline && list.data?.messages.find((m) => m.id === id)?.unread) {\n void patch(id, { unread: false })\n // An initial read can finish after the PATCH with the old unread flag.\n .then(() => cache.settleMessage(account.id, id))\n .catch((error: Error) => setActionError(error.message))\n }\n }}\n />\n </div>\n {(cursor || list.data?.next_cursor) && (\n <footer className=\"flex gap-2 p-2\">\n {cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(null)}>\n First page\n </Button>\n )}\n {list.data?.next_cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(list.data!.next_cursor!)}>\n Next page\n </Button>\n )}\n </footer>\n )}\n </div>\n {renderPanel({\n isOpen: !!selected || !!compose,\n title: compose ? 'New message' : message?.subject || 'Mail',\n onClose: () => {\n if (compose) composeClose.current?.()\n else setSelected(null)\n },\n children: compose ? (\n <ConnectedMailComposer\n key={`${account?.id}-${composeSession}`}\n account={account}\n initial={compose}\n maxBytes={policy?.max_attachment_bytes ?? 15 * 1024 * 1024}\n ready={ready}\n drafts={drafts.data?.messages ?? []}\n embedded\n localDraftId={composeLocalDraftId}\n offline={offline}\n documents={documents}\n word={word}\n sessionKey={`${mailboxKey}-${composeSession}`}\n onChange={setCompose}\n closeRequestRef={composeClose}\n onClose={() => {\n setCompose(null)\n if (compose.draft_id) setSelected(null)\n }}\n onOpenDraft={(id) => {\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(id)\n }}\n />\n ) : message && selected ? (\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={folders.data}\n isOnline={isOnline}\n loading={detail.isFetching}\n uploadPending={savePending}\n personLabel={personLabel}\n renderInvite={\n renderInvite &&\n (() =>\n renderInvite({\n accountId: account.id,\n messageId: message.id,\n attachments: message.attachments,\n isOnline,\n }))\n }\n onBack={() => setSelected(null)}\n onEditDraft={() => void editDraft()}\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onRestore={nativeTrash ? () => void update({ action: 'restore' }) : undefined}\n onDeleteForever={nativeTrash ? () => setConfirmDelete('message') : undefined}\n onDownloadAttachment={(a) => void downloadAttachment(a)}\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n onSaveToWorkspace={\n saveToWorkspace &&\n (() => {\n setSaveWorkspaceId(\n saveToWorkspace.defaultWorkspaceId ?? saveToWorkspace.workspaces[0]?.id ?? ''\n )\n setSavingToWorkspace(true)\n })\n }\n />\n ) : (\n <article className=\"min-w-0 flex-1 overflow-auto p-4 sm:p-5\">\n {selected && (\n <Button className=\"mb-3\" variant=\"ghost\" onClick={() => setSelected(null)}>\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n )}\n {detail.isFetching && selected && (\n <p className=\"text-muted-foreground\">Loading message…</p>\n )}\n {detail.error instanceof MailOfflineUnavailableError && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {detail.error.message}\n </p>\n )}\n </article>\n ),\n })}\n </div>\n )}\n {saveToWorkspace && (\n <Dialog open={savingToWorkspace} onOpenChange={setSavingToWorkspace}>\n <DialogContent>\n <DialogTitle>Save email to workspace</DialogTitle>\n <DialogDescription>\n Save a copy as an .eml file. Members with access to the file can read it.\n </DialogDescription>\n <select\n aria-label=\"Destination workspace\"\n value={saveWorkspaceId}\n onChange={(e) => setSaveWorkspaceId(e.target.value)}\n className=\"rounded border bg-background p-2\"\n >\n <option value=\"\" disabled>\n Choose a workspace\n </option>\n {saveToWorkspace.workspaces.map((w) => (\n <option key={w.id} value={w.id}>\n {w.name}\n </option>\n ))}\n </select>\n <Button disabled={!saveWorkspaceId || savePending} onClick={() => void saveEmail()}>\n {savePending ? 'Saving…' : 'Save email'}\n </Button>\n {actionError && <p role=\"alert\">{actionError}</p>}\n </DialogContent>\n </Dialog>\n )}\n {settings && policy && (\n <ConnectedMailAccounts\n policy={policy}\n accounts={accounts.data ?? []}\n user={user}\n oauthReturnPath={oauthReturnPath}\n settings={offline?.renderSettings?.()}\n onClose={() => setSettings(false)}\n />\n )}\n <ConfirmDialog\n isOpen={confirmDelete !== null}\n onClose={() => setConfirmDelete(null)}\n onConfirm={() => void deleteForever()}\n isLoading={deleting}\n title={confirmDelete === 'trash' ? 'Empty Trash?' : 'Delete forever?'}\n description={\n confirmDelete === 'trash'\n ? 'Every message in the Trash is deleted permanently and stops using your storage. This cannot be undone.'\n : 'This message is deleted permanently and stops using your storage. This cannot be undone.'\n }\n confirmText={confirmDelete === 'trash' ? 'Empty Trash' : 'Delete forever'}\n testId=\"mail-delete-forever-dialog\"\n />\n </section>\n )\n}\n","/**\n * One email of the mail client in scope, shown on its own (e.g. in a panel beside a chat): its actions,\n * sender, recipients, attachments and body, as the mailbox shows it. Replying hands the new message to\n * the host (`onCompose`), and so does asking ARBI to draft the reply (`onReplyWithArbi`).\n */\n\nimport { useState } from 'react'\nimport {\n accountPath,\n mailJson,\n useMailAccounts,\n useMailCache,\n useMailClient,\n useMailMessage,\n useMailOnline,\n useMailUnlock,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport { draftMailCompose, replyMailCompose } from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { resolveMailbox } from './mailbox'\n\nexport interface ConnectedMailMessageProps {\n messageId: string\n /** The account the message is in: an id, or `'native'` (default). */\n mailbox?: string\n /** The folder it is in (replying from Sent goes to its recipients). Default: the inbox. */\n folderRole?: string\n onClose: () => void\n /** Reply / reply all / forward: the new message, to open in a composer. */\n onCompose: (initial: MailCompose) => void\n /** Ask ARBI to draft the reply. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n}\n\nexport function ConnectedMailMessage({\n messageId,\n mailbox = 'native',\n folderRole = 'inbox',\n onClose,\n onCompose,\n onReplyWithArbi,\n}: ConnectedMailMessageProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const cache = useMailCache()\n const accounts = useMailAccounts()\n const account = resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(account)\n const detail = useMailMessage(account, messageId, { enabled: !!unlock.data || !isOnline })\n const [error, setError] = useState('')\n const message = detail.data\n if (!account || !message)\n return (\n <p role={detail.error ? 'alert' : 'status'} className=\"p-4 text-sm text-muted-foreground\">\n {detail.error?.message ?? 'Loading message…'}\n </p>\n )\n const update = async (body: MailMessageUpdate) => {\n try {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(message.id)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n await cache.refreshAll()\n if (body.folder_id || body.action) onClose()\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n saveFile(await (await client.fetch(path)).blob(), name)\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const reply = async (forward = false, all = false) => {\n try {\n const attachments = forward\n ? await hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n : []\n onCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {error && (\n <p role=\"alert\" className=\"px-4 pt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={undefined}\n isOnline={isOnline}\n loading={detail.isFetching}\n onBack={onClose}\n onEditDraft={() =>\n void hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n .then((attachments) => onCompose(draftMailCompose(message, attachments)))\n .catch((e: Error) => setError(e.message))\n }\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onDownloadAttachment={(a: MailAttachment) =>\n void download(attachmentPath(account.id, message.id, a.id), a.name)\n }\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n />\n </div>\n )\n}\n","/** \"Subscribe from URL\" and \"Holidays\" dialogs of the calendar list's Add menu. */\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport { useAddHolidayCalendar, useHolidayCountries, useSubscribeCalendar } from '@arbidocs/react'\nimport { normalizeFeedUrl } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nexport function SubscribeDialog({\n open,\n timeZone,\n onClose,\n}: {\n open: boolean\n timeZone: string\n onClose: () => void\n}) {\n const { notify } = useBlocksEnvironment()\n const subscribe = useSubscribeCalendar()\n const [url, setUrl] = useState('')\n const [name, setName] = useState('')\n const [refresh, setRefresh] = useState(720)\n useEffect(() => {\n if (open) {\n setUrl('')\n setName('')\n subscribe.reset()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n const normalized = normalizeFeedUrl(url)\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"calendar-subscribe-dialog\">\n <DialogHeader>\n <DialogTitle>Subscribe to a calendar</DialogTitle>\n <DialogDescription>\n Paste an iCalendar feed (https:// or webcal://). It refreshes automatically and is\n read-only.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n if (!normalized) return\n subscribe.mutate(\n {\n url: normalized,\n name: name.trim() || null,\n refresh_minutes: refresh,\n timezone: timeZone,\n },\n {\n onSuccess: (cal) => {\n notify(`Subscribed to “${cal.name ?? 'calendar'}”`, 'success')\n onClose()\n },\n }\n )\n }}\n >\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Feed URL</span>\n <Input\n autoFocus\n value={url}\n placeholder=\"webcal://…\"\n onChange={(e) => setUrl(e.target.value)}\n data-testid=\"calendar-subscribe-url\"\n />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Name (optional)</span>\n <Input value={name} onChange={(e) => setName(e.target.value)} />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Refresh</span>\n <select\n className={selectClass}\n value={refresh}\n onChange={(e) => setRefresh(Number(e.target.value))}\n >\n <option value={60}>Every hour</option>\n <option value={360}>Every 6 hours</option>\n <option value={720}>Every 12 hours</option>\n <option value={1440}>Daily</option>\n </select>\n </label>\n {subscribe.error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {subscribe.error.message}\n </p>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={!normalized || subscribe.isPending}\n data-testid=\"calendar-subscribe-save\"\n >\n {subscribe.isPending ? 'Subscribing…' : 'Subscribe'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport function HolidaysDialog({ open, onClose }: { open: boolean; onClose: () => void }) {\n const { data: countries = [], isLoading } = useHolidayCountries(open)\n const { notify } = useBlocksEnvironment()\n const add = useAddHolidayCalendar()\n const [country, setCountry] = useState('')\n const [subdivision, setSubdivision] = useState('')\n useEffect(() => {\n if (open) add.reset()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n const sorted = useMemo(\n () => [...countries].sort((a, b) => a.name.localeCompare(b.name)),\n [countries]\n )\n const subdivisions = countries.find((c) => c.code === country)?.subdivisions ?? []\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"calendar-holidays-dialog\">\n <DialogHeader>\n <DialogTitle>Add holidays</DialogTitle>\n <DialogDescription>\n Public holidays for a country or region, as a read-only calendar.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n if (!country) return\n add.mutate(\n { country, subdivision: subdivision || null },\n {\n onSuccess: (cal) => {\n notify(`Added “${cal.name ?? 'Holidays'}”`, 'success')\n onClose()\n },\n }\n )\n }}\n >\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Country</span>\n <select\n className={selectClass}\n value={country}\n onChange={(e) => {\n setCountry(e.target.value)\n setSubdivision('')\n }}\n disabled={isLoading}\n data-testid=\"calendar-holidays-country\"\n >\n <option value=\"\">{isLoading ? 'Loading…' : 'Choose a country'}</option>\n {sorted.map((c) => (\n <option key={c.code} value={c.code}>\n {c.name}\n </option>\n ))}\n </select>\n </label>\n {subdivisions.length > 0 && (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Region (optional)</span>\n <select\n className={selectClass}\n value={subdivision}\n onChange={(e) => setSubdivision(e.target.value)}\n data-testid=\"calendar-holidays-subdivision\"\n >\n <option value=\"\">Whole country</option>\n {subdivisions.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </label>\n )}\n {add.error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {add.error.message}\n </p>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={!country || add.isPending}\n data-testid=\"calendar-holidays-save\"\n >\n {add.isPending ? 'Adding…' : 'Add'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Connected calendar accounts (P3): mirror Google / Microsoft calendars (via the user's connector grant) or a\n * CalDAV server (iCloud, Fastmail, Nextcloud, …) into ARBI, two-way. Per account: status, last sync / error,\n * \"Sync now\", background sync opt-in and disconnect.\n *\n * Self-contained: renders as a plain section, so the calendar can mount it in a dialog or a settings tab.\n */\nimport { useState } from 'react'\nimport { AlertTriangle, CheckCircle2, Loader2, RefreshCw, Trash2 } from 'lucide-react'\nimport { Button, Input, Label, Switch, cn } from '@arbidocs/react/ui'\nimport {\n ACCOUNT_VENDOR,\n useCalDavProfiles,\n useCalendarAccounts,\n useCalendarSupport,\n useConnectCalDavAccount,\n useConnectOAuthAccount,\n useDisconnectCalendarAccount,\n useResumeCalendarAccountConnect,\n useStartCalendarAccountOAuth,\n useSyncCalendarAccount,\n useUpdateCalendarAccount,\n type CalendarAccount,\n} from '@arbidocs/react'\nimport { describeCalendarError } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport const BACKGROUND_SYNC_EXPLANATION =\n \"Keeps syncing while you're signed out. The refresh token (or CalDAV password) and the mirrored \" +\n \"calendars' keys are stored wrapped with the server's deployment key, so the server can sync without \" +\n 'your session. Turn it off to remove those wraps; the account then syncs only while you use ARBI.'\n\nconst KIND_LABEL: Record<CalendarAccount['kind'], string> = {\n google: 'Google Calendar',\n microsoft: 'Microsoft Outlook',\n caldav: 'CalDAV',\n}\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction formatSyncTime(iso: string | null | undefined, now: Date = new Date()): string {\n if (!iso) return 'Never synced'\n const t = new Date(iso)\n const mins = Math.round((now.getTime() - t.getTime()) / 60_000)\n if (mins < 1) return 'Synced just now'\n if (mins < 60) return `Synced ${mins} min ago`\n return `Synced ${t.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })}`\n}\n\nfunction StatusBadge({ account }: { account: CalendarAccount }) {\n const ok = account.status === 'ok'\n const label =\n account.status === 'needs_reauth' ? 'Reconnect needed' : ok ? 'Connected' : 'Sync error'\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs',\n ok\n ? 'bg-emerald-500/10 text-emerald-700 dark:text-emerald-400'\n : 'bg-destructive/10 text-destructive'\n )}\n data-testid={`calendar-account-status-${account.id}`}\n >\n {ok ? <CheckCircle2 className=\"size-3\" /> : <AlertTriangle className=\"size-3\" />}\n {label}\n </span>\n )\n}\n\nfunction AccountRow({ account }: { account: CalendarAccount }) {\n const { notify } = useBlocksEnvironment()\n const startOAuth = useStartCalendarAccountOAuth()\n const sync = useSyncCalendarAccount()\n const update = useUpdateCalendarAccount()\n const disconnect = useDisconnectCalendarAccount()\n const [confirming, setConfirming] = useState(false)\n const fail = (what: string) => (err: unknown) =>\n notify(`${what}: ${describeCalendarError(err)}`, 'error')\n const reconnect =\n !!startOAuth &&\n account.status === 'needs_reauth' &&\n (account.kind === 'google' || account.kind === 'microsoft')\n\n return (\n <li\n className=\"grid gap-2 rounded-lg border border-border bg-card p-3 text-sm\"\n data-testid={`calendar-account-${account.id}`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-foreground\">{KIND_LABEL[account.kind]}</div>\n <div className=\"truncate text-muted-foreground\">{account.address || '—'}</div>\n <div className=\"mt-1 flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <StatusBadge account={account} />\n <span>{formatSyncTime(account.last_sync_at)}</span>\n {account.calendars?.length ? (\n <span>\n {account.calendars.length} calendar{account.calendars.length === 1 ? '' : 's'}\n </span>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {reconnect && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n void startOAuth?.(\n account.kind as 'google' | 'microsoft',\n account.background_sync\n ).catch(fail('Could not reconnect'))\n }\n >\n Reconnect\n </Button>\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={sync.isPending}\n onClick={() =>\n sync.mutate(account.id, {\n onSuccess: (r) =>\n r?.error\n ? notify(`Sync failed: ${describeCalendarError(r.error)}`, 'error')\n : notify('Calendar synced', 'success'),\n onError: fail('Sync failed'),\n })\n }\n data-testid={`calendar-account-sync-${account.id}`}\n >\n {sync.isPending ? (\n <Loader2 className=\"mr-1 size-4 animate-spin\" />\n ) : (\n <RefreshCw className=\"mr-1 size-4\" />\n )}\n Sync now\n </Button>\n {confirming ? (\n <>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n disabled={disconnect.isPending}\n onClick={() =>\n disconnect.mutate(account.id, {\n onError: fail('Could not disconnect'),\n onSettled: () => setConfirming(false),\n })\n }\n data-testid={`calendar-account-disconnect-confirm-${account.id}`}\n >\n Disconnect\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirming(false)}>\n Cancel\n </Button>\n </>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Disconnect ${account.address}`}\n onClick={() => setConfirming(true)}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n {confirming && (\n <p className=\"text-xs text-muted-foreground\">\n Stops syncing and removes the mirrored calendars from ARBI. Nothing is deleted at{' '}\n {KIND_LABEL[account.kind]}.\n </p>\n )}\n {account.last_error && (\n <p role=\"alert\" className=\"rounded bg-destructive/10 px-2 py-1 text-xs text-destructive\">\n {describeCalendarError(account.last_error)}\n </p>\n )}\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Switch\n checked={account.background_sync}\n disabled={update.isPending}\n onCheckedChange={(checked) =>\n update.mutate(\n { id: account.id, backgroundSync: checked },\n { onError: fail('Could not change background sync') }\n )\n }\n aria-label=\"Background sync\"\n data-testid={`calendar-account-background-${account.id}`}\n />\n <span>\n <span className=\"font-medium text-foreground\">Background sync.</span>{' '}\n {BACKGROUND_SYNC_EXPLANATION}\n </span>\n </label>\n </li>\n )\n}\n\nfunction CalDavForm({ onDone }: { onDone: () => void }) {\n const { notify } = useBlocksEnvironment()\n const { data: profiles = [] } = useCalDavProfiles()\n const connect = useConnectCalDavAccount()\n const [profileId, setProfileId] = useState('')\n const [url, setUrl] = useState('')\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [background, setBackground] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const useUrl = !profileId\n\n return (\n <form\n className=\"grid gap-3 rounded-lg border border-border p-3\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (useUrl && !url.trim()) return setError('Choose a server or enter its CalDAV URL')\n connect.mutate(\n {\n profile_id: profileId || null,\n url: useUrl ? url : null,\n username,\n password,\n background_sync: background,\n },\n {\n onSuccess: () => {\n setPassword('')\n notify('CalDAV account connected', 'success')\n onDone()\n },\n onError: (err) => setError(describeCalendarError(err, 'Could not connect')),\n }\n )\n }}\n data-testid=\"calendar-caldav-form\"\n >\n {profiles.length > 0 && (\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-profile\">Server</Label>\n <select\n id=\"caldav-profile\"\n className={selectClass}\n value={profileId}\n onChange={(e) => setProfileId(e.target.value)}\n >\n <option value=\"\">Other (enter URL)</option>\n {profiles.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n </div>\n )}\n {useUrl && (\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-url\">CalDAV URL</Label>\n <Input\n id=\"caldav-url\"\n type=\"url\"\n placeholder=\"https://caldav.example.com/\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n )}\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-username\">Username</Label>\n <Input\n id=\"caldav-username\"\n required\n autoComplete=\"username\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-password\">App-specific password</Label>\n <Input\n id=\"caldav-password\"\n required\n type=\"password\"\n autoComplete=\"new-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n <span className=\"text-xs text-muted-foreground\">\n Create one in your provider&apos;s security settings (e.g. appleid.apple.com for iCloud).\n </span>\n </div>\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Switch checked={background} onCheckedChange={setBackground} aria-label=\"Background sync\" />\n <span>\n <span className=\"font-medium text-foreground\">Background sync.</span>{' '}\n {BACKGROUND_SYNC_EXPLANATION}\n </span>\n </label>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={connect.isPending}>\n {connect.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Connect\n </Button>\n </div>\n </form>\n )\n}\n\nexport interface CalendarAccountsPanelProps {\n className?: string\n}\n\nexport function CalendarAccountsPanel({ className }: CalendarAccountsPanelProps) {\n const { notify } = useBlocksEnvironment()\n const { connectors } = useCalendarSupport()\n const startOAuth = useStartCalendarAccountOAuth()\n const { data: accounts = [], isLoading, error } = useCalendarAccounts()\n const connectOAuth = useConnectOAuthAccount()\n const [caldavOpen, setCaldavOpen] = useState(false)\n const [background, setBackground] = useState(false)\n const [pendingKind, setPendingKind] = useState<'google' | 'microsoft' | null>(null)\n const [oauthError, setOauthError] = useState<string | null>(null)\n\n const resumed = useResumeCalendarAccountConnect(({ account, error: err }) => {\n if (account) notify(`${KIND_LABEL[account.kind]} connected`, 'success')\n if (err) setOauthError(describeCalendarError(err, 'Could not connect the account'))\n })\n\n const connect = async (kind: 'google' | 'microsoft') => {\n setOauthError(null)\n setPendingKind(kind)\n try {\n const vendors = (await connectors?.connectedVendors()) ?? []\n if (vendors.includes(ACCOUNT_VENDOR[kind])) {\n await connectOAuth.mutateAsync({ kind, backgroundSync: background })\n notify(`${KIND_LABEL[kind]} connected`, 'success')\n } else {\n await startOAuth?.(kind, background)\n }\n } catch (err) {\n setOauthError(describeCalendarError(err, 'Could not connect the account'))\n } finally {\n setPendingKind(null)\n }\n }\n\n const busy = connectOAuth.isPending || resumed.isPending\n // Google and Outlook connect through the host's connector OAuth; without it, CalDAV only.\n const oauth = !!connectors && !!startOAuth\n\n return (\n <section className={cn('grid gap-4', className)} data-testid=\"calendar-accounts-panel\">\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">Connected calendars</h3>\n <p className=\"text-sm text-muted-foreground\">\n Bring your Google, Outlook or CalDAV calendars into ARBI. Changes sync both ways.\n </p>\n </div>\n\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\">Loading accounts…</p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load accounts')}\n </p>\n ) : accounts.length === 0 ? (\n <p className=\"rounded-lg border border-dashed border-border p-4 text-sm text-muted-foreground\">\n No calendar accounts connected yet.\n </p>\n ) : (\n <ul className=\"grid gap-2\">\n {accounts.map((a) => (\n <AccountRow key={a.id} account={a} />\n ))}\n </ul>\n )}\n\n <div className=\"grid gap-2\">\n <div className=\"flex flex-wrap gap-2\">\n {oauth &&\n (['google', 'microsoft'] as const).map((kind) => (\n <Button\n key={kind}\n variant=\"outline\"\n disabled={busy}\n onClick={() => void connect(kind)}\n data-testid={`calendar-connect-${kind}`}\n >\n {pendingKind === kind && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Connect {KIND_LABEL[kind]}\n </Button>\n ))}\n <Button\n variant=\"outline\"\n onClick={() => setCaldavOpen((v) => !v)}\n data-testid=\"calendar-connect-caldav\"\n >\n Connect CalDAV (iCloud, Fastmail, …)\n </Button>\n </div>\n {oauth && (\n <>\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Switch\n checked={background}\n onCheckedChange={setBackground}\n aria-label=\"Background sync for new Google / Outlook accounts\"\n />\n <span>Turn on background sync for the new Google / Outlook account.</span>\n </label>\n <p className=\"text-xs text-muted-foreground\">\n Google and Outlook use your connector sign-in; you&apos;ll be sent to the provider to\n allow calendar access if you haven&apos;t already.\n </p>\n </>\n )}\n {oauthError && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"calendar-connect-error\">\n {oauthError}\n </p>\n )}\n </div>\n\n {caldavOpen && <CalDavForm onDone={() => setCaldavOpen(false)} />}\n </section>\n )\n}\n","import { useCopyText } from '../../citations/QuietMarks'\n\n/** Copy a calendar value (a password, a link, an address) and say \"<what> copied to clipboard\". */\nexport function useCalendarCopy() {\n const copy = useCopyText({ copyFailed: 'Could not copy. Select the text and copy it manually.' })\n return (value: string, what = 'Copied') => copy(value, `${what} to clipboard`)\n}\n","/** A read-only value with a Copy button (passwords, server URLs, feed links, booking links). */\nimport { useState } from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { useCalendarCopy } from './copy'\n\nexport interface CopyFieldProps {\n label: string\n value: string\n /** Monospace + break anywhere (secrets, URLs). */\n mono?: boolean\n testId?: string\n className?: string\n}\n\nexport function CopyField({ label, value, mono = true, testId, className }: CopyFieldProps) {\n const [copied, setCopied] = useState(false)\n const copyText = useCalendarCopy()\n return (\n <div className={cn('grid gap-1', className)}>\n <span className=\"text-xs font-medium text-muted-foreground\">{label}</span>\n <div className=\"flex items-center gap-2\">\n <code\n className={cn(\n 'min-w-0 flex-1 select-all rounded-md border border-border bg-muted/40 px-2 py-1.5 text-sm text-foreground',\n mono ? 'font-mono break-all' : 'break-words'\n )}\n data-testid={testId}\n >\n {value}\n </code>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n aria-label={`Copy ${label}`}\n onClick={() =>\n void copyText(value, label).then((ok) => {\n if (!ok) return\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n })\n }\n >\n {copied ? <Check className=\"size-4\" /> : <Copy className=\"size-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n","/**\n * Open access (P4): app passwords for CalDAV/CardDAV clients (Apple Calendar, Thunderbird, DAVx5, eM Client)\n * and secret read-only ICS feed URLs per calendar (full details or free/busy only). Secrets are shown once.\n *\n * Self-contained section; `calendars` defaults to the user's calendar list.\n */\nimport { useMemo, useState } from 'react'\nimport { KeyRound, Link2, Loader2, Trash2 } from 'lucide-react'\nimport { Button, Input, Label, cn } from '@arbidocs/react/ui'\nimport {\n splitAppPasswords,\n useAppPasswords,\n useCalendars,\n useCreateAppPassword,\n useCreateFeed,\n useRevokeAppPassword,\n type AppPassword,\n type AppPasswordCreated,\n type CalendarRead,\n type FeedLevel,\n} from '@arbidocs/react'\nimport { describeCalendarError, setupSteps } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { CopyField } from './CopyField'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction formatDate(iso: string | null | undefined): string {\n if (!iso) return 'never'\n return new Date(iso).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })\n}\n\nfunction calendarNames(ids: string[] | undefined, calendars: CalendarRead[]): string {\n if (!ids?.length) return 'No calendars'\n const names = ids.map((id) => calendars.find((c) => c.id === id)?.name).filter(Boolean)\n return names.length ? names.join(', ') : `${ids.length} calendar${ids.length === 1 ? '' : 's'}`\n}\n\nfunction RevokeButton({ row }: { row: AppPassword }) {\n const { notify } = useBlocksEnvironment()\n const revoke = useRevokeAppPassword()\n const [confirming, setConfirming] = useState(false)\n if (!confirming)\n return (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Revoke ${row.label}`}\n onClick={() => setConfirming(true)}\n data-testid={`calendar-apw-revoke-${row.id}`}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )\n return (\n <span className=\"flex gap-1\">\n <Button\n size=\"sm\"\n variant=\"destructive\"\n disabled={revoke.isPending}\n onClick={() =>\n revoke.mutate(row.id, {\n onSuccess: () => notify(`Revoked “${row.label}”`, 'success'),\n onError: (err) => notify(`Could not revoke: ${describeCalendarError(err)}`, 'error'),\n onSettled: () => setConfirming(false),\n })\n }\n data-testid={`calendar-apw-revoke-confirm-${row.id}`}\n >\n Revoke\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirming(false)}>\n Cancel\n </Button>\n </span>\n )\n}\n\nfunction CreatedPassword({ created, onDone }: { created: AppPasswordCreated; onDone: () => void }) {\n const server = created.server_url || `${window.location.origin}/dav/`\n const username = created.username || ''\n return (\n <div\n className=\"grid gap-3 rounded-lg border border-primary/40 bg-primary/5 p-3\"\n data-testid=\"calendar-apw-created\"\n >\n <p className=\"text-sm font-medium text-foreground\">\n Password for “{created.label}” — copy it now, it won&apos;t be shown again.\n </p>\n <CopyField label=\"Password\" value={created.password ?? ''} testId=\"calendar-apw-password\" />\n <CopyField label=\"User name\" value={username} />\n <CopyField label=\"Server URL\" value={server} />\n <details className=\"text-sm\">\n <summary className=\"cursor-pointer font-medium text-foreground\">Setup steps</summary>\n <ul className=\"mt-2 grid gap-2\">\n {setupSteps(server, username).map((s) => (\n <li key={s.client}>\n <div className=\"font-medium text-foreground\">{s.client}</div>\n <ol className=\"ml-4 list-decimal text-muted-foreground\">\n {s.steps.map((step) => (\n <li key={step}>{step}</li>\n ))}\n </ol>\n </li>\n ))}\n </ul>\n </details>\n <div className=\"flex justify-end\">\n <Button size=\"sm\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n )\n}\n\nfunction AppPasswordsSection({\n rows,\n calendars,\n}: {\n rows: AppPassword[]\n calendars: CalendarRead[]\n}) {\n const create = useCreateAppPassword()\n const [label, setLabel] = useState('')\n const [allCalendars, setAllCalendars] = useState(true)\n const [selected, setSelected] = useState<string[]>([])\n const [created, setCreated] = useState<AppPasswordCreated | null>(null)\n const [error, setError] = useState<string | null>(null)\n const pickable = calendars.filter((c) => !c.locked && c.role !== 'freebusy')\n\n return (\n <div className=\"grid gap-3\">\n <div>\n <h4 className=\"flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <KeyRound className=\"size-4\" /> App passwords\n </h4>\n <p className=\"text-sm text-muted-foreground\">\n Use your calendars and contacts in Apple Calendar, Thunderbird, DAVx5 or eM Client. Create\n one password per device and revoke it when you no longer use the device.\n </p>\n </div>\n {created ? (\n <CreatedPassword created={created} onDone={() => setCreated(null)} />\n ) : (\n <form\n className=\"grid gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (!label.trim()) return setError('Name the device, e.g. “iPhone”')\n if (!allCalendars && !selected.length) return setError('Pick at least one calendar')\n create.mutate(\n { label, calendar_ids: allCalendars ? null : selected },\n {\n onSuccess: (result) => {\n setCreated(result)\n setLabel('')\n },\n onError: (err) => setError(describeCalendarError(err, 'Could not create password')),\n }\n )\n }}\n data-testid=\"calendar-apw-form\"\n >\n <div className=\"flex flex-wrap gap-2\">\n <Input\n className=\"min-w-0 flex-1\"\n placeholder=\"Device name, e.g. iPhone\"\n aria-label=\"Device name\"\n maxLength={200}\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n data-testid=\"calendar-apw-label\"\n />\n <Button type=\"submit\" disabled={create.isPending}>\n {create.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Create password\n </Button>\n </div>\n <label className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={allCalendars}\n onChange={(e) => setAllCalendars(e.target.checked)}\n />\n All calendars I can read (and my contacts)\n </label>\n {!allCalendars && (\n <fieldset className=\"grid gap-1 rounded-md border border-border p-2 text-sm\">\n <legend className=\"px-1 text-xs text-muted-foreground\">\n Calendars this device can read\n </legend>\n {pickable.map((c) => (\n <label key={c.id} className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={selected.includes(c.id)}\n onChange={(e) =>\n setSelected((s) =>\n e.target.checked ? [...s, c.id] : s.filter((id) => id !== c.id)\n )\n }\n />\n <span className=\"size-2.5 rounded-full\" style={{ background: c.color }} />\n {c.name}\n </label>\n ))}\n </fieldset>\n )}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </form>\n )}\n {rows.length > 0 && (\n <ul className=\"grid gap-1\" data-testid=\"calendar-apw-list\">\n {rows.map((r) => (\n <li\n key={r.id}\n className=\"flex items-center justify-between gap-2 rounded-md border border-border px-3 py-2 text-sm\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-foreground\">{r.label}</div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {calendarNames(r.calendar_ids, calendars)} · created {formatDate(r.created_at)} ·\n last used {formatDate(r.last_used_at)}\n </div>\n </div>\n <RevokeButton row={r} />\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction FeedsSection({ rows, calendars }: { rows: AppPassword[]; calendars: CalendarRead[] }) {\n const create = useCreateFeed()\n const readable = calendars.filter((c) => !c.locked)\n const [calendarId, setCalendarId] = useState('')\n const [level, setLevel] = useState<FeedLevel>('full')\n const [created, setCreated] = useState<AppPasswordCreated | null>(null)\n const [error, setError] = useState<string | null>(null)\n const chosen = calendarId || readable[0]?.id || ''\n\n return (\n <div className=\"grid gap-3\">\n <div>\n <h4 className=\"flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Link2 className=\"size-4\" /> Calendar feeds (ICS)\n </h4>\n <p className=\"text-sm text-muted-foreground\">\n A secret, read-only link anyone with the URL can subscribe to. Free/busy feeds show only\n when you&apos;re busy, without titles.\n </p>\n </div>\n <form\n className=\"flex flex-wrap items-end gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (!chosen) return setError('Pick a calendar')\n const name = calendars.find((c) => c.id === chosen)?.name ?? 'Calendar'\n create.mutate(\n {\n calendar_id: chosen,\n level,\n label: `${name}${level === 'freebusy' ? ' (free/busy)' : ''}`,\n },\n {\n onSuccess: setCreated,\n onError: (err) => setError(describeCalendarError(err, 'Could not create feed')),\n }\n )\n }}\n data-testid=\"calendar-feed-form\"\n >\n <div className=\"grid min-w-40 flex-1 gap-1\">\n <Label htmlFor=\"feed-calendar\">Calendar</Label>\n <select\n id=\"feed-calendar\"\n className={selectClass}\n value={chosen}\n onChange={(e) => setCalendarId(e.target.value)}\n >\n {readable.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </select>\n </div>\n <div className=\"grid min-w-40 gap-1\">\n <Label htmlFor=\"feed-level\">Shows</Label>\n <select\n id=\"feed-level\"\n className={selectClass}\n value={level}\n onChange={(e) => setLevel(e.target.value as FeedLevel)}\n >\n <option value=\"full\">All event details</option>\n <option value=\"freebusy\">Free/busy only</option>\n </select>\n </div>\n <Button type=\"submit\" disabled={create.isPending || !chosen}>\n {create.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Create feed link\n </Button>\n </form>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n {created?.feed_url && (\n <div\n className=\"grid gap-2 rounded-lg border border-primary/40 bg-primary/5 p-3 text-sm\"\n data-testid=\"calendar-feed-created\"\n >\n <p className=\"font-medium text-foreground\">\n Copy this link now — it won&apos;t be shown again.\n </p>\n <CopyField label=\"Feed URL\" value={created.feed_url} testId=\"calendar-feed-url\" />\n <ul className=\"ml-4 list-disc text-xs text-muted-foreground\">\n <li>Outlook: Add calendar → Subscribe from web → paste the URL.</li>\n <li>Google Calendar: Other calendars → + → From URL → paste the URL.</li>\n <li>Apple Calendar: File → New Calendar Subscription → paste the URL.</li>\n </ul>\n <div className=\"flex justify-end\">\n <Button size=\"sm\" onClick={() => setCreated(null)}>\n Done\n </Button>\n </div>\n </div>\n )}\n {rows.length > 0 && (\n <ul className=\"grid gap-1\" data-testid=\"calendar-feed-list\">\n {rows.map((r) => (\n <li\n key={r.id}\n className=\"flex items-center justify-between gap-2 rounded-md border border-border px-3 py-2 text-sm\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-foreground\">\n {r.label}{' '}\n <span className=\"text-xs font-normal text-muted-foreground\">\n {r.kind === 'freebusy' ? 'free/busy' : 'full details'}\n </span>\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {calendarNames(r.calendar_ids, calendars)} · created {formatDate(r.created_at)} ·\n last fetched {formatDate(r.last_used_at)}\n </div>\n </div>\n <RevokeButton row={r} />\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nexport interface OpenAccessPanelProps {\n /** Calendars to offer; defaults to `useCalendars()`. */\n calendars?: CalendarRead[]\n className?: string\n}\n\nexport function OpenAccessPanel({ calendars: given, className }: OpenAccessPanelProps) {\n const { data: fetched = [] } = useCalendars()\n const calendars = given ?? fetched\n const { data: rows = [], isLoading, error } = useAppPasswords()\n const { devices, feeds } = useMemo(() => splitAppPasswords(rows), [rows])\n\n return (\n <section className={cn('grid gap-6', className)} data-testid=\"calendar-open-access-panel\">\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">Use in other apps</h3>\n <p className=\"text-sm text-muted-foreground\">\n Sync ARBI calendars to your phone or desktop calendar app, or publish a subscription link.\n </p>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load app passwords')}\n </p>\n )}\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : (\n <>\n <AppPasswordsSection rows={devices} calendars={calendars} />\n <FeedsSection rows={feeds} calendars={calendars} />\n </>\n )}\n </section>\n )\n}\n","/**\n * Booking pages (P5): public `/book/<slug>` pages where anyone can pick a free slot from your calendar.\n * List, create / edit (durations, zone, weekly hours, buffer, notice, horizon, daily limit, location, active),\n * copy the public link, delete.\n */\nimport { useState } from 'react'\nimport { CalendarCheck, ExternalLink, Loader2, Pencil, Plus, Trash2 } from 'lucide-react'\nimport { Button, Input, Label, Switch, Textarea, cn } from '@arbidocs/react/ui'\nimport {\n useBookingPages,\n useCalendarSettings,\n useDeleteBookingPage,\n useSaveBookingPage,\n type BookingPage,\n} from '@arbidocs/react'\nimport {\n WEEKDAY_NAMES,\n WeeklyHoursEditor,\n bookingLink,\n bookingToForm,\n describeCalendarError,\n detectTimeZone,\n emptyBookingForm,\n formToBookingBody,\n slugify,\n validateBookingForm,\n zoneOptions,\n type BookingFormState,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useCalendarCopy } from './copy'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction summarizeWeekly(page: BookingPage): string {\n const days = [...new Set((page.weekly ?? []).map((w) => Number(w.day)))].sort()\n if (!days.length) return 'No hours set'\n return days.map((d) => WEEKDAY_NAMES[d]?.slice(0, 3)).join(', ')\n}\n\nexport interface BookingPageFormProps {\n page?: BookingPage | null\n defaultTimeZone: string\n onDone: () => void\n}\n\nexport function BookingPageForm({ page, defaultTimeZone, onDone }: BookingPageFormProps) {\n const { notify } = useBlocksEnvironment()\n const copyText = useCalendarCopy()\n const [form, setForm] = useState<BookingFormState>(() =>\n page ? bookingToForm(page) : emptyBookingForm(defaultTimeZone)\n )\n const [slugTouched, setSlugTouched] = useState(!!page)\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [serverError, setServerError] = useState<string | null>(null)\n const save = useSaveBookingPage()\n const set = <K extends keyof BookingFormState>(key: K, value: BookingFormState[K]) =>\n setForm((f) => ({ ...f, [key]: value }))\n\n const num = (\n key: 'bufferMinutes' | 'minNoticeHours' | 'maxDaysAhead' | 'dailyLimit',\n label: string,\n hint?: string\n ) => (\n <div className=\"grid gap-1\">\n <Label htmlFor={`booking-${key}`}>{label}</Label>\n <Input\n id={`booking-${key}`}\n type=\"number\"\n inputMode=\"numeric\"\n min={0}\n placeholder={hint}\n value={form[key]}\n onChange={(e) => set(key, e.target.value)}\n aria-invalid={!!errors[key]}\n data-testid={`booking-${key}`}\n />\n {errors[key] && <span className=\"text-xs text-destructive\">{errors[key]}</span>}\n </div>\n )\n\n return (\n <form\n className=\"grid gap-4\"\n onSubmit={(e) => {\n e.preventDefault()\n const found = validateBookingForm(form)\n setErrors(found)\n setServerError(null)\n if (Object.keys(found).length) return\n save.mutate(formToBookingBody(form), {\n onSuccess: (saved) => {\n notify(page ? 'Booking page saved' : 'Booking page published', 'success')\n if (!page) void copyText(bookingLink(saved), 'Booking link')\n onDone()\n },\n onError: (err) =>\n setServerError(\n (err as { status?: number }).status === 409\n ? 'That link is taken. Choose another.'\n : describeCalendarError(err, 'Could not save')\n ),\n })\n }}\n data-testid=\"booking-page-form\"\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-title\">Title</Label>\n <Input\n id=\"booking-title\"\n placeholder=\"30-minute intro call\"\n value={form.title}\n onChange={(e) => {\n const title = e.target.value\n setForm((f) => ({ ...f, title, slug: slugTouched ? f.slug : slugify(title) }))\n }}\n aria-invalid={!!errors.title}\n data-testid=\"booking-title\"\n />\n {errors.title && <span className=\"text-xs text-destructive\">{errors.title}</span>}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-slug\">Link</Label>\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <span className=\"shrink-0\">/book/</span>\n <Input\n id=\"booking-slug\"\n value={form.slug}\n disabled={!!page}\n onChange={(e) => {\n setSlugTouched(true)\n set('slug', e.target.value.toLowerCase())\n }}\n aria-invalid={!!errors.slug}\n data-testid=\"booking-slug\"\n />\n </div>\n {errors.slug && <span className=\"text-xs text-destructive\">{errors.slug}</span>}\n </div>\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-description\">Description</Label>\n <Textarea\n id=\"booking-description\"\n rows={2}\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n />\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-durations\">Durations (minutes)</Label>\n <Input\n id=\"booking-durations\"\n placeholder=\"15, 30, 60\"\n value={form.durations}\n onChange={(e) => set('durations', e.target.value)}\n aria-invalid={!!errors.durations}\n data-testid=\"booking-durations\"\n />\n {errors.durations && <span className=\"text-xs text-destructive\">{errors.durations}</span>}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-zone\">Time zone of your hours</Label>\n <select\n id=\"booking-zone\"\n className={selectClass}\n value={form.timeZone}\n onChange={(e) => set('timeZone', e.target.value)}\n >\n {zoneOptions(form.timeZone).map((z) => (\n <option key={z} value={z}>\n {z.replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </div>\n </div>\n <fieldset className=\"grid gap-2\">\n <legend className=\"mb-1 text-sm font-medium text-foreground\">Weekly hours</legend>\n <WeeklyHoursEditor value={form.weekly} onChange={(weekly) => set('weekly', weekly)} />\n {errors.weekly && <span className=\"text-xs text-destructive\">{errors.weekly}</span>}\n <p className=\"text-xs text-muted-foreground\">\n Only times free in your calendars within these hours are offered.\n </p>\n </fieldset>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {num('bufferMinutes', 'Buffer between meetings (minutes)')}\n {num('minNoticeHours', 'Minimum notice (hours)')}\n {num('maxDaysAhead', 'Bookable up to (days ahead)')}\n {num('dailyLimit', 'Max bookings per day', 'No limit')}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-location\">Location</Label>\n <Input\n id=\"booking-location\"\n placeholder=\"Office, phone, or a meeting link\"\n value={form.location}\n onChange={(e) => set('location', e.target.value)}\n />\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={form.active}\n onCheckedChange={(active) => set('active', active)}\n aria-label=\"Accepting bookings\"\n data-testid=\"booking-active\"\n />\n Accepting bookings\n </label>\n {serverError && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {serverError}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={save.isPending} data-testid=\"booking-save\">\n {save.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n {page ? 'Save' : 'Publish'}\n </Button>\n </div>\n </form>\n )\n}\n\nexport interface BookingPagesPanelProps {\n /** Zone for new pages; defaults to the calendar settings zone, then the browser's. */\n defaultTimeZone?: string\n className?: string\n}\n\nexport function BookingPagesPanel({ defaultTimeZone, className }: BookingPagesPanelProps) {\n const { notify } = useBlocksEnvironment()\n const copyText = useCalendarCopy()\n const { data: pages = [], isLoading, error } = useBookingPages()\n const { data: settings } = useCalendarSettings(!defaultTimeZone)\n const remove = useDeleteBookingPage()\n const [editing, setEditing] = useState<BookingPage | 'new' | null>(null)\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null)\n const zone = defaultTimeZone || settings?.time_zone || detectTimeZone()\n\n if (editing)\n return (\n <section className={cn('grid gap-3', className)} data-testid=\"calendar-booking-panel\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {editing === 'new' ? 'New booking page' : `Edit “${editing.title}”`}\n </h3>\n <BookingPageForm\n key={editing === 'new' ? 'new' : editing.slug}\n page={editing === 'new' ? null : editing}\n defaultTimeZone={zone}\n onDone={() => setEditing(null)}\n />\n </section>\n )\n\n return (\n <section className={cn('grid gap-3', className)} data-testid=\"calendar-booking-panel\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">Booking pages</h3>\n <p className=\"text-sm text-muted-foreground\">\n Share a link; people pick a free time and it lands in your calendar.\n </p>\n </div>\n <Button size=\"sm\" onClick={() => setEditing('new')} data-testid=\"booking-page-new\">\n <Plus className=\"mr-1 size-4\" /> New booking page\n </Button>\n </div>\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load booking pages')}\n </p>\n ) : pages.length === 0 ? (\n <div className=\"grid justify-items-center gap-2 rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n <CalendarCheck className=\"size-6\" />\n <p>No booking pages yet.</p>\n </div>\n ) : (\n <ul className=\"grid gap-2\">\n {pages.map((p) => (\n <li\n key={p.id}\n className=\"grid gap-2 rounded-lg border border-border bg-card p-3 text-sm\"\n data-testid={`booking-page-${p.slug}`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 font-medium text-foreground\">\n {p.title}\n {!p.active && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n Paused\n </span>\n )}\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {p.durations.map((d) => `${d} min`).join(' / ')} · {summarizeWeekly(p)} ·{' '}\n {p.time_zone.replace(/_/g, ' ')}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void copyText(bookingLink(p), 'Booking link')}\n >\n Copy link\n </Button>\n <Button size=\"sm\" variant=\"ghost\" asChild aria-label={`Open ${p.title}`}>\n <a href={bookingLink(p)} target=\"_blank\" rel=\"noreferrer\">\n <ExternalLink className=\"size-4\" />\n </a>\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Edit ${p.title}`}\n onClick={() => setEditing(p)}\n >\n <Pencil className=\"size-4\" />\n </Button>\n {confirmDelete === p.slug ? (\n <>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n disabled={remove.isPending}\n onClick={() =>\n remove.mutate(p.slug, {\n onError: (err) =>\n notify(`Could not delete: ${describeCalendarError(err)}`, 'error'),\n onSettled: () => setConfirmDelete(null),\n })\n }\n >\n Delete\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirmDelete(null)}>\n Cancel\n </Button>\n </>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Delete ${p.title}`}\n onClick={() => setConfirmDelete(p.slug)}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n </section>\n )\n}\n","/**\n * Rooms directory: find a room (min capacity, feature, building) and see whether it is free for a time\n * window; create a room or piece of equipment. Book a room by inviting its address to an event.\n */\nimport { useMemo, useState } from 'react'\nimport { DoorOpen, Loader2, Plus } from 'lucide-react'\nimport { Button, Input, Label, Switch, cn } from '@arbidocs/react/ui'\nimport {\n useCalendarSettings,\n useCreateRoom,\n useRooms,\n type RoomQuery,\n type RoomRead,\n} from '@arbidocs/react'\nimport {\n defaultRoomWindow,\n describeCalendarError,\n detectTimeZone,\n formatBusy,\n safeZone,\n wallToUtc,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useCalendarCopy } from './copy'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction CreateRoomForm({ zone, onDone }: { zone: string; onDone: () => void }) {\n const { notify } = useBlocksEnvironment()\n const create = useCreateRoom()\n const [name, setName] = useState('')\n const [type, setType] = useState<'room' | 'equipment'>('room')\n const [capacity, setCapacity] = useState('')\n const [building, setBuilding] = useState('')\n const [floor, setFloor] = useState('')\n const [features, setFeatures] = useState('')\n const [autoAccept, setAutoAccept] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n return (\n <form\n className=\"grid gap-3 rounded-lg border border-border p-3\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (!name.trim()) return setError('Enter a name')\n const cap = capacity.trim() ? Number(capacity) : null\n if (cap !== null && (!Number.isInteger(cap) || cap < 1))\n return setError('Capacity must be a whole number')\n create.mutate(\n {\n name: name.trim(),\n type,\n capacity: cap,\n building: building.trim() || null,\n floor: floor.trim() || null,\n features: features\n .split(',')\n .map((f) => f.trim())\n .filter(Boolean),\n auto_accept: autoAccept,\n timezone: zone,\n },\n {\n onSuccess: (room) => {\n notify(`Created ${room.name} (${room.email})`, 'success')\n onDone()\n },\n onError: (err) => setError(describeCalendarError(err, 'Could not create')),\n }\n )\n }}\n data-testid=\"room-create-form\"\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-name\">Name</Label>\n <Input id=\"room-name\" value={name} onChange={(e) => setName(e.target.value)} />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-type\">Type</Label>\n <select\n id=\"room-type\"\n className={selectClass}\n value={type}\n onChange={(e) => setType(e.target.value as 'room' | 'equipment')}\n >\n <option value=\"room\">Room</option>\n <option value=\"equipment\">Equipment</option>\n </select>\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-capacity\">Capacity</Label>\n <Input\n id=\"room-capacity\"\n type=\"number\"\n min={1}\n value={capacity}\n onChange={(e) => setCapacity(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-building\">Building</Label>\n <Input\n id=\"room-building\"\n value={building}\n onChange={(e) => setBuilding(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-floor\">Floor</Label>\n <Input id=\"room-floor\" value={floor} onChange={(e) => setFloor(e.target.value)} />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-features\">Features (comma-separated)</Label>\n <Input\n id=\"room-features\"\n placeholder=\"projector, whiteboard, video\"\n value={features}\n onChange={(e) => setFeatures(e.target.value)}\n />\n </div>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch checked={autoAccept} onCheckedChange={setAutoAccept} aria-label=\"Auto-accept\" />\n Accept invitations automatically when free\n </label>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={create.isPending}>\n {create.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Create\n </Button>\n </div>\n </form>\n )\n}\n\nfunction RoomRow({ room, zone, checked }: { room: RoomRead; zone: string; checked: boolean }) {\n const copyText = useCalendarCopy()\n return (\n <li\n className=\"flex flex-wrap items-start justify-between gap-2 px-3 py-2 text-sm\"\n data-testid={`room-${room.id}`}\n >\n <div className=\"min-w-0\">\n <div className=\"font-medium text-foreground\">\n {room.name}\n {room.type === 'equipment' && (\n <span className=\"ml-1 text-xs font-normal text-muted-foreground\">(equipment)</span>\n )}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {[\n room.capacity ? `${room.capacity} people` : null,\n [room.building, room.floor && `floor ${room.floor}`].filter(Boolean).join(', ') || null,\n room.features?.length ? room.features.join(', ') : null,\n ]\n .filter(Boolean)\n .join(' · ')}\n </div>\n <button\n type=\"button\"\n className=\"text-xs text-primary underline-offset-2 hover:underline\"\n onClick={() => void copyText(room.email, 'Room address')}\n >\n {room.email}\n </button>\n {checked && !!room.busy?.length && (\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Busy {(room.busy ?? []).map((b) => formatBusy(b.start, b.end, zone)).join(', ')}\n </div>\n )}\n </div>\n {checked && room.free !== null && room.free !== undefined && (\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs',\n room.free\n ? 'bg-emerald-500/10 text-emerald-700 dark:text-emerald-400'\n : 'bg-destructive/10 text-destructive'\n )}\n data-testid={`room-free-${room.id}`}\n >\n {room.free ? 'Free' : 'Busy'}\n </span>\n )}\n </li>\n )\n}\n\nexport interface RoomsDirectoryPanelProps {\n /** Zone for the time-window inputs; defaults to the calendar settings zone. */\n timeZone?: string\n /** Show \"New room\" (any user may create; workspace rooms need workspace access). Default true. */\n canCreate?: boolean\n className?: string\n}\n\nexport function RoomsDirectoryPanel({\n timeZone,\n canCreate = true,\n className,\n}: RoomsDirectoryPanelProps) {\n const { data: settings } = useCalendarSettings(!timeZone)\n const zone = safeZone(timeZone || settings?.time_zone, detectTimeZone())\n const [initial] = useState(() => defaultRoomWindow(zone))\n const [minCapacity, setMinCapacity] = useState('')\n const [feature, setFeature] = useState('')\n const [building, setBuilding] = useState('')\n const [start, setStart] = useState(initial.start)\n const [end, setEnd] = useState(initial.end)\n const [checkWindow, setCheckWindow] = useState(true)\n const [creating, setCreating] = useState(false)\n\n const windowError = checkWindow && start && end && end <= start ? 'End must be after start' : null\n const query = useMemo<RoomQuery>(\n () => ({\n min_capacity: Number(minCapacity) > 0 ? Number(minCapacity) : undefined,\n feature: feature.trim() ? [feature.trim()] : undefined,\n building: building.trim() || undefined,\n ...(checkWindow && start && end && !windowError\n ? { start: wallToUtc(start, zone), end: wallToUtc(end, zone) }\n : {}),\n }),\n [minCapacity, feature, building, checkWindow, start, end, zone, windowError]\n )\n const { data: rooms = [], isFetching, error } = useRooms(query)\n const sorted = useMemo(\n () =>\n [...rooms].sort(\n (a, b) => Number(b.free ?? 0) - Number(a.free ?? 0) || a.name.localeCompare(b.name)\n ),\n [rooms]\n )\n\n return (\n <section className={cn('grid gap-3', className)} data-testid=\"calendar-rooms-panel\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div>\n <h3 className=\"flex items-center gap-1.5 text-base font-semibold text-foreground\">\n <DoorOpen className=\"size-4\" /> Rooms\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n Book a room by inviting its address to your event.\n </p>\n </div>\n {canCreate && !creating && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setCreating(true)}\n data-testid=\"room-new\"\n >\n <Plus className=\"mr-1 size-4\" /> New room\n </Button>\n )}\n </div>\n {creating && <CreateRoomForm zone={zone} onDone={() => setCreating(false)} />}\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-capacity\">Min. capacity</Label>\n <Input\n id=\"rooms-capacity\"\n type=\"number\"\n min={1}\n value={minCapacity}\n onChange={(e) => setMinCapacity(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-feature\">Feature</Label>\n <Input\n id=\"rooms-feature\"\n placeholder=\"projector\"\n value={feature}\n onChange={(e) => setFeature(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-building\">Building</Label>\n <Input\n id=\"rooms-building\"\n value={building}\n onChange={(e) => setBuilding(e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-2\">\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={checkWindow}\n onCheckedChange={setCheckWindow}\n aria-label=\"Check availability\"\n />\n Check availability ({zone.replace(/_/g, ' ')})\n </label>\n {checkWindow && (\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-start\">From</Label>\n <Input\n id=\"rooms-start\"\n type=\"datetime-local\"\n value={start}\n onChange={(e) => setStart(e.target.value)}\n data-testid=\"rooms-start\"\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-end\">To</Label>\n <Input\n id=\"rooms-end\"\n type=\"datetime-local\"\n value={end}\n onChange={(e) => setEnd(e.target.value)}\n data-testid=\"rooms-end\"\n />\n </div>\n {windowError && <span className=\"text-xs text-destructive\">{windowError}</span>}\n </div>\n )}\n </div>\n {error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load rooms')}\n </p>\n ) : sorted.length === 0 ? (\n <p className=\"rounded-lg border border-dashed border-border p-4 text-sm text-muted-foreground\">\n {isFetching ? 'Loading rooms…' : 'No rooms match.'}\n </p>\n ) : (\n <ul\n className=\"grid divide-y divide-border rounded-lg border border-border\"\n data-testid=\"rooms-list\"\n >\n {sorted.map((r) => (\n <RoomRow key={r.id} room={r} zone={zone} checked={!!query.start} />\n ))}\n </ul>\n )}\n </section>\n )\n}\n","/**\n * Calendar settings dialog. Tabs: General (GET/PUT /v1/calendar/settings via the block's form), Accounts\n * (connected Google / Outlook / CalDAV), Sync & devices (app passwords + feeds), Booking pages, Rooms.\n * The panels are self-contained and only mount when their tab is shown. Contacts are not here: they live in\n * the host's contacts.\n */\nimport { useEffect, useState } from 'react'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@arbidocs/react/ui'\nimport { useSaveCalendarSettings, type CalendarSettings } from '@arbidocs/react'\nimport {\n CalendarSettingsForm,\n describeCalendarError,\n toSettingsValue,\n type CalendarListItem,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { CalendarAccountsPanel } from './CalendarAccountsPanel'\nimport { OpenAccessPanel } from './OpenAccessPanel'\nimport { BookingPagesPanel } from './BookingPagesPanel'\nimport { RoomsDirectoryPanel } from './RoomsDirectoryPanel'\n\nexport type CalendarSettingsTab = 'general' | 'accounts' | 'access' | 'booking' | 'rooms'\n\nconst TABS: { value: CalendarSettingsTab; label: string }[] = [\n { value: 'general', label: 'General' },\n { value: 'accounts', label: 'Accounts' },\n { value: 'access', label: 'Sync & devices' },\n { value: 'booking', label: 'Booking pages' },\n { value: 'rooms', label: 'Rooms' },\n]\n\nexport interface CalendarSettingsDialogProps {\n open: boolean\n settings: CalendarSettings\n calendars: CalendarListItem[]\n /** Tab to show when the dialog opens (default General). */\n initialTab?: CalendarSettingsTab\n onClose: () => void\n}\n\nexport function CalendarSettingsDialog({\n open,\n settings,\n calendars,\n initialTab = 'general',\n onClose,\n}: CalendarSettingsDialogProps) {\n const { notify } = useBlocksEnvironment()\n const save = useSaveCalendarSettings()\n const [value, setValue] = useState(() => toSettingsValue(settings))\n const [tab, setTab] = useState<CalendarSettingsTab>(initialTab)\n useEffect(() => {\n if (open) {\n setValue(toSettingsValue(settings))\n setTab(initialTab)\n save.reset()\n }\n // Reset only when the dialog opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n className=\"max-h-[90vh] overflow-y-auto sm:max-w-3xl\"\n presentation=\"full\"\n data-testid=\"calendar-settings-dialog\"\n >\n <DialogHeader>\n <DialogTitle>Calendar settings</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preferences, connected accounts, device sync, booking pages and rooms\n </DialogDescription>\n </DialogHeader>\n <Tabs value={tab} onValueChange={(v) => setTab(v as CalendarSettingsTab)}>\n <TabsList\n className=\"flex h-auto flex-wrap justify-start\"\n data-testid=\"calendar-settings-tabs\"\n >\n {TABS.map((t) => (\n <TabsTrigger\n key={t.value}\n value={t.value}\n data-testid={`calendar-settings-tab-${t.value}`}\n >\n {t.label}\n </TabsTrigger>\n ))}\n </TabsList>\n <TabsContent value=\"general\" className=\"pt-3\">\n <CalendarSettingsForm\n value={value}\n onChange={setValue}\n calendars={calendars.filter((c) => c.canWrite)}\n saving={save.isPending}\n error={save.error ? describeCalendarError(save.error) : null}\n onCancel={onClose}\n onSave={() =>\n save.mutate({ ...settings, ...value } as CalendarSettings, {\n onSuccess: () => {\n notify('Calendar settings saved', 'success')\n onClose()\n },\n })\n }\n />\n </TabsContent>\n <TabsContent value=\"accounts\" className=\"pt-3\">\n {tab === 'accounts' && <CalendarAccountsPanel />}\n </TabsContent>\n <TabsContent value=\"access\" className=\"pt-3\">\n {tab === 'access' && <OpenAccessPanel />}\n </TabsContent>\n <TabsContent value=\"booking\" className=\"pt-3\">\n {tab === 'booking' && <BookingPagesPanel defaultTimeZone={settings.time_zone} />}\n </TabsContent>\n <TabsContent value=\"rooms\" className=\"pt-3\">\n {tab === 'rooms' && <RoomsDirectoryPanel timeZone={settings.time_zone} />}\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The editor's scheduling section: attendees' free/busy over the event's day (POST /freebusy), \"Find a\n * time\" (POST /find-time) that moves the draft, and the room finder (GET /rooms) that books a room by adding\n * it as an attendee with kind \"room\". Collapsed until opened, so the editor does not fetch on every open.\n */\nimport { useMemo, useState } from 'react'\nimport { CalendarSearch } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useArbi, useFindTime, useFreeBusy, useRooms } from '@arbidocs/react'\nimport {\n RoomFinder,\n SchedulingAssistant,\n applySuggestion,\n draftRangeUtc,\n freeBusyToRows,\n isAllDayDraft,\n toSuggestionViews,\n utcToDate,\n type EventDraft,\n type TimeSuggestionView,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport interface EventSchedulingProps {\n draft: EventDraft\n onChange: (draft: EventDraft) => void\n timeZone: string\n workingStartHour?: number\n}\n\nconst attendeeKey = (a: NonNullable<EventDraft['attendees']>[number]) =>\n (a.email ?? a.user_id ?? '').toLowerCase()\n\nexport function EventScheduling({\n draft,\n onChange,\n timeZone,\n workingStartHour = 7,\n}: EventSchedulingProps) {\n const [open, setOpen] = useState(false)\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const me = arbi.isLoggedIn ? (arbi.user.identity()?.email ?? null) : null\n const allDay = isAllDayDraft(draft)\n const range = useMemo(() => {\n try {\n const { startMs, endMs } = draftRangeUtc(draft, timeZone)\n if (!Number.isFinite(startMs) || !Number.isFinite(endMs) || endMs <= startMs) return null\n return { start: new Date(startMs).toISOString(), end: new Date(endMs).toISOString() }\n } catch {\n return null\n }\n }, [draft, timeZone])\n const eventDate = range ? utcToDate(range.start, timeZone) : null\n const [dayOverride, setDayOverride] = useState<string | null>(null)\n const date = dayOverride ?? eventDate\n\n const attendees = useMemo(() => draft.attendees ?? [], [draft.attendees])\n const roomEmails = useMemo(\n () => new Set(attendees.filter((a) => a.kind === 'room').map(attendeeKey)),\n [attendees]\n )\n const ids = useMemo(() => {\n const list = attendees.map(attendeeKey).filter(Boolean)\n if (me && !list.includes(me.toLowerCase())) list.unshift(me.toLowerCase())\n return list\n }, [attendees, me])\n const labelOf = (id: string) => {\n if (me && id === me.toLowerCase()) return 'You'\n const a = attendees.find((x) => attendeeKey(x) === id)\n return a?.name || a?.email || id\n }\n\n const dayStart = date ? `${date}T00:00:00Z` : null\n const fbWindow = date\n ? {\n start: new Date(Date.parse(`${date}T00:00:00Z`) - 86400_000).toISOString(),\n end: new Date(Date.parse(`${date}T00:00:00Z`) + 2 * 86400_000).toISOString(),\n }\n : null\n const freeBusy = useFreeBusy(open ? ids : [], fbWindow?.start ?? null, fbWindow?.end ?? null)\n const rows = useMemo(\n () => (date && freeBusy.data ? freeBusyToRows(freeBusy.data, date, labelOf, roomEmails) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [freeBusy.data, date, roomEmails, attendees, me]\n )\n\n const [filters, setFilters] = useState<{ minCapacity: number | null; feature: string }>({\n minCapacity: null,\n feature: '',\n })\n const rooms = useRooms(\n open && range\n ? {\n start: range.start,\n end: range.end,\n min_capacity: filters.minCapacity ?? undefined,\n feature: filters.feature.trim() ? [filters.feature.trim()] : undefined,\n }\n : null\n )\n\n const findTime = useFindTime()\n const [suggestions, setSuggestions] = useState<TimeSuggestionView[] | null>(null)\n const duration = range\n ? Math.round((Date.parse(range.end) - Date.parse(range.start)) / 60_000)\n : 30\n\n if (allDay) return null\n if (!open)\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n data-testid=\"calendar-open-scheduling\"\n >\n <CalendarSearch className=\"mr-1 size-4\" /> Scheduling assistant &amp; rooms\n </Button>\n )\n\n return (\n <div\n className=\"space-y-4 rounded-md border border-border p-3\"\n data-testid=\"calendar-scheduling-section\"\n >\n {date && (\n <SchedulingAssistant\n date={date}\n timeZone={timeZone}\n rows={rows}\n selection={range ? { startUtc: range.start, endUtc: range.end } : null}\n dayStartHour={Math.max(0, Math.min(workingStartHour, 8) - 1)}\n dayEndHour={21}\n loading={freeBusy.isFetching}\n suggestions={suggestions}\n finding={findTime.isPending}\n onDateChange={setDayOverride}\n onFindTime={() =>\n dayStart &&\n findTime.mutate(\n {\n attendees: ids,\n duration_minutes: Math.max(5, Math.min(duration, 24 * 60)),\n start: new Date(\n Math.max(Date.now(), Date.parse(dayStart) - 86400_000)\n ).toISOString(),\n end: new Date(Date.parse(dayStart) + 7 * 86400_000).toISOString(),\n working_hours_only: true,\n time_zone: timeZone,\n limit: 8,\n },\n {\n onSuccess: (s) => setSuggestions(toSuggestionViews(s)),\n onError: (err) => notify(`Could not find times: ${err.message}`, 'error'),\n }\n )\n }\n onPickSuggestion={(s) => {\n onChange(applySuggestion(draft, s, timeZone))\n setDayOverride(null)\n }}\n />\n )}\n <RoomFinder\n rooms={(rooms.data ?? []).map((r) => ({\n id: r.id,\n name: r.name,\n email: r.email,\n capacity: r.capacity,\n building: r.building,\n floor: r.floor,\n features: r.features,\n free: r.free,\n }))}\n loading={rooms.isFetching}\n minCapacity={filters.minCapacity}\n feature={filters.feature}\n onFiltersChange={setFilters}\n addedEmails={attendees.map((a) => a.email ?? '').filter(Boolean)}\n onAdd={(room) =>\n onChange({\n ...draft,\n location: draft.location || room.name,\n attendees: [\n ...attendees,\n { email: room.email, name: room.name, kind: 'room', role: 'non_participant' },\n ],\n })\n }\n />\n </div>\n )\n}\n","/**\n * The event editor in its dialog: the draft form with attendee suggestions from the user's\n * contacts, the scheduling assistant and room finder, and, when an event is scheduled from a\n * thread or DM, the \"Add an ARBI call\" choice.\n */\nimport { useState } from 'react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { useSearchContacts, type CalendarEvent, type CalendarSettings } from '@arbidocs/react'\nimport {\n EventEditor,\n type AttendeeDraft,\n type CalendarListItem,\n type EventDraft,\n} from '../../calendar'\nimport { EventScheduling } from './EventScheduling'\n\nexport interface EditorState {\n mode: 'create' | 'edit'\n event?: CalendarEvent\n original: EventDraft\n draft: EventDraft\n error: string | null\n /** \"Add ARBI call\" pre-ticked (scheduled from a thread / DM): the call is made when the event is saved. */\n autoCall?: boolean\n}\n\nexport interface EventEditorDialogProps {\n editor: EditorState | null\n onChange: (update: (editor: EditorState | null) => EditorState | null) => void\n onSave: () => void\n onDelete: (event: CalendarEvent) => void\n /** The calendars an event can be saved to. */\n calendars: CalendarListItem[]\n callsEnabled: boolean\n onAddCall: (draft: EventDraft) => Promise<{ call_id: string; url: string }>\n isWebinarAttendee: (attendee: AttendeeDraft) => boolean\n timeZone: string\n workingHours: CalendarSettings['working_hours']\n saving: boolean\n}\n\nexport function EventEditorDialog({\n editor,\n onChange,\n onSave,\n onDelete,\n calendars,\n callsEnabled,\n onAddCall,\n isWebinarAttendee,\n timeZone,\n workingHours,\n saving,\n}: EventEditorDialogProps) {\n const [attendeeQuery, setAttendeeQuery] = useState('')\n const people = useSearchContacts(editor ? attendeeQuery : '')\n const setDraft = (draft: EventDraft) => onChange((e) => (e ? { ...e, draft, error: null } : e))\n return (\n <Dialog open={!!editor} onOpenChange={(open) => !open && onChange(() => null)}>\n <DialogContent\n className=\"max-h-[92vh] overflow-y-auto sm:max-w-2xl\"\n presentation=\"full\"\n data-testid=\"calendar-event-editor-dialog\"\n >\n <DialogTitle className=\"sr-only\">\n {editor?.mode === 'edit' ? 'Edit event' : 'New event'}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">Event details form</DialogDescription>\n {editor &&\n editor.mode === 'create' &&\n callsEnabled &&\n !editor.draft.conference &&\n editor.autoCall !== undefined && (\n <label className=\"mb-2 flex items-center gap-2 rounded-md bg-muted/40 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={!!editor.autoCall}\n onChange={(e) => onChange((x) => (x ? { ...x, autoCall: e.target.checked } : x))}\n data-testid=\"calendar-editor-auto-call\"\n />\n Add an ARBI call (the link is created when you save)\n </label>\n )}\n {editor && (\n <EventEditor\n value={editor.draft}\n onChange={setDraft}\n onSave={onSave}\n onCancel={() => onChange(() => null)}\n onDelete={\n editor.mode === 'edit' && editor.event\n ? () => onDelete(editor.event as CalendarEvent)\n : undefined\n }\n calendars={calendars}\n mode={editor.mode}\n canAddCall={callsEnabled}\n onAddCall={callsEnabled ? () => onAddCall(editor.draft) : undefined}\n canAddWebinar={callsEnabled}\n isWebinarAttendee={isWebinarAttendee}\n defaultTimeZone={timeZone}\n attendeeSuggestions={(people.data ?? []).map((p) => ({\n email: p.email,\n name: p.name ?? null,\n detail: p.source === 'contacts' ? 'Contact' : 'ARBI',\n }))}\n onAttendeeQueryChange={setAttendeeQuery}\n schedulingSlot={\n <EventScheduling\n draft={editor.draft}\n timeZone={timeZone}\n workingStartHour={Number(\n (workingHours ?? [])\n .map((w) => w.start)\n .sort()[0]\n ?.slice(0, 2) ?? 8\n )}\n onChange={setDraft}\n />\n }\n saving={saving}\n error={editor.error}\n />\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Invitations waiting for me (GET /invitations): answer an invitation (accept / maybe / decline with an\n * optional note, or propose a new time), or decide on a proposed new time (COUNTER) for my own event.\n * Rendered as a toolbar button with a count badge that opens a popover.\n */\nimport { useState } from 'react'\nimport { Inbox } from 'lucide-react'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\nimport {\n useCalendarInvitations,\n useDecideCounter,\n useRespondToEvent,\n type InvitationRead,\n} from '@arbidocs/react'\nimport { ProposeTimeDialog, formatEventWhen, formatInZone, wallToUtc } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport interface InvitationsPanelProps {\n timeZone: string\n onOpenEvent?: (eventId: string) => void\n}\n\nfunction when(inv: InvitationRead, zone: string): string {\n if (!inv.start_utc || !inv.end_utc) return ''\n return formatEventWhen(\n { all_day: false, start_utc: inv.start_utc, end_utc: inv.end_utc, start: {}, end: {} },\n zone\n )\n}\n\nfunction proposed(inv: InvitationRead, zone: string): string {\n const s = inv.proposed_start\n const e = inv.proposed_end\n if (!s) return ''\n const toUtc = (spec: typeof s) =>\n spec?.date_time ? wallToUtc(spec.date_time, spec.time_zone || zone) : `${spec?.date}T00:00:00Z`\n const su = toUtc(s)\n const eu = e ? toUtc(e) : su\n return `${formatInZone(su, zone, { weekday: 'short', day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit' })} – ${formatInZone(eu, zone, { hour: 'numeric', minute: '2-digit' })}`\n}\n\nexport function InvitationsPanel({ timeZone, onOpenEvent }: InvitationsPanelProps) {\n const { notify } = useBlocksEnvironment()\n const { data: items = [], refetch } = useCalendarInvitations()\n const respond = useRespondToEvent()\n const decide = useDecideCounter()\n const [open, setOpen] = useState(false)\n const [notes, setNotes] = useState<Record<string, string>>({})\n const [proposeFor, setProposeFor] = useState<InvitationRead | null>(null)\n const fail = (err: Error) => notify(`Could not send: ${err.message}`, 'error')\n\n const answer = (inv: InvitationRead, partstat: 'accepted' | 'tentative' | 'declined') =>\n respond.mutate(\n { id: inv.event_id ?? inv.id, partstat, comment: notes[inv.id]?.trim() || null },\n { onError: fail }\n )\n\n return (\n <>\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (next) void refetch()\n }}\n >\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"relative\"\n aria-label={`Invitations${items.length ? `, ${items.length} waiting` : ''}`}\n data-testid=\"calendar-invitations-button\"\n >\n <Inbox className=\"size-4\" />\n {items.length > 0 && (\n <span\n className=\"absolute -right-0.5 -top-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-semibold text-primary-foreground\"\n data-testid=\"calendar-invitations-badge\"\n >\n {items.length}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"max-h-[70vh] w-96 max-w-[calc(100vw-2rem)] overflow-y-auto p-0\"\n data-testid=\"calendar-invitations-panel\"\n >\n <div className=\"border-b border-border px-3 py-2 text-sm font-semibold\">Invitations</div>\n {items.length === 0 && (\n <p className=\"px-3 py-4 text-sm text-muted-foreground\">Nothing waiting for you.</p>\n )}\n <ul className=\"divide-y divide-border\">\n {items.map((inv) => (\n <li\n key={inv.id}\n className=\"space-y-1.5 px-3 py-2.5 text-sm\"\n data-testid=\"calendar-invitation\"\n data-kind={inv.kind}\n >\n <button\n type=\"button\"\n className=\"block w-full text-left\"\n onClick={() => {\n if (inv.event_id && onOpenEvent) {\n setOpen(false)\n onOpenEvent(inv.event_id)\n }\n }}\n >\n <div className=\"truncate font-medium\">{inv.title || 'Untitled event'}</div>\n <div className=\"text-xs text-muted-foreground\">{when(inv, timeZone)}</div>\n <div className=\"text-xs text-muted-foreground\">\n {inv.kind === 'counter'\n ? `${inv.from_email ?? 'A guest'} proposed: ${proposed(inv, timeZone)}`\n : `From ${inv.organizer?.name || inv.organizer?.email || inv.from_email || 'the organiser'}`}\n </div>\n {inv.comment && <div className=\"text-xs italic\">“{inv.comment}”</div>}\n </button>\n {inv.kind === 'invitation' ? (\n <>\n <Input\n className=\"h-8\"\n placeholder=\"Add a note (optional)\"\n value={notes[inv.id] ?? ''}\n onChange={(e) => setNotes({ ...notes, [inv.id]: e.target.value })}\n />\n <div className=\"flex flex-wrap gap-1.5\">\n <Button\n size=\"sm\"\n onClick={() => answer(inv, 'accepted')}\n data-testid=\"calendar-invitation-accept\"\n >\n Accept\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => answer(inv, 'tentative')}>\n Maybe\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => answer(inv, 'declined')}>\n Decline\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setProposeFor(inv)}\n data-testid=\"calendar-invitation-propose\"\n >\n Propose new time\n </Button>\n </div>\n </>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n <Button\n size=\"sm\"\n onClick={() => decide.mutate({ id: inv.id, accept: true }, { onError: fail })}\n data-testid=\"calendar-counter-accept\"\n >\n Accept new time\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n decide.mutate({ id: inv.id, accept: false }, { onError: fail })\n }\n data-testid=\"calendar-counter-decline\"\n >\n Keep current time\n </Button>\n </div>\n )}\n </li>\n ))}\n </ul>\n </PopoverContent>\n </Popover>\n <ProposeTimeDialog\n open={!!proposeFor}\n startUtc={proposeFor?.start_utc ?? null}\n endUtc={proposeFor?.end_utc ?? null}\n timeZone={timeZone}\n sending={respond.isPending}\n onCancel={() => setProposeFor(null)}\n onSend={(v) => {\n const inv = proposeFor\n if (!inv) return\n respond.mutate(\n {\n id: inv.event_id ?? inv.id,\n partstat: 'tentative',\n comment: v.comment,\n propose_start: v.start,\n propose_end: v.end,\n },\n {\n onSuccess: () => {\n setProposeFor(null)\n notify('New time proposed to the organiser', 'success')\n },\n onError: fail,\n }\n )\n }}\n />\n </>\n )\n}\n","/** \"Publish to…\": mirror an own native calendar into a connected Google / Outlook / CalDAV account. */\nimport { useEffect, useState } from 'react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { useCalendarAccounts, usePublishCalendar } from '@arbidocs/react'\nimport { describeCalendarError } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nconst KIND: Record<string, string> = { google: 'Google', microsoft: 'Outlook', caldav: 'CalDAV' }\n\nexport interface PublishCalendarDialogProps {\n calendarId: string | null\n calendarName?: string | null\n onClose: () => void\n /** Open the Accounts tab when there is no account yet. */\n onConnectAccount?: () => void\n}\n\nexport function PublishCalendarDialog({\n calendarId,\n calendarName,\n onClose,\n onConnectAccount,\n}: PublishCalendarDialogProps) {\n const { notify } = useBlocksEnvironment()\n const { data: accounts = [], isLoading } = useCalendarAccounts(!!calendarId)\n const publish = usePublishCalendar()\n const [accountId, setAccountId] = useState('')\n useEffect(() => {\n if (calendarId) {\n setAccountId('')\n publish.reset()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [calendarId])\n const chosen = accountId || accounts[0]?.id || ''\n\n return (\n <Dialog open={!!calendarId} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"calendar-publish-dialog\">\n <DialogHeader>\n <DialogTitle>Publish “{calendarName || 'Calendar'}”</DialogTitle>\n <DialogDescription>\n Creates a copy at the provider and keeps both in sync, so it shows in Outlook, Google or\n Apple Calendar.\n </DialogDescription>\n </DialogHeader>\n {!isLoading && accounts.length === 0 ? (\n <div className=\"space-y-3 text-sm\">\n <p className=\"text-muted-foreground\">Connect an account first.</p>\n {onConnectAccount && (\n <Button type=\"button\" variant=\"outline\" onClick={onConnectAccount}>\n Connect an account\n </Button>\n )}\n </div>\n ) : (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Account</span>\n <select\n className=\"h-9 rounded-md border border-input bg-background px-2 text-sm\"\n value={chosen}\n onChange={(e) => setAccountId(e.target.value)}\n data-testid=\"calendar-publish-account\"\n >\n {accounts.map((a) => (\n <option key={a.id} value={a.id}>\n {KIND[a.kind] ?? a.kind} · {a.address}\n </option>\n ))}\n </select>\n </label>\n )}\n {publish.error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {describeCalendarError(publish.error, 'Could not publish the calendar')}\n </p>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n disabled={!chosen || !calendarId || publish.isPending}\n onClick={() =>\n calendarId &&\n publish.mutate(\n { accountId: chosen, calendarId },\n {\n onSuccess: () => {\n notify('Calendar published', 'success')\n onClose()\n },\n }\n )\n }\n data-testid=\"calendar-publish-save\"\n >\n {publish.isPending ? 'Publishing…' : 'Publish'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/** Share a calendar with ARBI users: list grantees, add by e-mail with a role, change role, remove. */\nimport { useState } from 'react'\nimport { Trash2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport {\n useCalendarShares,\n useShareCalendar,\n useUnshareCalendar,\n type ShareRole,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nconst SHARE_ROLES: { value: ShareRole; label: string }[] = [\n { value: 'freebusy', label: 'See only free/busy' },\n { value: 'read_basic', label: 'See times and titles' },\n { value: 'read', label: 'See all event details' },\n { value: 'write', label: 'Make changes to events' },\n { value: 'delegate', label: 'Make changes and respond for me' },\n]\n\nconst selectClass =\n 'h-9 rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nexport interface ShareCalendarDialogProps {\n calendarId: string | null\n calendarName?: string | null\n onClose: () => void\n}\n\nexport function ShareCalendarDialog({\n calendarId,\n calendarName,\n onClose,\n}: ShareCalendarDialogProps) {\n const { notify } = useBlocksEnvironment()\n const { data: shares = [], isLoading } = useCalendarShares(calendarId)\n const share = useShareCalendar()\n const unshare = useUnshareCalendar()\n const [email, setEmail] = useState('')\n const [role, setRole] = useState<ShareRole>('read')\n const fail = (err: Error) => notify(`Could not update sharing: ${err.message}`, 'error')\n\n const add = () => {\n const grantee = email.trim().toLowerCase()\n if (!calendarId || !grantee) return\n share.mutate(\n { calId: calendarId, grantee, role },\n { onSuccess: () => setEmail(''), onError: fail }\n )\n }\n\n return (\n <Dialog open={!!calendarId} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-lg\" data-testid=\"calendar-share-dialog\">\n <DialogHeader>\n <DialogTitle>Share “{calendarName || 'Calendar'}”</DialogTitle>\n <DialogDescription>\n People you add get their own key to this calendar. Removing someone rotates the key.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-wrap items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n add()\n }}\n >\n <Input\n type=\"email\"\n className=\"min-w-0 flex-1\"\n placeholder=\"name@example.com\"\n aria-label=\"E-mail of the person to share with\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n data-testid=\"calendar-share-email\"\n />\n <select\n className={selectClass}\n aria-label=\"Permission\"\n value={role}\n onChange={(e) => setRole(e.target.value as ShareRole)}\n data-testid=\"calendar-share-role\"\n >\n {SHARE_ROLES.map((r) => (\n <option key={r.value} value={r.value}>\n {r.label}\n </option>\n ))}\n </select>\n <Button\n type=\"submit\"\n disabled={!email.trim() || share.isPending}\n data-testid=\"calendar-share-add\"\n >\n Share\n </Button>\n </form>\n <ul\n className=\"divide-y divide-border rounded-md border border-border\"\n data-testid=\"calendar-share-list\"\n >\n {isLoading && <li className=\"px-3 py-2 text-sm text-muted-foreground\">Loading…</li>}\n {shares.map((s) => (\n <li\n key={s.user_id}\n className=\"flex items-center gap-2 px-3 py-2 text-sm\"\n data-testid=\"calendar-share-row\"\n data-user-id={s.user_id}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium\">{s.name || s.email || s.user_id}</div>\n {s.name && s.email && (\n <div className=\"truncate text-xs text-muted-foreground\">{s.email}</div>\n )}\n </div>\n {s.role === 'owner' ? (\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n ) : (\n <>\n <select\n className={`${selectClass} h-8`}\n aria-label={`Permission for ${s.email ?? s.user_id}`}\n value={s.role}\n disabled={s.is_agent}\n onChange={(e) =>\n calendarId &&\n share.mutate(\n {\n calId: calendarId,\n grantee: s.user_id,\n role: e.target.value as ShareRole,\n },\n { onError: fail }\n )\n }\n >\n {SHARE_ROLES.map((r) => (\n <option key={r.value} value={r.value}>\n {r.label}\n </option>\n ))}\n </select>\n {!s.is_agent && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Stop sharing with ${s.email ?? s.user_id}`}\n onClick={() =>\n calendarId &&\n unshare.mutate({ calId: calendarId, userId: s.user_id }, { onError: fail })\n }\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </>\n )}\n </li>\n ))}\n </ul>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The connected calendar's view state: the chosen view is remembered across reloads (localStorage),\n * the anchor date lives for the session, and two requests carry intents from elsewhere into the\n * calendar once it mounts: an event to open (a deep link, a reminder) and a prefilled new event\n * (\"Schedule a call\" from a thread). The host navigates to its calendar page after making one.\n */\nimport { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport type { CalendarViewKind } from '../../calendar/types'\n\n/** \"Schedule a call\" from elsewhere (a thread, a DM, a dashboard): the editor opens prefilled. */\nexport interface CalendarComposerPrefill {\n title?: string\n attendees?: { email?: string | null; user_id?: string | null; name?: string | null }[]\n conversationId?: string | null\n /** Add an ARBI call when the event is saved (\"Add ARBI call\" ticked). */\n addCall?: boolean\n}\n\nexport interface PendingCalendarEvent {\n id: string\n recurrenceId?: string | null\n}\n\ninterface CalendarViewState {\n /** `null` until the user picks one: the settings' default view applies. */\n view: CalendarViewKind | null\n /** YYYY-MM-DD anchor; `null` = today. */\n date: string | null\n pendingEvent: PendingCalendarEvent | null\n pendingComposer: CalendarComposerPrefill | null\n setPendingComposer: (prefill: CalendarComposerPrefill | null) => void\n setView: (view: CalendarViewKind) => void\n setDate: (date: string | null) => void\n setPendingEvent: (pending: PendingCalendarEvent | null) => void\n}\n\nexport const useCalendarViewStore = create<CalendarViewState>()(\n persist(\n (set) => ({\n view: null,\n date: null,\n pendingEvent: null,\n pendingComposer: null,\n setPendingComposer: (pendingComposer) => set({ pendingComposer }),\n setView: (view) => set({ view }),\n setDate: (date) => set({ date }),\n setPendingEvent: (pendingEvent) => set({ pendingEvent }),\n }),\n {\n name: 'arbi-calendar-view',\n storage: createJSONStorage(() => localStorage),\n partialize: (s) => ({ view: s.view }),\n }\n )\n)\n\nconst EVT_RE = /^evt-[A-Za-z0-9]{8}$/\n\n/** Ask the calendar to open on an event (ignored unless it is an `evt-` id). */\nexport function requestCalendarEvent(event: PendingCalendarEvent): void {\n if (EVT_RE.test(event.id)) useCalendarViewStore.getState().setPendingEvent(event)\n}\n\n/** Ask the calendar to open the event editor prefilled. */\nexport function requestCalendarComposer(prefill: CalendarComposerPrefill): void {\n useCalendarViewStore.getState().setPendingComposer(prefill)\n}\n","import type { AttendeeDraft, EventDraft, WebinarRole } from '../../calendar/types'\n\n/**\n * ARBI calls for calendar events, from the host (the calls stack lives there). Without it the\n * editor offers no \"Add ARBI call\" or webinar, and Join opens the meeting link in a new tab.\n */\nexport interface CalendarCallSupport {\n /** Whether \"Add ARBI call\", webinars and \"Schedule call\" are offered (the user may host calls). */\n canSchedule: boolean\n /**\n * Make the call for a draft: its key sealed to me and to the draft's ARBI attendees (who share its\n * meeting chat). A webinar gives each attendee its role (`attendeeKey` → role).\n */\n create(\n draft: EventDraft,\n webinarRoles?: Record<string, WebinarRole>\n ): Promise<{ call_id: string; url: string }>\n /** After a save: seal the call's key to ARBI attendees added since it was made. */\n share(draft: EventDraft): Promise<void>\n /** A saved webinar's roles (they live on its call), keyed by `attendeeKey`; `null`: not a webinar. */\n loadWebinarRoles(\n url: string,\n attendees: AttendeeDraft[]\n ): Promise<Record<string, WebinarRole> | null>\n /** Save a webinar's changed roles on its call. */\n saveWebinarRoles(\n url: string,\n roles: Record<string, WebinarRole> | undefined,\n attendees: AttendeeDraft[]\n ): Promise<void>\n /** The attendees (`attendeeKey`) that are ARBI users: who gets a role in a new webinar. */\n arbiAttendees(attendees: AttendeeDraft[]): Promise<Set<string>>\n /** Join a meeting link (an ARBI call opens in the app; anything else in a new tab). */\n join(url: string): void\n /** Open an ARBI call's meeting chat. */\n openChat(url: string): void\n}\n\n/** Open a meeting link without call support: a new tab. */\nexport function openMeetingLink(url: string): void {\n if (/^https?:\\/\\//i.test(url)) window.open(url, '_blank', 'noopener,noreferrer')\n}\n\n/** Where an overlay item on the calendar points (`fact:…`, `workflow:…`, `conversation:…`). */\nexport interface CalendarOverlayLink {\n kind: 'fact' | 'workflow' | 'conversation'\n id: string\n}\n","/** \"Upcoming\": my events in the next 7 days (GET /events), soonest first, with Join for online meetings. */\nimport { useMemo, useState } from 'react'\nimport { Video } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { useCalendarEvents, useCalendars, type CalendarEvent } from '@arbidocs/react'\nimport {\n canJoinEvent,\n conferenceUrl,\n formatInZone,\n formatPlainDate,\n isWebinarConference,\n upcomingOf,\n utcToDate,\n} from '../../calendar'\nimport { openMeetingLink } from './types'\n\nexport interface ConnectedUpcomingEventsProps {\n timeZone: string\n days?: number\n limit?: number\n showDeclined?: boolean\n onOpen?: (event: CalendarEvent) => void\n /** Join an event's meeting (the host's calls). Default: the link opens in a new tab. */\n onJoin?: (event: CalendarEvent) => void\n className?: string\n}\n\nexport function ConnectedUpcomingEvents({\n timeZone,\n days = 7,\n limit = 8,\n showDeclined,\n onOpen,\n onJoin,\n className,\n}: ConnectedUpcomingEventsProps) {\n // Round \"now\" to the minute so the query key is stable across renders.\n const [now] = useState(() => Math.floor(Date.now() / 60_000) * 60_000)\n const range = useMemo(\n () => ({\n start: new Date(now).toISOString(),\n end: new Date(now + days * 86400_000).toISOString(),\n }),\n [now, days]\n )\n const { data: events = [], isLoading } = useCalendarEvents(range)\n const { data: calendars = [] } = useCalendars()\n const hidden = useMemo(\n () => new Set(calendars.filter((c) => c.hidden).map((c) => c.id)),\n [calendars]\n )\n const list = upcomingOf(events, Date.now(), { showDeclined, hidden }).slice(0, limit)\n\n let lastDay = ''\n return (\n <section className={cn('space-y-1 text-sm', className)} data-testid=\"calendar-upcoming\">\n <h4 className=\"px-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Upcoming\n </h4>\n {!isLoading && list.length === 0 && (\n <p className=\"px-1 text-xs text-muted-foreground\">Nothing in the next {days} days.</p>\n )}\n <ul className=\"space-y-0.5\">\n {list.map((e) => {\n const day = e.all_day ? (e.start.date ?? '') : utcToDate(e.start_utc, timeZone)\n const header = day !== lastDay\n lastDay = day\n return (\n <li key={e.instance_id}>\n {header && (\n <div className=\"px-1 pt-1.5 text-[11px] font-medium text-muted-foreground\">\n {formatPlainDate(day, { weekday: 'short', day: 'numeric', month: 'short' })}\n </div>\n )}\n <div\n className=\"flex items-center gap-1.5 rounded-md px-1 py-0.5 hover:bg-muted/60\"\n data-testid=\"calendar-upcoming-item\"\n >\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-baseline gap-1.5 text-left\"\n onClick={() => onOpen?.(e)}\n >\n <span className=\"w-12 shrink-0 text-xs text-muted-foreground\">\n {e.all_day\n ? 'All day'\n : formatInZone(e.start_utc, timeZone, { hour: 'numeric', minute: '2-digit' })}\n </span>\n <span\n className={cn('min-w-0 truncate', e.my_partstat === 'needs_action' && 'italic')}\n >\n {e.restricted ? 'Busy' : e.title || 'Untitled'}\n </span>\n </button>\n {conferenceUrl(e) && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={canJoinEvent(e) ? 'default' : 'ghost'}\n className=\"h-6 px-2 text-xs\"\n onClick={() =>\n onJoin ? onJoin(e) : openMeetingLink(conferenceUrl(e) as string)\n }\n aria-label={`Join ${e.title}`}\n data-testid=\"calendar-upcoming-join\"\n >\n <Video className=\"mr-1 size-3\" />{' '}\n {isWebinarConference(e.conference) ? 'Join webinar' : 'Join'}\n </Button>\n )}\n </div>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","/**\n * Which attendees of the editor's webinar get a role select: for a saved webinar its invitees (roles apply to\n * them only — the call lists every one), for a new one the attendees that are ARBI users (the people its call\n * key is sealed to; looked up as they are added).\n */\nimport { useCallback, useEffect, useState } from 'react'\nimport { attendeeKey, type AttendeeDraft, type EventDraft } from '../../calendar'\nimport type { CalendarCallSupport } from './types'\n\nexport function useWebinarAttendee(\n draft: EventDraft | null | undefined,\n calls: CalendarCallSupport | undefined\n): (attendee: AttendeeDraft) => boolean {\n const conference = draft?.conference\n const pending = conference?.kind === 'webinar' && !conference.url\n const attendees = JSON.stringify(draft?.attendees ?? [])\n const [arbiUsers, setArbiUsers] = useState<ReadonlySet<string>>(new Set())\n useEffect(() => {\n if (!pending || !calls) return\n let live = true\n calls\n .arbiAttendees(JSON.parse(attendees) as AttendeeDraft[])\n .then((users) => live && setArbiUsers(users))\n .catch(() => {})\n return () => {\n live = false\n }\n }, [pending, attendees, calls])\n const roles = conference?.url ? conference.roles : null\n return useCallback(\n (a: AttendeeDraft) => (roles ? attendeeKey(a) in roles : arbiUsers.has(attendeeKey(a))),\n [roles, arbiUsers]\n )\n}\n","/**\n * The connected native calendar: a left rail (mini month, calendar list with overlay toggles,\n * upcoming events), the grid, and the dialogs around it (event details, editor, recurrence scope,\n * calendar create / rename, sharing, publishing, subscriptions, holidays, settings). Data comes\n * from the `@arbidocs/react` calendar hooks (offline when the host's `CalendarSupportProvider`\n * keeps the calendar on the device); ARBI calls come from the host (`calls`).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { Plus, Printer, Settings } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport {\n isQueuedCalendarWrite,\n useArbi,\n useCalendarAccounts,\n useCalendarEvent,\n useCalendarEvents,\n useCalendarOutbox,\n useCalendarOverlays,\n useCalendarSettings,\n useCalendars,\n useCreateCalendar,\n useCreateEvent,\n useDeleteCalendar,\n useDeleteEvent,\n useFetchCalendarEvent,\n useImportCalendar,\n useMoveEvent,\n useRefreshCalendar,\n useResumeCalendarAccountConnect,\n useRespondToEvent,\n useSaveCalendarSettings,\n useSyncAccountsOnOpen,\n useUpdateCalendar,\n useUpdateEvent,\n type CalendarEvent,\n type CalendarSettings,\n type EditScope,\n type OverlayItem,\n} from '@arbidocs/react'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport {\n CalendarFormDialog,\n CalendarGrid,\n CalendarList,\n CALENDAR_DEFAULT_LABELS,\n EventDetails,\n MiniMonth,\n ProposeTimeDialog,\n ScopeDialog,\n buildCreateBody,\n buildDeleteTarget,\n buildEditRequest,\n buildGridEvents,\n buildTimeChangeRequest,\n calendarToListItem,\n canJoinEvent,\n conferenceUrl,\n describeCalendarError,\n detectTimeZone,\n eventToDraft,\n isWebinarConference,\n needsScope,\n newEventDraft,\n parseOverlayLink,\n pendingCreateToGrid,\n printCalendar,\n safeZone,\n todayInZone,\n utcToDate,\n validateDraft,\n type CalendarFormValue,\n type CalendarViewKind,\n type EventDraft,\n type EventTimeChange,\n type GridEvent,\n type GridRange,\n type OverlayLayer,\n type PrintView,\n type SlotSelection,\n} from '../../calendar'\nimport { HolidaysDialog, SubscribeDialog } from './AddCalendarDialogs'\nimport { CalendarSettingsDialog, type CalendarSettingsTab } from './CalendarSettingsDialog'\nimport { EventEditorDialog, type EditorState } from './EventEditorDialog'\nimport { InvitationsPanel } from './InvitationsPanel'\nimport { PublishCalendarDialog } from './PublishCalendarDialog'\nimport { ShareCalendarDialog } from './ShareCalendarDialog'\nimport { useCalendarViewStore } from './store'\nimport { openMeetingLink, type CalendarCallSupport, type CalendarOverlayLink } from './types'\nimport { ConnectedUpcomingEvents } from './ConnectedUpcomingEvents'\nimport { useWebinarAttendee } from './useWebinarAttendee'\n\nexport interface ConnectedCalendarProps {\n /** ARBI calls for events (the host's calls stack). Without it: no \"Add ARBI call\", Join opens links. */\n calls?: CalendarCallSupport\n /**\n * Open what an overlay item (a fact, workflow or task) points to. Default: a conversation opens\n * through the blocks environment; the rest does nothing.\n */\n onOpenOverlay?: (link: CalendarOverlayLink) => void\n /** Turn the account sync on open off (a host that syncs elsewhere). Default on. */\n syncAccountsOnOpen?: boolean\n}\n\nconst FALLBACK_SETTINGS: CalendarSettings = {\n time_zone: detectTimeZone(),\n secondary_time_zone: null,\n week_start: 1,\n working_hours: [0, 1, 2, 3, 4].map((day) => ({ day, start: '09:00', end: '17:00' })),\n default_view: 'week',\n default_duration_minutes: 30,\n default_calendar_id: null,\n show_declined: false,\n show_week_numbers: false,\n auto_add_invitations: 'all',\n decline_message: null,\n overlays: [],\n}\n\nconst PHONE_QUERY = '(max-width: 639px)'\nfunction subscribePhone(cb: () => void) {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {}\n const mq = window.matchMedia(PHONE_QUERY)\n mq?.addEventListener?.('change', cb)\n return () => mq?.removeEventListener?.('change', cb)\n}\nconst isPhoneNow = () =>\n typeof window !== 'undefined' && !!window.matchMedia?.(PHONE_QUERY)?.matches\nfunction useIsPhone() {\n return useSyncExternalStore(subscribePhone, isPhoneNow, () => false)\n}\n\n// 422s from Microsoft / Google mirrored calendars get a plain explanation (unrepresentable recurrence).\nconst errorText = (err: unknown) => describeCalendarError(err)\n\nconst PRINT_VIEW: Record<CalendarViewKind, PrintView> = {\n day: 'day',\n week: 'week',\n work_week: 'week',\n month: 'month',\n agenda: 'agenda',\n year: 'month',\n}\n\ninterface ScopePrompt {\n action: 'edit' | 'delete' | 'respond'\n allowFollowing: boolean\n choose: (scope: EditScope) => void\n cancel?: () => void\n}\n\ntype Selected = { kind: 'event'; event: CalendarEvent } | null\n\nconst safeName = (name: string | null | undefined, fallback: string) =>\n (name ?? '').replace(/[^\\w\\- ]+/g, '').trim() || fallback\n\nexport function ConnectedCalendar({\n calls,\n onOpenOverlay,\n syncAccountsOnOpen = true,\n}: ConnectedCalendarProps = {}) {\n const { confirm, notify, openConversation } = useBlocksEnvironment()\n const arbi = useArbi()\n const fetchEvent = useFetchCalendarEvent()\n const notifyError = (prefix: string, err: unknown) =>\n notify(`${prefix}: ${errorText(err)}`, 'error')\n const isPhone = useIsPhone()\n const { data: settingsData } = useCalendarSettings()\n const settings = settingsData ?? FALLBACK_SETTINGS\n const zone = safeZone(settings.time_zone, detectTimeZone())\n const { data: calendars = [] } = useCalendars()\n\n const storedView = useCalendarViewStore((s) => s.view)\n const storedDate = useCalendarViewStore((s) => s.date)\n const setView = useCalendarViewStore((s) => s.setView)\n const setDate = useCalendarViewStore((s) => s.setDate)\n const pendingEvent = useCalendarViewStore((s) => s.pendingEvent)\n const setPendingEvent = useCalendarViewStore((s) => s.setPendingEvent)\n const view: CalendarViewKind =\n storedView ?? (isPhone ? 'agenda' : (settings.default_view as CalendarViewKind) || 'week')\n const date = storedDate ?? todayInZone(zone)\n\n const [range, setRange] = useState<{ start: string; end: string } | null>(null)\n const [highlight, setHighlight] = useState<{ start: string; end: string } | null>(null)\n const overlayLayers = useMemo(() => settings.overlays ?? [], [settings.overlays])\n\n const { data: events } = useCalendarEvents(range)\n const { data: overlays } = useCalendarOverlays(range, overlayLayers)\n\n const { data: outbox } = useCalendarOutbox()\n // Mirrored calendars: the account lists them even where the calendar row does not carry the provider.\n const { data: accounts } = useCalendarAccounts()\n const listItems = useMemo(() => {\n const kindOf = new Map<string, string>()\n for (const acc of accounts ?? []) for (const id of acc.calendars ?? []) kindOf.set(id, acc.kind)\n return calendars.map((c) => {\n const item = calendarToListItem(c)\n return item.provider ? item : { ...item, provider: kindOf.get(c.id) ?? null }\n })\n }, [calendars, accounts])\n const gridEvents = useMemo(() => {\n const out = buildGridEvents(events, calendars, overlays, {\n zone,\n showDeclined: !!settings.show_declined,\n })\n // Creates made offline show as pending until the outbox replays them.\n const pending: GridEvent[] = []\n for (const item of outbox ?? []) {\n if (item.op.kind !== 'create' || item.state === 'sent') continue\n const g = pendingCreateToGrid(item.requestId, item.op.body as EventDraft, zone)\n if (g) pending.push(g)\n }\n return pending.length ? [...out, ...pending] : out\n }, [events, calendars, overlays, outbox, zone, settings.show_declined])\n const eventByInstance = useMemo(\n () => new Map((events ?? []).map((e) => [e.instance_id, e])),\n [events]\n )\n const overlayByInstance = useMemo(\n () => new Map((overlays ?? []).map((o) => [`${o.layer}:${o.instance_id}`, o])),\n [overlays]\n )\n const defaultCalendarId =\n settings.default_calendar_id ??\n calendars.find((c) => c.is_default && c.can_write)?.id ??\n calendars.find((c) => c.can_write)?.id ??\n null\n\n // Unlock the calendar keys for this session as soon as the page opens.\n useEffect(() => {\n if (arbi.isLoggedIn) void arbi.calendar.unlock()\n }, [arbi])\n\n const [selected, setSelected] = useState<Selected>(null)\n const [editor, setEditor] = useState<EditorState | null>(null)\n const [scopePrompt, setScopePrompt] = useState<ScopePrompt | null>(null)\n const [calendarForm, setCalendarForm] = useState<\n { mode: 'create' } | { mode: 'edit'; id: string; initial: CalendarFormValue } | null\n >(null)\n const [settingsOpen, setSettingsOpen] = useState(false)\n const [settingsTab, setSettingsTab] = useState<CalendarSettingsTab>('general')\n const [publishFor, setPublishFor] = useState<string | null>(null)\n const callsEnabled = !!calls?.canSchedule\n const pendingComposer = useCalendarViewStore((s) => s.pendingComposer)\n const setPendingComposer = useCalendarViewStore((s) => s.setPendingComposer)\n /** Make the ARBI call for a draft (K sealed to me + its ARBI attendees, who share its meeting chat). */\n const makeCall = (draft: EventDraft) => {\n if (!calls) throw new Error('Calls are not available')\n return calls.create(draft)\n }\n /** After a save: seal K to ARBI attendees added since the call was made (best effort). */\n const shareCall = (draft: EventDraft) => {\n if (!calls || draft.conference?.type !== 'arbi' || !draft.attendees?.length) return\n calls.share(draft).catch((err) => notifyError('Could not share the call with new guests', err))\n }\n /**\n * The event's ARBI call, made on save: a webinar picked in the editor (made with its roles, once they are\n * picked), or \"Add ARBI call\" ticked when scheduling from a thread / DM.\n */\n const withCall = async (draft: EventDraft, autoCall?: boolean): Promise<EventDraft> => {\n const c = draft.conference\n if (calls && c?.type === 'arbi' && c.kind === 'webinar' && !c.url) {\n const call = await calls.create(draft, c.roles ?? {})\n return { ...draft, conference: { ...c, url: call.url, call_id: call.call_id } }\n }\n if (autoCall && !c) {\n const call = await makeCall(draft)\n return { ...draft, conference: { type: 'arbi', url: call.url, call_id: call.call_id } }\n }\n return draft\n }\n /** {@link withCall}, keeping the made call in the editor so a failed save is retried without a second one. */\n const withCallKept = async (draft: EventDraft, autoCall?: boolean): Promise<EventDraft> => {\n const next = await withCall(draft, autoCall)\n if (next !== draft) setEditor((e) => (e ? { ...e, draft: next, autoCall: false } : e))\n return next\n }\n /** After saving a webinar whose roles changed: PATCH them on its call (best effort). */\n const saveWebinarRoles = (original: EventDraft, draft: EventDraft) => {\n const c = draft.conference\n if (!calls || !isWebinarConference(c) || !c?.url || !original.conference?.url) return\n if (JSON.stringify(original.conference.roles ?? {}) === JSON.stringify(c.roles ?? {})) return\n calls\n .saveWebinarRoles(c.url, c.roles, draft.attendees ?? [])\n .catch((err) => notifyError('Could not update the webinar roles', err))\n }\n const isWebinarAttendee = useWebinarAttendee(editor?.draft, calls)\n /** Join a meeting: an ARBI call through the host's calls, any other link in a new tab. */\n const joinMeeting = (event: Pick<CalendarEvent, 'conference'>) => {\n const url = conferenceUrl(event)\n if (!url) return\n if (calls) calls.join(url)\n else openMeetingLink(url)\n }\n\n // Connected accounts: pull/push once per session when the calendar opens, and finish an OAuth connect\n // that left for the provider and came back here.\n useSyncAccountsOnOpen(syncAccountsOnOpen)\n useResumeCalendarAccountConnect(({ account, error }) => {\n if (account) notify('Calendar account connected', 'success')\n if (error) notifyError('Could not connect the account', error)\n })\n const [shareFor, setShareFor] = useState<string | null>(null)\n const [addDialog, setAddDialog] = useState<'subscribe' | 'holidays' | null>(null)\n const [proposeFor, setProposeFor] = useState<CalendarEvent | null>(null)\n const importTarget = useRef<string | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n\n const createEvent = useCreateEvent()\n const updateEvent = useUpdateEvent()\n const deleteEvent = useDeleteEvent()\n const moveEvent = useMoveEvent()\n const respond = useRespondToEvent()\n const createCalendar = useCreateCalendar()\n const updateCalendar = useUpdateCalendar()\n const deleteCalendar = useDeleteCalendar()\n const importCalendar = useImportCalendar()\n const saveSettings = useSaveCalendarSettings()\n const refreshCalendar = useRefreshCalendar()\n\n // Deep link (`&event=evt-…`, a reminder): fetch that event, jump to its date and open it.\n useEffect(() => {\n if (!pendingEvent) return\n setPendingEvent(null)\n fetchEvent(pendingEvent.id, pendingEvent.recurrenceId)\n .then((event) => {\n setDate(utcToDate(event.start_utc, zone))\n setSelected({ kind: 'event', event })\n })\n .catch((err) => notifyError('Could not open the event', err))\n // Runs when a request arrives, not when the helpers' identities change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pendingEvent, setPendingEvent, setDate, zone])\n\n // ── grid callbacks ──────────────────────────────────────────────────────\n\n const onRangeChange = useCallback(\n (r: GridRange) => {\n const next = { start: r.start.toISOString(), end: r.end.toISOString() }\n setRange((prev) => (prev && prev.start === next.start && prev.end === next.end ? prev : next))\n const last = new Date(r.end.getTime() - 1)\n setHighlight({ start: utcToDate(r.start, zone), end: utcToDate(last, zone) })\n },\n [zone]\n )\n\n const openCreate = useCallback(\n (slot?: SlotSelection | null) => {\n const draft = newEventDraft(settings, { slot, calendarId: defaultCalendarId })\n setEditor({ mode: 'create', original: draft, draft, error: null })\n },\n [settings, defaultCalendarId]\n )\n\n // \"Schedule call\" from a thread / DM / the dashboard: open the editor prefilled.\n useEffect(() => {\n if (!pendingComposer) return\n setPendingComposer(null)\n const base = newEventDraft(settings, { calendarId: defaultCalendarId })\n const draft: EventDraft = {\n ...base,\n title: pendingComposer.title ?? '',\n conversation_id: pendingComposer.conversationId ?? null,\n attendees: (pendingComposer.attendees ?? []).map((a) => ({\n email: a.email ?? null,\n user_id: a.user_id ?? null,\n name: a.name ?? null,\n role: 'required',\n kind: 'individual',\n })),\n }\n setEditor({\n mode: 'create',\n original: draft,\n draft,\n error: null,\n autoCall: !!pendingComposer.addCall && callsEnabled,\n })\n }, [pendingComposer, setPendingComposer, settings, defaultCalendarId, callsEnabled])\n\n const openOverlay = (item: OverlayItem) => {\n const link = parseOverlayLink(item.link)\n if (!link) return\n if (onOpenOverlay) onOpenOverlay(link)\n else if (link.kind === 'conversation') openConversation(link.id)\n }\n\n const onEventClick = (instanceId: string) => {\n const event = eventByInstance.get(instanceId)\n if (event) {\n setSelected({ kind: 'event', event })\n return\n }\n const overlay = overlayByInstance.get(instanceId)\n if (overlay) openOverlay(overlay)\n }\n\n const withScope = (\n event: CalendarEvent,\n action: 'edit' | 'delete',\n run: (scope: EditScope) => void,\n cancel?: () => void\n ) => {\n if (!needsScope(event)) {\n run('all')\n return\n }\n setScopePrompt({\n action,\n allowFollowing: !event.is_exception,\n choose: (scope) => {\n setScopePrompt(null)\n run(scope)\n },\n cancel: () => {\n setScopePrompt(null)\n cancel?.()\n },\n })\n }\n\n const onEventChange = (change: EventTimeChange) => {\n const event = eventByInstance.get(change.instanceId)\n if (!event || !event.can_edit || event.restricted) {\n change.revert()\n return\n }\n withScope(\n event,\n 'edit',\n (scope) => {\n const { target, body } = buildTimeChangeRequest(event, change, scope, zone)\n updateEvent.mutate(\n { target, body },\n {\n onError: (err) => {\n change.revert()\n notifyError('Could not move the event', err)\n },\n }\n )\n },\n change.revert\n )\n }\n\n // ── details / editor actions ───────────────────────────────────────────\n\n const openEdit = async (event: CalendarEvent) => {\n setSelected(null)\n let master: CalendarEvent | null = null\n if (event.recurrence_id && !event.recurrence) {\n try {\n master = await fetchEvent(event.id)\n } catch {\n master = null\n }\n }\n let draft = eventToDraft(event, master)\n // A webinar's roles live on its call: show them in the editor.\n if (calls && draft.conference?.url && isWebinarConference(draft.conference)) {\n try {\n const roles = await calls.loadWebinarRoles(draft.conference.url, draft.attendees ?? [])\n if (roles) draft = { ...draft, conference: { ...draft.conference, kind: 'webinar', roles } }\n } catch (err) {\n notifyError('Could not load the webinar roles', err)\n }\n }\n setEditor({ mode: 'edit', event, original: draft, draft, error: null })\n }\n\n const removeEvent = (event: CalendarEvent) => {\n const run = (scope: EditScope) =>\n deleteEvent.mutate(buildDeleteTarget(event, scope), {\n onSuccess: () => {\n setSelected(null)\n setEditor(null)\n },\n onError: (err) => notifyError('Could not delete the event', err),\n })\n const invitee = event.is_organizer === false && event.my_partstat != null\n if (needsScope(event)) withScope(event, 'delete', run)\n else\n void confirm({\n message: invitee\n ? `Remove “${event.title || 'this event'}” from your calendar? The organiser is told you declined.`\n : `Delete “${event.title || 'this event'}”?`,\n title: invitee ? 'Remove from calendar' : 'Delete event',\n }).then((ok) => ok && run('all'))\n }\n\n const saveEditor = () => {\n if (!editor) return\n const problem = validateDraft(editor.draft, zone)\n if (problem) {\n setEditor({ ...editor, error: CALENDAR_DEFAULT_LABELS[problem] })\n return\n }\n if (editor.mode === 'create') {\n void (async () => {\n let draft: EventDraft\n try {\n draft = await withCallKept(editor.draft, editor.autoCall)\n } catch (err) {\n setEditor((e) =>\n e ? { ...e, error: `Could not add the ARBI call: ${errorText(err)}` } : e\n )\n return\n }\n createEvent.mutate(buildCreateBody(draft), {\n onSuccess: (event) => {\n shareCall(draft)\n setEditor(null)\n if (isQueuedCalendarWrite(event))\n notify('Saved on this device — it syncs when you are back online', 'info')\n else setDate(utcToDate(event.start_utc, zone))\n },\n onError: (err) => setEditor((e) => (e ? { ...e, error: errorText(err) } : e)),\n })\n })()\n return\n }\n const event = editor.event\n if (!event) return\n withScope(event, 'edit', async (scope) => {\n let draft: EventDraft\n try {\n draft = await withCallKept(editor.draft)\n } catch (err) {\n setEditor((e) =>\n e ? { ...e, error: `Could not add the ARBI call: ${errorText(err)}` } : e\n )\n return\n }\n const { target, body, moveTo } = buildEditRequest(event, editor.original, draft, scope)\n try {\n let id = event.id\n let queued = false\n if (Object.keys(body).length) {\n const updated = await updateEvent.mutateAsync({ target, body })\n if (isQueuedCalendarWrite(updated)) queued = true\n else id = updated.id\n }\n if (moveTo && !queued) await moveEvent.mutateAsync({ id, calendarId: moveTo })\n if (!queued) {\n shareCall(draft)\n saveWebinarRoles(editor.original, draft)\n }\n setEditor(null)\n if (queued) notify('Saved on this device — it syncs when you are back online', 'info')\n } catch (err) {\n setEditor((e) => (e ? { ...e, error: errorText(err) } : e))\n }\n })\n }\n\n const onRespond = (event: CalendarEvent, partstat: 'accepted' | 'declined' | 'tentative') => {\n const send = (scope: EditScope) =>\n respond.mutate(\n scope === 'this' && event.recurrence_id\n ? { id: event.id, partstat, scope: 'this', recurrence_id: event.recurrence_id }\n : { id: event.id, partstat },\n {\n onSuccess: (updated) =>\n setSelected((s) =>\n s?.event.instance_id === event.instance_id\n ? {\n kind: 'event',\n event: {\n ...s.event,\n my_partstat: isQueuedCalendarWrite(updated) ? partstat : updated.my_partstat,\n },\n }\n : s\n ),\n onError: (err) => notifyError('Could not send your response', err),\n }\n )\n if (!event.recurrence_id) return send('all')\n setScopePrompt({\n action: 'respond',\n allowFollowing: false,\n choose: (scope) => {\n setScopePrompt(null)\n send(scope)\n },\n })\n }\n\n // ── calendar list actions ──────────────────────────────────────────────\n\n const calendarById = (id: string) => calendars.find((c) => c.id === id)\n\n const patchCalendar = (id: string, body: Parameters<typeof updateCalendar.mutate>[0]['body']) =>\n updateCalendar.mutate(\n { id, body },\n { onError: (err) => notifyError('Could not update the calendar', err) }\n )\n\n const toggleOverlay = (layer: OverlayLayer) => {\n const on = overlayLayers.includes(layer)\n saveSettings.mutate(\n {\n ...settings,\n overlays: on ? overlayLayers.filter((l) => l !== layer) : [...overlayLayers, layer],\n },\n { onError: (err) => notifyError('Could not save the setting', err) }\n )\n }\n\n const onImportFile = async (file: File) => {\n try {\n const ics = await file.text()\n const result = await importCalendar.mutateAsync({ ics, calendarId: importTarget.current })\n const parts = [`${result.created} added`, `${result.updated} updated`]\n if (result.skipped) parts.push(`${result.skipped} skipped`)\n notify(`Imported: ${parts.join(', ')}`, result.errors?.length ? 'warning' : 'success')\n } catch (err) {\n notifyError('Import failed', err)\n }\n }\n\n const onDeleteCalendar = async (id: string) => {\n const cal = calendarById(id)\n const ok = await confirm({\n message: `Delete the calendar “${cal?.name ?? 'Untitled'}” and all its events?`,\n title: 'Delete calendar',\n })\n if (ok)\n deleteCalendar.mutate(id, {\n onError: (err) => notifyError('Could not delete the calendar', err),\n })\n }\n\n const saveCalendarForm = (value: CalendarFormValue) => {\n if (!calendarForm) return\n const done = {\n onSuccess: () => setCalendarForm(null),\n onError: (err: Error) => notifyError('Could not save the calendar', err),\n }\n if (calendarForm.mode === 'create')\n createCalendar.mutate({ name: value.name, color: value.color, timezone: zone }, done)\n else updateCalendar.mutate({ id: calendarForm.id, body: value }, done)\n }\n\n // The list copy can lag (e.g. a room answers right after a save): show the event's own fresh copy.\n const { data: freshSelected } = useCalendarEvent(\n selected?.event.id.startsWith('evt-') ? selected.event.id : null,\n selected?.event.recurrence_id\n )\n const selectedEvent = selected\n ? freshSelected &&\n freshSelected.id === selected.event.id &&\n (freshSelected.recurrence_id ?? null) === (selected.event.recurrence_id ?? null)\n ? freshSelected\n : selected.event\n : null\n const selectedCalendar = selectedEvent ? calendarById(selectedEvent.calendar_id) : undefined\n\n return (\n <div className=\"flex h-full min-h-0 w-full gap-3 p-2 sm:p-3\" data-testid=\"calendar-page\">\n <aside\n className=\"hidden w-64 shrink-0 flex-col gap-4 overflow-y-auto md:flex\"\n data-testid=\"calendar-rail\"\n >\n <Button\n onClick={() => openCreate(null)}\n data-testid=\"calendar-new-event\"\n className=\"w-full\"\n >\n <Plus className=\"mr-1 size-4\" /> New event\n </Button>\n <MiniMonth\n date={date}\n weekStart={settings.week_start}\n timeZone={zone}\n highlightRange={highlight}\n showWeekNumbers={settings.show_week_numbers}\n onSelect={(d) => setDate(d)}\n />\n <CalendarList\n calendars={listItems}\n overlays={{\n facts: overlayLayers.includes('facts'),\n workflows: overlayLayers.includes('workflows'),\n tasks: overlayLayers.includes('tasks'),\n }}\n onToggleHidden={(id) => {\n const cal = calendarById(id)\n if (cal) patchCalendar(id, { hidden: !cal.hidden })\n }}\n onColorChange={(id, color) => patchCalendar(id, { color })}\n onToggleOverlay={toggleOverlay}\n onCreate={() => setCalendarForm({ mode: 'create' })}\n onEdit={(id) => {\n const cal = calendarById(id)\n if (cal)\n setCalendarForm({\n mode: 'edit',\n id,\n initial: { name: cal.name ?? '', color: cal.color },\n })\n }}\n onImport={(id) => {\n importTarget.current = id\n fileInput.current?.click()\n }}\n onExport={(id) => {\n const cal = calendarById(id)\n if (cal)\n arbi.calendar\n .exportCalendar(cal.id)\n .then((blob) => downloadBlob(blob, `${safeName(cal.name, 'calendar')}.ics`))\n .catch((err) => notifyError('Export failed', err))\n }}\n onDelete={(id) => void onDeleteCalendar(id)}\n onShare={(id) => setShareFor(id)}\n onRefresh={(id) =>\n refreshCalendar.mutate(id, {\n onSuccess: () => notify('Calendar refreshed', 'success'),\n onError: (err) => notifyError('Could not refresh', err),\n })\n }\n onPublish={(id) => setPublishFor(id)}\n onSubscribe={() => setAddDialog('subscribe')}\n onAddHolidays={() => setAddDialog('holidays')}\n onImportFile={() => {\n importTarget.current = null\n fileInput.current?.click()\n }}\n />\n <ConnectedUpcomingEvents\n timeZone={zone}\n showDeclined={!!settings.show_declined}\n onOpen={(event) => setSelected({ kind: 'event', event })}\n onJoin={joinMeeting}\n />\n </aside>\n\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col\" data-testid=\"calendar-main\">\n <CalendarGrid\n events={gridEvents}\n view={view}\n date={date}\n timeZone={zone}\n secondaryTimeZone={settings.secondary_time_zone ?? null}\n weekStart={settings.week_start}\n workingHours={settings.working_hours}\n showWeekNumbers={settings.show_week_numbers}\n nowIndicator\n\n onRangeChange={onRangeChange}\n onSelectSlot={(slot) => openCreate(slot)}\n onEventClick={(instanceId) => onEventClick(instanceId)}\n onEventChange={onEventChange}\n onViewChange={setView}\n onDateChange={(d) => setDate(d)}\n onCreateShortcut={() => openCreate(null)}\n toolbarEnd={\n <div className=\"flex items-center gap-1\">\n <Button\n size=\"sm\"\n className=\"md:hidden\"\n onClick={() => openCreate(null)}\n aria-label=\"New event\"\n >\n <Plus className=\"size-4\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Print\"\n title=\"Print\"\n data-testid=\"calendar-print-button\"\n onClick={() =>\n printCalendar({\n events: (events ?? []).filter(\n (e) => !calendars.find((c) => c.id === e.calendar_id)?.hidden\n ),\n view: PRINT_VIEW[view],\n date,\n timeZone: zone,\n weekStart: settings.week_start,\n calendars: calendars.map((c) => ({ id: c.id, name: c.name, color: c.color })),\n })\n }\n >\n <Printer className=\"size-4\" />\n </Button>\n <InvitationsPanel timeZone={zone} onOpenEvent={(id) => setPendingEvent({ id })} />\n <Button\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Calendar settings\"\n data-testid=\"calendar-settings-button\"\n onClick={() => {\n setSettingsTab('general')\n setSettingsOpen(true)\n }}\n >\n <Settings className=\"size-4\" />\n </Button>\n </div>\n }\n />\n </main>\n\n <input\n ref={fileInput}\n type=\"file\"\n accept=\".ics,text/calendar\"\n className=\"hidden\"\n data-testid=\"calendar-import-input\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) void onImportFile(file)\n }}\n />\n\n <Dialog\n open={!!selectedEvent && !scopePrompt}\n onOpenChange={(open) => !open && setSelected(null)}\n >\n <DialogContent\n className=\"sm:max-w-md\"\n presentation=\"sheet\"\n hideCloseButton\n data-testid=\"calendar-event-details-dialog\"\n >\n <DialogTitle className=\"sr-only\">{selectedEvent?.title || 'Event'}</DialogTitle>\n <DialogDescription className=\"sr-only\">Event details</DialogDescription>\n {selectedEvent && (\n <EventDetails\n event={selectedEvent}\n timeZone={zone}\n calendarName={selectedCalendar?.name ?? null}\n calendarColor={selectedCalendar?.color ?? null}\n canJoin={canJoinEvent(selectedEvent)}\n onClose={() => setSelected(null)}\n onEdit={\n selectedEvent.can_edit && !selectedEvent.restricted\n ? () => void openEdit(selectedEvent)\n : undefined\n }\n onDelete={\n selectedEvent.can_edit ||\n (selectedEvent.is_organizer === false && selectedEvent.my_partstat != null)\n ? () => removeEvent(selectedEvent)\n : undefined\n }\n onProposeTime={\n selectedEvent.my_partstat && !selectedEvent.is_organizer\n ? () => setProposeFor(selectedEvent)\n : undefined\n }\n onRespond={\n selectedEvent.my_partstat && !selectedEvent.is_organizer\n ? (p) => onRespond(selectedEvent, p)\n : undefined\n }\n onJoin={\n selectedEvent.conference?.url\n ? () => {\n // Close the details first: the call's pre-join opens on top of the page.\n setSelected(null)\n joinMeeting(selectedEvent)\n }\n : undefined\n }\n onOpenMeetingChat={\n calls && selectedEvent.conference?.type === 'arbi' && conferenceUrl(selectedEvent)\n ? () => {\n setSelected(null)\n calls.openChat(conferenceUrl(selectedEvent) as string)\n }\n : undefined\n }\n />\n )}\n </DialogContent>\n </Dialog>\n\n <EventEditorDialog\n editor={editor}\n onChange={setEditor}\n onSave={saveEditor}\n onDelete={(event) => removeEvent(event)}\n calendars={listItems.filter((c) => c.canWrite && !c.locked)}\n callsEnabled={callsEnabled}\n onAddCall={makeCall}\n isWebinarAttendee={isWebinarAttendee}\n timeZone={zone}\n workingHours={settings.working_hours}\n saving={createEvent.isPending || updateEvent.isPending || moveEvent.isPending}\n />\n\n <ScopeDialog\n open={!!scopePrompt}\n action={scopePrompt?.action ?? 'edit'}\n allowFollowing={scopePrompt?.allowFollowing ?? true}\n onChoose={(scope) => scopePrompt?.choose(scope)}\n onCancel={() => (scopePrompt?.cancel ? scopePrompt.cancel() : setScopePrompt(null))}\n />\n\n <CalendarFormDialog\n open={!!calendarForm}\n mode={calendarForm?.mode ?? 'create'}\n initial={\n calendarForm?.mode === 'edit' ? calendarForm.initial : { name: '', color: '#3b82f6' }\n }\n saving={createCalendar.isPending || updateCalendar.isPending}\n onSave={saveCalendarForm}\n onCancel={() => setCalendarForm(null)}\n />\n\n <CalendarSettingsDialog\n open={settingsOpen}\n settings={settings}\n calendars={listItems}\n initialTab={settingsTab}\n onClose={() => setSettingsOpen(false)}\n />\n <PublishCalendarDialog\n calendarId={publishFor}\n calendarName={publishFor ? calendarById(publishFor)?.name : null}\n onClose={() => setPublishFor(null)}\n onConnectAccount={() => {\n setPublishFor(null)\n setSettingsTab('accounts')\n setSettingsOpen(true)\n }}\n />\n\n <ShareCalendarDialog\n calendarId={shareFor}\n calendarName={shareFor ? calendarById(shareFor)?.name : null}\n onClose={() => setShareFor(null)}\n />\n <SubscribeDialog\n open={addDialog === 'subscribe'}\n timeZone={zone}\n onClose={() => setAddDialog(null)}\n />\n <HolidaysDialog open={addDialog === 'holidays'} onClose={() => setAddDialog(null)} />\n <ProposeTimeDialog\n open={!!proposeFor}\n startUtc={proposeFor?.start_utc ?? null}\n endUtc={proposeFor?.end_utc ?? null}\n timeZone={zone}\n sending={respond.isPending}\n onCancel={() => setProposeFor(null)}\n onSend={(v) => {\n const event = proposeFor\n if (!event) return\n respond.mutate(\n {\n id: event.id,\n partstat: 'tentative',\n comment: v.comment,\n propose_start: v.start,\n propose_end: v.end,\n ...(event.recurrence_id\n ? { scope: 'this' as const, recurrence_id: event.recurrence_id }\n : {}),\n },\n {\n onSuccess: () => {\n setProposeFor(null)\n notify('New time proposed to the organiser', 'success')\n },\n onError: (err) => notifyError('Could not send the proposal', err),\n }\n )\n }}\n />\n </div>\n )\n}\n","/**\n * Invitation card in the Mail message view: when the message carries an iCalendar part, show the event\n * (parsed client-side) and, if it is in my calendar (GET /lookup?uid=), Accept / Maybe / Decline and\n * Open in calendar. Self-contained so the mail view only mounts it.\n */\nimport { useEffect, useState } from 'react'\nimport { CalendarDays } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n isQueuedCalendarWrite,\n useCalendarEventByUid,\n useCalendarSettings,\n useMailAttachmentText,\n useRespondToEvent,\n type MailAttachment,\n} from '@arbidocs/react'\nimport {\n detectTimeZone,\n formatEventWhen,\n isCalendarAttachment,\n parseIcsInvite,\n safeZone,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport interface ConnectedMailInviteCardProps {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n /** Open the event in the host's calendar (\"Open in calendar\"); without it the button is hidden. */\n onOpenEvent?: (event: { id: string }) => void\n}\n\nconst PARTSTAT_TEXT: Record<string, string> = {\n accepted: 'You accepted',\n declined: 'You declined',\n tentative: 'You said maybe',\n needs_action: 'Not answered yet',\n}\n\nexport function ConnectedMailInviteCard({\n accountId,\n messageId,\n attachments,\n isOnline,\n onOpenEvent,\n}: ConnectedMailInviteCardProps) {\n const { notify } = useBlocksEnvironment()\n const part = attachments.find(isCalendarAttachment)\n const { data: settings } = useCalendarSettings(!!part)\n const zone = safeZone(settings?.time_zone, detectTimeZone())\n const { data: ics } = useMailAttachmentText(accountId, messageId, part, { enabled: isOnline })\n const invite = ics ? parseIcsInvite(ics, zone) : null\n const lookup = useCalendarEventByUid(invite?.uid && invite.method !== 'REPLY' ? invite.uid : null)\n const respond = useRespondToEvent()\n const [partstat, setPartstat] = useState<string | null>(null)\n const event = lookup.data ?? null\n useEffect(() => setPartstat(event?.my_partstat ?? null), [event?.my_partstat])\n\n if (!part || !invite) return null\n const cancelled = invite.method === 'CANCEL' || invite.status === 'CANCELLED'\n const when =\n invite.startUtc && invite.endUtc\n ? formatEventWhen(\n {\n all_day: invite.allDay,\n start_utc: invite.startUtc,\n end_utc: invite.endUtc,\n start: { date: invite.startDate },\n end: { date: invite.endDate },\n },\n zone\n )\n : ''\n const canRespond = !!event && !event.is_organizer && event.my_partstat != null && !cancelled\n\n const answer = (p: 'accepted' | 'tentative' | 'declined') =>\n event &&\n respond.mutate(\n { id: event.id, partstat: p },\n {\n onSuccess: (updated) =>\n setPartstat(isQueuedCalendarWrite(updated) ? p : (updated.my_partstat ?? p)),\n onError: (err) => notify(`Could not send your response: ${err.message}`, 'error'),\n }\n )\n\n return (\n <div\n className=\"mb-4 flex gap-3 rounded-lg border border-border bg-muted/20 p-3\"\n data-testid=\"mail-invite-card\"\n >\n <CalendarDays className=\"mt-0.5 size-5 shrink-0 text-primary\" aria-hidden />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div\n className={cn('font-medium', cancelled && 'line-through')}\n data-testid=\"mail-invite-title\"\n >\n {invite.title || 'Untitled event'}\n </div>\n <div className=\"text-sm text-muted-foreground\">{when}</div>\n {invite.location && <div className=\"text-sm text-muted-foreground\">{invite.location}</div>}\n {invite.organizer && (\n <div className=\"text-xs text-muted-foreground\">\n Organiser: {invite.organizer.name || invite.organizer.email}\n </div>\n )}\n {cancelled && <div className=\"text-sm text-destructive\">This event was cancelled.</div>}\n {invite.method === 'REPLY' && (\n <div className=\"text-sm text-muted-foreground\">A guest replied to your invitation.</div>\n )}\n {!cancelled && invite.method !== 'REPLY' && !lookup.isLoading && !event && isOnline && (\n <div className=\"text-xs text-muted-foreground\">Not in your calendar yet.</div>\n )}\n {canRespond && partstat && (\n <div className=\"text-xs text-muted-foreground\" data-testid=\"mail-invite-status\">\n {PARTSTAT_TEXT[partstat] ?? partstat}\n </div>\n )}\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {canRespond && (\n <>\n <Button\n size=\"sm\"\n variant={partstat === 'accepted' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('accepted')}\n data-testid=\"mail-invite-accept\"\n >\n Accept\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'tentative' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('tentative')}\n >\n Maybe\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'declined' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('declined')}\n >\n Decline\n </Button>\n </>\n )}\n {event && onOpenEvent && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onOpenEvent({ id: event.id })}\n data-testid=\"mail-invite-open\"\n >\n Open in calendar\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * The PUBLIC booking page (`/book/:slug`, no sign-in). A visitor picks a duration and a free slot\n * (shown in THEIR detected time zone, changeable), enters name + e-mail, and books. The confirmation\n * offers an .ics download and a private cancel link (`/book/:slug?cancel=<token>`), which this page\n * also handles. Requests go to the blocks environment's API base URL.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { CalendarCheck, CalendarX, Clock, Globe, Loader2, MapPin } from 'lucide-react'\nimport { Button, Input, Label, Textarea, cn } from '@arbidocs/react/ui'\nimport {\n PublicBookingError,\n bookPublicSlot,\n cancelPublicBooking,\n getPublicBookingPage,\n type BookingConfirmation,\n type PublicBookingPage,\n} from '@arbidocs/react'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport {\n addDays,\n detectTimeZone,\n formatSlotRange,\n groupSlotsByDay,\n publicBookingMessage,\n todayInZone,\n zoneOptions,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\n/** The cancel link a guest can keep: this page with `?cancel=<token>`. */\nexport function bookingCancelLink(\n slug: string,\n token: string,\n origin = window.location.origin\n): string {\n return `${origin}/book/${encodeURIComponent(slug)}?cancel=${encodeURIComponent(token)}`\n}\n\nfunction downloadIcs(ics: string, filename: string) {\n downloadBlob(new Blob([ics], { type: 'text/calendar;charset=utf-8' }), filename)\n}\n\nconst PAGE_DAYS = 14\nconst selectClass =\n 'h-9 rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction Shell({ children, wide = false }: { children: React.ReactNode; wide?: boolean }) {\n return (\n <main className=\"flex min-h-dvh items-start justify-center bg-background px-4 py-6 text-foreground sm:items-center sm:py-10\">\n <div\n className={cn(\n 'w-full rounded-lg border border-border bg-card p-5 shadow-sm sm:p-6',\n wide ? 'max-w-2xl' : 'max-w-md'\n )}\n >\n {children}\n <p className=\"mt-6 text-center text-xs text-muted-foreground\">Scheduling by ARBI</p>\n </div>\n </main>\n )\n}\n\nfunction CancelView({ slug, token }: { slug: string; token: string }) {\n const { apiBaseUrl } = useBlocksEnvironment().runtimeConfig\n const [state, setState] = useState<'idle' | 'busy' | 'done'>('idle')\n const [error, setError] = useState<string | null>(null)\n return (\n <Shell>\n <div className=\"grid gap-4\" data-testid=\"book-cancel\">\n <div className=\"flex items-center gap-2\">\n <CalendarX className=\"size-5 text-muted-foreground\" />\n <h1 className=\"text-lg font-semibold\">\n {state === 'done' ? 'Booking cancelled' : 'Cancel your booking?'}\n </h1>\n </div>\n {state === 'done' ? (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"book-cancel-done\">\n Your booking has been cancelled and the organiser has been told. You can close this\n page.\n </p>\n ) : (\n <>\n <p className=\"text-sm text-muted-foreground\">\n The organiser will be notified and the time will be freed up.\n </p>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-error\">\n {error}\n </p>\n )}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"destructive\"\n disabled={state === 'busy'}\n onClick={() => {\n setState('busy')\n setError(null)\n cancelPublicBooking(apiBaseUrl, slug, token)\n .then(() => setState('done'))\n .catch((err) => {\n setState('idle')\n setError(\n err instanceof PublicBookingError && err.status === 404\n ? 'This booking was not found — it may already be cancelled.'\n : publicBookingMessage(err)\n )\n })\n }}\n data-testid=\"book-cancel-confirm\"\n >\n {state === 'busy' && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Cancel booking\n </Button>\n <Button variant=\"ghost\" asChild>\n <a href={`/book/${encodeURIComponent(slug)}`}>Book another time</a>\n </Button>\n </div>\n </>\n )}\n </div>\n </Shell>\n )\n}\n\nfunction Confirmation({\n slug,\n confirmation,\n zone,\n}: {\n slug: string\n confirmation: BookingConfirmation\n zone: string\n}) {\n const link = bookingCancelLink(slug, confirmation.cancel_token)\n return (\n <Shell>\n <div className=\"grid gap-4\" data-testid=\"book-confirmed\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"size-5 text-emerald-600 dark:text-emerald-400\" />\n <h1 className=\"text-lg font-semibold\">You&apos;re booked</h1>\n </div>\n <div className=\"grid gap-1 text-sm\">\n <div className=\"font-medium\">{confirmation.title}</div>\n <div className=\"text-muted-foreground\" data-testid=\"book-confirmed-when\">\n {formatSlotRange(confirmation.start, confirmation.end, zone)}\n </div>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n A confirmation has been sent to your e-mail.\n </p>\n <Button\n onClick={() => downloadIcs(confirmation.ics, `${slug}.ics`)}\n data-testid=\"book-add-to-calendar\"\n >\n Add to calendar (.ics)\n </Button>\n <div className=\"grid gap-1 text-sm\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Need to cancel? Keep this link:\n </span>\n <a\n className=\"break-all text-primary underline-offset-2 hover:underline\"\n href={link}\n data-testid=\"book-cancel-link\"\n >\n {link}\n </a>\n </div>\n </div>\n </Shell>\n )\n}\n\nexport interface ConnectedPublicBookingProps {\n /** The booking page's slug (`/book/<slug>`). */\n slug: string\n /** A guest's cancel token (`?cancel=`): the page offers to cancel that booking instead. */\n cancelToken?: string | null\n}\n\nexport function ConnectedPublicBooking({ slug, cancelToken }: ConnectedPublicBookingProps) {\n const { apiBaseUrl } = useBlocksEnvironment().runtimeConfig\n\n const [zone, setZone] = useState(detectTimeZone)\n const [duration, setDuration] = useState<number | undefined>(undefined)\n const [offset, setOffset] = useState(0)\n const [page, setPage] = useState<PublicBookingPage | null>(null)\n const [loading, setLoading] = useState(true)\n const [loadError, setLoadError] = useState<unknown>(null)\n const [reload, setReload] = useState(0)\n const [picked, setPicked] = useState<string | null>(null)\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [note, setNote] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [confirmation, setConfirmation] = useState<BookingConfirmation | null>(null)\n\n const ownerZone = page?.time_zone\n useEffect(() => {\n if (cancelToken || !slug) return\n // A stale-response flag rather than an AbortController: the app's global fetch layer can share one\n // in-flight request between StrictMode's double-run effects, so aborting the first fails the second.\n let stale = false\n setLoading(true)\n setLoadError(null)\n const start =\n offset > 0 && ownerZone ? addDays(todayInZone(ownerZone), offset * PAGE_DAYS) : undefined\n getPublicBookingPage(apiBaseUrl, slug, { duration, start, days: PAGE_DAYS })\n .then((p) => {\n if (stale) return\n setPage(p)\n setLoading(false)\n })\n .catch((err) => {\n if (stale) return\n setLoadError(err)\n setLoading(false)\n })\n return () => {\n stale = true\n }\n // ownerZone is only needed to compute later pages; it does not trigger a refetch on its own.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [apiBaseUrl, slug, duration, offset, reload, cancelToken])\n\n const chosenDuration = duration ?? page?.durations[0] ?? 30\n const days = useMemo(() => groupSlotsByDay(page?.slots ?? [], zone), [page?.slots, zone])\n\n const submit = useCallback(async () => {\n if (!picked) return\n setSubmitting(true)\n setSubmitError(null)\n try {\n setConfirmation(\n await bookPublicSlot(apiBaseUrl, slug, {\n start: picked,\n duration: chosenDuration,\n name,\n email,\n note,\n })\n )\n } catch (err) {\n setSubmitError(publicBookingMessage(err))\n if (err instanceof PublicBookingError && err.status === 409) {\n setPicked(null)\n setReload((n) => n + 1)\n }\n } finally {\n setSubmitting(false)\n }\n }, [apiBaseUrl, picked, slug, chosenDuration, name, email, note])\n\n if (cancelToken) return <CancelView slug={slug} token={cancelToken} />\n if (confirmation) return <Confirmation slug={slug} confirmation={confirmation} zone={zone} />\n\n if (!page) {\n return (\n <Shell>\n {loading ? (\n <div\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid=\"book-loading\"\n >\n <Loader2 className=\"size-4 animate-spin\" /> Loading…\n </div>\n ) : (\n <div className=\"grid gap-3\" data-testid=\"book-error\">\n <h1 className=\"text-lg font-semibold\">\n {loadError instanceof PublicBookingError && loadError.status === 404\n ? 'Page not found'\n : 'Could not load this page'}\n </h1>\n <p role=\"alert\" className=\"text-sm text-muted-foreground\">\n {publicBookingMessage(loadError)}\n </p>\n {!(loadError instanceof PublicBookingError && loadError.status === 404) && (\n <Button variant=\"outline\" onClick={() => setReload((n) => n + 1)}>\n Try again\n </Button>\n )}\n </div>\n )}\n </Shell>\n )\n }\n\n const pickedLabel = picked\n ? formatSlotRange(\n picked,\n new Date(new Date(picked).getTime() + chosenDuration * 60_000).toISOString(),\n zone\n )\n : ''\n\n return (\n <Shell wide>\n <header className=\"mb-5 grid gap-1\">\n {page.owner_name && (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"book-owner\">\n {page.owner_name}\n </p>\n )}\n <h1 className=\"text-xl font-semibold\" data-testid=\"book-title\">\n {page.title}\n </h1>\n {page.description && (\n <p className=\"whitespace-pre-line text-sm text-muted-foreground\">{page.description}</p>\n )}\n <div className=\"mt-1 flex flex-wrap gap-x-4 gap-y-1 text-sm text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-4\" /> {chosenDuration} min\n </span>\n {page.location && (\n <span className=\"inline-flex items-center gap-1\">\n <MapPin className=\"size-4\" /> {page.location}\n </span>\n )}\n </div>\n </header>\n\n {picked ? (\n <form\n className=\"grid gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n void submit()\n }}\n data-testid=\"book-form\"\n >\n <div className=\"rounded-md bg-muted/50 px-3 py-2 text-sm\" data-testid=\"book-picked\">\n {pickedLabel}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"book-name\">Your name</Label>\n <Input\n id=\"book-name\"\n required\n autoComplete=\"name\"\n maxLength={200}\n value={name}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"book-name\"\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"book-email\">E-mail</Label>\n <Input\n id=\"book-email\"\n required\n type=\"email\"\n autoComplete=\"email\"\n maxLength={320}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n data-testid=\"book-email\"\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"book-note\">Anything to share? (optional)</Label>\n <Textarea\n id=\"book-note\"\n rows={3}\n maxLength={2000}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n </div>\n {submitError && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-submit-error\">\n {submitError}\n </p>\n )}\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={() => setPicked(null)}>\n Back\n </Button>\n <Button type=\"submit\" disabled={submitting} data-testid=\"book-submit\">\n {submitting && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Confirm booking\n </Button>\n </div>\n </form>\n ) : (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-end gap-3\">\n {page.durations.length > 1 && (\n <div className=\"grid gap-1\" role=\"group\" aria-label=\"Duration\">\n <span className=\"text-xs font-medium text-muted-foreground\">Duration</span>\n <div className=\"flex flex-wrap gap-1\">\n {page.durations.map((d) => (\n <Button\n key={d}\n size=\"sm\"\n variant={d === chosenDuration ? 'default' : 'outline'}\n aria-pressed={d === chosenDuration}\n onClick={() => {\n setDuration(d)\n setOffset(0)\n }}\n data-testid={`book-duration-${d}`}\n >\n {d} min\n </Button>\n ))}\n </div>\n </div>\n )}\n <label className=\"grid gap-1\">\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <Globe className=\"size-3.5\" /> Your time zone\n </span>\n <select\n className={cn(selectClass, 'max-w-full')}\n value={zone}\n onChange={(e) => setZone(e.target.value)}\n aria-label=\"Your time zone\"\n data-testid=\"book-zone\"\n >\n {zoneOptions(zone).map((z) => (\n <option key={z} value={z}>\n {z.replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {submitError && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-submit-error\">\n {submitError}\n </p>\n )}\n\n {loading ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> Finding free times…\n </div>\n ) : loadError ? (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-error\">\n {publicBookingMessage(loadError)}\n </p>\n ) : days.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"book-no-slots\">\n No free times in these two weeks.\n </p>\n ) : (\n <div className=\"grid gap-4\" data-testid=\"book-days\">\n {days.map((day) => (\n <section key={day.date} className=\"grid gap-2\" data-testid={`book-day-${day.date}`}>\n <h2 className=\"text-sm font-medium\">{day.label}</h2>\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4 md:grid-cols-5\">\n {day.slots.map((s) => (\n <Button\n key={s.start}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setSubmitError(null)\n setPicked(s.start)\n }}\n data-testid={`book-slot-${s.start}`}\n >\n {s.label}\n </Button>\n ))}\n </div>\n </section>\n ))}\n </div>\n )}\n\n <div className=\"flex justify-between gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={offset === 0 || loading}\n onClick={() => setOffset((o) => Math.max(0, o - 1))}\n >\n Earlier\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={loading}\n onClick={() => setOffset((o) => o + 1)}\n data-testid=\"book-later\"\n >\n Later dates\n </Button>\n </div>\n </div>\n )}\n </Shell>\n )\n}\n","import {\n useAgentSession,\n useStartAgentSession,\n useCloseAgentSession,\n useArbiChat,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ChatPage } from '../chat/ChatPage'\nimport { takeOpenDocumentForTurn } from '../chat/open-document'\n\nexport interface ConnectedAgentChatPanelProps {\n agentId: string\n workspaceId: string\n agentName?: string\n}\n\nfunction ActiveChat({ agentId, workspaceId }: ConnectedAgentChatPanelProps) {\n // The agent drafts in the open document too, when it is in the agent's workspace.\n const chat = useArbiChat({\n agentId,\n workspaceId,\n activeArtifact: () => takeOpenDocumentForTurn({ workspaceId }),\n })\n return (\n <ChatPage\n chat={{ ...chat, assistantMode: undefined, setAssistantMode: undefined }}\n documentsRequired={false}\n compactHeader\n surface=\"dock\"\n emptyTitle=\"What would you like me to do?\"\n emptyDescription=\"This agent works through its own login. Upload files here to stage them in its sandbox.\"\n className=\"h-[min(65vh,650px)] min-h-[380px]\"\n />\n )\n}\n\n/** An owned agent's independent login and chat, using the shared controller and chat surface. */\nexport function ConnectedAgentChatPanel({\n agentId,\n workspaceId,\n agentName = 'Agent',\n}: ConnectedAgentChatPanelProps) {\n const session = useAgentSession(agentId)\n const start = useStartAgentSession()\n const close = useCloseAgentSession()\n const ready = session.data?.active && session.data.workspace_ext_id === workspaceId\n const busy = start.isPending || close.isPending\n const error = start.error ?? close.error ?? session.error\n return (\n <section className=\"space-y-3\" data-testid=\"agent-chat-panel\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <p className=\"text-sm\" data-testid=\"agent-chat-session-status\">\n {agentName} ·{' '}\n {ready\n ? 'Signed in to this workspace'\n : session.data?.active\n ? `Signed in to ${session.data.workspace_name ?? 'another workspace'}`\n : 'Signed out'}\n </p>\n <div className=\"flex gap-2\">\n {!ready && (\n <Button\n type=\"button\"\n disabled={busy || session.isLoading}\n onClick={() => start.mutate({ agentId, workspaceId })}\n data-testid=\"agent-chat-login\"\n >\n {start.isPending ? 'Signing in…' : 'Sign in here'}\n </Button>\n )}\n {session.data?.active && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => close.mutate(agentId)}\n data-testid=\"agent-chat-logout\"\n >\n {close.isPending ? 'Signing out…' : 'Sign out agent'}\n </Button>\n )}\n </div>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error.message}\n </p>\n )}\n {ready && (\n <ActiveChat key={`${agentId}:${workspaceId}`} agentId={agentId} workspaceId={workspaceId} />\n )}\n </section>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/connection/ArbiAppProvider.tsx","../../src/connection/ConnectedTaskAccessRequest.tsx","../../src/connection/ConnectedWorkspaceActivity.tsx","../../src/connection/notification-center/items.ts","../../src/connection/notification-center/NotificationEvent.tsx","../../src/connection/notification-center/NotificationCenter.tsx","../../src/connection/notification-center/ConnectedNotificationCenter.tsx","../../src/connection/ConnectedNotificationRelevance.tsx","../../src/connection/ConnectedSkillUpload.tsx","../../src/connection/ConnectedSkillsLibrary.tsx","../../src/connection/ConnectedAgentCreator.tsx","../../src/connection/ConnectedWorkflowHistory.tsx","../../src/connection/StreamedArtifact.tsx","../../src/connection/useWorkflowThread.ts","../../src/connection/WorkflowRunThread.tsx","../../src/connection/WorkflowRunnerDialogs.tsx","../../src/connection/ConnectedWorkflowRunner.tsx","../../src/connection/ConnectedTagTable.tsx","../../src/connection/useConnectedShellWorkspaces.ts","../../src/connection/settings-page/SessionStatusIcon.tsx","../../src/connection/ConnectedSettings.tsx","../../src/connection/settings-page/ConnectedAccountSettings.tsx","../../src/connection/mail/ConnectedMailAccounts.tsx","../../src/connection/settings-page/ConnectedMailSettings.tsx","../../src/connection/settings-page/ConnectedPrivacySettings.tsx","../../src/connection/settings-page/ConnectedPremiumModels.tsx","../../src/connection/settings-page/ConnectedSettingsPage.tsx","../../src/connection/workspace-settings/useConnectedWorkspaceSettings.ts","../../src/connection/workspace-settings/ConnectedWorkspaceSettings.tsx","../../src/connection/useConnectedDocxNotifications.ts","../../src/connection/useConnectedWorkNotifications.ts","../../src/connection/mail/attachments.ts","../../src/connection/mail/useWordBody.ts","../../src/connection/mail/MailComposerForm.tsx","../../src/connection/mail/mailbox.ts","../../src/connection/mail/ConnectedMailComposer.tsx","../../src/connection/mail/ConnectedMailSetup.tsx","../../src/connection/mail/ConnectedMailbox.tsx","../../src/connection/mail/ConnectedMailMessage.tsx","../../src/connection/calendar/AddCalendarDialogs.tsx","../../src/connection/calendar/CalendarAccountsPanel.tsx","../../src/connection/calendar/copy.ts","../../src/connection/calendar/CopyField.tsx","../../src/connection/calendar/OpenAccessPanel.tsx","../../src/connection/calendar/BookingPagesPanel.tsx","../../src/connection/calendar/RoomsDirectoryPanel.tsx","../../src/connection/calendar/CalendarSettingsDialog.tsx","../../src/connection/calendar/EventScheduling.tsx","../../src/connection/calendar/EventEditorDialog.tsx","../../src/connection/calendar/InvitationsPanel.tsx","../../src/connection/calendar/PublishCalendarDialog.tsx","../../src/connection/calendar/ShareCalendarDialog.tsx","../../src/connection/calendar/store.ts","../../src/connection/calendar/types.ts","../../src/connection/calendar/ConnectedUpcomingEvents.tsx","../../src/connection/calendar/useWebinarAttendee.ts","../../src/connection/calendar/ConnectedCalendar.tsx","../../src/connection/calendar/ConnectedMailInviteCard.tsx","../../src/connection/calendar/ConnectedPublicBooking.tsx","../../src/connection/ConnectedAgentChatPanel.tsx"],"names":["useConnection","jsx","ArbiWebSocketProvider","useState","QueryClient","QueryClientProvider","ArbiProvider","ConnectionProvider","useConversations","useRunConversation","jsxs","Button","useWorkspaceActivity","useWorkspaceUsers","useMemo","WorkspaceActivityList","isDeploymentUserNotification","isWorkspaceNotificationType","signatureNotificationPhrase","signatureRequestMeta","describeServerNotification","Fragment","getWorkspaceActionText","getWorkspaceSentPhrase","BOX_SEAT_REFUSED","BOX_SEAT_REFUSED_TITLE","documentActivityPhrase","isSignatureNotificationType","inputRequestTitle","WORK_NOTIFICATION_LABELS","Activity","getNotificationTypeMeta","icon","useEffect","Bell","Info","UserCheck","TriStateFilterMenu","DraggableHeader","TabHeader","GridView","SelectionBar","SelectionBarAction","Trash2","Loader2","useArbi","initials","UserEntity","EntityPill","ShieldIcon","workspaceKindColor","getWorkspaceKind","useArbiSessionState","useDocuments","documentDisplayName","DocumentEntity","useNotifications","useDeleteNotifications","useMarkNotificationsRead","useNotify","useCallback","useWorkspaces","useBlocksEnvironment","useConnectedWorkspace","useWorkspaceNotificationLevel","WorkspaceNotificationMenu","useFollowThread","ThreadFollowMenuItem","ThreadFollowButton","useUploadSkillFiles","useRef","cn","Label","importSkillFile","Upload","importSkillFromUrl","Input","Link2","EntityIcon","useSkills","useSetSkillVisibility","useDeleteSkill","buildLibrarySkills","filterLibrarySkills","useSkillSource","SKILL_SOURCE_LABELS","SKILL_TYPE_LABELS","workflowToSkillMarkdown","SKILL_MAIN_FILENAME","downloadBlob","Search","SkillViewToggle","SkillFilterChips","Plus","SkillTile","ArrowLeft","SkillGenerateForm","SkillLibraryDetail","parseSkillFrontmatter","skillSlug","serializeSkill","SkillEditForm","Textarea","DEFAULT_AGENT_CAPABILITIES","DEFAULT_AGENT_TEMPLATES","DEFAULT_AGENT_TYPES","useAgentModels","useMcpTools","useAgentConfig","useAgentWorkspaces","useCreateAgent","useSaveAgentConfig","useGrantAgentAccess","useRevokeAgentAccess","useGenerateAgentAvatar","stripPersonaPreamble","isValidAgentName","res","composePersona","AgentCreator","AgentAvatarField","MultiSelect","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","AgentConnectInstructions","formatDate","fmtDate","useWorkflowRuns","TaskRunsDialog","formatRelativeTime","useConversationActivity","useAgents","useConnectedWorkspaceRole","PersonPill","TaskActivityDialog","lazy","artifacts","useStreamedArtifact","ArtifactCanvas","StreamedArtifactFrame","Suspense","stepFields","initialRunInputs","useCreateWork","useActOnStep","workflowSteps","fromPlanSteps","stepStatesFromActivity","useConversationThreads","runThreadTitle","toPlanSteps","useWorkflowView","useArbiChat","ChatPage","useOptionalDocumentTools","splitDocRef","fetchDocumentPdf","ModalScaffold","SignDocumentDialog","DocumentToolsProvider","ConnectedNativeDocxEditor","useTags","useLayoutEffect","files","MessageSquare","AiAnswer","WorkflowRunner","ExternalLink","WorkflowStepBar","stepLevels","stepDocuments","stepKindOf","useTagKindSchema","useSetTagValues","useUpdateTagKindSchema","useInvalidateTagData","tagTableDocx","DOCX_MIME_TYPE","TagTable","useShellWorkspaces","ArbiBotHeadIcon","Monitor","errorText","useProfile","useUpdateProfile","useRequestEmailChange","useConfirmEmailChange","useNameEditor","useAvatarCrop","useEmailChange","SettingsSection","UserCircle","ProfileCard","AvatarPicker","ImageCropModal","useIdentityVerification","IdentityVerificationCard","IdentityVerificationDialog","RequireVerified","usePasswordChange","usePasswordChangeForm","PasswordChangeDialog","KeyRound","SettingsCard","SettingsActionRow","EMAIL_NOTIFICATION_CATEGORIES","EMAIL_NOTIFICATION_KEYS","useNotificationPreferences","NotificationCategoryList","toNotificationCategories","useSessions","useCurrentSessionId","useTerminateSession","toActiveSessionViews","SettingsRow","Radio","ActiveSessionsDialog","useSignOut","useIsOnline","LogoutDialog","toLogoutSessionViews","useDeleteAccount","useDeleteAccountFlow","SettingsDangerZone","DeleteAccountDialog","toDeleteBlockerViews","serverConnectionView","ServerConnectionButton","SettingsPanel","Wifi","LogOut","useMailClient","defaultMailAlias","useClaimNativeAlias","useMailOnline","isAliasTakenError","nextAliasSuggestion","aliasTakenMessage","useConnectMailAccount","useDisconnectMailAccount","useMailPolicy","useMailAccounts","useUserSettings","useUpdateUserSettings","Switch","RotateCcw","ModelProviderLabel","ProviderIcon","formatGbpPerMillionTokens","useAvailableModels","PremiumModelsFrame","User","Mail","HatGlasses","useRequestedSettingsSection","SettingsPage","getEntityLabel","useUpdateWorkspace","useAddWorkspaceMembers","useRemoveWorkspaceMembers","PageLoading","LoadingIndicator","WorkspacePageFrame","WorkspaceIdentityPanel","EntityIdentityBar","IDENTITY_NAME_MAX_LENGTH","WorkspaceIdentity","toShellWorkspace","WorkspaceProjectSlot","WorkspaceAudienceLine","CommonWorkspaceToggle","MemberAvatarStack","ExpandableSection","FolderInput","LeaveFooter","useQueryClient","useQuery","useArbiWebSocket","useWorkNotifications","mailDraftIdFromContent","accountPath","client","bytesToBase64","fileAttachment","useRegisterOpenDocument","useMailDraftEditor","PlainMailBodyEditor","useMailProjects","parseMailRecipients","useSaveMailDraft","useSendMail","useMailDraftReplaced","X","createPortal","Paperclip","MailDocumentPicker","Tooltip","TooltipTrigger","TooltipContent","Send","useMailUnlock","useMailFolders","useMailMessages","useMailDraftCompose","draftMailCompose","useMailMessage","replyMailCompose","emptyMailCompose","MailIcon","useMailCache","mailJson","MailOfflineUnavailableError","FilesFilterBar","FilterInput","FolderFilterButton","FolderPickerRow","Settings","MailGrid","error","MailMessageView","ConfirmDialog","useSubscribeCalendar","normalizeFeedUrl","DialogFooter","useHolidayCountries","useAddHolidayCalendar","selectClass","CheckCircle2","AlertTriangle","useStartCalendarAccountOAuth","useSyncCalendarAccount","useUpdateCalendarAccount","useDisconnectCalendarAccount","describeCalendarError","RefreshCw","useCalDavProfiles","useConnectCalDavAccount","useCalendarSupport","useCalendarAccounts","useConnectOAuthAccount","useResumeCalendarAccountConnect","ACCOUNT_VENDOR","useCopyText","Check","Copy","useRevokeAppPassword","setupSteps","create","useCreateAppPassword","useCreateFeed","useCalendars","useAppPasswords","splitAppPasswords","WEEKDAY_NAMES","bookingToForm","emptyBookingForm","useSaveBookingPage","validateBookingForm","formToBookingBody","bookingLink","slugify","WeeklyHoursEditor","useBookingPages","useCalendarSettings","useDeleteBookingPage","detectTimeZone","CalendarCheck","Pencil","useCreateRoom","formatBusy","safeZone","defaultRoomWindow","wallToUtc","useRooms","DoorOpen","useSaveCalendarSettings","toSettingsValue","Tabs","TabsList","TabsTrigger","TabsContent","CalendarSettingsForm","attendeeKey","isAllDayDraft","draftRangeUtc","utcToDate","useFreeBusy","freeBusyToRows","useFindTime","CalendarSearch","SchedulingAssistant","toSuggestionViews","applySuggestion","RoomFinder","useSearchContacts","EventEditor","formatEventWhen","formatInZone","useCalendarInvitations","useRespondToEvent","useDecideCounter","Popover","PopoverTrigger","Inbox","PopoverContent","ProposeTimeDialog","usePublishCalendar","useCalendarShares","useShareCalendar","useUnshareCalendar","persist","createJSONStorage","useCalendarEvents","upcomingOf","formatPlainDate","conferenceUrl","canJoinEvent","Video","isWebinarConference","useSyncExternalStore","useFetchCalendarEvent","todayInZone","useCalendarOverlays","useCalendarOutbox","calendarToListItem","buildGridEvents","pendingCreateToGrid","useSyncAccountsOnOpen","useCreateEvent","useUpdateEvent","useDeleteEvent","useMoveEvent","useCreateCalendar","useUpdateCalendar","useDeleteCalendar","useImportCalendar","useRefreshCalendar","newEventDraft","parseOverlayLink","needsScope","buildTimeChangeRequest","eventToDraft","buildDeleteTarget","validateDraft","CALENDAR_DEFAULT_LABELS","buildCreateBody","event","isQueuedCalendarWrite","buildEditRequest","useCalendarEvent","MiniMonth","CalendarList","CalendarGrid","printCalendar","Printer","EventDetails","ScopeDialog","CalendarFormDialog","isCalendarAttachment","useMailAttachmentText","parseIcsInvite","useCalendarEventByUid","when","CalendarDays","CalendarX","cancelPublicBooking","PublicBookingError","publicBookingMessage","formatSlotRange","addDays","getPublicBookingPage","groupSlotsByDay","bookPublicSlot","Clock","MapPin","Globe","takeOpenDocumentForTurn","useAgentSession","useStartAgentSession","useCloseAgentSession"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Composition root for a host app on the ARBI React SDK.\n *\n * QueryClientProvider → react-query cache shared with the SDK\n * ArbiProvider → the SDK's Arbi instance (no network until login)\n * ConnectionProvider → demo/live auth + workspace layer\n *\n * With no live `apiUrl`, ArbiProvider is still mounted (cheap, inert) against\n * `demoApiUrl` and the app runs entirely in seeded demo mode.\n */\nimport { useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ArbiProvider, ArbiWebSocketProvider } from '@arbidocs/react'\nimport { ConnectionProvider, useConnection } from './ConnectionProvider'\nimport type { ArbiConnectionConfig } from './types'\n\n/**\n * Opens the shared SDK WebSocket once the app is live-authenticated (demo /\n * logged-out sessions have no backend, so they stay disconnected). Lives inside\n * ConnectionProvider so it can read the live status.\n */\nfunction ConnectionBoundWebSocket({ children }: { children: ReactNode }) {\n const { status } = useConnection()\n return (\n <ArbiWebSocketProvider enabled={status === 'authenticated'}>{children}</ArbiWebSocketProvider>\n )\n}\n\nexport function ArbiAppProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const [queryClient] = useState(\n () =>\n new QueryClient({\n defaultOptions: { queries: { staleTime: 30_000, retry: 1, refetchOnWindowFocus: false } },\n })\n )\n\n const providerUrl = config.apiUrl || config.demoApiUrl || 'https://demo.arbi.local'\n\n return (\n <QueryClientProvider client={queryClient}>\n <ArbiProvider url={providerUrl} deploymentDomain={config.deploymentDomain}>\n <ConnectionProvider config={config}>\n <ConnectionBoundWebSocket>{children}</ConnectionBoundWebSocket>\n </ConnectionProvider>\n </ArbiProvider>\n </QueryClientProvider>\n )\n}\n","import { useConversations, useRunConversation } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useConnection } from './ConnectionProvider'\n\n/** Approval for a parked agent run, scoped to the currently selected task. */\nexport function ConnectedTaskAccessRequest({ conversationId }: { conversationId?: string }) {\n const { workspaceId } = useConnection()\n const tasks = useConversations(workspaceId ?? undefined, { live: true })\n const run = useRunConversation()\n const task = tasks.data?.find((item) => item.external_id === conversationId)\n if (!task?.pending_auth_request_id || !task.is_owner) return null\n return (\n <section\n className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-card p-3\"\n data-testid=\"task-chat-access-request\"\n >\n <p className=\"flex-1 text-sm\">This task is waiting for temporary workspace access.</p>\n <Button\n disabled={run.isPending}\n onClick={() => run.mutate(task.external_id)}\n data-testid=\"task-chat-allow-access\"\n >\n {run.isPending ? 'Allowing access…' : 'Allow access and run'}\n </Button>\n {run.error && (\n <p role=\"alert\" className=\"w-full text-sm text-destructive\">\n {run.error.message}\n </p>\n )}\n </section>\n )\n}\n","import { useMemo } from 'react'\nimport { useWorkspaceActivity, useWorkspaceUsers } from '@arbidocs/react'\nimport {\n WorkspaceActivityList,\n type WorkspaceActivityItem,\n type WorkspaceActivityListProps,\n type WorkspaceActivityTarget,\n} from '../activity'\nimport { useConnection } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceActivityProps extends Pick<\n WorkspaceActivityListProps,\n 'formatTime' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace to show; default the selected one. */\n workspaceId?: string\n /** Open an entry's thread, document version or run (the host owns its routes). */\n onOpen: (target: WorkspaceActivityTarget, item: WorkspaceActivityItem) => void\n /** Entries per page (1–100, server default 30). */\n pageSize?: number\n}\n\n/** The selected workspace's activity feed, newest first, a page at a time. */\nexport function ConnectedWorkspaceActivity({\n workspaceId: workspaceProp,\n onOpen,\n pageSize,\n ...listProps\n}: ConnectedWorkspaceActivityProps) {\n const { workspaceId: selected, status, ensureWorkspaceOpen } = useConnection()\n const workspaceId = workspaceProp ?? selected ?? undefined\n const live = status === 'authenticated' && !!workspaceId\n const feed = useWorkspaceActivity(workspaceId, {\n enabled: live,\n limit: pageSize,\n // Titles and names decrypt only while the session has the workspace open.\n beforeFetch: workspaceId === selected ? ensureWorkspaceOpen : undefined,\n })\n const members = useWorkspaceUsers(workspaceId, {\n enabled: live && workspaceId === selected,\n beforeFetch: ensureWorkspaceOpen,\n })\n const names = useMemo(\n () =>\n new Map(\n (members.data ?? []).map((m) => [\n m.user.external_id,\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n ])\n ),\n [members.data]\n )\n const items = useMemo(\n () => (feed.data?.pages ?? []).flatMap((page) => page.items as WorkspaceActivityItem[]),\n [feed.data]\n )\n return (\n <WorkspaceActivityList\n {...listProps}\n items={items}\n isLoading={feed.isLoading}\n isError={feed.isError}\n hasMore={feed.hasNextPage}\n isLoadingMore={feed.isFetchingNextPage}\n onLoadMore={() => void feed.fetchNextPage()}\n onRetry={() => void feed.refetch()}\n onOpen={onOpen}\n nameOf={(id) => names.get(id)}\n />\n )\n}\n","/**\n * The notification centre's one list: the persisted notifications (both what the user received\n * and what they sent, from `/v1/notifications`) and the session log (the shared notify store's own\n * entries), merged newest first, with the category and type filters over it.\n */\nimport type { components } from '@arbidocs/client'\nimport type { AppNotification } from '@arbidocs/react/shell'\nimport { isDeploymentUserNotification, isWorkspaceNotificationType } from '@arbidocs/react'\n\nexport type NotificationRow = components['schemas']['NotificationResponse']\n\n/**\n * One entry of the list.\n *\n * - `kind: 'incoming'` — a persisted notification the user received; read from their side\n * (shows the sender).\n * - `kind: 'activity'` — the user's own: a notification they sent (`persisted: true`) or a\n * session-log entry (`persisted: false`); read from the sender's side.\n *\n * `persisted` is what the user sees as the category: persisted entries survive in the\n * notifications table (\"Notifications\"); session entries are this browser's log (\"Session log\").\n */\nexport interface NotificationCenterItem {\n id: string\n timestamp: number\n kind: 'incoming' | 'activity'\n persisted: boolean\n /** Every persisted entry. */\n row?: NotificationRow\n /** Every session-log entry. */\n entry?: AppNotification\n}\n\nexport type NotificationFilterType = 'notifications' | 'session' | 'workspace' | 'contact_accepted'\nexport type NotificationFilterState = Map<NotificationFilterType, 'include' | 'exclude' | null>\n\n/** Whose side a persisted row is read from: received rows are incoming, sent ones are activity. */\nfunction sideOf(row: NotificationRow, userId: string): 'incoming' | 'activity' | null {\n const isSender = row.sender.external_id === userId\n const isRecipient = row.recipient.external_id === userId\n if (row.type === 'contact_accepted') return isRecipient ? 'incoming' : 'activity'\n // A Box admin's notice (one row per admin): the inviter / new user is its sender but it is not\n // their activity — listing it would show them each admin, once per admin.\n if (isDeploymentUserNotification(row.type)) return isRecipient ? 'incoming' : null\n if (isSender) return 'activity'\n if (isRecipient) return 'incoming'\n return null\n}\n\n/** The merged list, newest first. */\nexport function buildNotificationCenterItems(\n rows: readonly NotificationRow[],\n session: readonly AppNotification[],\n userId: string\n): NotificationCenterItem[] {\n const items: NotificationCenterItem[] = []\n for (const row of rows) {\n const kind = sideOf(row, userId)\n if (kind)\n items.push({\n id: row.external_id,\n timestamp: new Date(row.created_at).getTime(),\n kind,\n persisted: true,\n row,\n })\n }\n for (const entry of session)\n items.push({ id: entry.id, timestamp: entry.ts, kind: 'activity', persisted: false, entry })\n return items.sort((a, b) => b.timestamp - a.timestamp)\n}\n\n/** Per-type counts of the received notifications, for the filter badges. */\nexport function countNotificationTypes(items: readonly NotificationCenterItem[]): {\n workspace: number\n contact_accepted: number\n} {\n const counts = { workspace: 0, contact_accepted: 0 }\n for (const item of items) {\n if (item.kind !== 'incoming' || !item.row) continue\n if (isWorkspaceNotificationType(item.row.type)) counts.workspace++\n else if (item.row.type === 'contact_accepted') counts.contact_accepted++\n }\n return counts\n}\n\n/**\n * The items the active \"include\" filters select, OR-combined: an item shows when it matches any.\n * With no active filter everything shows. The category filters track `persisted`, the same\n * differentiator as the Category column.\n */\nexport function filterNotificationCenterItems(\n items: NotificationCenterItem[],\n filters: NotificationFilterState\n): NotificationCenterItem[] {\n const active = new Set<NotificationFilterType>()\n filters.forEach((state, type) => {\n if (state === 'include') active.add(type)\n })\n if (active.size === 0) return items\n return items.filter((item) => {\n if (active.has('notifications') && item.persisted) return true\n if (active.has('session') && !item.persisted) return true\n const type = item.row?.type\n if (!type) return false\n if (active.has('workspace') && isWorkspaceNotificationType(type)) return true\n return active.has('contact_accepted') && type === 'contact_accepted'\n })\n}\n","/**\n * The Event cell of the notification centre: what happened, as a sentence around the people and\n * documents involved, with the action that opens it. A received notification reads from the\n * recipient's side (\"[Priya] mentioned you in a conversation\"), a sent one from the sender's\n * (\"You mentioned [Sam] in a conversation\"), a session-log entry as it was toasted.\n */\nimport type { ComponentType, ReactElement, ReactNode } from 'react'\nimport {\n BOX_SEAT_REFUSED,\n BOX_SEAT_REFUSED_TITLE,\n WORK_NOTIFICATION_LABELS,\n describeServerNotification,\n documentActivityPhrase,\n getWorkspaceActionText,\n getWorkspaceSentPhrase,\n inputRequestTitle,\n isDeploymentUserNotification,\n isSignatureNotificationType,\n isWorkspaceNotificationType,\n signatureNotificationPhrase,\n signatureRequestMeta,\n type NotificationTarget,\n type SignatureNotificationType,\n} from '@arbidocs/react'\nimport type { NotificationCenterItem, NotificationRow } from './items'\n\nexport type NotificationUser = NotificationRow['sender']\n\nexport interface NotificationDocumentChipProps {\n documentId: string\n workspaceId?: string | null\n /** Open the document. */\n onOpen: () => void\n /** What to show when the document is not known here (its name is encrypted per workspace). */\n fallback: ReactNode\n}\n\n/** How the host draws people, workspaces and documents in the list. */\nexport interface NotificationCenterRenderers {\n /** A person's pill. */\n renderUser: (user: NotificationUser) => ReactNode\n /** A workspace's badge (the Category of a workspace's notification), or null when the host\n * does not know the workspace (the type's own category shows instead). */\n renderWorkspace: (workspaceId: string) => ReactNode | null\n /** A signature notification's document: its chip when known, else `fallback`. */\n DocumentChip: ComponentType<NotificationDocumentChipProps>\n}\n\nconst ACTION_CLASS =\n 'ml-auto flex-shrink-0 rounded-md bg-accent px-2 py-0.5 text-xs font-medium text-primary transition-colors hover:bg-primary/10'\nconst PHRASE_CLASS = 'min-w-0 shrink-[2] truncate text-sm'\n\nfunction ActionButton({ label, onClick }: { label: string; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n className={ACTION_CLASS}\n data-testid=\"notification-action-button\"\n >\n {label}\n </button>\n )\n}\n\n/** \"[person] {phrase}\" — the row line most notifications are. */\nfunction PersonLine({ person, children }: { person: ReactNode; children: ReactNode }) {\n return (\n <div className=\"flex h-full items-center gap-1.5 text-muted-foreground\">\n {person}\n {children}\n </div>\n )\n}\n\nfunction SignatureEvent({\n row,\n isIncoming,\n open,\n renderers,\n}: {\n row: NotificationRow\n isIncoming: boolean\n open: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n}): ReactElement {\n const type = row.type as SignatureNotificationType\n const { lead, showPerson, verb, tail } = signatureNotificationPhrase(type, isIncoming)\n const { documentId } = signatureRequestMeta(row.content)\n const target = describeServerNotification(row)?.target\n const openIt = () => target && open(target)\n const { DocumentChip } = renderers\n const unnamed = (\n <>\n <span className=\"min-w-0 truncate text-sm\">\n {type === 'signature_requested' ? 'a document' : 'the document'}\n </span>\n {/* Named, the document's own chip opens it (its line is too narrow to share with a\n button); unnamed (another workspace), Open does. */}\n {documentId && <ActionButton label=\"Open\" onClick={openIt} />}\n </>\n )\n // Two short lines, so a narrow panel still shows who and which document: the person and what\n // they did, then the document and Open. The fixed wording gives way first; the person's name\n // never yields to it.\n const wording = 'min-w-0 shrink-[100] truncate text-sm'\n return (\n <div\n className=\"flex h-full min-w-0 flex-col justify-center gap-0.5 text-muted-foreground\"\n data-testid=\"notification-signature\"\n >\n <div className=\"flex min-w-0 items-center gap-1.5 leading-5\">\n {lead && <span className={wording}>{lead}</span>}\n {showPerson && (\n <span\n className=\"flex max-w-full min-w-0 shrink-0\"\n data-testid=\"notification-signature-person\"\n >\n {renderers.renderUser(isIncoming ? row.sender : row.recipient)}\n </span>\n )}\n {verb && <span className={wording}>{verb}</span>}\n </div>\n <div className=\"flex min-w-0 items-center gap-1.5 leading-5\">\n {documentId ? (\n <DocumentChip\n documentId={documentId}\n workspaceId={row.workspace_ext_id}\n onOpen={openIt}\n fallback={unnamed}\n />\n ) : (\n unnamed\n )}\n {tail && <span className={wording}>{tail.trim()}</span>}\n </div>\n </div>\n )\n}\n\nfunction PersistedEvent({\n item,\n row,\n open,\n renderers,\n}: {\n item: NotificationCenterItem\n row: NotificationRow\n open: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n}): ReactElement {\n const { sender, recipient } = row\n const type = row.type as string\n const isIncoming = item.kind === 'incoming'\n const user = renderers.renderUser\n const target = () => describeServerNotification(row)?.target\n const openTarget = () => {\n const t = target()\n if (t) open(t)\n }\n\n // Workspace membership — the workspace itself is the Category. Received: \"[sender] added you\n // as collaborator\"; sent: \"You added [member] as collaborator\".\n if (isWorkspaceNotificationType(type)) {\n if (isIncoming)\n return (\n <PersonLine person={user(sender)}>\n <span className={PHRASE_CLASS}>{getWorkspaceActionText(type)}</span>\n </PersonLine>\n )\n const { before, after } = getWorkspaceSentPhrase(type)\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className={PHRASE_CLASS}>{before}</span>\n {user(recipient)}\n {after && <span className={PHRASE_CLASS}>{after}</span>}\n </div>\n )\n }\n\n if (type === 'contact_accepted') {\n if (isIncoming)\n return (\n <PersonLine person={user(sender)}>\n <span className={`${PHRASE_CLASS} italic`}>\n {row.content || 'accepted your invitation to join the platform'}\n </span>\n </PersonLine>\n )\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className={`${PHRASE_CLASS} italic`}>\n {row.content || 'Accepted an invitation to join the platform'}\n </span>\n </div>\n )\n }\n\n // A workspace access request: received, \"Review\" opens the grant flow.\n if (type === 'workspace_access_request') {\n if (isIncoming)\n return (\n <PersonLine person={user(sender)}>\n <span className={PHRASE_CLASS}>requested workspace access</span>\n <ActionButton label=\"Review\" onClick={openTarget} />\n </PersonLine>\n )\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className={PHRASE_CLASS}>Requested workspace access from</span>\n {user(recipient)}\n </div>\n )\n }\n\n // A Box admin's notice: someone was invited or joined. Same sentence as the bell and toast,\n // with \"Manage users\" to the portal when the link is a trusted portal URL.\n if (isDeploymentUserNotification(type)) {\n const entry = describeServerNotification(row)\n return (\n <div\n className=\"flex h-full items-center gap-1.5 text-sm text-muted-foreground\"\n data-testid=\"notification-deployment-user\"\n >\n <span className=\"min-w-0 truncate\" title={entry?.title}>\n {entry?.title}\n </span>\n {entry?.target && <ActionButton label={entry.actionLabel ?? 'Open'} onClick={openTarget} />}\n </div>\n )\n }\n\n // Self-notifications: a refused Box seat, a signup bonus, a reward.\n const selfLine =\n type === BOX_SEAT_REFUSED\n ? BOX_SEAT_REFUSED_TITLE\n : type === 'signup_reward'\n ? `Signup bonus — ${row.content || 'You earned a signup bonus'}`\n : type === 'referral_reward'\n ? `Reward earned — ${row.content || 'You earned a reward'}`\n : null\n if (selfLine)\n return (\n <div className=\"flex items-center h-full text-sm text-muted-foreground\">\n <span className=\"min-w-0 truncate\">{selfLine}</span>\n </div>\n )\n\n // An @mention: name the person and offer \"Open\" to jump to the message.\n if (type === 'mention' || type === 'docx_mention') {\n const inDocument = type === 'docx_mention'\n return (\n <div className=\"flex h-full items-center gap-1.5 text-muted-foreground\">\n {!isIncoming && <span className=\"text-sm\">You mentioned</span>}\n {isIncoming ? user(sender) : user(recipient)}\n <span className={PHRASE_CLASS}>\n {inDocument\n ? isIncoming\n ? 'mentioned you in a document comment'\n : 'in a document comment'\n : isIncoming\n ? 'mentioned you in a conversation'\n : 'in a conversation'}\n </span>\n {(row.conversation_ext_id || inDocument) && (\n <ActionButton label=\"Open\" onClick={openTarget} />\n )}\n </div>\n )\n }\n\n // A reply in a thread you take part in, or a new version of a document you own. Only\n // received: nobody is sent their own.\n if (type === 'thread_reply' || type === 'document_activity') {\n return (\n <div\n className=\"flex h-full items-center gap-1.5 text-muted-foreground\"\n data-testid=\"notification-relevance\"\n >\n {user(sender)}\n <span className={PHRASE_CLASS}>\n {type === 'thread_reply' ? 'replied in a thread' : documentActivityPhrase(row.content)}\n </span>\n <ActionButton label=\"Open\" onClick={openTarget} />\n </div>\n )\n }\n\n if (isSignatureNotificationType(type))\n return <SignatureEvent row={row} isIncoming={isIncoming} open={open} renderers={renderers} />\n\n // Work notifications — a task is a conversation, so the notification links straight to it.\n const workLabel =\n type === 'agent_input_requested'\n ? inputRequestTitle(row.content)\n : WORK_NOTIFICATION_LABELS[type]\n if (workLabel)\n return (\n <div\n className=\"flex h-full items-center gap-1.5 text-sm text-muted-foreground\"\n title={workLabel}\n data-testid=\"notification-work\"\n >\n <span className={`min-w-0 truncate ${type === 'workflow_failed' ? 'text-red-text' : ''}`}>\n {workLabel}\n </span>\n {row.conversation_ext_id && (\n <ActionButton\n label=\"Open\"\n onClick={() =>\n open({\n kind: 'conversation',\n workspaceId: row.workspace_ext_id ?? undefined,\n conversationId: row.conversation_ext_id!,\n ...(row.message_ext_id ? { messageId: row.message_ext_id } : {}),\n })\n }\n />\n )}\n </div>\n )\n\n return (\n <div className=\"flex items-center h-full text-sm text-muted-foreground\">\n {type || 'Notification'}\n </div>\n )\n}\n\n/** A session-log entry: its message as toasted (+ its action while this session lasts). */\nfunction SessionEvent({ item }: { item: NotificationCenterItem }): ReactElement | null {\n const entry = item.entry\n if (!entry) return null\n return (\n <div\n className=\"flex h-full items-center gap-2 text-sm text-muted-foreground\"\n title={entry.title}\n >\n {entry.html ? (\n <span className=\"min-w-0 truncate\" dangerouslySetInnerHTML={{ __html: entry.html }} />\n ) : (\n <span className=\"min-w-0 truncate\">{entry.title}</span>\n )}\n {entry.onSelect && entry.actionLabel && (\n <ActionButton label={entry.actionLabel} onClick={entry.onSelect} />\n )}\n </div>\n )\n}\n\nexport function NotificationEvent({\n item,\n open,\n renderers,\n}: {\n item: NotificationCenterItem\n open: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n}): ReactElement | null {\n if (!item.persisted) return <SessionEvent item={item} />\n if (!item.row) return null\n return <PersistedEvent item={item} row={item.row} open={open} renderers={renderers} />\n}\n","/**\n * The notification centre page: one time-sorted list of what the user received, what they sent\n * and this session's log, with category/type filters, bulk delete and paging. Presentational:\n * {@link ConnectedNotificationCenter} supplies the data; the host draws people, workspaces and\n * documents ({@link NotificationCenterRenderers}) and owns where an entry leads.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport type { ColDef, GridApi, GridState, ICellRendererParams } from 'ag-grid-community'\nimport { Activity, Bell, Info, Loader2, Trash2, UserCheck } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { getNotificationTypeMeta, type NotificationTarget } from '@arbidocs/react'\nimport { GridView } from '../../files/GridView'\nimport { SelectionBar, SelectionBarAction } from '../../files/SelectionBar'\nimport { TabHeader } from '../../shell/TabHeader'\nimport { DraggableHeader } from '../../settings/DraggableHeader'\nimport { TriStateFilterMenu, type TriStateOption } from '../../settings/TriStateFilterMenu'\nimport {\n countNotificationTypes,\n filterNotificationCenterItems,\n type NotificationCenterItem,\n type NotificationFilterState,\n type NotificationFilterType,\n} from './items'\nimport { NotificationEvent, type NotificationCenterRenderers } from './NotificationEvent'\n\nexport interface NotificationCenterProps {\n /** Every entry, newest first (see `buildNotificationCenterItems`). */\n items: NotificationCenterItem[]\n isLoading?: boolean\n /** More persisted notifications exist beyond the loaded ones. */\n hasMore?: boolean\n isLoadingMore?: boolean\n onLoadMore?: () => void\n /** Delete entries (persisted ones on the server, session ones from the log). */\n onDelete: (items: NotificationCenterItem[]) => void\n /** Open where an entry leads. */\n onOpen: (target: NotificationTarget) => void\n renderers: NotificationCenterRenderers\n /** \"Today, 14:05\" for an entry's time. */\n formatTime: (timestamp: number) => string\n /** The entry to scroll to and highlight (e.g. the one picked in the bell). */\n focusId?: string | null\n /** Header content on the right (e.g. a panel mode switcher). */\n headerRight?: ReactNode\n /** Label of the Workspace type filter (a host's own word for a workspace). */\n workspaceLabel?: string\n /** Persisted column state (order, width, sort), read once at mount, and its changes. */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n}\n\n/** Icon + label for the Category column: the notification type's, or \"Session log\". */\nfunction categoryOf(item: NotificationCenterItem): { icon: ReactNode; label: string } {\n if (!item.persisted)\n return { icon: <Activity size={16} className=\"text-muted-foreground\" />, label: 'Session log' }\n const meta = getNotificationTypeMeta(item.row?.type)\n const Icon = meta.Icon\n return { icon: <Icon size={16} className={meta.iconClassName} />, label: meta.label }\n}\n\nfunction useColumns(\n formatTime: (timestamp: number) => string,\n onOpen: (target: NotificationTarget) => void,\n renderers: NotificationCenterRenderers\n): ColDef<NotificationCenterItem>[] {\n return useMemo(\n () => [\n {\n colId: 'timestamp',\n headerName: 'Time',\n field: 'timestamp',\n width: 150,\n filter: false,\n sortable: true,\n sort: 'desc',\n cellRenderer: (params: ICellRendererParams<NotificationCenterItem>) => {\n // The unread dot is for what you received.\n const isNew = params.data?.kind === 'incoming' && params.data.row && !params.data.row.read\n return (\n <div className=\"flex items-center h-full gap-2\">\n {isNew && <div className=\"w-2.5 h-2.5 rounded-full bg-primary flex-shrink-0\" />}\n <span className=\"text-sm text-muted-foreground\">\n {params.value ? formatTime(params.value) : 'Unknown'}\n </span>\n </div>\n )\n },\n },\n {\n colId: 'event',\n headerName: 'Event',\n flex: 1,\n minWidth: 160,\n // A docked panel leaves this column ~150px: keep the cell's own padding small so the\n // sentence (who, what, which document) gets the room rather than the gutters.\n cellClass: 'px-2!',\n filter: false,\n sortable: false,\n cellRenderer: (params: ICellRendererParams<NotificationCenterItem>) =>\n params.data ? (\n <NotificationEvent item={params.data} open={onOpen} renderers={renderers} />\n ) : null,\n },\n {\n colId: 'category',\n headerName: 'Category',\n width: 130,\n filter: false,\n sortable: true,\n valueGetter: (params) => (params.data ? categoryOf(params.data).label : ''),\n cellRenderer: (params: ICellRendererParams<NotificationCenterItem>) => {\n if (!params.data) return null\n // A workspace's notification collapses into the workspace's badge — it IS its category.\n const workspaceId = params.data.row?.workspace_ext_id\n const workspace = workspaceId ? renderers.renderWorkspace(workspaceId) : null\n if (workspace) return <div className=\"flex items-center h-full\">{workspace}</div>\n const { icon, label } = categoryOf(params.data)\n return (\n <div className=\"flex items-center h-full gap-1.5 text-muted-foreground\">\n <span className=\"flex-shrink-0\">{icon}</span>\n <span className=\"min-w-0 shrink-[2] truncate text-sm\">{label}</span>\n </div>\n )\n },\n },\n ],\n [formatTime, onOpen, renderers]\n )\n}\n\nexport function NotificationCenter({\n items,\n isLoading = false,\n hasMore = false,\n isLoadingMore = false,\n onLoadMore,\n onDelete,\n onOpen,\n renderers,\n formatTime,\n focusId,\n headerRight,\n workspaceLabel = 'Workspace',\n gridState,\n onGridStateChange,\n}: NotificationCenterProps) {\n const [selected, setSelected] = useState<NotificationCenterItem[]>([])\n const [filters, setFilters] = useState<NotificationFilterState>(new Map())\n const [filterOpen, setFilterOpen] = useState(false)\n const [gridApi, setGridApi] = useState<GridApi<NotificationCenterItem> | null>(null)\n\n const filtered = useMemo(() => filterNotificationCenterItems(items, filters), [items, filters])\n const typeCounts = useMemo(() => countNotificationTypes(items), [items])\n const persistedCount = useMemo(() => items.filter((i) => i.persisted).length, [items])\n const hasUnread = useMemo(\n () => items.some((i) => i.kind === 'incoming' && i.row && !i.row.read),\n [items]\n )\n\n // Scroll the focused entry into view whenever the list changes under it.\n useEffect(() => {\n if (!gridApi || gridApi.isDestroyed()) return\n gridApi.redrawRows()\n if (focusId) {\n const row = gridApi.getRowNode(focusId)\n if (row) gridApi.ensureNodeVisible(row, 'middle')\n }\n }, [gridApi, focusId, filtered])\n\n const columnDefs = useColumns(formatTime, onOpen, renderers)\n\n const options = useMemo(\n (): TriStateOption<NotificationFilterType>[] => [\n {\n id: 'notifications',\n label: 'Notifications',\n icon: <Bell className=\"h-4 w-4\" />,\n count: persistedCount,\n },\n {\n id: 'session',\n label: 'Session log',\n icon: <Activity className=\"h-4 w-4\" />,\n count: items.length - persistedCount,\n },\n {\n id: 'workspace',\n label: workspaceLabel,\n icon: <Info className=\"h-4 w-4\" />,\n count: typeCounts.workspace,\n },\n {\n id: 'contact_accepted',\n label: 'Invitation Accepted',\n icon: <UserCheck className=\"h-4 w-4\" />,\n count: typeCounts.contact_accepted,\n },\n ],\n [items.length, persistedCount, typeCounts, workspaceLabel]\n )\n\n const tabs = [\n {\n id: 'notifications',\n label: 'Notifications',\n icon: (\n <div className=\"relative\">\n <Bell className=\"w-5 h-5\" />\n {hasUnread && (\n <div className=\"absolute -top-0.5 -right-0.5 w-2.5 h-2.5 rounded-full bg-primary border border-background\" />\n )}\n </div>\n ),\n // Filter-aware: the filtered total whenever a filter applies.\n count: filtered.length,\n actions: (\n <TriStateFilterMenu\n testId=\"notifications-filter-button\"\n title=\"Filter\"\n open={filterOpen}\n onOpenChange={setFilterOpen}\n filterStates={filters}\n onFiltersChange={setFilters}\n options={options}\n groups={[\n { label: 'Category', options: ['notifications', 'session'] },\n { label: 'Type', options: ['workspace', 'contact_accepted'] },\n ]}\n />\n ),\n },\n ]\n\n return (\n <div className=\"flex flex-col h-full bg-background\" data-testid=\"notifications-page\">\n <DraggableHeader>\n <TabHeader\n tabs={tabs}\n activeTabId=\"notifications\"\n onTabChange={() => {}}\n variant=\"underline\"\n // One tab in a narrow panel — keep the label visible (the default 640 breakpoint\n // would hide it as \"compact\").\n compactBreakpoint={380}\n rightContent={headerRight}\n />\n </DraggableHeader>\n\n <div data-testid=\"notifications-list\" className=\"flex flex-1 flex-col min-h-0 px-3 pt-1\">\n <div className=\"flex-1 min-h-0\">\n <GridView<NotificationCenterItem>\n items={filtered}\n columnDefs={columnDefs}\n getItemId={(item) => item.id}\n selection={{ mode: 'multiple', selected, onSelectionChange: setSelected }}\n isLoading={isLoading}\n height=\"100%\"\n persistState={!!onGridStateChange}\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n emptyState={{\n icon: <Bell size={48} className=\"text-muted-foreground/60\" />,\n title: 'No notifications',\n message: 'Notifications and activity will appear here',\n }}\n // Through the prop, not gridOptions: GridView needs its own onGridReady to keep the\n // grid api, without which a ticked row never reaches onSelectionChange.\n onGridReady={({ api }) => setGridApi(api)}\n gridOptions={{\n getRowClass: (params) => (params.data?.id === focusId ? 'bg-accent/40' : undefined),\n onRowDataUpdated: ({ api }) => {\n if (focusId) {\n const row = api.getRowNode(focusId)\n if (row) api.ensureNodeVisible(row, 'middle')\n }\n },\n suppressMenuHide: false,\n headerHeight: 40,\n rowHeight: 48,\n animateRows: true,\n suppressCellFocus: true,\n suppressRowClickSelection: true,\n tooltipInteraction: true,\n tooltipShowDelay: 200,\n tooltipHideDelay: 500,\n defaultColDef: { sortable: true, filter: false, resizable: true },\n }}\n />\n </div>\n {filtered.length > 0 && (\n <SelectionBar count={selected.length} onClear={() => setSelected([])}>\n {(isCompact) => (\n <SelectionBarAction\n icon={Trash2}\n label=\"Delete\"\n onClick={() => {\n if (selected.length === 0) return\n onDelete(selected)\n setSelected([])\n }}\n disabled={selected.length === 0}\n isCompact={isCompact}\n className=\"text-red-text hover:text-red-text hover:bg-red-bg border-red-border\"\n testId=\"bulk-delete-notifications\"\n />\n )}\n </SelectionBar>\n )}\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center py-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onLoadMore}\n disabled={isLoadingMore}\n data-testid=\"notifications-load-more-button\"\n >\n {isLoadingMore ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Loading…\n </>\n ) : (\n 'Load more'\n )}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * The notification centre on a live session: the persisted notifications (`/v1/notifications`,\n * a page at a time) and the shared notify store's session log in one list. Viewing it marks what\n * you received read. Any host mounts it; it draws people, workspaces and documents with the\n * shared entities unless the host passes its own, and the host routes where an entry leads.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n documentDisplayName,\n getWorkspaceKind,\n useArbi,\n useArbiSessionState,\n useDeleteNotifications,\n useDocuments,\n useMarkNotificationsRead,\n useNotifications,\n useWorkspaces,\n type NotificationTarget,\n} from '@arbidocs/react'\nimport { useNotify } from '@arbidocs/react/shell'\nimport { DocumentEntity, EntityPill, ShieldIcon, UserEntity } from '@arbidocs/react/ui'\nimport { workspaceKindColor } from '../../shell/Workspace'\nimport { buildNotificationCenterItems, type NotificationCenterItem } from './items'\nimport { NotificationCenter, type NotificationCenterProps } from './NotificationCenter'\nimport type {\n NotificationCenterRenderers,\n NotificationDocumentChipProps,\n NotificationUser,\n} from './NotificationEvent'\n\nexport interface ConnectedNotificationCenterProps extends Pick<\n NotificationCenterProps,\n 'focusId' | 'headerRight' | 'workspaceLabel' | 'gridState' | 'onGridStateChange'\n> {\n /** Open where an entry leads (the host owns its routes). An external page (`url`) opens in a\n * new tab without it. */\n onOpen: (target: NotificationTarget) => void\n /** The host's own people / workspace / document renderers (default: the shared entities). */\n renderers?: Partial<NotificationCenterRenderers>\n /** \"Today, 14:05\"; default the local date and time. */\n formatTime?: (timestamp: number) => string\n /** Persisted notifications per page (default 100). */\n pageSize?: number\n}\n\ntype Workspace = NonNullable<ReturnType<typeof useWorkspaces>['data']>[number]\n\nconst PAGE_SIZE = 100\n\nfunction localTime(timestamp: number): string {\n const date = new Date(timestamp)\n const time = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n const today = new Date()\n const yesterday = new Date(today)\n yesterday.setDate(today.getDate() - 1)\n if (date.toDateString() === today.toDateString()) return `Today, ${time}`\n if (date.toDateString() === yesterday.toDateString()) return `Yesterday, ${time}`\n return `${date.toLocaleDateString([], { month: 'short', day: 'numeric' })}, ${time}`\n}\n\nfunction DefaultUser({ user }: { user: NotificationUser }) {\n const arbi = useArbi()\n const isMe = arbi.isLoggedIn && arbi.user.identity()?.externalId === user.external_id\n const name = [user.given_name, user.family_name].filter(Boolean).join(' ') || user.email\n const initials = name\n .split(/\\s+/)\n .map((part) => part.charAt(0))\n .join('')\n .slice(0, 2)\n .toUpperCase()\n return (\n <UserEntity\n size=\"xs\"\n variant=\"pill\"\n showTooltip={false}\n interactive={false}\n isMe={isMe}\n displayName={isMe ? 'You' : name}\n initials={initials}\n picture={user.picture}\n />\n )\n}\n\nfunction WorkspaceBadge({ workspace }: { workspace: Workspace }) {\n return (\n <EntityPill\n icon={\n <ShieldIcon\n char={workspace.name.charAt(0)}\n workspaceColor={workspaceKindColor(getWorkspaceKind(workspace))}\n size={16}\n />\n }\n label={workspace.name}\n size=\"sm\"\n shape=\"rounded\"\n labelMaxWidth=\"max-w-[10ch]\"\n />\n )\n}\n\n/** A document of the open workspace by name; another workspace's names are not decrypted here. */\nfunction DefaultDocumentChip({\n documentId,\n workspaceId,\n onOpen,\n fallback,\n}: NotificationDocumentChipProps) {\n const openWorkspace = useArbiSessionState((s) => s.workspaceId)\n const inOpenWorkspace = !workspaceId || workspaceId === openWorkspace\n const { data: documents } = useDocuments(openWorkspace ?? undefined, {\n enabled: inOpenWorkspace && !!openWorkspace,\n })\n const doc = inOpenWorkspace ? documents?.find((d) => d.external_id === documentId) : undefined\n const name = documentDisplayName(doc)\n if (!doc || !name) return <>{fallback}</>\n return (\n <span className=\"flex min-w-0 flex-1\" title={`Open ${name}`}>\n <DocumentEntity\n doc={doc}\n fullWidth\n onClick={(e) => {\n e.stopPropagation()\n onOpen()\n }}\n className=\"min-w-0\"\n data-testid=\"notification-signature-document\"\n />\n </span>\n )\n}\n\nconst renderUser = (user: NotificationUser) => <DefaultUser user={user} />\n\nexport function ConnectedNotificationCenter({\n onOpen,\n renderers,\n formatTime = localTime,\n pageSize = PAGE_SIZE,\n ...pageProps\n}: ConnectedNotificationCenterProps) {\n const arbi = useArbi()\n const userId = (arbi.isLoggedIn && arbi.user.identity()?.externalId) || ''\n const [limit, setLimit] = useState(pageSize)\n const { data: rows = [], isLoading, isFetching } = useNotifications({ limit })\n const deleteRows = useDeleteNotifications()\n const { mutate: markRead } = useMarkNotificationsRead()\n const history = useNotify((s) => s.notifications)\n const removeEntries = useNotify((s) => s.removeNotifications)\n\n // The session log: the store's own entries (entries a source synced in are persisted rows).\n const session = useMemo(() => history.filter((n) => !n.source), [history])\n const items = useMemo(\n () => buildNotificationCenterItems(rows, session, userId),\n [rows, session, userId]\n )\n\n // Viewing the list is seeing it: mark unread rows addressed to me read. That includes\n // self-addressed rows (quota, rewards), which sit in my activity but count in the bell.\n useEffect(() => {\n const unread = rows\n .filter((n) => n.recipient.external_id === userId && !n.read)\n .map((n) => n.external_id)\n if (unread.length > 0) markRead(unread)\n }, [rows, userId, markRead])\n\n const onDelete = useCallback(\n (selected: NotificationCenterItem[]) => {\n const persisted = selected.filter((i) => i.persisted && i.row).map((i) => i.row!.external_id)\n const local = selected.filter((i) => !i.persisted && i.entry).map((i) => i.entry!.id)\n if (persisted.length > 0) deleteRows.mutate(persisted)\n if (local.length > 0) removeEntries(local)\n },\n [deleteRows, removeEntries]\n )\n\n const open = useCallback(\n (target: NotificationTarget) => {\n if (target.kind === 'url') window.open(target.url, '_blank', 'noopener,noreferrer')\n else onOpen(target)\n },\n [onOpen]\n )\n\n // The workspace list is read only for the default badge (a host's renderer has its own).\n const { data: workspaces } = useWorkspaces({\n enabled: arbi.isLoggedIn && !renderers?.renderWorkspace,\n })\n const merged = useMemo((): NotificationCenterRenderers => {\n const byId = new Map((workspaces ?? []).map((w) => [w.external_id, w]))\n return {\n renderUser,\n renderWorkspace: (workspaceId) => {\n const workspace = byId.get(workspaceId)\n return workspace ? <WorkspaceBadge workspace={workspace} /> : null\n },\n DocumentChip: DefaultDocumentChip,\n ...renderers,\n }\n }, [renderers, workspaces])\n\n return (\n <NotificationCenter\n {...pageProps}\n items={items}\n isLoading={isLoading}\n // A full page means there may be more on the server.\n hasMore={rows.length === limit}\n isLoadingMore={isFetching}\n onLoadMore={() => setLimit((current) => current + pageSize)}\n onDelete={onDelete}\n onOpen={open}\n renderers={merged}\n formatTime={formatTime}\n />\n )\n}\n","import { useEffect } from 'react'\nimport { useFollowThread, useWorkspaceNotificationLevel } from '@arbidocs/react'\nimport {\n ThreadFollowButton,\n ThreadFollowMenuItem,\n WorkspaceNotificationMenu,\n type ThreadFollowLabels,\n type WorkspaceNotificationMenuProps,\n} from '../activity'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\n\nexport interface ConnectedWorkspaceNotificationMenuProps extends Pick<\n WorkspaceNotificationMenuProps,\n 'onOpenActivity' | 'labels' | 'className' | 'testId'\n> {\n /** The workspace; default the selected one. */\n workspaceId?: string\n}\n\n/**\n * The bell menu that follows, mutes or resets a workspace, saved to the user settings. Runs under\n * any host (`useConnectedWorkspace`); a failed save is notified.\n */\nexport function ConnectedWorkspaceNotificationMenu({\n workspaceId: workspaceProp,\n ...menuProps\n}: ConnectedWorkspaceNotificationMenuProps) {\n const { notify } = useBlocksEnvironment()\n const { workspaceId: selected, live } = useConnectedWorkspace()\n const workspaceId = workspaceProp ?? selected\n const { level, setLevel, isLoading, isSaving, error } = useWorkspaceNotificationLevel(\n workspaceId,\n { enabled: live }\n )\n useEffect(() => {\n if (error) notify('Could not save the workspace notification setting', 'error')\n }, [error, notify])\n if (!workspaceId) return null\n return (\n <WorkspaceNotificationMenu\n {...menuProps}\n level={level}\n onLevelChange={setLevel}\n disabled={isLoading || isSaving}\n />\n )\n}\n\nexport interface ConnectedThreadFollowProps {\n conversationId: string | null | undefined\n /** `button` (default): a bell toggle; `menu-item`: an item of a thread's options menu. */\n as?: 'button' | 'menu-item'\n labels?: Partial<ThreadFollowLabels>\n testId?: string\n}\n\n/** Follow or unfollow a thread (pushed everything in it), saved to the user settings. */\nexport function ConnectedThreadFollow({\n conversationId,\n as = 'button',\n ...props\n}: ConnectedThreadFollowProps) {\n const { live } = useConnectedWorkspace()\n const { following, setFollowing, isLoading, isSaving } = useFollowThread(conversationId, {\n enabled: live,\n })\n if (!conversationId) return null\n const Control = as === 'menu-item' ? ThreadFollowMenuItem : ThreadFollowButton\n return (\n <Control\n {...props}\n following={following}\n onFollowingChange={setFollowing}\n disabled={isLoading || isSaving}\n />\n )\n}\n","/**\n * Add a skill someone gave you: a file from your computer (`.md` or `.zip`) or a link to one. Both\n * go through the one skill upload (`useUploadSkillFiles`); the skill then appears in every skill\n * list once it is processed.\n */\n\nimport { useRef, useState } from 'react'\nimport { useUploadSkillFiles } from '@arbidocs/react'\nimport { Button, Input, Label, cn } from '@arbidocs/react/ui'\nimport { Link2, Upload } from 'lucide-react'\nimport {\n importSkillFile,\n importSkillFromUrl,\n type SkillImportResult,\n} from '../agents/skills/skillImport'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport interface ConnectedSkillUploadLabels {\n title: string\n description: string\n fromFile: string\n chooseFile: string\n fromLink: string\n linkPlaceholder: string\n add: string\n cancel: string\n /** The notification once a skill is added. */\n added: (slug: string) => string\n failed: string\n}\n\nexport const DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS: ConnectedSkillUploadLabels = {\n title: 'Add a skill',\n description: 'Bring in a skill someone sent you, from a file or a link.',\n fromFile: 'From a file',\n chooseFile: 'Choose a file',\n fromLink: 'From a link',\n linkPlaceholder: 'https://…/SKILL.md',\n add: 'Add',\n cancel: 'Cancel',\n added: (slug) => `${slug} added`,\n failed: 'Could not add the skill',\n}\n\nexport interface ConnectedSkillUploadProps {\n /** Added (its slug) or cancelled (nothing). Absent: no Cancel, and the form stays. */\n onDone?: (addedSlug?: string) => void\n labels?: Partial<ConnectedSkillUploadLabels>\n className?: string\n}\n\nexport function ConnectedSkillUpload({ onDone, labels, className }: ConnectedSkillUploadProps) {\n const l = { ...DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS, ...labels }\n const { notify } = useBlocksEnvironment()\n const upload = useUploadSkillFiles()\n const fileRef = useRef<HTMLInputElement>(null)\n const [url, setUrl] = useState('')\n const [busy, setBusy] = useState(false)\n\n const add = async (read: () => Promise<SkillImportResult>) => {\n setBusy(true)\n try {\n const { slug, entries } = await read()\n await upload.mutateAsync(\n entries.map((e) => ({\n folder: e.folder,\n fileName: e.fileName,\n content: new Blob([e.content], { type: 'text/markdown' }),\n }))\n )\n notify(l.added(slug), 'success')\n setUrl('')\n onDone?.(slug)\n } catch (error) {\n notify(error instanceof Error && error.message ? error.message : l.failed, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div\n className={cn('flex flex-col gap-6 overflow-y-auto p-4', className)}\n data-testid=\"skills-add-view\"\n >\n <div className=\"space-y-2\">\n <h3 className=\"text-base font-semibold\">{l.title}</h3>\n <p className=\"text-sm text-muted-foreground\">{l.description}</p>\n </div>\n <div className=\"space-y-2\">\n <Label>{l.fromFile}</Label>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".md,.markdown,.zip\"\n className=\"hidden\"\n data-testid=\"skills-add-file-input\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) void add(() => importSkillFile(file))\n }}\n />\n <div>\n <Button\n variant=\"outline\"\n disabled={busy}\n onClick={() => fileRef.current?.click()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-file\"\n >\n <Upload className=\"mr-1.5 size-4\" />\n {l.chooseFile}\n </Button>\n </div>\n </div>\n <form\n className=\"space-y-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (url.trim()) void add(() => importSkillFromUrl(url))\n }}\n >\n <Label htmlFor=\"skills-add-url\">{l.fromLink}</Label>\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n <Input\n id=\"skills-add-url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder={l.linkPlaceholder}\n inputMode=\"url\"\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-input\"\n />\n <Button\n type=\"submit\"\n disabled={busy || !url.trim()}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add-url-submit\"\n >\n <Link2 className=\"mr-1.5 size-4\" />\n {l.add}\n </Button>\n </div>\n </form>\n {onDone && (\n <div>\n <Button variant=\"ghost\" onClick={() => onDone()} className=\"pointer-coarse:min-h-11\">\n {l.cancel}\n </Button>\n </div>\n )}\n </div>\n )\n}\n","/**\n * The skills library bound to the connection: one place to find, read, copy, change, share, export\n * and add skills. The host's built-in skills, your own and the ones others shared sit in one list\n * with search, filter chips and a gallery or list view; picking one opens its detail beside the\n * list (over it on a phone). Running a skill and drafting a new one with the assistant are the\n * host's (`onRun`, `onDraft`): the library has no run UI of its own.\n *\n * \"Make a copy\" needs no server feature: a shared skill is read and saved again as your own (the\n * same path as adding a skill from a file); a built-in is written out as a SKILL.md first. Your copy\n * has the original's name, so it is used instead of the original until you delete it.\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport {\n useArbi,\n useDeleteSkill,\n useSetSkillVisibility,\n useSkillSource,\n useSkills,\n useUploadSkillFiles,\n} from '@arbidocs/react'\nimport { Button, EntityIcon, Input, Textarea, cn } from '@arbidocs/react/ui'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport { ArrowLeft, Plus, Search, Upload } from 'lucide-react'\nimport {\n SkillFilterChips,\n SkillTile,\n SkillViewToggle,\n type SkillBrowserView,\n} from '../agents/skills/SkillBrowserParts'\nimport { SkillEditForm, SkillGenerateForm } from '../agents/skills/SkillForms'\nimport { SkillLibraryDetail } from '../agents/skills/SkillLibraryDetail'\nimport {\n SKILL_SOURCE_LABELS,\n SKILL_TYPE_LABELS,\n buildLibrarySkills,\n filterLibrarySkills,\n type LibrarySkill,\n type SkillSource,\n} from '../agents/skills/skillLibrary'\nimport {\n parseSkillFrontmatter,\n serializeSkill,\n SKILL_MAIN_FILENAME,\n} from '../agents/skills/skillFiles'\nimport { skillSlug, workflowToSkillMarkdown } from '../agents/workflows/skillMarkdown'\nimport type { WorkflowDefinition } from '../agents/workflows/types'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { ConnectedSkillUpload } from './ConnectedSkillUpload'\n\ntype Mode = 'detail' | 'new' | 'edit' | 'add'\n\nconst SKILL_FOLDER = 'skills/'\nconst NAME_PATTERN = /^[a-z0-9-]{1,64}$/\nconst icon = <EntityIcon entityType=\"SKILL\" />\n\nconst errorText = (error: unknown, fallback: string) =>\n error instanceof Error && error.message ? error.message : fallback\nconst statusOf = (error: unknown) =>\n error && typeof error === 'object' && 'status' in error\n ? (error as { status?: number }).status\n : undefined\n\nexport interface ConnectedSkillsLibraryProps {\n /** The host's built-in skills (prompt workflows with their own forms). */\n builtins?: WorkflowDefinition[]\n /** Open on this skill. */\n initialSlug?: string\n /** Run a skill: the host opens its run dialog with it selected. */\n onRun: (slug: string) => void\n /** \"New skill\", described: the host hands the text to the assistant (e.g. as a chat draft). */\n onDraft: (text: string) => void\n /** The instructions editor. Default: a plain text area. */\n renderEditor?: (markdown: string, onChange: (markdown: string) => void) => ReactNode\n}\n\nexport function ConnectedSkillsLibrary({\n builtins = [],\n initialSlug,\n onRun,\n onDraft,\n renderEditor,\n}: ConnectedSkillsLibraryProps) {\n const arbi = useArbi()\n const { confirm, notify } = useBlocksEnvironment()\n const { data: listings } = useSkills()\n const upload = useUploadSkillFiles()\n const setVisibility = useSetSkillVisibility()\n const deleteSkill = useDeleteSkill()\n\n const [mode, setMode] = useState<Mode>('detail')\n const [selected, setSelected] = useState<string | null>(initialSlug ?? null)\n const [query, setQuery] = useState('')\n const [source, setSource] = useState<SkillSource | 'all'>('all')\n const [type, setType] = useState('all')\n const [view, setView] = useState<SkillBrowserView>('gallery')\n const [isBusy, setIsBusy] = useState(false)\n\n const all = useMemo(() => buildLibrarySkills(builtins, listings ?? []), [builtins, listings])\n const shown = useMemo(\n () => filterLibrarySkills(all, { query, source, type }),\n [all, query, source, type]\n )\n const current = all.find((s) => s.slug === selected) ?? null\n const { data: currentText, isLoading: textLoading } = useSkillSource(current?.docExtId)\n\n // A skill that is gone (deleted) leaves nothing selected.\n useEffect(() => {\n if (selected && !current && all.length > 0) setSelected(null)\n }, [selected, current, all.length])\n\n const count = (s: SkillSource) => all.filter((x) => x.source === s).length\n const sourceOptions = [\n { id: 'all', label: 'All', count: all.length },\n { id: 'builtin', label: SKILL_SOURCE_LABELS.builtin, count: count('builtin') },\n { id: 'mine', label: SKILL_SOURCE_LABELS.mine, count: count('mine') },\n { id: 'shared', label: SKILL_SOURCE_LABELS.shared, count: count('shared') },\n ]\n const types = [...new Set(all.map((s) => s.type))]\n const typeOptions = [\n { id: 'all', label: 'Any kind' },\n ...types.map((t) => ({ id: t, label: SKILL_TYPE_LABELS[t] ?? t })),\n ]\n\n const pick = (slug: string) => {\n setSelected(slug)\n setMode('detail')\n }\n\n /** A stored skill's SKILL.md, or a built-in written out as one. */\n const markdownOf = async (skill: LibrarySkill): Promise<string> => {\n if (!skill.docExtId) return workflowToSkillMarkdown(skill.workflow)\n const response = await arbi.documents.download(skill.docExtId)\n if (!response.ok) throw new Error(`Could not read the skill (${response.status})`)\n return response.text()\n }\n\n /**\n * Save `markdown` as the user's own skill of this name (it then replaces any original): private,\n * unless it is a shared skill of theirs being changed (it stays shared).\n */\n const saveAs = (slug: string, markdown: string, shared = false) =>\n upload.mutateAsync([\n {\n folder: `${SKILL_FOLDER}${slug}`,\n fileName: SKILL_MAIN_FILENAME,\n content: new Blob([markdown], { type: 'text/markdown' }),\n shared,\n },\n ])\n\n const busy = async (work: () => Promise<void>) => {\n setIsBusy(true)\n try {\n await work()\n } finally {\n setIsBusy(false)\n }\n }\n\n const makeCopy = (skill: LibrarySkill) =>\n busy(async () => {\n try {\n await saveAs(skill.slug, await markdownOf(skill))\n notify(\n 'Your copy is ready. It is used instead of the original; delete it to go back.',\n 'success'\n )\n setSelected(skill.slug)\n } catch (error) {\n notify(errorText(error, 'Could not make a copy'), 'error')\n }\n })\n\n const toggleShare = (skill: LibrarySkill) => {\n if (!skill.docExtId) return\n const docExtId = skill.docExtId\n const next = skill.isShared ? 'mine' : 'global'\n return busy(async () => {\n try {\n await setVisibility.mutateAsync({ docExtId, visibility: next })\n notify(next === 'global' ? 'Shared with everyone' : 'Made private', 'success')\n } catch (error) {\n notify(\n statusOf(error) === 409 || errorText(error, '').includes('409')\n ? 'Someone has already shared a skill with this name. Rename yours first.'\n : 'Could not change who can see this skill',\n 'error'\n )\n }\n })\n }\n\n const remove = async (skill: LibrarySkill) => {\n if (!skill.docExtId) return\n const docExtId = skill.docExtId\n const ok = await confirm({\n message: skill.replacesBuiltin\n ? `Delete your copy of \"${skill.title}\"? The original will be used again.`\n : `Delete \"${skill.title}\"? This cannot be undone.`,\n title: 'Delete skill',\n })\n if (!ok) return\n await busy(async () => {\n try {\n await deleteSkill.mutateAsync(docExtId)\n notify(`${skill.title} deleted`, 'success')\n setSelected(null)\n } catch {\n notify('Could not delete the skill', 'error')\n }\n })\n }\n\n const exportFile = async (skill: LibrarySkill) => {\n try {\n downloadBlob(\n new Blob([await markdownOf(skill)], { type: 'text/markdown' }),\n SKILL_MAIN_FILENAME\n )\n } catch (error) {\n notify(errorText(error, 'Could not export the skill'), 'error')\n }\n }\n\n const rightVisible = mode !== 'detail' || current !== null\n const backToList = () => {\n setMode('detail')\n setSelected(null)\n }\n const done = (slug?: string) => {\n if (slug) setSelected(slug)\n setMode('detail')\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 border-t border-border\">\n <div\n className={cn(\n 'flex min-h-0 w-full flex-col md:w-[26rem] md:shrink-0 md:border-r md:border-border',\n rightVisible && 'max-md:hidden'\n )}\n data-testid=\"skills-list-pane\"\n >\n <div className=\"flex flex-col gap-3 p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search skills\"\n aria-label=\"Search skills\"\n className=\"pl-9 pointer-coarse:min-h-11\"\n data-testid=\"skills-browser-search\"\n />\n </div>\n <SkillViewToggle value={view} onChange={setView} />\n </div>\n <SkillFilterChips\n label=\"Show\"\n value={source}\n onChange={(id) => setSource(id as SkillSource | 'all')}\n options={sourceOptions}\n />\n {types.length > 1 && (\n <SkillFilterChips\n label=\"Kind\"\n value={type}\n onChange={setType}\n options={typeOptions}\n testIdPrefix=\"skills-type\"\n />\n )}\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n onClick={() => setMode('new')}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-new\"\n >\n <Plus className=\"mr-1 size-4\" />\n New skill\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setMode('add')}\n className=\"pointer-coarse:min-h-11\"\n data-testid=\"skills-add\"\n >\n <Upload className=\"mr-1 size-4\" />\n Add a skill\n </Button>\n </div>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 pb-3\" data-testid=\"skills-list\">\n {shown.length === 0 ? (\n <p className=\"py-10 text-center text-sm text-muted-foreground\">\n No skills match. Try another word or filter.\n </p>\n ) : (\n <div\n className={cn(\n 'gap-2',\n view === 'gallery'\n ? 'grid grid-cols-[repeat(auto-fill,minmax(9.5rem,1fr))]'\n : 'flex flex-col'\n )}\n >\n {shown.map((skill) => (\n <SkillTile\n key={skill.slug}\n name={skill.title}\n testId={`skill-tile-${skill.slug}`}\n description={skill.description}\n sourceLabel={\n skill.isShared\n ? `${SKILL_SOURCE_LABELS.mine}, shared`\n : SKILL_SOURCE_LABELS[skill.source]\n }\n type={skill.type}\n icon={icon}\n layout={view}\n selected={skill.slug === selected}\n onSelect={() => pick(skill.slug)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div\n className={cn('flex min-h-0 min-w-0 flex-1 flex-col', !rightVisible && 'max-md:hidden')}\n data-testid=\"skills-detail-pane\"\n >\n {rightVisible && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={backToList}\n className=\"m-2 self-start pointer-coarse:min-h-11 md:hidden\"\n data-testid=\"skills-back\"\n >\n <ArrowLeft className=\"mr-1 size-4\" />\n All skills\n </Button>\n )}\n {mode === 'new' && (\n <SkillGenerateForm\n icon={icon}\n onGenerate={(desc) => {\n onDraft(`/create-skill ${desc}`.trim() + ' ')\n notify('Sent to the chat: the assistant will draft your skill.', 'info')\n }}\n onManual={() => setMode('edit')}\n />\n )}\n {mode === 'edit' && (\n <SkillEditor\n skill={current?.source === 'mine' ? current : null}\n text={current?.source === 'mine' ? currentText : undefined}\n renderEditor={renderEditor}\n onSave={async (slug, markdown, isEditing) => {\n await saveAs(slug, markdown, isEditing && !!current?.isShared)\n notify(isEditing ? `${slug} saved` : `${slug} added`, 'success')\n done(slug)\n }}\n onCancel={() => done()}\n isSaving={upload.isPending}\n />\n )}\n {mode === 'add' && <ConnectedSkillUpload onDone={done} />}\n {mode === 'detail' && current && (\n <SkillLibraryDetail\n skill={current}\n icon={icon}\n instructions={\n current.docExtId\n ? currentText\n ? parseSkillFrontmatter(currentText, SKILL_MAIN_FILENAME).content\n : ''\n : current.workflow.run.kind === 'prompt'\n ? current.workflow.run.promptTemplate\n : ''\n }\n isLoading={!!current.docExtId && textLoading}\n actions={{\n onRun: () => onRun(current.slug),\n onCopy: () => void makeCopy(current),\n onEdit: () => setMode('edit'),\n onToggleShare: () => void toggleShare(current),\n onExport: () => void exportFile(current),\n onDelete: () => void remove(current),\n isBusy,\n }}\n />\n )}\n {mode === 'detail' && !current && (\n <div className=\"flex flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground max-md:hidden\">\n Pick a skill to read it, run it or make a copy.\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Write or change a skill: a name, a short description and the instructions. Saving a skill of the\n * same name replaces it.\n */\nfunction SkillEditor({\n skill,\n text,\n renderEditor,\n onSave,\n onCancel,\n isSaving,\n}: {\n /** The skill being changed (yours); absent when writing a new one. */\n skill: LibrarySkill | null\n /** Its SKILL.md, once read. */\n text: string | undefined\n renderEditor?: ConnectedSkillsLibraryProps['renderEditor']\n onSave: (slug: string, markdown: string, isEditing: boolean) => Promise<void>\n onCancel: () => void\n isSaving: boolean\n}) {\n const { notify } = useBlocksEnvironment()\n const isEditing = !!skill\n const [name, setName] = useState(skill?.slug ?? '')\n const [description, setDescription] = useState('')\n const [body, setBody] = useState('')\n const [seeded, setSeeded] = useState(!isEditing)\n const [nameError, setNameError] = useState<string | null>(null)\n\n // Seed from the existing content once it has been read.\n if (isEditing && !seeded && text !== undefined) {\n const parsed = parseSkillFrontmatter(text, SKILL_MAIN_FILENAME)\n setDescription(parsed.description ?? '')\n setBody(parsed.content ?? '')\n setSeeded(true)\n }\n\n const save = async () => {\n if (!NAME_PATTERN.test(name)) {\n setNameError('Use 1–64 lowercase letters, numbers or hyphens.')\n return\n }\n if (description.trim().length < 1) {\n notify('Add a short description.', 'error')\n return\n }\n const slug = skillSlug(name)\n try {\n await onSave(slug, serializeSkill({ name: slug, description, body }), isEditing)\n } catch (err) {\n notify(errorText(err, 'Could not save the skill'), 'error')\n }\n }\n\n return (\n <SkillEditForm\n name={name}\n onNameChange={setName}\n isNameLocked={isEditing}\n nameError={nameError}\n description={description}\n onDescriptionChange={setDescription}\n editor={\n renderEditor ? (\n renderEditor(body, setBody)\n ) : (\n <Textarea\n value={body}\n onChange={(e) => setBody(e.target.value)}\n className=\"min-h-64 flex-1 font-mono text-sm\"\n aria-label=\"Instructions\"\n />\n )\n }\n isSaving={isSaving}\n isEditing={isEditing}\n onSave={save}\n onCancel={onCancel}\n labels={{ create: 'Add skill' }}\n testIds={{\n name: 'skill-edit-name',\n description: 'skill-edit-description',\n save: 'skill-edit-save',\n }}\n />\n )\n}\n","/**\n * Create or edit an agent, bound to the connection: describe what it is for (or start from a\n * template), see what it can do, save. Saving creates the agent if it is new, then pins its config:\n * the base config (the agent's own, else the library default) with its `Agents` section patched\n * (persona with its name, model, tool switches, skills, connected tools). The workspaces ticked\n * under Advanced are granted (standing access); an external agent then shows its one-time\n * connection script. An avatar can be generated once it has a name.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useAgentConfig,\n useAgentModels,\n useAgentWorkspaces,\n useCreateAgent,\n useGenerateAgentAvatar,\n useGrantAgentAccess,\n useMcpTools,\n useRevokeAgentAccess,\n useSaveAgentConfig,\n useSkills,\n useWorkspaces,\n} from '@arbidocs/react'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Label,\n} from '@arbidocs/react/ui'\nimport {\n AgentCreator,\n isValidAgentName,\n type AgentCapability,\n type AgentCreatorLabels,\n type AgentCreatorValues,\n type AgentTemplate,\n} from '../agents/definitions/AgentCreator'\nimport { AgentAvatarField, type AgentTypeOption } from '../agents/definitions/AgentEditorParts'\nimport { AgentConnectInstructions } from '../agents/definitions/AgentConnectInstructions'\nimport {\n DEFAULT_AGENT_CAPABILITIES,\n DEFAULT_AGENT_TEMPLATES,\n DEFAULT_AGENT_TYPES,\n} from '../agents/definitions/defaults'\nimport { composePersona, stripPersonaPreamble } from '../agents/definitions/persona'\nimport { MultiSelect } from '../settings/MultiSelect'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\ntype AgentsSection = Record<string, unknown>\n\n/** The agent being edited: its id, name, picture and address. */\nexport interface ConnectedAgentCreatorAgent {\n external_id: string\n given_name: string\n picture?: string | null\n email?: string | null\n}\n\nexport interface ConnectedAgentCreatorProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Present: edit it; absent: create one. */\n agent?: ConnectedAgentCreatorAgent | null\n /** The name a new agent starts with (e.g. a connection that needs `SlackAssistant`). */\n initialName?: string\n /** Saved: the new or updated agent's id. */\n onSaved?: (agentExtId: string) => void\n capabilities?: AgentCapability[]\n templates?: AgentTemplate[]\n types?: AgentTypeOption<string>[]\n /**\n * Offer to take a granted workspace back. It re-opens workspaces on the session to do it, so a\n * host whose session keeps one workspace open (the ARBI app) leaves it off.\n */\n canRevokeWorkspaces?: boolean\n labels?: Partial<AgentCreatorLabels>\n}\n\nexport function ConnectedAgentCreator({\n open,\n onOpenChange,\n agent,\n initialName,\n onSaved,\n capabilities = DEFAULT_AGENT_CAPABILITIES,\n templates = DEFAULT_AGENT_TEMPLATES,\n types = DEFAULT_AGENT_TYPES,\n canRevokeWorkspaces = false,\n labels,\n}: ConnectedAgentCreatorProps) {\n const { notify } = useBlocksEnvironment()\n const isEdit = !!agent\n const [saving, setSaving] = useState(false)\n const [skills, setSkills] = useState<string[]>([])\n const [mcpTools, setMcpTools] = useState<string[]>([])\n const [picture, setPicture] = useState<string | null>(agent?.picture ?? null)\n const [avatarBusy, setAvatarBusy] = useState(false)\n // After creating an EXTERNAL agent: its one-time connection script.\n const [connect, setConnect] = useState<{ email: string; signingKey: string } | null>(null)\n // The avatar endpoint needs the agent to exist: in create mode the first avatar click creates it\n // and remembers it, so the final save reuses it instead of making a second agent.\n const [early, setEarly] = useState<{ id: string; email: string; signingKey: string } | null>(null)\n\n const { data: models = [] } = useAgentModels({ enabled: open })\n const { data: skillsList } = useSkills({ enabled: open })\n const { data: mcpToolsList } = useMcpTools({ enabled: open })\n // The agent's pinned config (edit) or the library default (create): what the form seeds from.\n const { data: baseConfig } = useAgentConfig(agent?.external_id, { enabled: open })\n const { data: workspaces = [] } = useWorkspaces({ enabled: open })\n const { data: agentWorkspaces = [] } = useAgentWorkspaces(agent?.external_id, {\n enabled: isEdit && open,\n })\n const createAgent = useCreateAgent()\n const saveConfig = useSaveAgentConfig()\n const grantAccess = useGrantAgentAccess()\n const revokeAccess = useRevokeAgentAccess()\n const generateAvatar = useGenerateAgentAvatar()\n const agents = (baseConfig?.Agents ?? {}) as AgentsSection\n const grantedIds = useMemo(\n () => agentWorkspaces.map((w) => w.workspace_ext_id),\n [agentWorkspaces]\n )\n\n // Open only once the base config has arrived: the creator seeds from it on open, and a later\n // refetch must not clobber what the user typed.\n const ready = open && baseConfig !== undefined\n useEffect(() => {\n if (!ready) return\n setPicture(agent?.picture ?? null)\n setEarly(null)\n setSkills(Array.isArray(agents.ENABLED_SKILLS) ? (agents.ENABLED_SKILLS as string[]) : [])\n setMcpTools(Array.isArray(agents.MCP_TOOLS) ? (agents.MCP_TOOLS as string[]) : [])\n // Seed once per open.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ready])\n\n const initialValues = useMemo<Partial<AgentCreatorValues>>(\n () => ({\n name: agent?.given_name ?? initialName ?? '',\n persona: isEdit ? stripPersonaPreamble(String(agents.PERSONA ?? '')) : '',\n modelName: String(agents.AGENT_MODEL_NAME ?? ''),\n capabilities: Object.fromEntries(capabilities.map(({ key }) => [key, Boolean(agents[key])])),\n type: 'builtin',\n workspaceIds: [],\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [ready, agent]\n )\n\n const skillOptions = (skillsList ?? []).map((s) => ({ label: s.name || s.slug, value: s.slug }))\n const mcpOptions = (mcpToolsList?.tools ?? []).map((t) => ({\n label: `${t.name} (${t.server_name})`,\n value: t.name,\n }))\n\n const handleGenerateAvatar = async (values: AgentCreatorValues) => {\n setAvatarBusy(true)\n try {\n let agentExtId = agent?.external_id ?? early?.id ?? ''\n if (!agentExtId) {\n if (!isValidAgentName(values.name)) {\n notify('Give the agent a name first.', 'error')\n return\n }\n const res = await createAgent.mutateAsync(values.name)\n agentExtId = res.external_id\n setEarly({ id: res.external_id, email: res.email, signingKey: res.signing_private_key })\n }\n const who = values.persona.trim() || `an AI assistant named ${values.name}`\n const res = await generateAvatar.mutateAsync({\n agentExtId,\n prompt:\n `Square portrait avatar for an AI agent: ${who}. ` +\n 'Stylised, friendly, high-contrast, head-and-shoulders, centred, simple flat background.',\n })\n setPicture(res.picture ?? null)\n } catch {\n notify('Avatar generation failed — try again.', 'error')\n } finally {\n setAvatarBusy(false)\n }\n }\n\n const handleSubmit = async (values: AgentCreatorValues) => {\n setSaving(true)\n try {\n let agentExtId = agent?.external_id ?? early?.id ?? ''\n let created: { email: string; signingKey: string } | null = early\n if (!agentExtId) {\n const res = await createAgent.mutateAsync(values.name)\n agentExtId = res.external_id\n created = { email: res.email, signingKey: res.signing_private_key }\n }\n const name = values.name || agent?.given_name || 'Agent'\n await saveConfig.mutateAsync({\n agentExtId,\n title: `agent-${name}`,\n sections: {\n Agents: {\n PERSONA: composePersona(name, values.persona),\n ...(values.modelName ? { AGENT_MODEL_NAME: values.modelName } : {}),\n ...Object.fromEntries(capabilities.map(({ key }) => [key, !!values.capabilities[key]])),\n ENABLED_SKILLS: values.capabilities.SKILLS_ENABLED && skills.length ? skills : null,\n MCP_TOOLS: mcpTools,\n },\n },\n })\n // Workspace access is explicit: only the workspaces ticked under Advanced are granted.\n for (const workspaceId of values.workspaceIds.filter((w) => !grantedIds.includes(w))) {\n await grantAccess.mutateAsync({ agentExtId, workspaceId })\n }\n notify(isEdit ? 'Agent updated.' : 'Agent created.', 'success')\n onSaved?.(agentExtId)\n onOpenChange(false)\n // A newly created EXTERNAL agent reveals its one-time connection script.\n if (created && values.type === 'external') setConnect(created)\n } catch (e) {\n notify(`Saving the agent failed: ${e instanceof Error ? e.message : e}`, 'error')\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <>\n <AgentCreator\n open={ready}\n onOpenChange={onOpenChange}\n isEdit={isEdit}\n agentName={agent?.given_name}\n capabilities={capabilities}\n templates={templates}\n models={models}\n workspaces={workspaces.map((w) => ({ id: w.external_id, name: w.name }))}\n grantedWorkspaceIds={grantedIds}\n onRevokeWorkspace={\n canRevokeWorkspaces && agent\n ? (workspaceId) =>\n void revokeAccess\n .mutateAsync({ agentExtId: agent.external_id, workspaceId })\n .catch((e: unknown) =>\n notify(e instanceof Error ? e.message : String(e), 'error')\n )\n : undefined\n }\n revokingWorkspaceId={\n revokeAccess.isPending ? revokeAccess.variables?.workspaceId : undefined\n }\n avatar={(values) => (\n <AgentAvatarField\n picture={picture}\n isBusy={avatarBusy}\n canGenerate={isEdit || isValidAgentName(values.name)}\n onGenerate={() => handleGenerateAvatar(values)}\n />\n )}\n types={types}\n initialValues={initialValues}\n isSaving={saving}\n onSubmit={handleSubmit}\n labels={labels}\n advanced={(values) => (\n <>\n {mcpOptions.length > 0 && (\n <div className=\"flex flex-col gap-1.5\">\n <Label>Connected tools</Label>\n <p className=\"text-xs text-muted-foreground\">\n Extra tools from services you have connected. Pick which this agent may use.\n </p>\n <MultiSelect\n data={mcpOptions}\n value={mcpTools}\n onChange={setMcpTools}\n placeholder=\"None\"\n data-testid=\"agent-mcp-select\"\n />\n </div>\n )}\n {values.capabilities.SKILLS_ENABLED && (\n <div className=\"flex flex-col gap-1.5\">\n <Label>Skills</Label>\n <p className=\"text-xs text-muted-foreground\">\n Skills are instructions the agent may follow. Leave empty to allow all of yours.\n </p>\n <MultiSelect\n data={skillOptions}\n value={skills}\n onChange={setSkills}\n placeholder=\"All skills you can see\"\n data-testid=\"agent-skills-select\"\n />\n </div>\n )}\n </>\n )}\n />\n <Dialog open={connect !== null} onOpenChange={(next) => !next && setConnect(null)}>\n <DialogContent\n presentation=\"sheet\"\n className=\"max-h-[calc(100dvh-2rem)] max-w-2xl overflow-y-auto\"\n data-testid=\"agent-connect-dialog\"\n >\n <DialogHeader>\n <DialogTitle>Connect your agent</DialogTitle>\n <DialogDescription>\n This key is shown once. Run the script on the machine that will host the agent.\n </DialogDescription>\n </DialogHeader>\n {connect && (\n <AgentConnectInstructions email={connect.email} signingKey={connect.signingKey} />\n )}\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","/**\n * A saved workflow's history and a task's activity, bound to the connection.\n *\n * - `ConnectedWorkflowHistory`: every run of a workflow (re-read while shown), each with when, what\n * it was (a thread, an email, an AI review, a reminder) and how it went; a run's thread opens\n * through the environment's `openConversation`, a document action's result through the host.\n * - `ConnectedTaskActivityDialog`: a task's timeline (re-read while it runs), with who did what.\n */\n\nimport { useCallback, type ReactNode } from 'react'\nimport {\n formatRelativeTime,\n useAgents,\n useConversationActivity,\n useWorkflowRuns,\n} from '@arbidocs/react'\nimport {\n TaskRunsDialog,\n type TaskRunView,\n type TaskRunsDialogLabels,\n} from '../agents/tasks/TaskRunsDialog'\nimport { TaskActivityDialog } from '../agents/tasks/TaskActivityDialog'\nimport type { TaskActivityEvent } from '../agents/tasks/TaskActivityTimeline'\nimport { PersonPill, type TaskPerson } from '../agents/tasks/PersonPill'\nimport { fmtDate } from '../lib/format'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useConnectedWorkspaceRole } from './ConnectedWorkflowsTable'\n\ntype WorkflowRun = NonNullable<ReturnType<typeof useWorkflowRuns>['data']>[number]\n\n/** What a run was, in a word. */\nconst RUN_KIND: Record<string, string> = {\n email_documents: 'Email',\n annotate_documents: 'AI Review',\n reminder: 'Reminder',\n}\nconst DOCUMENT_ACTIONS = new Set(['email_documents', 'annotate_documents'])\n\n/** A run as the history lists it: when, what, on how many documents. */\nexport function workflowRunView(\n run: WorkflowRun,\n formatDate: (iso: string) => string\n): TaskRunView {\n const documents = DOCUMENT_ACTIONS.has(run.action_type)\n ? ` · ${run.document_ext_ids.length} documents`\n : ''\n return {\n id: `execution-${run.id}`,\n // An AI review that finished has a result to open (its fields over its documents).\n resultId:\n run.action_type === 'annotate_documents' && run.status === 'completed'\n ? String(run.id)\n : undefined,\n status: run.status,\n when: `${formatDate(run.created_at)} · ${RUN_KIND[run.action_type] ?? 'Thread'}${documents}`,\n error: run.error,\n conversationId: run.conversation_ext_id ?? undefined,\n }\n}\n\nexport interface ConnectedWorkflowHistoryProps {\n /** The workflow (`null`: closed). */\n workflow: { external_id: string; name: string } | null\n onOpenChange: (open: boolean) => void\n /** In the page rather than a dialog. */\n inline?: boolean\n hideHeader?: boolean\n formatDate?: (iso: string) => string\n /** Open a document action's result (an AI review's fields): the host's. Absent: no Open. */\n onOpenResult?: (run: WorkflowRun) => void\n /** Under a failed run: e.g. a way to report it. */\n renderErrorReport?: (run: TaskRunView) => ReactNode\n labels?: Partial<TaskRunsDialogLabels>\n}\n\nexport function ConnectedWorkflowHistory({\n workflow,\n onOpenChange,\n inline,\n hideHeader,\n formatDate = fmtDate,\n onOpenResult,\n renderErrorReport,\n labels,\n}: ConnectedWorkflowHistoryProps) {\n const { openConversation } = useBlocksEnvironment()\n const { data: runs = [], isLoading } = useWorkflowRuns(workflow?.external_id)\n return (\n <TaskRunsDialog\n inline={inline}\n hideHeader={hideHeader}\n open={!!workflow}\n onOpenChange={onOpenChange}\n taskName={workflow?.name}\n renderErrorReport={renderErrorReport}\n isLoading={isLoading}\n labels={{\n title: (name) => `History — ${name}`,\n description: 'Executions and results of this workflow.',\n empty: 'This workflow hasn’t run yet.',\n ...labels,\n }}\n runs={runs.map((run) => workflowRunView(run, formatDate))}\n onOpenResult={\n onOpenResult &&\n ((id) => {\n const run = runs.find((r) => String(r.id) === id)\n if (run) onOpenResult(run)\n })\n }\n onOpenRun={(conversationId) => openConversation(conversationId)}\n />\n )\n}\n\n/** Relative time, compact for list rows. */\nconst relativeTime = (iso: string) => formatRelativeTime(iso, { style: 'short' })\n\nexport interface ConnectedTaskActivityDialogProps {\n conversationId: string\n taskName: string\n /** The run is generating right now: the timeline then re-reads itself every few seconds. */\n live?: boolean\n onClose: () => void\n /** How a person shows (the host's own pill). Default: the shared pill with their name. */\n renderPerson?: (person: TaskPerson) => ReactNode\n formatExact?: (iso: string) => string\n}\n\nexport function ConnectedTaskActivityDialog({\n conversationId,\n taskName,\n live,\n onClose,\n renderPerson: renderTaskPerson,\n formatExact = fmtDate,\n}: ConnectedTaskActivityDialogProps) {\n const activity = useConversationActivity(conversationId, { live })\n const { data: agents = [] } = useAgents()\n const { userId } = useConnectedWorkspace()\n const { members } = useConnectedWorkspaceRole()\n const renderPerson = useCallback(\n (id: string | null | undefined) => {\n const isMe = !!id && id === userId\n const member = members.find((m) => m.user.external_id === id)?.user\n const name =\n (member && [member.given_name, member.family_name].filter(Boolean).join(' ')) ||\n member?.email\n const person = { id, label: isMe ? 'You' : name || 'Someone', isMe }\n return renderTaskPerson ? renderTaskPerson(person) : <PersonPill person={person} />\n },\n [renderTaskPerson, userId, members]\n )\n const agentName = useCallback(\n (agentId: string) => agents.find((a) => a.external_id === agentId)?.given_name ?? undefined,\n [agents]\n )\n return (\n <TaskActivityDialog\n open\n onOpenChange={(open) => !open && onClose()}\n taskName={taskName}\n events={activity.data as TaskActivityEvent[] | undefined}\n isLoading={activity.isLoading}\n isError={activity.isError}\n renderPerson={renderPerson}\n agentName={agentName}\n formatRelative={relativeTime}\n formatExact={formatExact}\n />\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { ArtifactCanvas } from '@arbidocs/react'\nimport { useStreamedArtifact, type UseStreamedArtifactOptions } from '@arbidocs/react/artifacts'\nimport {\n StreamedArtifactFrame,\n type StreamedArtifactFrameLabels,\n type StreamedArtifactFrameTestIds,\n} from '../artifacts/StreamedArtifactFrame'\nimport type { ArtifactEvent } from './ai'\nimport type { StreamedArtifactEditorProps } from './StreamedArtifactEditor'\n\n// The editor (MDXEditor, Lexical) stays out of the bundle until a draft is ready to edit.\nconst StreamedArtifactEditor = lazy(() => import('./StreamedArtifactEditor'))\n\nexport interface StreamedArtifactProps\n extends\n Pick<UseStreamedArtifactOptions, 'configId' | 'parseRetry' | 'clean'>,\n Pick<\n StreamedArtifactEditorProps,\n 'editorProps' | 'onSaved' | 'onSaveError' | 'actions' | 'hideDefaultActions'\n > {\n /** The artifacts of the agent run (`useConnectedAiTask().artifacts`). */\n artifacts: ArtifactEvent[]\n workspaceId: string | undefined\n /** The agent is still working: show the live canvas. */\n busy: boolean\n /** The run failed; with no draft the canvas shows it. */\n error?: string | null\n stepCount?: number\n busyHint?: string\n emptyHint?: string\n className?: string\n /** Root test id of the editor; the preparing state is `${testId}-preparing`. */\n testId?: string\n labels?: Partial<StreamedArtifactFrameLabels>\n testIds?: Partial<StreamedArtifactFrameTestIds>\n}\n\n/**\n * An agent-drafted artifact from stream to editor, in one part. Pass the run's `artifacts` and\n * whether it is `busy`; it shows\n *\n * 1. the live `ArtifactCanvas` while the agent streams;\n * 2. \"Preparing editor...\" (the canvas stays readable underneath) while the finished draft is\n * cleaned (`cleanDraftMarkdown`), stored as version 1 of the artifact (`wpType: 'artifact'`)\n * and parsed by the backend, which can take up to about a minute;\n * 3. `ArtifactEditor` on the stored version (edit, save a new version, version list, compare\n * with track changes) when its text is ready;\n * 4. an error with Retry when storing or parsing fails.\n *\n * Needs `<ArbiProvider>` + React Query. The host imports the editor stylesheet\n * (`@mdxeditor/editor/style.css`) and defines the global `Prism` in a module it imports at app\n * start (see the Artifacts section of docs/design/blocks-package.md).\n *\n * ```tsx\n * const task = useConnectedAiTask()\n * <StreamedArtifact artifacts={task.artifacts} workspaceId={workspaceId} busy={task.status === 'running'} error={task.error} />\n * ```\n */\nexport function StreamedArtifact({\n artifacts,\n workspaceId,\n busy,\n error = null,\n stepCount,\n busyHint,\n emptyHint,\n className,\n testId = 'streamed-artifact',\n configId,\n parseRetry,\n clean,\n editorProps,\n onSaved,\n onSaveError,\n actions,\n hideDefaultActions,\n labels,\n testIds,\n}: StreamedArtifactProps) {\n const streamed = useStreamedArtifact({\n artifacts,\n workspaceId,\n settled: !busy && !error,\n configId,\n parseRetry,\n clean,\n })\n const canvas = (\n <ArtifactCanvas\n artifacts={artifacts}\n className={streamed.phase === 'streaming' ? className : undefined}\n busy={busy}\n busyHint={busyHint}\n stepCount={stepCount}\n error={error}\n emptyHint={emptyHint}\n />\n )\n return (\n <StreamedArtifactFrame\n phase={streamed.phase}\n canvas={canvas}\n className={className}\n error={streamed.error?.message}\n onRetry={streamed.retry}\n labels={labels}\n testIds={{ preparing: `${testId}-preparing`, error: `${testId}-error`, ...testIds }}\n >\n <Suspense fallback={canvas}>\n {streamed.docId && (\n <StreamedArtifactEditor\n key={streamed.docId}\n workspaceId={workspaceId}\n docId={streamed.docId}\n title={streamed.artifact?.title ?? 'Draft'}\n testId={testId}\n className={className}\n editorProps={editorProps}\n onSaved={onSaved}\n onSaveError={onSaveError}\n actions={actions}\n hideDefaultActions={hideDefaultActions}\n />\n )}\n </Suspense>\n </StreamedArtifactFrame>\n )\n}\n","/**\n * A stepped workflow run that lives in a work thread on the server. The thread's plan carries the\n * steps; its activity log says where each step is; the work runner starts each agent step as a\n * turn in the thread. This hook reads all of that and does the person's part: it starts the thread\n * (with the run's inputs and the steps' prompts composed from them), completes forms, uploads and\n * reviews, skips, and retries a failed step. A run whose first open step is an agent or action\n * step starts when the person presses Start: the thread is created and the server starts that\n * step. `WorkflowRunner` shows the result.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useActOnStep,\n useArbi,\n useConversationActivity,\n useConversationThreads,\n useConversations,\n useCreateWork,\n useWorkspaceUsers,\n type ConversationResponse,\n} from '@arbidocs/react'\nimport { fromPlanSteps, toPlanSteps, type TaskPlanStep } from '../agents/workflows/planSteps'\nimport {\n initialRunInputs,\n runThreadTitle,\n stepFields,\n stepStatesFromActivity,\n workflowSteps,\n type StepComposeOptions,\n type WorkflowActivityEvent,\n} from '../agents/workflows/run'\nimport { useWorkflowView, type WorkflowRunView } from '../agents/workflows/useWorkflowView'\nimport type {\n WorkflowDefinition,\n WorkflowInputs,\n WorkflowStep,\n WorkflowStepState,\n} from '../agents/workflows/types'\nimport { useConnectedWorkspace } from './ConnectionProvider'\n\nexport interface UseWorkflowThreadOptions extends StepComposeOptions {\n /**\n * An existing run to show (its thread). Absent: a new run starts when its first step is done,\n * or, when that is an agent or action step, when the person starts it.\n */\n conversationId?: string\n /** The thread was created (store its id to come back to the run). */\n onStarted?: (conversationId: string) => void\n /**\n * The host's commits, by step id (`commit: true` steps): done before the step is recorded, e.g.\n * create and open the matter the run belongs in (the thread is created in the open workspace).\n * May return inputs to merge into the run.\n */\n commit?: Record<string, (inputs: WorkflowInputs) => Promise<WorkflowInputs | void>>\n /** Prefills for a new run. */\n initialInputs?: WorkflowInputs\n /** The agent that runs the agent steps (`agt-…`); absent = the person's own assistant. */\n agentId?: string\n /**\n * The files added on an upload step in this run (doc ids): sent when it is completed, so the\n * step records exactly them.\n */\n documentsFor?: (stepId: string) => string[]\n}\n\nexport interface WorkflowThread {\n view: WorkflowRunView\n /** The run's thread, once it exists. */\n conversationId: string | undefined\n conversation: ConversationResponse | undefined\n /** A workspace member's name by id. */\n nameOf: (id: string) => string | undefined\n /** The workspace's people (not agents): what a person field offers. */\n people: Array<{ value: string; label: string }>\n}\n\nconst STARTING = new Set(['pending', 'running'])\n\n/**\n * The values a form or a fielded review collected (what is recorded with it on the thread). A\n * review's blank optional fields are left out: the server checks each one given.\n */\nfunction formValues(step: WorkflowStep, inputs: WorkflowInputs): WorkflowInputs | undefined {\n const fields = stepFields(step)\n if (!fields.length) return undefined\n if (step.kind === 'form')\n return Object.fromEntries(fields.map((f) => [f.name, inputs[f.name] ?? '']))\n const given = fields.flatMap((f) => {\n const v = inputs[f.name]\n return v === undefined || v === '' ? [] : [[f.name, v] as const]\n })\n return given.length ? Object.fromEntries(given) : undefined\n}\n\n/** How many times missing answers are fetched again before giving up (about three minutes). */\nexport const ANSWER_RETRY_CAP = 16\n\n/** The wait before the `attempt`th fetch of missing answers: at once, then 1s doubling to 15s. */\nexport function answerRetryDelay(attempt: number): number {\n return attempt === 0 ? 0 : Math.min(1000 * 2 ** (attempt - 1), 15_000)\n}\n\n/**\n * Fetch again, with backoff and a cap, while `missing` (the ids of finished steps' answers not\n * read yet) is not empty. A change in what is missing starts the count again.\n */\nfunction useAnswerRetry(missing: string, refetch: () => Promise<unknown>) {\n const [attempt, setAttempt] = useState(0)\n const [prev, setPrev] = useState(missing)\n if (prev !== missing) {\n setPrev(missing)\n setAttempt(0)\n }\n const refetchRef = useRef(refetch)\n refetchRef.current = refetch\n useEffect(() => {\n if (!missing || attempt >= ANSWER_RETRY_CAP) return\n const t = setTimeout(() => {\n void refetchRef.current()\n setAttempt((a) => a + 1)\n }, answerRetryDelay(attempt))\n return () => clearTimeout(t)\n }, [missing, attempt])\n}\n\nexport function useWorkflowThread(\n workflow: WorkflowDefinition,\n options: UseWorkflowThreadOptions = {}\n): WorkflowThread {\n const arbi = useArbi()\n const { ensureWorkspaceOpen, live, workspaceId } = useConnectedWorkspace()\n const wsId = workspaceId ?? undefined\n const [threadId, setThreadId] = useState(options.conversationId)\n const [localInputs, setLocalInputs] = useState<WorkflowInputs>(() =>\n initialRunInputs(workflow, options.initialInputs)\n )\n // What the person typed: it wins over the thread's copy, which only learns a form's values when\n // that step is completed (until then it holds them blank).\n const [edits, setEdits] = useState<WorkflowInputs>({})\n const [localStates, setLocalStates] = useState<Record<string, WorkflowStepState>>({})\n const createWork = useCreateWork()\n const actOnStep = useActOnStep()\n\n const conversations = useConversations(wsId, { enabled: !!threadId, live: true })\n const members = useWorkspaceUsers(wsId, {\n enabled: live && !!wsId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const nameOf = useCallback(\n (id: string) => {\n const u = members.data?.find((m) => m.user.external_id === id)?.user\n return u ? [u.given_name, u.family_name].filter(Boolean).join(' ') || u.email : undefined\n },\n [members.data]\n )\n const conversation = conversations.data?.find((c) => c.external_id === threadId)\n const steps = useMemo(\n () =>\n workflowSteps(workflow).length > 0\n ? workflowSteps(workflow)\n : fromPlanSteps((conversation?.plan?.steps ?? []) as TaskPlanStep[]),\n [workflow, conversation?.plan?.steps]\n )\n\n // Poll while an agent step is on its way (the server starts it, then runs it).\n const activity = useConversationActivity(threadId, { live: !!threadId })\n const serverStates = useMemo(\n () => stepStatesFromActivity((activity.data ?? []) as WorkflowActivityEvent[]),\n [activity.data]\n )\n const working = steps.some(\n (s) =>\n (s.kind === 'agent' || s.kind === 'action') &&\n STARTING.has(serverStates[s.id]?.status ?? 'pending')\n )\n const threads = useConversationThreads(wsId, threadId, { enabled: !!threadId, live: working })\n // Only answers with text: the assistant's message exists (empty) from the moment its turn\n // starts and is filled when the turn ends, which can be after the step is recorded done.\n const answers = useMemo(() => {\n const byId = new Map<string, string>()\n for (const t of threads.data?.threads ?? [])\n for (const m of t.history)\n if (m.role === 'assistant' && m.content?.trim()) byId.set(m.external_id, m.content)\n return byId\n }, [threads.data])\n\n // A step can finish as the run stops (the last one always does): nothing is polled then, and\n // the activity log no longer changes. Fetch the messages again, backing off, until every\n // finished step's answer is in (or the cap is reached; a new missing answer starts again).\n const missing = Object.values(serverStates)\n .flatMap((st) =>\n st.status === 'done' && st.responseId && !answers.has(st.responseId) ? [st.responseId] : []\n )\n .sort()\n .join(' ')\n useAnswerRetry(missing, threads.refetch)\n\n const states = useMemo(() => {\n if (!threadId) return localStates\n const out: Record<string, WorkflowStepState> = {}\n for (const [id, s] of Object.entries(serverStates))\n out[id] = { ...s, text: s.responseId ? answers.get(s.responseId) : undefined }\n return out\n }, [threadId, localStates, serverStates, answers])\n\n const inputs = useMemo(\n () =>\n threadId\n ? { ...localInputs, ...(conversation?.skill_inputs ?? {}), ...edits }\n : { ...localInputs, ...edits },\n [threadId, localInputs, conversation?.skill_inputs, edits]\n ) as WorkflowInputs\n\n const refresh = useCallback(async () => {\n await Promise.all([activity.refetch(), conversations.refetch()])\n }, [activity, conversations])\n\n const act = useCallback(\n async (\n id: string,\n body: {\n step: string\n action: 'complete' | 'skip' | 'send_back' | 'decline'\n inputs?: WorkflowInputs\n documents?: string[]\n to?: string\n note?: string\n }\n ) => {\n await actOnStep.mutateAsync({ conversationId: id, body })\n await refresh()\n },\n [actOnStep, refresh]\n )\n\n // The run starts: its thread, in the workspace now open, with the steps and the inputs so far.\n // Creating it starts the first ready agent step on the server; the steps skipped before it existed\n // are then recorded (which starts what they made ready).\n const createThread = useCallback(\n async (values: WorkflowInputs, done?: string): Promise<string> => {\n await ensureWorkspaceOpen()\n const created = await createWork.mutateAsync({\n title: runThreadTitle(workflow, values).slice(0, 60),\n description: workflow.description || null,\n prompt: null,\n skill_ref: null,\n skill_inputs: values as Record<string, unknown>,\n agent_ext_id: options.agentId ?? null,\n auth_mode: 'run_now_temp',\n plan: {\n goal: '',\n criteria: [],\n max_passes: 3,\n documents: [],\n steps: toPlanSteps(workflow, {\n inputs: values,\n resolveWorkflow: options.resolveWorkflow,\n compose: options.compose,\n }),\n },\n })\n const id = created.external_id\n setThreadId(id)\n if (done) setLocalStates((s) => ({ ...s, [done]: { status: 'done' } }))\n options.onStarted?.(id)\n for (const [stepId, st] of Object.entries(localStates))\n if (st.status === 'skipped')\n await actOnStep.mutateAsync({\n conversationId: id,\n body: { step: stepId, action: 'skip' },\n })\n return id\n },\n [ensureWorkspaceOpen, createWork, workflow, options, localStates, actOnStep]\n )\n\n const complete = useCallback(\n async (step: WorkflowStep) => {\n let values = inputs\n const commit = step.commit ? options.commit?.[step.id] : undefined\n if (commit && localStates[step.id]?.status !== 'done') {\n values = { ...values, ...((await commit(values)) ?? {}) }\n setLocalInputs(values)\n setEdits({})\n }\n const id = threadId ?? (await createThread(values, step.id))\n const documents = step.kind === 'upload' ? options.documentsFor?.(step.id) : undefined\n await act(id, {\n step: step.id,\n action: 'complete',\n inputs: formValues(step, values),\n ...(documents?.length ? { documents } : {}),\n })\n },\n [inputs, options, localStates, threadId, createThread, act]\n )\n\n // Start the ready agent or action step nothing else will start: create the run's thread (the\n // server starts the step), or run the thread again (the server could not start it before).\n const start = useCallback(async () => {\n if (!threadId) {\n await createThread(inputs)\n await refresh()\n return\n }\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n }, [threadId, createThread, inputs, arbi, refresh])\n\n const skip = useCallback(\n async (stepId: string) => {\n if (!threadId) {\n setLocalStates((s) => ({ ...s, [stepId]: { status: 'skipped' } }))\n return\n }\n await act(threadId, { step: stepId, action: 'skip' })\n },\n [threadId, act]\n )\n\n const retry = useCallback(\n async (_stepId: string) => {\n if (!threadId) return\n // Running the thread again retries its failed step.\n await arbi.conversations.runWithAuth(threadId)\n await refresh()\n },\n [arbi, threadId, refresh]\n )\n\n const sendBack = useCallback(\n async (stepId: string, to: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'send_back', to, ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n const decline = useCallback(\n async (stepId: string, note?: string) => {\n if (!threadId) return\n await act(threadId, { step: stepId, action: 'decline', ...(note ? { note } : {}) })\n },\n [threadId, act]\n )\n\n // A run opened later opens where it is once its log has arrived (not at its first step).\n const loaded = !options.conversationId || activity.isSuccess || activity.isError\n\n // Nothing will start a ready agent or action step unless the person does: there is no thread\n // yet, or the thread's run is not under way (it could not start: `last_error` says why).\n const idle = !!conversation && !conversation.in_progress\n const anyRunning = Object.values(states).some((s) => s.status === 'running')\n const needsStart = !threadId || (idle && !anyRunning)\n const runError = idle ? (conversation?.last_error ?? null) : null\n\n const view = useWorkflowView({\n steps,\n states,\n inputs,\n setInput: (name, value) => setEdits((i) => ({ ...i, [name]: value })),\n complete,\n skip,\n retry,\n start,\n needsStart,\n runError,\n sendBack,\n decline,\n nameOf,\n loaded,\n isLocked: (id) => states[id]?.status === 'done',\n })\n\n const people = useMemo(\n () =>\n (members.data ?? [])\n .filter((m) => !m.user.external_id.startsWith('agt-'))\n .map((m) => ({\n value: m.user.external_id,\n label: nameOf(m.user.external_id) ?? m.user.external_id,\n })),\n [members.data, nameOf]\n )\n\n return { view, conversationId: threadId, conversation, nameOf, people }\n}\n","/**\n * A workflow run's thread, live and interactive: the blocks `ChatPage` held to the run's one\n * conversation (people ask follow-ups, see the answers and their sources, open documents), with\n * the current step's panel beside it (`aside`). Step messages show as their step's chip.\n */\n\nimport { useEffect, type ReactNode } from 'react'\nimport { useArbiChat } from '@arbidocs/react'\nimport { ChatPage } from '../chat/ChatPage'\nimport type { ChatCitationTarget, ChatPageLabels, WorkflowStepView } from '../chat/chat-page-types'\n\nexport interface WorkflowRunThreadProps {\n conversationId: string\n workspaceId: string | undefined\n /** The current step's panel. */\n aside?: ReactNode\n /** A step by id: its title, kind and phase (step messages show as its chip). */\n stepOf?: (stepId: string) => WorkflowStepView | undefined\n /** Scroll to and mark this message (a step's answer). */\n targetMessageId?: string\n onOpenCitation?: (target: ChatCitationTarget) => void\n labels?: Partial<ChatPageLabels>\n className?: string\n}\n\nexport function WorkflowRunThread({\n conversationId,\n workspaceId,\n aside,\n stepOf,\n targetMessageId,\n onOpenCitation,\n labels,\n className,\n}: WorkflowRunThreadProps) {\n const chat = useArbiChat({ workspaceId })\n const listed = chat.threads.some((t) => t.id === conversationId)\n const { selectThread, activeThreadId } = chat\n // The run's conversation, once the workspace's list has it.\n useEffect(() => {\n if (listed && activeThreadId !== conversationId) selectThread(conversationId)\n }, [listed, activeThreadId, conversationId, selectThread])\n\n return (\n <ChatPage\n chat={{ ...chat, threads: chat.threads.filter((t) => t.id === conversationId) }}\n singleThread\n documentsRequired={false}\n aside={aside}\n asideBreakpoint={52}\n workflowStepOf={stepOf}\n targetMessageId={targetMessageId}\n onOpenCitation={onOpenCitation}\n labels={labels}\n className={className ?? 'h-[min(78dvh,860px)] min-h-[480px] rounded-xl border border-border'}\n />\n )\n}\n","/**\n * What the connected runner opens itself when the host does not take over: the sign flow for a\n * signature step (the blocks `SignDocumentDialog` on the document's PDF), the native Word editor\n * for a tracked-changes version, and a tabular review's grid (its documents by its columns).\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { useArbi, useDocuments, useTags } from '@arbidocs/react'\nimport {\n DocumentToolsProvider,\n fetchDocumentPdf,\n useOptionalDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { Loader2 } from 'lucide-react'\nimport { SignDocumentDialog } from '../document-tools/SignDocumentDialog'\nimport { ModalScaffold } from '../settings/ModalScaffold'\nimport { splitDocRef } from '../agents/workflows/run'\nimport { ConnectedNativeDocxEditor } from './docx/ConnectedNativeDocxEditor'\nimport { useConnectedWorkspace } from './ConnectionProvider'\n\nexport interface WorkflowRunnerDialogLabels {\n loadingDocument: string\n preparingDocument: string\n documentFailed: string\n reviewTitle: string\n reviewDescription: string\n document: string\n empty: string\n showMore: string\n showLess: string\n wordTitle: string\n}\n\nexport const DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS: WorkflowRunnerDialogLabels = {\n loadingDocument: 'Opening the document…',\n preparingDocument: 'The PDF is still being prepared…',\n documentFailed: 'The document could not be opened.',\n reviewTitle: 'Review',\n reviewDescription: 'Each document against each review column.',\n document: 'Document',\n empty: '—',\n showMore: 'Show more',\n showLess: 'Show less',\n wordTitle: 'Tracked changes',\n}\n\n/** How often, and how long apart, the PDF is fetched again while it is still being rendered. */\nexport const SIGN_PDF_RETRIES = 4\nexport const SIGN_PDF_RETRY_DELAY_MS = 1500\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\n/**\n * The sign flow on one document version: its PDF is fetched, then the blocks sign dialog.\n *\n * What is signed is the PDF `GET /view?version=` serves (a Word or Markdown document's rendition),\n * never the original's download, so the hash the server checks is of the bytes shown here. A\n * rendition still being written is fetched again a few times; a version superseded since the step\n * was set offers the current one instead.\n */\nexport function WorkflowSignDialog({\n docRef,\n onClose,\n labels,\n}: {\n /** `doc-…` or `doc-…@v3`. */\n docRef: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const arbi = useArbi()\n const { user, ensureWorkspaceOpen } = useConnectedWorkspace()\n const tools = useOptionalDocumentTools()\n const { id, version: stepVersion } = splitDocRef(docRef)\n // The version the step names, until the signer opens the current one instead.\n const [version, setVersion] = useState(stepVersion)\n const [pdf, setPdf] = useState<Blob | null>(null)\n const [preparing, setPreparing] = useState(false)\n const [failed, setFailed] = useState(false)\n useEffect(() => {\n let live = true\n setPdf(null)\n setFailed(false)\n setPreparing(false)\n void (async () => {\n try {\n await ensureWorkspaceOpen()\n const client = arbi.getClient().fetch\n const ref = version ? `${id}@v${version}` : id\n for (let attempt = 0; ; attempt++) {\n try {\n const blob = await fetchDocumentPdf(client, ref)\n if (live) setPdf(blob)\n return\n } catch (err) {\n if (!live || attempt >= SIGN_PDF_RETRIES) throw err\n setPreparing(true)\n await wait(SIGN_PDF_RETRY_DELAY_MS)\n if (!live) return\n }\n }\n } catch {\n if (live) setFailed(true)\n }\n })()\n return () => {\n live = false\n }\n }, [arbi, id, version, ensureWorkspaceOpen])\n\n if (!pdf)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.loadingDocument}\n size=\"sm\"\n testId=\"workflow-sign-loading\"\n >\n <ModalScaffold.Body>\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {failed ? (\n labels.documentFailed\n ) : (\n <>\n <Loader2 className=\"size-4 animate-spin\" />{' '}\n {preparing ? labels.preparingDocument : labels.loadingDocument}\n </>\n )}\n </p>\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n const dialog = (\n <SignDocumentDialog\n // A new PDF is a new signing: the form starts again on it.\n key={version ?? 'current'}\n open\n onOpenChange={(o) => !o && onClose()}\n documentId={id}\n pdfBlob={pdf}\n version={version}\n // Superseded since the step was set: sign the current version, after seeing it.\n onOpenCurrent={() => setVersion(undefined)}\n />\n )\n // A host with its own document tools keeps them (its notices, its document opening).\n return tools ? (\n dialog\n ) : (\n <DocumentToolsProvider\n client={arbi.getClient().fetch}\n user={user ? { name: user.name, email: user.email } : null}\n >\n {dialog}\n </DocumentToolsProvider>\n )\n}\n\n/** A tracked-changes version in the native Word editor. */\nexport function WorkflowWordDialog({\n docRef,\n title,\n onClose,\n labels,\n}: {\n docRef: string\n title?: string\n onClose: () => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { id } = splitDocRef(docRef)\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={title ?? labels.wordTitle}\n size=\"xl\"\n testId=\"workflow-word-dialog\"\n >\n <ModalScaffold.Body className=\"h-[70dvh] p-0\">\n <ConnectedNativeDocxEditor documentId={id} title={title ?? labels.wordTitle} />\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/** A tabular review's grid: each document (row) against each column (label), with its value. */\nexport function WorkflowReviewGridDialog({\n tags,\n documents,\n onClose,\n onOpenDocument,\n labels,\n}: {\n tags: string[]\n documents: string[]\n onClose: () => void\n onOpenDocument?: (docId: string) => void\n labels: WorkflowRunnerDialogLabels\n}) {\n const { workspaceId } = useConnectedWorkspace()\n const allTags = useTags(workspaceId ?? undefined)\n // The workspace's documents carry their review values (doctags); the review's rows are its own.\n const all = useDocuments(workspaceId ?? undefined)\n // The grid waits for its column names and for documents fetched since it opened: before, its\n // headers would be the raw tag ids and its cells the values cached before the review ran.\n const isLoading =\n allTags.isLoading || all.isLoading || (all.isFetching && !all.isFetchedAfterMount)\n const docs = (all.data ?? []).filter((d) => documents.includes(d.external_id))\n const columns = useMemo(\n () =>\n tags.map((id) => ({\n id,\n name: allTags.data?.find((t) => t.external_id === id)?.name ?? id,\n })),\n [tags, allTags.data]\n )\n return (\n <ModalScaffold\n open\n onOpenChange={(o) => !o && onClose()}\n title={labels.reviewTitle}\n description={labels.reviewDescription}\n showDescription\n size=\"xl\"\n testId=\"workflow-review-grid\"\n >\n <ModalScaffold.Body className=\"overflow-auto\">\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {labels.loadingDocument}\n </p>\n ) : (\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr>\n <th className=\"sticky left-0 z-10 border-b border-border bg-background p-2 text-left align-bottom font-medium\">\n {labels.document}\n </th>\n {columns.map((c) => (\n <th\n key={c.id}\n className=\"border-b border-border p-2 text-left align-bottom font-medium\"\n >\n <div className={`${VALUE_WIDTH} line-clamp-2 break-words`} title={c.name}>\n {c.name}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {docs.map((d) => (\n <tr key={d.external_id} data-testid={`workflow-review-grid-row-${d.external_id}`}>\n <td className=\"sticky left-0 z-10 border-b border-border bg-background p-2 align-top\">\n <DocumentName onClick={onOpenDocument && (() => onOpenDocument(d.external_id))}>\n {d.file_name ?? d.external_id}\n </DocumentName>\n </td>\n {columns.map((c) => {\n const note = d.doctags?.find((t) => t.tag_ext_id === c.id)?.note\n return (\n <td\n key={c.id}\n className=\"border-b border-border p-2 align-top text-muted-foreground\"\n >\n <ReviewValue value={note || labels.empty} labels={labels} />\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </ModalScaffold.Body>\n </ModalScaffold>\n )\n}\n\n/*\n * Widths sit on a block inside each cell: an auto-layout table ignores `max-width` on a cell, so a\n * long file name or answer would otherwise widen its column, or (without wrapping) spill into the\n * next one. The grid scrolls sideways when the columns do not fit.\n */\nconst DOCUMENT_WIDTH = 'w-40 sm:w-56'\nconst VALUE_WIDTH = 'min-w-48 max-w-80'\n\n/** The row's document: its name wraps over two lines at most, the full name on hover. */\nfunction DocumentName({ onClick, children }: { onClick?: () => void; children: string }) {\n const className = `${DOCUMENT_WIDTH} line-clamp-2 break-words text-left font-medium`\n return onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n title={children}\n className={`${className} text-primary hover:underline`}\n >\n {children}\n </button>\n ) : (\n <div title={children} className={className}>\n {children}\n </div>\n )\n}\n\n/** A review value: four lines, then a toggle to read the rest in place. */\nfunction ReviewValue({ value, labels }: { value: string; labels: WorkflowRunnerDialogLabels }) {\n const ref = useRef<HTMLDivElement>(null)\n const [expanded, setExpanded] = useState(false)\n const [clamped, setClamped] = useState(false)\n useLayoutEffect(() => {\n const el = ref.current\n if (el && !expanded) setClamped(el.scrollHeight > el.clientHeight + 1)\n }, [value, expanded])\n return (\n <div className={VALUE_WIDTH}>\n <div\n ref={ref}\n title={clamped && !expanded ? value : undefined}\n className={`whitespace-pre-line break-words ${expanded ? '' : 'line-clamp-4'}`}\n >\n {value}\n </div>\n {(clamped || expanded) && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-1 text-xs font-medium text-primary hover:underline\"\n >\n {expanded ? labels.showLess : labels.showMore}\n </button>\n )}\n </div>\n )\n}\n","/**\n * A stepped workflow run in its work thread, end to end: `useWorkflowThread` keeps the run on the\n * server (the thread's plan, its activity, its turns) and `WorkflowRunner` shows it. Agent answers\n * are the thread's messages; uploads go into the open workspace; a review can notify the people\n * who should approve it, in the run's thread. The host keeps its wording, its commits\n * (`options.commit`) and its finish screen.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AiAnswer, useArbi, useDocuments, useWorkspaceUsers } from '@arbidocs/react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ExternalLink, Loader2, MessageSquare } from 'lucide-react'\nimport {\n WorkflowRunner,\n type WorkflowRunnerFile,\n type WorkflowRunnerProps,\n} from '../agents/workflows/WorkflowRunner'\nimport type { WorkflowRunnerActions } from '../agents/workflows/StepParts'\nimport { WorkflowStepBar } from '../agents/workflows/WorkflowStepBar'\nimport { splitDocRef, stepLevels } from '../agents/workflows/run'\nimport { stepKindOf } from '../agents/workflows/stepKinds'\nimport { stepDocuments } from '../agents/workflows/StepDocuments'\nimport type {\n WorkflowAgentStep,\n WorkflowDefinition,\n WorkflowStepState,\n WorkflowUploadStep,\n} from '../agents/workflows/types'\nimport { useConnectedWorkspace } from './ConnectionProvider'\nimport { useWorkflowThread, type UseWorkflowThreadOptions } from './useWorkflowThread'\nimport { WorkflowRunThread } from './WorkflowRunThread'\nimport type { ChatCitationTarget } from '../chat/chat-page-types'\nimport {\n DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS,\n WorkflowReviewGridDialog,\n WorkflowSignDialog,\n WorkflowWordDialog,\n type WorkflowRunnerDialogLabels,\n} from './WorkflowRunnerDialogs'\n\nexport interface ConnectedWorkflowRunnerLabels {\n notify: string\n /** An agent step's answer, in the thread layout: a link to it in the thread. */\n showInThread: string\n /** The thread layout's panel toggle, when the panel folds (a narrow container). */\n currentStep: string\n /** A finished step whose answer is still being fetched. */\n loadingAnswer: string\n notified: string\n openThread: string\n}\n\nexport const DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS: ConnectedWorkflowRunnerLabels = {\n notify: 'Ask to approve',\n showInThread: 'Show in the thread',\n currentStep: 'Current step',\n notified: 'Notified.',\n openThread: 'Open the thread',\n loadingAnswer: 'Fetching the answer…',\n}\n\nexport interface ConnectedWorkflowRunnerProps extends Omit<\n WorkflowRunnerProps,\n | 'run'\n | 'renderAgentOutput'\n | 'onUpload'\n | 'uploading'\n | 'files'\n | 'onRetryUpload'\n | 'onRemoveUpload'\n | 'renderReview'\n | 'actions'\n | 'nameOfDoc'\n> {\n workflow: WorkflowDefinition\n /** The run's bindings: an existing thread, commits, prompt wording, workflow lookup. */\n options?: UseWorkflowThreadOptions\n /** Open a conversation (the run's thread): the host navigates. */\n onOpenConversation?: (conversationId: string) => void\n /** The muted line an agent step shows before its answer. */\n emptyHint?: (step: WorkflowAgentStep) => string | undefined\n connectedLabels?: Partial<ConnectedWorkflowRunnerLabels>\n /**\n * Open a document (a version: `version`; at a page: `page`, from a citation): the host\n * navigates. Absent: no document links. In the thread layout a citation opens its document with\n * it too, unless `onOpenCitation` is given.\n */\n onOpenDocument?: (documentId: string, version?: number, page?: number) => void\n /**\n * The thread layout's citation open action, as `ChatPage`'s `onOpenCitation` (the cited\n * document, page and passage). Absent: `onOpenDocument`; neither: citations offer no open.\n */\n onOpenCitation?: (target: ChatCitationTarget) => void\n /** Open an email step's draft in native mail (the host's mail screen). Absent: no button. */\n onOpenDraft?: (draftId: string) => void\n /** Show an answer in the run's thread. Absent: no link. */\n onOpenMessage?: (messageId: string) => void\n /**\n * Take over what the runner otherwise opens itself: the sign flow, the Word editor for a\n * tracked-changes version, a tabular review's grid.\n */\n actions?: Pick<WorkflowRunnerActions, 'sign' | 'openRedline' | 'openReview'>\n dialogLabels?: Partial<WorkflowRunnerDialogLabels>\n /**\n * `thread` (default): once the run has its thread, the page is that thread, live (follow-ups,\n * answers with their sources, documents), with the step bar on top and the current step in a\n * compact panel beside it; steps' answers link to their message instead of being repeated.\n * Before the thread exists (the first form), and with `guided`, it is the stepper: one step at\n * a time, each answer shown in full.\n */\n layout?: 'thread' | 'guided'\n /**\n * Which of the workspace's documents an upload step lists (the files \"in this matter\"): the\n * host hides what is not the matter's own, e.g. skill files kept as workspace documents —\n * `(doc) => !(doc.folder ?? '').startsWith('skills')`. Files added on the run's upload steps are\n * always listed. Absent: every document.\n */\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean\n}\n\n/** A workspace document, as `fileFilter` sees it. */\nexport type WorkflowRunnerDocument = NonNullable<ReturnType<typeof useDocuments>['data']>[number]\n\n/** What the runner has open itself. */\ntype OpenDialog =\n | { kind: 'sign'; docRef: string }\n | { kind: 'word'; docRef: string; title: string }\n | { kind: 'review'; tags: string[]; documents: string[] }\n\nexport function ConnectedWorkflowRunner({\n workflow,\n options,\n onOpenConversation,\n emptyHint,\n connectedLabels,\n onOpenDocument,\n onOpenCitation,\n onOpenDraft,\n onOpenMessage,\n actions: hostActions,\n dialogLabels,\n layout = 'thread',\n fileFilter,\n testIdPrefix = 'workflow-run',\n ...runnerProps\n}: ConnectedWorkflowRunnerProps) {\n const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels }\n const dl = { ...DEFAULT_WORKFLOW_RUNNER_DIALOG_LABELS, ...dialogLabels }\n const arbi = useArbi()\n const { ensureWorkspaceOpen, userId, workspaceId } = useConnectedWorkspace()\n const wsId = workspaceId ?? undefined\n const { data: docs = [], refetch } = useDocuments(wsId)\n // The files being sent on the run's upload steps, and those that did not upload (until retried\n // or removed): the step waits for them.\n const [sending, setSending] = useState<PendingUpload[]>([])\n // The files added on each upload step in this run (doc id -> step id), and their names (listed\n // under them before the workspace's documents catch up).\n const [added, setAdded] = useState<Record<string, string>>({})\n const [addedNames, setAddedNames] = useState<Record<string, string>>({})\n const addedRef = useRef(added)\n addedRef.current = added\n const { view, conversationId, people } = useWorkflowThread(workflow, {\n ...options,\n // An upload step records exactly the files added on it (else the server's guess).\n documentsFor:\n options?.documentsFor ??\n ((stepId) =>\n Object.entries(addedRef.current).flatMap(([doc, step]) => (step === stepId ? [doc] : []))),\n })\n const [dialog, setDialog] = useState<OpenDialog | null>(null)\n const inThread = layout === 'thread' && !!conversationId\n // The message the thread scrolls to (a step's answer, picked from the panel).\n const [target, setTarget] = useState<string | undefined>(undefined)\n const nameOfDoc = useCallback(\n (id: string) => docs.find((d) => d.external_id === id)?.file_name ?? undefined,\n [docs]\n )\n const actions = useMemo<WorkflowRunnerActions>(\n () => ({\n me: userId,\n openDocument:\n onOpenDocument &&\n ((ref) => {\n const { id, version } = splitDocRef(ref)\n onOpenDocument(id, version)\n }),\n openDraft: onOpenDraft && ((draftId) => onOpenDraft(draftId)),\n // In the thread layout an answer is right there: scroll to it.\n openMessage: inThread ? setTarget : onOpenMessage,\n sign:\n hostActions?.sign ??\n ((_step, state) => {\n const w = state.waiting\n if (w?.doc_ext_id) setDialog({ kind: 'sign', docRef: w.doc_ext_id })\n }),\n openRedline:\n hostActions?.openRedline ??\n ((ref) =>\n setDialog({ kind: 'word', docRef: ref, title: nameOfDoc(splitDocRef(ref).id) ?? '' })),\n openReview:\n hostActions?.openReview ??\n ((tags, documents) => setDialog({ kind: 'review', tags, documents })),\n }),\n [userId, onOpenDocument, onOpenDraft, onOpenMessage, hostActions, nameOfDoc, inThread]\n )\n\n // A citation in the thread opens its document as the regular chat does (the host's handler).\n const openCitation = useMemo<((target: ChatCitationTarget) => void) | undefined>(\n () =>\n onOpenCitation ??\n (onOpenDocument &&\n ((t) => {\n const docId = t.documentId ?? t.passage?.documentId\n if (docId) onOpenDocument(docId, undefined, t.page ?? t.passage?.page ?? undefined)\n })),\n [onOpenCitation, onOpenDocument]\n )\n\n const uploadSeq = useRef(0)\n const sendingRef = useRef(sending)\n sendingRef.current = sending\n // Send these files for a step, one after another; one that fails stays listed with its error.\n const send = useCallback(\n async (batch: PendingUpload[]) => {\n if (!batch.length) return\n const keys = new Set(batch.map((p) => p.key))\n const mark = (key: string, patch: Partial<PendingUpload> | null) =>\n setSending((all) =>\n patch === null\n ? all.filter((p) => p.key !== key)\n : all.map((p) => (p.key === key ? { ...p, ...patch } : p))\n )\n setSending((all) => [\n ...all.filter((p) => !keys.has(p.key)),\n ...batch.map((p) => ({ ...p, status: 'uploading' as const, error: undefined })),\n ])\n try {\n // The server resolves the target workspace from the session: make sure it is open.\n await ensureWorkspaceOpen()\n } catch (e) {\n for (const p of batch) mark(p.key, { status: 'failed', error: uploadError(e) })\n return\n }\n for (const p of batch) {\n try {\n const { doc_ext_ids = [] } = (await arbi.documents.uploadFile(p.file, p.file.name)) ?? {}\n if (!doc_ext_ids.length) throw new Error('No document came back')\n setAdded((a) => ({\n ...a,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.stepId])),\n }))\n setAddedNames((n) => ({\n ...n,\n ...Object.fromEntries(doc_ext_ids.map((id) => [id, p.file.name])),\n }))\n mark(p.key, null)\n } catch (e) {\n mark(p.key, { status: 'failed', error: uploadError(e) })\n }\n }\n await refetch()\n },\n [arbi, ensureWorkspaceOpen, refetch]\n )\n const onUpload = useCallback(\n (files: File[], step: WorkflowUploadStep) =>\n send(\n files.map((file) => ({\n key: `upload-${++uploadSeq.current}`,\n file,\n stepId: step.id,\n status: 'uploading' as const,\n }))\n ),\n [send]\n )\n const onRetryUpload = useCallback(\n (file: WorkflowRunnerFile) => {\n const p = sendingRef.current.find((x) => x.key === file.id)\n if (p) void send([p])\n },\n [send]\n )\n const onRemoveUpload = useCallback(\n (file: WorkflowRunnerFile) => setSending((all) => all.filter((p) => p.key !== file.id)),\n []\n )\n\n const files = [\n ...sending.map<WorkflowRunnerFile>((p) => ({\n id: p.key,\n name: p.file.name,\n status: p.status === 'failed' ? 'upload-failed' : 'uploading',\n error: p.error,\n addedFor: p.stepId,\n })),\n ...runnerFiles(docs, added, fileFilter, addedNames),\n ]\n // Watch the files just added until they are read (the step waits for them).\n const reading = files.some((f) => f.addedFor && f.status === 'processing')\n useEffect(() => {\n if (!reading) return\n const t = setInterval(() => void refetch(), READ_POLL_MS)\n return () => clearInterval(t)\n }, [reading, refetch])\n\n const renderAgentOutput = (step: WorkflowAgentStep, state: WorkflowStepState | undefined) => {\n const status = state?.status\n // Beside the thread an answer is not repeated: it links to its message.\n if (inThread) {\n const id = state?.responseId\n return id && status === 'done' ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setTarget(id)}\n data-testid={`${testIdPrefix}-${step.id}-show-in-thread`}\n >\n <MessageSquare className=\"size-4\" /> {l.showInThread}\n </Button>\n ) : null\n }\n if (!state?.text && status !== 'done') return null\n // Finished, its answer not read yet (the thread is fetched again until it is).\n if (!state?.text && state?.responseId) {\n return (\n <p\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-${step.id}-answer-loading`}\n >\n <Loader2 className=\"size-4 animate-spin\" /> {l.loadingAnswer}\n </p>\n )\n }\n return (\n <AiAnswer\n status={status === 'running' ? 'running' : 'done'}\n text={state?.text ?? ''}\n emptyHint={emptyHint?.(step)}\n testId={`${testIdPrefix}-${step.id}-answer`}\n />\n )\n }\n\n const runner = (compact: boolean) => (\n <WorkflowRunner\n people={people}\n {...runnerProps}\n workflow={workflow}\n run={view}\n renderAgentOutput={renderAgentOutput}\n renderReview={(step) =>\n conversationId ? (\n <ReviewNotify\n conversationId={conversationId}\n workspaceId={wsId}\n labels={l}\n testId={`${testIdPrefix}-${step.id}`}\n />\n ) : null\n }\n onUpload={onUpload}\n uploading={sending.some((p) => p.status === 'uploading')}\n files={files}\n onRetryUpload={onRetryUpload}\n onRemoveUpload={onRemoveUpload}\n actions={actions}\n nameOfDoc={nameOfDoc}\n testIdPrefix={testIdPrefix}\n hideStepBar={compact}\n compact={compact}\n className={compact ? undefined : runnerProps.className}\n />\n )\n\n return (\n <div className=\"space-y-3\">\n {conversationId && onOpenConversation && (\n <div className=\"flex justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenConversation(conversationId)}\n data-testid={`${testIdPrefix}-open-thread`}\n >\n <ExternalLink className=\"size-4\" /> {l.openThread}\n </Button>\n </div>\n )}\n {inThread && conversationId ? (\n <>\n <WorkflowStepBar\n run={view}\n levels={stepLevels(view.steps)}\n doneTitle={\n (workflow.run.kind === 'steps' ? workflow.run.completion?.title : undefined) ??\n runnerProps.labels?.complete ??\n 'Done'\n }\n icon={(key) =>\n key && runnerProps.renderIcon ? runnerProps.renderIcon(key) : undefined\n }\n tid={(suffix) => `${testIdPrefix}-${suffix}`}\n />\n <WorkflowRunThread\n conversationId={conversationId}\n workspaceId={wsId}\n stepOf={(id) => {\n const step = view.steps.find((s) => s.id === id)\n if (!step) return undefined\n // Its document, one click from its chip: the latest version, in the host's viewer\n // (else the Word dialog).\n const states = Object.fromEntries(\n view.steps.flatMap((s) => {\n const state = view.stateOf(s.id)\n return state ? [[s.id, state]] : []\n })\n )\n const ref = stepDocuments(view.steps, states, id).at(-1)\n const open = actions.openDocument ?? actions.openRedline\n return {\n title: step.title,\n kind: stepKindOf(step),\n phase: view.phaseOf(id),\n document:\n ref && open\n ? { name: nameOfDoc(splitDocRef(ref).id) ?? ref, onOpen: () => open(ref) }\n : undefined,\n }\n }}\n targetMessageId={target}\n onOpenCitation={openCitation}\n labels={{ workflows: l.currentStep }}\n aside={runner(true)}\n />\n </>\n ) : (\n runner(false)\n )}\n {dialog?.kind === 'sign' && (\n <WorkflowSignDialog docRef={dialog.docRef} onClose={() => setDialog(null)} labels={dl} />\n )}\n {dialog?.kind === 'word' && (\n <WorkflowWordDialog\n docRef={dialog.docRef}\n title={dialog.title || undefined}\n onClose={() => setDialog(null)}\n labels={dl}\n />\n )}\n {dialog?.kind === 'review' && (\n <WorkflowReviewGridDialog\n tags={dialog.tags}\n documents={dialog.documents}\n onClose={() => setDialog(null)}\n onOpenDocument={onOpenDocument && ((id) => onOpenDocument(id))}\n labels={dl}\n />\n )}\n </div>\n )\n}\n\nconst READ_POLL_MS = 3000\n\n/** A file being sent on an upload step, or one that did not upload (`error`). */\ninterface PendingUpload {\n key: string\n file: File\n stepId: string\n status: 'uploading' | 'failed'\n error?: string\n}\n\nfunction uploadError(e: unknown): string {\n return e instanceof Error && e.message ? e.message : String(e || 'Upload failed')\n}\n\n/**\n * The upload step's files: the workspace's documents the host's `fileFilter` keeps, plus every\n * file added on one of the run's upload steps (`added`: doc id -> step id), which the step waits on.\n * A file added that the workspace does not list yet is shown as being read (`names` gives its name).\n */\nexport function runnerFiles(\n docs: WorkflowRunnerDocument[],\n added: Record<string, string>,\n fileFilter?: (doc: WorkflowRunnerDocument) => boolean,\n names: Record<string, string> = {}\n): WorkflowRunnerFile[] {\n const listed = new Set(docs.map((d) => d.external_id))\n return [\n ...docs\n .filter((d) => !fileFilter || added[d.external_id] || fileFilter(d))\n .map((d) => ({\n id: d.external_id,\n name: d.file_name ?? d.external_id,\n status: fileStatus(d.status),\n addedFor: added[d.external_id],\n })),\n ...Object.entries(added)\n .filter(([id]) => !listed.has(id))\n .map(([id, stepId]) => ({\n id,\n name: names[id] ?? id,\n status: 'processing' as const,\n addedFor: stepId,\n })),\n ]\n}\n\n/** A document's processing status as the upload step shows it; unknown stays unknown. */\nexport function fileStatus(status: string | null | undefined): WorkflowRunnerFile['status'] {\n const s = status?.toLowerCase()\n if (!s) return undefined\n if (s === 'failed') return 'failed'\n if (s === 'completed' || s === 'empty' || s === 'low-content') return 'ready'\n return 'processing'\n}\n\n/** Who should approve: the workspace's people (not agents), notified about the run's thread. */\nfunction ReviewNotify({\n conversationId,\n workspaceId,\n labels,\n testId,\n}: {\n conversationId: string\n workspaceId: string | undefined\n labels: ConnectedWorkflowRunnerLabels\n testId: string\n}) {\n const arbi = useArbi()\n const { live, userId, ensureWorkspaceOpen } = useConnectedWorkspace()\n const { data: members = [] } = useWorkspaceUsers(workspaceId, {\n enabled: live && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const people = members.filter(\n (m) =>\n !m.agent_ext_id && !m.user.external_id.startsWith('agt-') && m.user.external_id !== userId\n )\n const [picked, setPicked] = useState<string[]>([])\n const [sent, setSent] = useState(false)\n const [busy, setBusy] = useState(false)\n if (people.length === 0) return null\n const toggle = (id: string) =>\n setPicked((p) => (p.includes(id) ? p.filter((x) => x !== id) : [...p, id]))\n\n return (\n <div className=\"space-y-3\" data-testid={`${testId}-notify`}>\n <div className=\"flex flex-wrap gap-1.5\">\n {people.map((m) => {\n const name =\n [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email\n const on = picked.includes(m.user.external_id)\n return (\n <button\n key={m.user.external_id}\n type=\"button\"\n onClick={() => toggle(m.user.external_id)}\n aria-pressed={on}\n className={cn(\n 'rounded-full border px-2.5 py-1 text-xs',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground'\n )}\n data-testid={`${testId}-person-${m.user.external_id}`}\n >\n {name}\n </button>\n )\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={!picked.length || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await arbi.conversations.notify(conversationId, picked)\n setSent(true)\n } finally {\n setBusy(false)\n }\n }}\n data-testid={`${testId}-notify-send`}\n >\n {labels.notify}\n </Button>\n {sent && <span className=\"text-xs text-muted-foreground\">{labels.notified}</span>}\n </div>\n </div>\n )\n}\n","/**\n * `TagTable` bound to the connection: every tag of a kind in the workspace (`kind=\"issue\"`: every\n * issue), or with `parentId` a label's children. The columns are the kind's fields in the\n * workspace (`useTagKindSchema`), edited in place and saved as the kind's schema\n * (`useUpdateTagKindSchema`); the rows are the tag list filtered by kind with links (`useTags`),\n * their cells saved with `useSetTagValues`. \"Add row\" creates a tag of the kind (issues, people\n * and organisations are flat: no parent). The workspace's people fill person columns, and the\n * snapshot is filed in the workspace as a Word document (`.docx`, so it opens in the Word editor;\n * its id goes to `onExported`, so a host can open it or send it for signature) or downloaded.\n */\n\nimport { useMemo, useState } from 'react'\nimport type { components } from '@arbidocs/client'\nimport {\n useArbi,\n useInvalidateTagData,\n useSetTagValues,\n useTagKindSchema,\n useTags,\n useUpdateTagKindSchema,\n useWorkspaceUsers,\n} from '@arbidocs/react'\nimport { TagTable, type TagTableProps } from '../tags/TagTable'\nimport { DOCX_MIME_TYPE, tagTableDocx } from '../tags/tagTableDocx'\nimport type { TagTableData } from '../tags/tagTableModel'\nimport { useConnection } from './ConnectionProvider'\n\n/** What a tag is: a label, annotation, search, issue, person or organisation. */\ntype TagKind = NonNullable<components['schemas']['TagResponse']['kind']>\n\n/** Kinds that are flat: their tags have no parent. */\nconst FLAT_KINDS: readonly TagKind[] = ['issue', 'person', 'organisation']\n\n/** The title of a table of a kind (its export's default title). */\nconst KIND_TITLES: Record<TagKind, string> = {\n label: 'Labels',\n annotation: 'Annotations',\n search: 'Searches',\n issue: 'Issues',\n person: 'People',\n organisation: 'Organisations',\n}\n\nexport interface ConnectedTagTableProps extends Pick<\n TagTableProps,\n | 'onOpenDocument'\n | 'onOpenFact'\n | 'onOpenThread'\n | 'onOpenRow'\n | 'actions'\n | 'labels'\n | 'className'\n | 'testId'\n> {\n /** The rows are the workspace's tags of this kind, oldest first; the columns its fields. */\n kind: TagKind\n /** Only this tag's children (a label hierarchy; flat kinds have none). */\n parentId?: string\n /** How many documents, facts and threads each row lists (the rest are counted). Default 3. */\n linksLimit?: number\n /** The exported document's title; default the kind's (\"Issues\", \"People\", …). */\n exportTitle?: string\n /** The snapshot was filed: its document id. Absent: no export button. */\n onExported?: (documentId: string) => void\n /** Offer the snapshot as a `.docx` download. Default true. */\n downloadable?: boolean\n /** Read only: no cell edits, no \"Add row\", no column changes. */\n readOnly?: boolean\n}\n\nexport function ConnectedTagTable({\n kind,\n parentId,\n linksLimit = 3,\n exportTitle,\n onExported,\n downloadable = true,\n readOnly,\n ...props\n}: ConnectedTagTableProps) {\n const arbi = useArbi()\n const { workspaceId, status, ensureWorkspaceOpen } = useConnection()\n const schema = useTagKindSchema(kind)\n const rows = useTags(workspaceId ?? undefined, {\n kind,\n ...(parentId ? { parentId } : {}),\n include: ['links'],\n linksLimit,\n })\n // An annotation or a search is defined with its format, not added by name.\n const canAddRows = !readOnly && kind !== 'annotation' && kind !== 'search'\n const setValues = useSetTagValues()\n const updateSchema = useUpdateTagKindSchema()\n const invalidate = useInvalidateTagData()\n const members = useWorkspaceUsers(workspaceId ?? undefined, {\n enabled: status === 'authenticated' && !!workspaceId,\n beforeFetch: ensureWorkspaceOpen,\n })\n const [error, setError] = useState<string | null>(null)\n const people = (members.data ?? []).map((m) => ({\n value: m.user.external_id,\n label: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n }))\n const table: TagTableData | undefined = useMemo(\n () => (schema.data && rows.data ? { columns: schema.data.fields, rows: rows.data } : undefined),\n [schema.data, rows.data]\n )\n const fail = (e: unknown) => setError(e instanceof Error ? e.message : String(e))\n /** The snapshot as a Word file named `<title> (<date>).docx`. */\n const snapshot = (data: TagTableData) => {\n const title = exportTitle ?? KIND_TITLES[kind]\n const bytes = tagTableDocx(data, {\n title,\n nameOf: (id) => people.find((p) => p.value === id)?.label,\n })\n const stamp = new Date().toISOString().slice(0, 10)\n const name = `${title.replace(/[\\\\/:*?\"<>|]+/g, '-')} (${stamp}).docx`\n return { blob: new Blob([bytes as BlobPart], { type: DOCX_MIME_TYPE }), name }\n }\n\n return (\n <div className=\"space-y-2\">\n <TagTable\n {...props}\n table={table}\n isLoading={schema.isLoading || rows.isLoading}\n people={people}\n onChangeValue={\n readOnly\n ? undefined\n : async (tagId, fieldId, value) => {\n setError(null)\n await setValues.mutateAsync({ tagId, values: { [fieldId]: value } }).catch(fail)\n }\n }\n onChangeColumns={\n readOnly\n ? undefined\n : async (fields) => {\n setError(null)\n await ensureWorkspaceOpen()\n // A refusal (two columns of one name, a type change) stays on screen.\n await updateSchema.mutateAsync({ kind, fields }).catch((e: unknown) => {\n fail(e)\n throw e\n })\n }\n }\n onAddRow={\n !canAddRows\n ? undefined\n : async (name) => {\n setError(null)\n try {\n await ensureWorkspaceOpen()\n await arbi.tags.create({\n name,\n kind,\n ...(parentId && !FLAT_KINDS.includes(kind) ? { parentId } : {}),\n })\n await invalidate()\n } catch (e) {\n fail(e)\n }\n }\n }\n onExport={\n onExported && table\n ? async () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n await ensureWorkspaceOpen()\n const uploaded = await arbi.documents.uploadFile(blob, name)\n const id = uploaded?.doc_ext_ids?.[0]\n if (id) onExported(id)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n onDownload={\n downloadable && table\n ? () => {\n setError(null)\n try {\n const { blob, name } = snapshot(table)\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n document.body.appendChild(link)\n link.click()\n link.remove()\n // Revoke after the click is handled: some browsers cancel the download otherwise.\n setTimeout(() => URL.revokeObjectURL(url), 0)\n } catch (e) {\n fail(e)\n }\n }\n : undefined\n }\n />\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","import {\n useShellWorkspaces,\n useWorkspaces,\n type ShellWorkspaceSource,\n type UseShellWorkspacesOptions,\n type UseShellWorkspacesResult,\n} from '@arbidocs/react'\nimport { useConnection } from './ConnectionProvider'\n\nexport type UseConnectedShellWorkspacesOptions = Omit<\n UseShellWorkspacesOptions,\n 'workspaces' | 'isLoading' | 'loadError' | 'selectedId' | 'select'\n>\n\n/**\n * `useShellWorkspaces` wired to the connection layer: the account's live workspaces, the\n * connection's single selection as the active workspace, and `open` = `setWorkspace` (opens it on\n * the server, remembers it for the next login) then `onOpened`.\n *\n * ```tsx\n * const { active, recent, open } = useConnectedShellWorkspaces({\n * seed: { workspaces: demoWorkspaces, activeId: 'demo-1' },\n * onOpened: () => navigate('/app/documents'),\n * })\n * ```\n */\nexport function useConnectedShellWorkspaces(\n options: UseConnectedShellWorkspacesOptions = {}\n): UseShellWorkspacesResult {\n const { workspaceId, setWorkspace } = useConnection()\n const query = useWorkspaces()\n return useShellWorkspaces({\n ...options,\n workspaces: Array.isArray(query.data) ? (query.data as ShellWorkspaceSource[]) : undefined,\n isLoading: query.isLoading,\n loadError: query.error,\n selectedId: workspaceId,\n select: (workspace) => setWorkspace(workspace.id),\n })\n}\n","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 * `ConnectionProvider` provides one over the SDK; a host with its own session and API client\n * mounts its own `AccountClientProvider` (as ARBI-frontend does), and these sections work alike.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { KeyRound, Radio, UserCircle } from 'lucide-react'\nimport {\n ImageCropModal,\n useAvatarCrop,\n useConfirmEmailChange,\n useCurrentSessionId,\n useDeleteAccount,\n useDeleteAccountFlow,\n useEmailChange,\n useIdentityVerification,\n useNameEditor,\n useNotificationPreferences,\n usePasswordChange,\n usePasswordChangeForm,\n useProfile,\n useRequestEmailChange,\n useSessions,\n useSignOut,\n useTerminateSession,\n useUpdateProfile,\n type AvatarFileProblem,\n} from '@arbidocs/react'\nimport { useIsOnline } from '@arbidocs/react/document-tools'\nimport { Button, type IdentityStatus } from '@arbidocs/react/ui'\nimport { initials } from '../lib/format'\nimport { AvatarPicker } from '../settings/AvatarPicker'\nimport { ProfileCard } from '../settings/ProfileCard'\nimport {\n IdentityVerificationCard,\n IdentityVerificationDialog,\n RequireVerified,\n type IdentityVerificationLabels,\n} from '../settings/IdentityVerification'\nimport {\n SettingsActionRow,\n SettingsCard,\n SettingsDangerZone,\n SettingsRow,\n SettingsSection,\n} from '../settings/SettingsPanel'\nimport { PasswordChangeDialog } from '../settings/PasswordChangeDialog'\nimport { ActiveSessionsDialog, DeleteAccountDialog } from '../settings/AccountDialogs'\nimport { LogoutDialog } from '../settings/LogoutDialog'\nimport { NotificationCategoryList } from '../settings/NotificationCategoryList'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { 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 /** Section heading; default `Profile`. */\n title?: ReactNode\n /** Classes of the initials avatar shown without a picture (e.g. the host's per-user colour). */\n avatarClassName?: string\n /** More of the section under the card (e.g. `ConnectedIdentityVerification`). */\n children?: ReactNode\n}\n\n/** Avatar, editable name and email change of the signed-in user (`ProfileCard`). */\nexport function ConnectedProfileCard({\n title = 'Profile',\n avatarClassName = 'bg-primary text-primary-foreground',\n children,\n}: ConnectedProfileCardProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const updateProfile = useUpdateProfile()\n const requestEmailChange = useRequestEmailChange()\n const confirmEmailChange = useConfirmEmailChange()\n\n const name = useNameEditor({\n givenName: profile?.givenName,\n familyName: profile?.familyName,\n save: async (next) => {\n try {\n await updateProfile.mutateAsync(next)\n notify('Name updated', 'success')\n } catch (e) {\n notify('Failed to update name', 'error')\n throw e\n }\n },\n })\n const avatar = useAvatarCrop({\n upload: async (picture) => {\n try {\n await updateProfile.mutateAsync({ picture })\n notify('Profile picture updated', 'success')\n } catch (e) {\n notify('Failed to update picture', 'error')\n throw e\n }\n },\n onProblem: (problem) => notify(AVATAR_PROBLEMS[problem], 'error'),\n })\n const email = useEmailChange({\n requestCode: async (address) => {\n try {\n await requestEmailChange.mutateAsync(address)\n notify('Verification code sent to your new email', 'success')\n } catch (e) {\n notify(errorText(e, 'Failed to send verification code'), 'error')\n throw e\n }\n },\n confirm: async (args) => {\n try {\n await confirmEmailChange.mutateAsync(args)\n notify('Email address updated', 'success')\n } catch (e) {\n notify(errorText(e, 'Invalid or expired verification code'), 'error')\n throw e\n }\n },\n })\n\n const display = profile?.fullName || 'Unnamed'\n return (\n <SettingsSection icon={<UserCircle />} title={title}>\n <ProfileCard\n avatar={\n <>\n <AvatarPicker\n pictureUrl={profile?.picture}\n initials={initials(display)}\n fallbackClassName={avatarClassName}\n isUploading={avatar.isUploading}\n onFileChosen={avatar.onFileChosen}\n />\n <ImageCropModal\n open={avatar.pendingImage !== null}\n image={avatar.pendingImage}\n title=\"Crop your photo\"\n aspect={1}\n cropShape=\"round\"\n output={{ maxSize: 128, mimeType: 'image/jpeg', quality: 0.85 }}\n onComplete={avatar.onCropComplete}\n onCancel={avatar.onCropCancel}\n />\n </>\n }\n name={{ ...name, display, isSaving: name.isSaving }}\n email={profile?.email ?? ''}\n isSso={profile?.isSso ?? false}\n isVerified={profile?.isIdentityVerified ?? false}\n onStartEmailChange={email.onStart}\n emailChange={email.isOpen ? email : undefined}\n />\n {children}\n </SettingsSection>\n )\n}\n\n// ── Identity verification ───────────────────────────────────────────────────\n\nexport interface ConnectedIdentityVerificationProps {\n labels?: Partial<IdentityVerificationLabels>\n /** Open the host's billing (card, plan) when the fee cannot be charged. */\n onManageBilling?: () => void\n /** The host's price format; default `formatIdentityPrice`. */\n formatPrice?: (status: IdentityStatus) => string\n}\n\n/** The ID check card and its dialog, bound to the account. Renders nothing when not offered. */\nexport function ConnectedIdentityVerification({\n labels,\n onManageBilling,\n formatPrice,\n}: ConnectedIdentityVerificationProps) {\n const { notify } = useBlocksEnvironment()\n const { data: profile } = useProfile()\n const flow = useIdentityVerification({\n formatPrice,\n onVerifiedChange: (verified) =>\n notify(verified ? 'Identity verified' : 'Verified tick removed', 'success'),\n onNameAccepted: () => notify('Name updated to match your ID', 'success'),\n })\n return (\n <>\n <IdentityVerificationCard flow={flow} labels={labels} onManageBilling={onManageBilling} />\n <IdentityVerificationDialog\n flow={flow}\n accountName={profile?.fullName ?? ''}\n labels={labels}\n onManageBilling={onManageBilling}\n />\n </>\n )\n}\n\nexport interface ConnectedRequireVerifiedProps {\n children?: ReactNode\n labels?: Partial<IdentityVerificationLabels>\n}\n\n/** `RequireVerified` bound to the SDK: gates `children` when the deployment requires an ID check. */\nexport function ConnectedRequireVerified({ children, labels }: ConnectedRequireVerifiedProps) {\n const { data: profile } = useProfile()\n const flow = useIdentityVerification()\n return (\n <RequireVerified flow={flow} accountName={profile?.fullName ?? ''} labels={labels}>\n {children}\n </RequireVerified>\n )\n}\n\n// ── Security: password ──────────────────────────────────────────────────────\n\n/** The default password policy: 8 characters, an uppercase letter or symbol, a digit. */\nexport function defaultUnmetPasswordRequirement(password: string): string | null {\n if (password.length < 8) return 'Minimum 8 characters'\n if (!/[A-Z!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)) {\n return 'At least one uppercase letter or special character'\n }\n if (!/[0-9]/.test(password)) return 'At least one number'\n return null\n}\n\nexport interface ConnectedPasswordChangeDialogProps {\n open: boolean\n onClose: () => void\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** After signing in with a recovery key: set a new password, no current one asked for. */\n recoveryMode?: boolean\n /** Recovery finished: continue into the app (recovery closes itself, with no success screen). */\n onRecoveryComplete?: () => void\n}\n\n/** Change (or, in recovery mode, set) the master password (`PasswordChangeDialog`). */\nexport function ConnectedPasswordChangeDialog({\n open,\n onClose,\n getUnmetRequirement = defaultUnmetPasswordRequirement,\n recoveryMode = false,\n onRecoveryComplete,\n}: ConnectedPasswordChangeDialogProps) {\n const { notify } = useBlocksEnvironment()\n const change = usePasswordChange()\n const form = usePasswordChangeForm({\n recoveryMode,\n getUnmetRequirement,\n submit: async (vars) => {\n await change.mutateAsync(vars)\n notify(\n recoveryMode\n ? 'Account recovered and password set successfully'\n : 'Password changed successfully',\n 'success'\n )\n },\n onClose,\n onRecoveryComplete,\n })\n return (\n <PasswordChangeDialog\n open={open}\n onClose={form.onCancel}\n recoveryMode={recoveryMode}\n currentPassword={form.currentPassword}\n onCurrentPasswordChange={form.onCurrentPasswordChange}\n newPassword={form.newPassword}\n onNewPasswordChange={form.onNewPasswordChange}\n confirmPassword={form.confirmPassword}\n onConfirmPasswordChange={form.onConfirmPasswordChange}\n getUnmetRequirement={getUnmetRequirement}\n error={form.error}\n isProcessing={form.isProcessing}\n isSubmitDisabled={form.isSubmitDisabled}\n onSubmit={form.onSubmit}\n isChanged={form.isChanged}\n onDone={form.onDone}\n />\n )\n}\n\nexport interface ConnectedSecuritySectionProps {\n /** The host's password policy; default is {@link defaultUnmetPasswordRequirement}. */\n getUnmetRequirement?: (password: string) => string | null\n /** Extra rows under \"Change password\" (e.g. \"Save recovery key\"). */\n children?: ReactNode\n}\n\n/** The Security card: \"Change password\" and the dialog behind it. */\nexport function ConnectedSecuritySection({\n getUnmetRequirement,\n children,\n}: ConnectedSecuritySectionProps) {\n const [open, setOpen] = useState(false)\n return (\n <SettingsSection icon={<KeyRound />} title=\"Security\">\n <SettingsCard padding=\"sm\">\n <SettingsActionRow\n title=\"Change password\"\n description=\"Used to sign in and to unlock your account key. Changing it keeps everything readable and re-encrypts nothing.\"\n onClick={() => setOpen(true)}\n testId=\"change-password-button\"\n />\n {children}\n </SettingsCard>\n <ConnectedPasswordChangeDialog\n open={open}\n onClose={() => setOpen(false)}\n getUnmetRequirement={getUnmetRequirement}\n />\n </SettingsSection>\n )\n}\n\n// ── Notifications ───────────────────────────────────────────────────────────\n\nexport interface ConnectedNotificationPreferencesProps {\n /** Categories to offer; default {@link EMAIL_NOTIFICATION_CATEGORIES}. */\n categories?: readonly EmailNotificationCategoryDef[]\n title?: ReactNode\n}\n\n/** The email-notification switches (`NotificationCategoryList`) over the user settings. */\nexport function ConnectedNotificationPreferences({\n categories = EMAIL_NOTIFICATION_CATEGORIES,\n title = 'Notifications',\n}: ConnectedNotificationPreferencesProps) {\n const keys = useMemo(\n () =>\n categories === EMAIL_NOTIFICATION_CATEGORIES\n ? EMAIL_NOTIFICATION_KEYS\n : categories.map((c) => c.key),\n [categories]\n )\n const prefs = useNotificationPreferences(keys)\n return (\n <SettingsSection title={title}>\n <SettingsCard className=\"space-y-0\">\n <NotificationCategoryList\n masterId=\"emailNotifications\"\n masterTitle=\"Email Notifications\"\n masterDescription=\"Email me about activity when I’m away\"\n masterChecked={prefs.masterChecked}\n onMasterChange={prefs.setAll}\n categories={toNotificationCategories(prefs.checked, categories)}\n onCategoryChange={prefs.setCategory}\n />\n </SettingsCard>\n </SettingsSection>\n )\n}\n\n// ── Sessions ────────────────────────────────────────────────────────────────\n\nexport interface ConnectedSessionsRowProps {\n /** Glyph per session status; 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 /** Offer \"All sessions\"; default true (e.g. false for agent accounts). */\n canLogoutAll?: boolean\n /**\n * Ask before signing out (e.g. unsent work kept only on this device); resolve `false` to stay\n * signed in. Default: sign out at once.\n */\n confirmSignOut?: () => Promise<boolean> | boolean\n /** 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 canLogoutAll = true,\n confirmSignOut,\n renderSessionIcon = renderSessionStatusIcon,\n}: ConnectedLogoutDialogProps) {\n const sessions = useSessions({ enabled: open })\n const signOut = useSignOut()\n const isOnline = useIsOnline()\n const run = async (everywhere: boolean) => {\n onClose()\n if (confirmSignOut && !(await confirmSignOut())) return\n signOut.mutate({ everywhere, reason: 'manual' })\n }\n return (\n <LogoutDialog\n open={open}\n onClose={onClose}\n onLogoutThis={() => void run(false)}\n onLogoutAll={() => void run(true)}\n canLogoutAll={canLogoutAll}\n isOnline={isOnline}\n sessions={toLogoutSessionViews(sessions.data ?? [])}\n renderSessionIcon={renderSessionIcon}\n />\n )\n}\n\n// ── Danger zone ─────────────────────────────────────────────────────────────\n\nexport interface ConnectedDangerZoneProps {\n /** Link to the billing page for a deletion blocked by an active subscription. */\n renderSubscriptionLink?: () => ReactNode\n}\n\n/** \"Delete your account\": the collapsed danger zone and the two-step dialog (`DeleteAccountDialog`). */\nexport function ConnectedDangerZone({ renderSubscriptionLink }: ConnectedDangerZoneProps) {\n const { notify } = useBlocksEnvironment()\n const [zoneOpen, setZoneOpen] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const { data: profile } = useProfile()\n const userEmail = profile?.email ?? ''\n const remove = useDeleteAccount()\n const signOut = useSignOut()\n const flow = useDeleteAccountFlow({\n userEmail,\n remove: () => remove.mutateAsync(),\n onClose: () => setDialogOpen(false),\n onDeleted: () => signOut.mutate({ reason: 'account-deleted' }),\n onError: () => notify('Failed to delete account. Please try again.', 'error'),\n })\n return (\n <>\n <SettingsDangerZone\n isOpen={zoneOpen}\n onToggle={() => setZoneOpen((o) => !o)}\n title=\"Delete your account\"\n description=\"Once deleted, your account will be immediately closed and you will be logged out. This action cannot be undone.\"\n action={\n <Button\n variant=\"destructive\"\n size=\"sm\"\n disabled={!userEmail}\n onClick={() => setDialogOpen(true)}\n data-testid=\"delete-account-button\"\n >\n Delete Account\n </Button>\n }\n />\n <DeleteAccountDialog\n open={dialogOpen}\n onClose={flow.onClose}\n step={flow.step}\n blockers={toDeleteBlockerViews(flow.blockers, renderSubscriptionLink)}\n onContinue={flow.onContinue}\n onBack={flow.onBack}\n userEmail={userEmail}\n confirmEmail={flow.confirmEmail}\n onConfirmEmailChange={flow.onConfirmEmailChange}\n isDeleting={flow.isDeleting}\n onSubmit={flow.onSubmit}\n />\n </>\n )\n}\n","/**\n * The Account section of a settings page, bound to the signed-in account: profile and ID check,\n * security, the session card (server connection, active sessions, sign out) and the danger zone.\n * What only the host knows is a prop: the recovery-key download, its admin links, its socket and\n * its billing page.\n */\nimport { useState, type ReactNode } from 'react'\nimport { LogOut, Wifi } from 'lucide-react'\nimport type { IdentityStatus } from '@arbidocs/react/ui'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport {\n SettingsCard,\n SettingsPanel,\n SettingsRow,\n SettingsSection,\n} from '../../settings/SettingsPanel'\nimport {\n ServerConnectionButton,\n serverConnectionView,\n type ServerConnectionStatus,\n} from '../../settings/ServerConnectionControls'\nimport {\n ConnectedDangerZone,\n ConnectedIdentityVerification,\n ConnectedLogoutDialog,\n ConnectedProfileCard,\n ConnectedSecuritySection,\n ConnectedSessionsRow,\n} from '../ConnectedSettings'\n\nexport interface ConnectedServerConnection extends ServerConnectionStatus {\n /** Refresh the session (re-authenticate, reconnect); the button spins until it settles. */\n onRefresh: () => Promise<unknown>\n}\n\nexport interface ConnectedAccountSettingsProps {\n /** Classes of the initials avatar shown without a picture (e.g. the host's per-user colour). */\n avatarClassName?: string\n /** Open the host's billing when the ID-check fee cannot be charged. */\n onManageBilling?: () => void\n /** The ID-check price format. */\n formatIdentityPrice?: (status: IdentityStatus) => string\n /** Sections between Profile and Security (e.g. a link to the host's admin portal). */\n afterProfile?: ReactNode\n /** The host's password policy. */\n getUnmetPasswordRequirement?: (password: string) => string | null\n /** More Security rows under \"Change password\" (e.g. \"Save recovery key\"). */\n securityRows?: ReactNode\n /** The server-connection row; none when the host has no live connection to show. */\n connection?: ConnectedServerConnection\n /** Sign out through the host's own dialog. Default: the built-in `ConnectedLogoutDialog`. */\n onLogout?: () => void\n renderSessionIcon?: (status: string) => ReactNode\n /** Link to the billing page for a deletion blocked by an active subscription. */\n renderSubscriptionLink?: () => ReactNode\n}\n\nfunction ServerConnectionRow({ onRefresh, ...status }: ConnectedServerConnection) {\n const { runtimeConfig } = useBlocksEnvironment()\n const [isRefreshing, setIsRefreshing] = useState(false)\n const view = serverConnectionView(status, runtimeConfig.deploymentDomain || 'server')\n const refresh = async () => {\n setIsRefreshing(true)\n try {\n await onRefresh()\n } finally {\n setIsRefreshing(false)\n }\n }\n return (\n <SettingsRow label=\"Server connection\" description={view.description}>\n <ServerConnectionButton\n state={view.state}\n label={view.label}\n isRefreshing={isRefreshing}\n onRefresh={() => void refresh()}\n />\n </SettingsRow>\n )\n}\n\nexport function ConnectedAccountSettings({\n avatarClassName,\n onManageBilling,\n formatIdentityPrice,\n afterProfile,\n getUnmetPasswordRequirement,\n securityRows,\n connection,\n onLogout,\n renderSessionIcon,\n renderSubscriptionLink,\n}: ConnectedAccountSettingsProps) {\n const [logoutOpen, setLogoutOpen] = useState(false)\n return (\n <SettingsPanel className=\"max-w-2xl\">\n <ConnectedProfileCard avatarClassName={avatarClassName}>\n <ConnectedIdentityVerification\n onManageBilling={onManageBilling}\n formatPrice={formatIdentityPrice}\n />\n </ConnectedProfileCard>\n\n {afterProfile}\n\n <ConnectedSecuritySection getUnmetRequirement={getUnmetPasswordRequirement}>\n {securityRows}\n </ConnectedSecuritySection>\n\n <SettingsSection icon={<Wifi />} title=\"Session\">\n <SettingsCard>\n {connection && <ServerConnectionRow {...connection} />}\n <ConnectedSessionsRow renderSessionIcon={renderSessionIcon} />\n <SettingsRow label=\"Logout\" description=\"Sign out of your account on this device.\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onLogout ?? (() => setLogoutOpen(true))}\n className=\"flex items-center gap-2\"\n data-testid=\"logout-button\"\n >\n <LogOut className=\"w-4 h-4\" />\n Logout\n </Button>\n </SettingsRow>\n </SettingsCard>\n </SettingsSection>\n\n <ConnectedDangerZone renderSubscriptionLink={renderSubscriptionLink} />\n\n {!onLogout && (\n <ConnectedLogoutDialog\n open={logoutOpen}\n onClose={() => setLogoutOpen(false)}\n renderSessionIcon={renderSessionIcon}\n />\n )}\n </SettingsPanel>\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useConnectMailAccount,\n useDisconnectMailAccount,\n useMailClient,\n useMailOnline,\n type MailAccount,\n type MailPolicy,\n} from '@arbidocs/react'\n\n/** Whose names suggest the native address (`given.family`). */\nexport interface MailAliasUser {\n given_name?: string | null\n family_name?: string | null\n}\n\nexport interface ConnectedMailAccountsProps {\n policy: MailPolicy\n accounts: MailAccount[]\n onClose: () => void\n /** Render in place (e.g. a settings page) instead of a dialog. */\n embedded?: boolean\n user?: MailAliasUser | null\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** Extra settings under the accounts (e.g. keeping mail on this device). */\n settings?: ReactNode\n}\n\n/** Choose the native address, connect or remove external mailboxes. */\nexport function ConnectedMailAccounts({\n policy,\n accounts,\n onClose,\n embedded = false,\n user,\n oauthReturnPath,\n settings,\n}: ConnectedMailAccountsProps) {\n const { client } = useMailClient()\n const [profileId, setProfileId] = useState(policy.server_profiles[0]?.id ?? '')\n const [email, setEmail] = useState('')\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [error, setError] = useState('')\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const native = useClaimNativeAlias(onClose)\n const isOnline = useMailOnline()\n // Account changes go to the server; offline they are unavailable, and the note says why.\n const offline = !isOnline\n const onNativeError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n const connect = useConnectMailAccount()\n const disconnect = useDisconnectMailAccount()\n const authorizeOAuth = client.authorizeOAuth\n const oauth = async (vendor: string) => {\n if (!authorizeOAuth) return\n try {\n window.location.assign(\n await authorizeOAuth(\n vendor,\n oauthReturnPath ?? `${window.location.pathname}${window.location.search}`\n )\n )\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not connect account')\n }\n }\n const content = (\n <>\n {offline && (\n <p\n role=\"status\"\n className=\"mb-4 rounded bg-muted/40 px-3 py-2 text-sm text-muted-foreground\"\n >\n {\"You're offline. Creating, connecting or removing accounts needs a connection.\"}\n </p>\n )}\n {policy.native_enabled && !accounts.some((a) => a.provider === 'native') && (\n <form\n className=\"mb-5 grid gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n native.mutate(alias, { onError: onNativeError })\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Choose your email address\n <div className=\"flex items-center gap-2\">\n <input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n className=\"min-w-0 flex-1 rounded border bg-background p-2\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span>@{policy.native_domain}</span>\n </div>\n </label>\n <Button disabled={native.isPending || offline} type=\"submit\">\n Create inbox\n </Button>\n </form>\n )}\n <p className=\"mb-4 text-sm text-muted-foreground\">\n Connect an account using the providers enabled by your administrator.\n </p>\n {authorizeOAuth && (\n <div className=\"mb-4 flex flex-wrap gap-2\">\n {policy.oauth_providers.map((vendor) => (\n <Button\n key={vendor}\n variant=\"outline\"\n disabled={offline}\n onClick={() => void oauth(vendor)}\n >\n Connect {vendor === 'microsoft' ? 'Outlook' : 'Gmail'}\n </Button>\n ))}\n </div>\n )}\n {accounts.map((account) => (\n <div\n key={account.id}\n className=\"mb-2 flex items-center justify-between gap-2 rounded border p-3 text-sm\"\n >\n <div>\n <div>{account.email}</div>\n <div className=\"text-muted-foreground\">{account.display_name}</div>\n </div>\n {account.profile_id ? (\n <Button\n variant=\"ghost\"\n disabled={disconnect.isPending || offline}\n onClick={() =>\n disconnect.mutate(account.id, { onError: (err: Error) => setError(err.message) })\n }\n >\n Disconnect\n </Button>\n ) : account.provider !== 'native' ? (\n authorizeOAuth && (\n <Button\n variant=\"ghost\"\n disabled={offline}\n onClick={() => void oauth(account.provider)}\n >\n Reconnect\n </Button>\n )\n ) : (\n <span className=\"text-muted-foreground\">Native inbox</span>\n )}\n </div>\n ))}\n {policy.server_profiles.length > 0 && (\n <form\n className=\"mt-5 grid gap-3\"\n onSubmit={(event) => {\n event.preventDefault()\n setError('')\n connect.mutate(\n { profileId, email, username, password },\n {\n onSuccess: () => {\n setPassword('')\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }}\n >\n <label className=\"grid gap-1 text-sm\">\n Mail server\n <select\n aria-label=\"Mail server\"\n className=\"rounded border bg-background p-2\"\n value={profileId}\n onChange={(e) => setProfileId(e.target.value)}\n >\n {policy.server_profiles.map((profile) => (\n <option key={profile.id} value={profile.id}>\n {profile.name}\n </option>\n ))}\n </select>\n </label>\n <label className=\"grid gap-1 text-sm\">\n Email address\n <input\n required\n type=\"email\"\n autoComplete=\"email\"\n className=\"rounded border bg-background p-2\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Username\n <input\n placeholder=\"Same as email address\"\n autoComplete=\"username\"\n className=\"rounded border bg-background p-2\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </label>\n <label className=\"grid gap-1 text-sm\">\n Password or app password\n <input\n required\n type=\"password\"\n autoComplete=\"current-password\"\n className=\"rounded border bg-background p-2\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n </label>\n <Button type=\"submit\" disabled={connect.isPending || offline}>\n {connect.isPending ? 'Connecting…' : 'Connect mailbox'}\n </Button>\n </form>\n )}\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {accounts.length > 0 && settings}\n </>\n )\n if (embedded) return <div className=\"max-w-2xl\">{content}</div>\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n >\n <DialogContent className=\"max-h-[90dvh] max-w-lg overflow-auto\">\n <DialogTitle>Mail accounts</DialogTitle>\n <DialogDescription>\n Choose your email address or connect an external mailbox.\n </DialogDescription>\n {content}\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The Mail section of a settings page: the native address and the connected mailboxes\n * (`ConnectedMailAccounts`, in place). Answered from the device when offline, like the mailbox,\n * so the section never hangs on \"Loading mail accounts…\" without a connection.\n */\nimport type { ReactNode } from 'react'\nimport { useMailAccounts, useMailPolicy, useProfile } from '@arbidocs/react'\nimport { ConnectedMailAccounts } from '../mail/ConnectedMailAccounts'\n\nexport interface ConnectedMailSettingsProps {\n /** Where a provider's OAuth returns after connecting a mailbox. Default: the current page. */\n oauthReturnPath?: string\n /** More settings under the accounts (e.g. keeping mail on this device). */\n settings?: ReactNode\n}\n\nconst noop = () => {}\n\nexport function ConnectedMailSettings({ oauthReturnPath, settings }: ConnectedMailSettingsProps) {\n const { data: policy } = useMailPolicy()\n const accounts = useMailAccounts({ enabled: !!policy?.enabled })\n const { data: profile } = useProfile()\n if (accounts.isError) {\n return <p className=\"text-sm text-muted-foreground\">{accounts.error.message}</p>\n }\n if (!policy || !accounts.isSuccess) return <p>Loading mail accounts…</p>\n return (\n <ConnectedMailAccounts\n // The suggested address comes from the name: start again once the profile is in.\n key={profile ? 'named' : 'unnamed'}\n embedded\n policy={policy}\n accounts={accounts.data}\n user={profile && { given_name: profile.givenName, family_name: profile.familyName }}\n oauthReturnPath={oauthReturnPath}\n settings={settings}\n onClose={noop}\n />\n )\n}\n","/**\n * The Privacy section of a settings page, over the user settings: whether others see you online,\n * the host's own privacy rows, \"Reset tips\", and the email notifications.\n */\nimport type { ReactNode } from 'react'\nimport { RotateCcw } from 'lucide-react'\nimport { useUpdateUserSettings, useUserSettings } from '@arbidocs/react'\nimport { Button, Switch } from '@arbidocs/react/ui'\nimport {\n SettingsCard,\n SettingsPanel,\n SettingsRow,\n SettingsSection,\n} from '../../settings/SettingsPanel'\nimport { ConnectedNotificationPreferences } from '../ConnectedSettings'\n\nexport interface ConnectedPrivacySettingsProps {\n /** More rows after \"Show Online Status\" (e.g. the host's remote-control switch). */\n rows?: ReactNode\n /** Offer \"Reset tips\" (the host shows tips the user can hide with \"don't show again\"). */\n showTipsReset?: boolean\n}\n\nexport function ConnectedPrivacySettings({\n rows,\n showTipsReset = false,\n}: ConnectedPrivacySettingsProps) {\n const { data: settings } = useUserSettings()\n const update = useUpdateUserSettings()\n const hideOnlineStatus = settings?.hide_online_status ?? false\n const dismissedTips = settings?.dismissed_tips ?? []\n return (\n <SettingsPanel className=\"max-w-2xl\">\n <SettingsSection title=\"Privacy and tips\">\n <SettingsCard>\n <SettingsRow\n label=\"Show Online Status\"\n labelFor=\"showOnlineStatus\"\n description=\"When on, other users can see when you're online\"\n >\n {/* Framed positively (on = visible); the setting is `hide_online_status`. */}\n <Switch\n id=\"showOnlineStatus\"\n checked={!hideOnlineStatus}\n onCheckedChange={(value) => update.mutate({ hide_online_status: !value })}\n data-testid=\"toggle-show-online-status\"\n />\n </SettingsRow>\n\n {rows}\n\n {showTipsReset && (\n <SettingsRow\n label=\"Hidden tips\"\n description=\"Restore any Smart Tips you’ve hidden with “don’t show again”.\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => update.mutate({ dismissed_tips: [] })}\n disabled={dismissedTips.length === 0}\n className=\"gap-1.5\"\n data-testid=\"reset-tips-button\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n Reset tips\n </Button>\n </SettingsRow>\n )}\n </SettingsCard>\n </SettingsSection>\n\n <ConnectedNotificationPreferences />\n </SettingsPanel>\n )\n}\n","/**\n * Premium models over the user settings: a switch and a radio-style table of the deployment's\n * premium (third-party) models, with the ARBI-hosted Standard models as one greyed reference row.\n * Renders nothing when the deployment offers no premium model.\n *\n * `premium_model` is `''` when Premium is off and a model name when it is on. Unset is ON with\n * the deployment's default premium model (as the server reads it), so the table shows that row.\n * Turning Premium on picks the cheapest model by output cost; a click on the selected row does\n * not deselect it (only the switch turns Premium off).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ColDef } from 'ag-grid-community'\nimport type { components } from '@arbidocs/client'\nimport {\n ProviderIcon,\n formatGbpPerMillionTokens,\n useAvailableModels,\n useUpdateUserSettings,\n useUserSettings,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { GridView } from '../../files/GridView'\nimport { SettingsCard, SettingsPanel, SettingsSection } from '../../settings/SettingsPanel'\nimport { ModelProviderLabel, PremiumModelsFrame } from '../../settings/PremiumModelsFrame'\n\ntype ModelInfo = components['schemas']['ModelInfo']\n\nconst PROVIDER_NAMES: Record<string, string> = {\n openai: 'OpenAI',\n fireworks_ai: 'Fireworks AI',\n 'vertex_ai-language-models': 'Google',\n vertex_ai: 'Google',\n gemini: 'Google',\n anthropic: 'Anthropic',\n}\n\nconst isStandard = (model: Pick<ModelInfo, 'tags'> | undefined) =>\n !!model?.tags?.includes('Standard')\n\n/** The merged cost column's header, \"£/MT in-out\" (AG Grid keeps its sort arrow around it). */\nfunction PremiumCostHeader() {\n return <span className=\"flex items-center gap-0.5\">£/MT in-out</span>\n}\n\n/** The cheapest model by output-token cost (unknown costs last). */\nfunction cheapest(models: readonly ModelInfo[]): ModelInfo | undefined {\n return [...models].sort((a, b) => {\n const ao = a.output_cost_per_token\n const bo = b.output_cost_per_token\n if (ao == null && bo == null) return 0\n if (ao == null) return 1\n if (bo == null) return -1\n return ao - bo\n })[0]\n}\n\nconst COLUMNS: ColDef<ModelInfo>[] = [\n {\n colId: 'model_name',\n headerName: 'Model',\n field: 'model_name',\n flex: 2,\n minWidth: 130,\n tooltipField: 'model_name',\n },\n {\n colId: 'provider',\n headerName: 'Provider',\n field: 'provider',\n flex: 1,\n minWidth: 120,\n cellRenderer: (params: { value?: string; data?: ModelInfo }) =>\n isStandard(params.data) ? (\n <ModelProviderLabel\n logo={<img src=\"/favicon.svg\" alt=\"ARBI\" className=\"size-3.5 flex-shrink-0 rounded-sm\" />}\n >\n ARBI CITY\n </ModelProviderLabel>\n ) : (\n <ModelProviderLabel\n logo={\n <ProviderIcon modelName={params.data?.model_name} provider={params.value} size={14} />\n }\n >\n {PROVIDER_NAMES[params.value ?? ''] || params.value || '—'}\n </ModelProviderLabel>\n ),\n },\n {\n // Input and output cost in one column so the table fits the panel; sorted by output cost.\n colId: 'cost',\n headerName: 'Cost / MTok',\n headerComponentParams: { innerHeaderComponent: PremiumCostHeader },\n headerTooltip: '£ per million tokens — input then output',\n field: 'output_cost_per_token',\n flex: 1,\n minWidth: 120,\n type: 'rightAligned',\n cellRenderer: (params: { data?: ModelInfo }) => (\n <span className=\"tabular-nums\">\n {formatGbpPerMillionTokens(params.data?.input_cost_per_token) ?? '£0'}-\n {formatGbpPerMillionTokens(params.data?.output_cost_per_token) ?? '£0'}\n </span>\n ),\n },\n]\n\nexport function ConnectedPremiumModels() {\n const { notify } = useBlocksEnvironment()\n const { data: settings } = useUserSettings()\n const update = useUpdateUserSettings()\n const { data: available } = useAvailableModels()\n const isDeveloper = settings?.developer === true\n\n const premiumModel = settings?.premium_model\n const premiumModels = useMemo(\n () =>\n (available?.models ?? []).filter(\n (m) => m.tags?.includes('Premium') && (isDeveloper || !m.model_name.includes('@'))\n ),\n [available, isDeveloper]\n )\n // The Standard models share one rate: one reference row, never selectable.\n const rows = useMemo(() => {\n const standards = (available?.models ?? []).filter(isStandard)\n if (standards.length === 0) return premiumModels\n const reference = {\n ...standards[0],\n model_name: `Standard (${standards.map((m) => m.model_name).join(', ')})`,\n }\n return [reference, ...premiumModels]\n }, [available, premiumModels])\n const current = premiumModel ?? available?.premium_default ?? ''\n\n const save = useCallback(\n (model: string) =>\n update.mutate(\n { premium_model: model },\n {\n onError: (err) => notify(`Failed to update Premium setting: ${String(err)}`, 'error'),\n }\n ),\n [update, notify]\n )\n\n // A stable selection: recomputed when the selected name changes, not on every refetch.\n const currentRef = useRef(current)\n currentRef.current = current\n const [selected, setSelected] = useState<ModelInfo[]>([])\n useEffect(() => {\n const match = premiumModels.filter((m) => m.model_name === current)\n setSelected((prev) =>\n prev.length === match.length && prev[0]?.model_name === match[0]?.model_name ? prev : match\n )\n }, [current, premiumModels])\n\n const onSelectionChange = useCallback(\n (items: ModelInfo[]) => {\n const picked = items.filter((m) => !isStandard(m))\n const next = picked[0]?.model_name\n if (!next || next === currentRef.current) return\n setSelected(picked)\n save(next)\n },\n [save]\n )\n\n if (premiumModels.length === 0) return null\n\n return (\n <SettingsPanel className=\"max-w-2xl space-y-4\">\n <SettingsSection title=\"Premium models\">\n <SettingsCard className=\"space-y-0\">\n <PremiumModelsFrame\n enabled={premiumModel !== ''}\n onEnabledChange={(enabled) => {\n const target = enabled ? cheapest(premiumModels)?.model_name : ''\n if (target !== undefined) save(target)\n }}\n >\n <GridView\n items={rows}\n columnDefs={COLUMNS}\n getItemId={(m) => m.model_name}\n selection={{ mode: 'single', selected, onSelectionChange }}\n gridOptions={{\n rowClassRules: { 'opacity-60 italic': (p) => isStandard(p.data) },\n }}\n height={Math.min(rows.length * 40 + 48, 320)}\n testId=\"premium-model-grid\"\n />\n </PremiumModelsFrame>\n </SettingsCard>\n </SettingsSection>\n </SettingsPanel>\n )\n}\n","/**\n * The settings page of any host: a tab per section, every section addressable by id, so\n * `openSettings(section)` (`useBlocksEnvironment`) opens the page at it.\n *\n * The sections are data. The connected ones below (account, mail, privacy, chat) are bound to the\n * signed-in account through `@arbidocs/react`; a host adds its own (appearance, storage, …) and\n * leaves out what it does not offer. Without `section` the page follows `openSettings` requests;\n * a host that keeps the open section itself passes `section` and `onSectionChange`.\n */\nimport { useEffect, useState } from 'react'\nimport { HatGlasses, Mail, MessageSquare, User } from 'lucide-react'\nimport { useRequestedSettingsSection } from '../../provider/settings-section'\nimport {\n SettingsPage,\n type SettingsPageProps,\n type SettingsPageSection,\n} from '../../settings/SettingsPage'\nimport {\n ConnectedAccountSettings,\n type ConnectedAccountSettingsProps,\n} from './ConnectedAccountSettings'\nimport { ConnectedMailSettings, type ConnectedMailSettingsProps } from './ConnectedMailSettings'\nimport {\n ConnectedPrivacySettings,\n type ConnectedPrivacySettingsProps,\n} from './ConnectedPrivacySettings'\nimport { ConnectedPremiumModels } from './ConnectedPremiumModels'\n\n/** The section ids of the connected sections. */\nexport const SETTINGS_SECTION_IDS = {\n account: 'account',\n mail: 'mail',\n privacy: 'privacy',\n chat: 'chat',\n} as const\n\n/** Account: profile, ID check, security, sessions, sign out, delete. */\nexport function accountSettingsSection(props?: ConnectedAccountSettingsProps): SettingsPageSection {\n return {\n id: SETTINGS_SECTION_IDS.account,\n label: 'Account',\n icon: <User className=\"w-6 h-6\" />,\n render: () => <ConnectedAccountSettings {...props} />,\n }\n}\n\n/** Mail: the native address and the connected mailboxes. */\nexport function mailSettingsSection(props?: ConnectedMailSettingsProps): SettingsPageSection {\n return {\n id: SETTINGS_SECTION_IDS.mail,\n label: 'Mail',\n icon: <Mail className=\"w-6 h-6\" />,\n render: () => <ConnectedMailSettings {...props} />,\n }\n}\n\n/** Privacy: online status, tips and the email notifications. */\nexport function privacySettingsSection(props?: ConnectedPrivacySettingsProps): SettingsPageSection {\n return {\n id: SETTINGS_SECTION_IDS.privacy,\n label: 'Privacy',\n icon: <HatGlasses className=\"w-6 h-6\" />,\n render: () => <ConnectedPrivacySettings {...props} />,\n }\n}\n\n/** Chat: the premium models. */\nexport function chatSettingsSection(): SettingsPageSection {\n return {\n id: SETTINGS_SECTION_IDS.chat,\n label: 'Chat',\n icon: <MessageSquare className=\"w-6 h-6\" />,\n render: () => <ConnectedPremiumModels />,\n }\n}\n\n/** The sections of a host that adds none of its own. */\nexport const DEFAULT_SETTINGS_SECTIONS: readonly SettingsPageSection[] = [\n accountSettingsSection(),\n privacySettingsSection(),\n chatSettingsSection(),\n]\n\nexport interface ConnectedSettingsPageProps extends Omit<\n SettingsPageProps,\n 'sections' | 'activeSectionId' | 'onSectionChange'\n> {\n /** The sections in tab order; default {@link DEFAULT_SETTINGS_SECTIONS}. */\n sections?: readonly SettingsPageSection[]\n /** The open section (controlled). Default: the last `openSettings` request, else the first. */\n section?: string\n onSectionChange?: (id: string) => void\n}\n\nexport function ConnectedSettingsPage({\n sections = DEFAULT_SETTINGS_SECTIONS,\n section,\n onSectionChange,\n ...page\n}: ConnectedSettingsPageProps) {\n const requested = useRequestedSettingsSection()\n const [local, setLocal] = useState(requested?.section)\n useEffect(() => {\n if (requested) setLocal(requested.section)\n }, [requested])\n const controlled = section !== undefined\n return (\n <SettingsPage\n {...page}\n sections={sections}\n activeSectionId={controlled ? section : local}\n onSectionChange={(id) => {\n if (!controlled) setLocal(id)\n onSectionChange?.(id)\n }}\n />\n )\n}\n","/**\n * A workspace's settings bound to the SDK: the workspace and its members, the viewer's role, and\n * the edits a settings page makes (name, description, visibility, add, remove, leave), each\n * confirmed and notified through the blocks environment.\n *\n * The server applies these to the workspace the session has OPEN, so an edit to a workspace that\n * is no longer the open one (the viewer switched while the page stayed) is refused with a notice.\n */\nimport { useWorkspaces, useAddWorkspaceMembers, useRemoveWorkspaceMembers } from '@arbidocs/react'\nimport { useUpdateWorkspace, type WorkspaceRole } from '@arbidocs/react'\nimport { getEntityLabel } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\n\n/** How a share ended. */\nexport type ShareOutcome =\n 'added' | 'partial' | 'invited' | 'already_member' | 'cancelled' | 'error'\n\n/** The server's `detail`, whichever error shape it came in. */\nfunction errorDetail(err: unknown): string | undefined {\n const e = err as {\n detail?: unknown\n apiError?: { detail?: unknown }\n response?: { data?: { detail?: unknown } }\n error?: { detail?: unknown }\n } | null\n const detail = e?.detail ?? e?.apiError?.detail ?? e?.response?.data?.detail ?? e?.error?.detail\n if (typeof detail === 'string' && detail) return detail\n const message = (detail as { message?: unknown } | null)?.message\n return typeof message === 'string' && message ? message : undefined\n}\n\nfunction errorStatus(err: unknown): number | undefined {\n const e = err as { status?: number; response?: { status?: number } } | null\n return e?.status ?? e?.response?.status\n}\n\nconst workspaceWord = () => getEntityLabel('WORKSPACE').toLowerCase()\n\nconst inviteMessage = (emails: string[]) =>\n `${\n emails.length === 1\n ? `${emails[0]} isn't on the platform yet.`\n : `These users aren't on the platform yet:\\n${emails.join('\\n')}`\n }\\n\\nInvite them by email? Once they sign up, they'll usually get access to this ${workspaceWord()} automatically — if not, they can request it themselves.`\n\nexport interface UseConnectedWorkspaceSettingsOptions {\n /** After the viewer left the workspace (e.g. go back to the list). */\n onLeft?: () => void\n}\n\nexport function useConnectedWorkspaceSettings(\n workspaceId: string,\n { onLeft }: UseConnectedWorkspaceSettingsOptions = {}\n) {\n const { notify, confirm } = useBlocksEnvironment()\n const { workspaceId: openWorkspaceId, userId } = useConnectedWorkspace()\n const { data: workspaces } = useWorkspaces()\n const workspace = workspaces?.find((w) => w.external_id === workspaceId)\n const update = useUpdateWorkspace()\n const add = useAddWorkspaceMembers()\n const remove = useRemoveWorkspaceMembers()\n\n const members = workspace?.users ?? []\n const role = members.find((m) => m.user.external_id === userId)?.role ?? null\n const isOwner = role === 'owner'\n const isMember = role !== null\n\n /** Edits go to the open workspace: refuse (and say so) once it is another one. */\n const stillOpen = (): boolean => {\n if (!workspace) return false\n if (openWorkspaceId === workspace.external_id) return true\n notify(\n `Not saved: you switched to another ${workspaceWord()} first. Open \"${workspace.name}\" and try again.`,\n 'warning'\n )\n return false\n }\n\n /** Save the name and the description together (the endpoint takes the pair). */\n const updateIdentity = async (data: { name: string; description: string }): Promise<void> => {\n if (!workspace || !stillOpen()) return\n const changed = [\n ...(data.name !== workspace.name ? ['name'] : []),\n ...(data.description !== (workspace.description || '') ? ['description'] : []),\n ]\n try {\n await update.mutateAsync({ name: data.name, description: data.description })\n if (changed.length > 0) {\n notify(`${getEntityLabel('WORKSPACE')} ${changed.join(', ')} updated`, 'success')\n }\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Failed to update workspace', 'error')\n throw err\n }\n }\n\n const setPublic = async (isPublic: boolean): Promise<void> => {\n if (!workspace || !stillOpen()) return\n await update.mutateAsync({ is_public: isPublic })\n notify(`Workspace is now ${isPublic ? 'common' : 'members-only'}`, 'success')\n }\n\n const invite = async (emails: string[], memberRole: WorkspaceRole) => {\n try {\n await add.mutateAsync({ emails, role: memberRole, confirmInvite: true })\n notify(\n emails.length === 1\n ? `Invitation sent to ${emails[0]}`\n : `Invitations sent to ${emails.length} users`,\n 'success'\n )\n } catch (err) {\n const detail = errorDetail(err)\n notify(\n detail ? `Couldn't send the invitation: ${detail}` : 'Failed to send the invitation.',\n 'error'\n )\n }\n }\n\n /**\n * Add members by email. Emails already in the workspace are said so; emails not on ARBI are\n * offered an invitation. A quota refusal is left to the host's payment-required handling.\n */\n const share = async (\n emails: string[],\n memberRole: WorkspaceRole = 'collaborator'\n ): Promise<ShareOutcome> => {\n if (!workspace) return 'error'\n const current = new Set(members.map((m) => m.user.email.toLowerCase()))\n try {\n const added = new Set(\n ((await add.mutateAsync({ emails, role: memberRole })) ?? []).map((m) =>\n m.user.email.toLowerCase()\n )\n )\n const failed = emails.filter((email) => !added.has(email.toLowerCase()))\n if (failed.length === 0) return 'added'\n const already = failed.filter((email) => current.has(email.toLowerCase()))\n const unknown = failed.filter((email) => !current.has(email.toLowerCase()))\n if (added.size > 0) {\n notify(`Added ${added.size} ${added.size === 1 ? 'member' : 'members'}`, 'success')\n }\n if (already.length > 0) {\n notify(\n already.length === 1\n ? `${already[0]} is already a member`\n : `${already.length} users are already members`,\n 'info'\n )\n }\n if (\n unknown.length > 0 &&\n (await confirm({\n message: inviteMessage(unknown),\n title: 'Invite by email?',\n kind: 'yesno',\n }))\n ) {\n await invite(unknown, memberRole)\n return added.size > 0 ? 'partial' : 'invited'\n }\n return added.size > 0 ? 'partial' : 'already_member'\n } catch (err) {\n const status = errorStatus(err)\n const detail = errorDetail(err) || 'Failed to add member to workspace'\n const lower = detail.toLowerCase()\n if (lower.includes('already has access')) return 'already_member'\n const notRegistered =\n status === 404 ||\n lower.includes('not found') ||\n lower.includes('no user') ||\n lower.includes('does not exist') ||\n lower.includes('user not registered')\n if (notRegistered) {\n if (\n await confirm({\n message: inviteMessage(emails),\n title: 'Invite by email?',\n kind: 'yesno',\n })\n ) {\n await invite(emails, memberRole)\n return 'invited'\n }\n return 'cancelled'\n }\n const quota =\n status === 402 ||\n lower.includes('limit reached') ||\n lower.includes('quota') ||\n lower.includes('upgrade')\n if (!quota) notify(detail, 'error')\n return 'error'\n }\n }\n\n const removeMember = async (userExtId: string, email: string, name: string): Promise<void> => {\n if (!workspace || !isOwner) return\n const ok = await confirm({\n message: `Remove ${name} (${email}) from the \"${workspace.name}\" ${getEntityLabel('WORKSPACE')}?\\n\\nNote that ${getEntityLabel('WORKSPACEUSER', 'PLURAL').toLowerCase()} may have saved private content in the workspace that you cannot see. If you remove them from the ${workspaceWord()} they will immediately lose access to any content in the ${workspaceWord()}.`,\n title: `Remove ${getEntityLabel('WORKSPACEUSER')}`,\n })\n if (!ok) return\n try {\n await remove.mutateAsync([userExtId])\n notify(`Successfully removed ${name} from workspace`, 'success')\n } catch {\n notify(`Failed to remove ${name} from workspace`, 'error')\n }\n }\n\n const leave = async (): Promise<void> => {\n if (!workspace || !userId || isOwner) return\n const name = workspace.name\n const ok = await confirm({\n message: `Are you sure you want to leave the \"${name}\" ${getEntityLabel('WORKSPACE')}?\\n\\nYou will lose access to all content in this ${workspaceWord()}.`,\n title: 'Leave Workspace',\n })\n if (!ok) return\n try {\n await remove.mutateAsync([userId])\n onLeft?.()\n notify(`Successfully left ${name}`, 'success')\n } catch {\n notify('Failed to leave workspace', 'error')\n }\n }\n\n return {\n workspace,\n members,\n role,\n isOwner,\n isMember,\n updateIdentity,\n setPublic,\n share,\n removeMember,\n leave,\n isSharing: add.isPending,\n isRemoving: remove.isPending,\n }\n}\n","/**\n * A workspace's own page, bound to the SDK: the identity bar (name and description edited in\n * place, the workspace's project, visibility, the members and Share), the member list under it, the\n * host's dashboard, \"Export, copy or move…\" and, for a member who does not own it, Leave.\n *\n * The host supplies what only it has: the project picker, the member table, the share dialog, the\n * dashboard, and where Export and the activity feed open.\n */\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { FolderInput } from 'lucide-react'\nimport { toShellWorkspace, useUserSettings, type WorkspaceRole } from '@arbidocs/react'\nimport { Button, getEntityLabel } from '@arbidocs/react/ui'\nimport type { components } from '@arbidocs/client'\nimport { EntityIdentityBar, IDENTITY_NAME_MAX_LENGTH } from '../../components/EntityIdentityBar'\nimport { MemberAvatarStack } from '../../components/MemberAvatarStack'\nimport { LoadingIndicator } from '../../components/LoadingIndicator'\nimport { WorkspaceIdentity } from '../../shell/Workspace'\nimport {\n ExpandableSection,\n LeaveFooter,\n PageLoading,\n WorkspaceAudienceLine,\n WorkspaceIdentityPanel,\n WorkspacePageFrame,\n WorkspaceProjectSlot,\n} from '../../workspaces/WorkspaceSettingsParts'\nimport { CommonWorkspaceToggle } from '../../workspaces/CommonWorkspaceToggle'\nimport { ConnectedWorkspaceNotificationMenu } from '../ConnectedNotificationRelevance'\nimport { useConnectedWorkspaceSettings, type ShareOutcome } from './useConnectedWorkspaceSettings'\n\ntype Workspace = components['schemas']['WorkspaceResponse']\ntype WorkspaceMember = Workspace['users'][number]\n\n/** An agent account (its id starts `agt-`). */\nconst isAgentMember = (member: WorkspaceMember) => member.user.external_id.startsWith('agt-')\nconst memberName = (member: WorkspaceMember) =>\n member.user.family_name\n ? `${member.user.given_name} ${member.user.family_name}`\n : member.user.given_name\n\nexport interface WorkspaceMembersSlot {\n workspace: Workspace\n members: WorkspaceMember[]\n onRemove: (userExtId: string, email: string, name: string) => Promise<void>\n isRemoving: boolean\n}\n\nexport interface WorkspaceShareSlot {\n open: boolean\n onOpenChange: (open: boolean) => void\n workspace: Workspace\n members: WorkspaceMember[]\n onShare: (emails: string[], role?: WorkspaceRole) => Promise<ShareOutcome>\n isSharing: boolean\n}\n\nexport interface ConnectedWorkspaceSettingsProps {\n workspaceId: string\n /** The workspace's project, right of the name: a picker for an owner, else a pill. */\n project?: (ctx: { workspace: Workspace; isOwner: boolean }) => ReactNode\n /** The project line under the workspace mark. */\n projectLine?: (workspace: Workspace) => ReactNode\n /** The full member table, shown when the member avatars are opened. */\n membersTable?: (ctx: WorkspaceMembersSlot) => ReactNode\n /** The dialog behind Share (owners only). */\n shareDialog?: (ctx: WorkspaceShareSlot) => ReactNode\n /** The workspace's dashboard, between the identity and the page foot. */\n children?: ReactNode\n /** Open the host's export/copy/move dialog (members only). */\n onExport?: () => void\n /** Open the workspace's activity feed (from the bell menu). */\n onOpenActivity?: () => void\n /** After the viewer left the workspace. */\n onLeft?: () => void\n testId?: string\n}\n\nexport function ConnectedWorkspaceSettings({\n workspaceId,\n project,\n projectLine,\n membersTable,\n shareDialog,\n children,\n onExport,\n onOpenActivity,\n onLeft,\n testId = 'workspace-settings-page',\n}: ConnectedWorkspaceSettingsProps) {\n const settings = useConnectedWorkspaceSettings(workspaceId, { onLeft })\n const { workspace, members, isOwner, isMember } = settings\n const { data: userSettings } = useUserSettings()\n // Only a developer sees the visibility switch.\n const isDeveloper = userSettings?.developer === true\n // Agents are listed only when their sessions are shown (experimental), as everywhere else.\n const showAgents = userSettings?.show_agent_sessions ?? false\n const visibleMembers = useMemo(\n () => (showAgents ? members : members.filter((m) => !isAgentMember(m))),\n [members, showAgents]\n )\n const [membersExpanded, setMembersExpanded] = useState(false)\n const [shareOpen, setShareOpen] = useState(false)\n\n if (!workspace) {\n return (\n <PageLoading>\n <LoadingIndicator message=\"Loading workspace...\" />\n </PageLoading>\n )\n }\n\n return (\n <>\n <WorkspacePageFrame testId={testId}>\n <WorkspaceIdentityPanel>\n <EntityIdentityBar\n testId=\"workspace-identity-bar\"\n canEdit={isOwner}\n // How much of this workspace reaches the bell (a member's own setting, any role).\n actions={\n isMember ? (\n <ConnectedWorkspaceNotificationMenu\n workspaceId={workspace.external_id}\n onOpenActivity={onOpenActivity}\n testId=\"workspace-home-notification-menu\"\n />\n ) : undefined\n }\n fields={[\n {\n label: 'Name',\n value: workspace.name,\n placeholder: 'Untitled',\n maxLength: IDENTITY_NAME_MAX_LENGTH,\n valueClassName: 'truncate text-base font-semibold',\n testId: 'workspace-home-title',\n hideLabel: true,\n leading: (\n <WorkspaceIdentity\n workspace={{\n ...toShellWorkspace(workspace),\n projectLine: projectLine?.(workspace),\n }}\n expanded={false}\n />\n ),\n trailing: project && (\n <WorkspaceProjectSlot\n testId=\"workspace-home-project\"\n caption={`${getEntityLabel('PROJECT')}:`}\n >\n {project({ workspace, isOwner })}\n </WorkspaceProjectSlot>\n ),\n // Both fields go up together: the endpoint takes the pair.\n onSave: (name) =>\n settings.updateIdentity({ name, description: workspace.description ?? '' }),\n },\n {\n label: 'Description',\n value: workspace.description ?? '',\n placeholder: 'No description',\n multiline: true,\n valueClassName: 'line-clamp-2 text-sm text-muted-foreground',\n testId: 'workspace-home-description',\n hideLabel: true,\n trailing: (\n <WorkspaceAudienceLine\n visibility={{\n testId: 'workspace-home-visibility',\n caption: 'Visibility:',\n toggle:\n isOwner && isDeveloper ? (\n <CommonWorkspaceToggle\n isCommon={workspace.is_public ?? false}\n onToggle={(value) => void settings.setPublic(value)}\n data-testid=\"workspace-visibility-toggle\"\n />\n ) : undefined,\n stateText: workspace.is_public\n ? 'Common — everyone on this deployment'\n : 'Members only',\n stateHelp: workspace.is_public\n ? 'Everyone on this deployment can see its files, not only its members.'\n : 'Only members of this workspace can see its files.',\n }}\n members={\n <MemberAvatarStack\n members={visibleMembers.map((m) => ({\n name: memberName(m),\n picture: m.user.picture,\n }))}\n total={visibleMembers.length}\n expanded={membersExpanded}\n onClick={() => setMembersExpanded((open) => !open)}\n testId=\"workspace-home-members-toggle\"\n />\n }\n share={\n isOwner && shareDialog\n ? {\n label: 'Share',\n onClick: () => setShareOpen(true),\n testId: 'workspace-quick-add-member',\n }\n : undefined\n }\n />\n ),\n onSave: (description) =>\n settings.updateIdentity({ name: workspace.name, description }),\n },\n ]}\n />\n\n {isMember && membersTable && (\n <ExpandableSection\n expanded={membersExpanded}\n testId=\"workspace-settings-members-section\"\n >\n {membersTable({\n workspace,\n members: visibleMembers,\n onRemove: settings.removeMember,\n isRemoving: settings.isRemoving,\n })}\n </ExpandableSection>\n )}\n </WorkspaceIdentityPanel>\n\n {children}\n\n {/* Taking content out (a download, a copy, a move) is one dialog for the workspace. */}\n {isMember && onExport && (\n <div className=\"flex justify-end px-4 pb-4\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onExport}\n data-testid=\"workspace-transfer-button\"\n >\n <FolderInput className=\"size-4\" />\n Export, copy or move…\n </Button>\n </div>\n )}\n\n {/* Leaving ends your part in the workspace: last and alone. There is no delete here. */}\n {!isOwner && (\n <LeaveFooter\n testId=\"workspace-settings-footer\"\n leave={{\n testId: 'workspace-leave-button',\n label: settings.isRemoving\n ? 'Leaving…'\n : `Leave ${getEntityLabel('WORKSPACE').toLowerCase()}`,\n disabled: settings.isRemoving,\n onClick: () => void settings.leave(),\n }}\n />\n )}\n </WorkspacePageFrame>\n\n {isOwner &&\n shareDialog?.({\n open: shareOpen,\n onOpenChange: setShareOpen,\n workspace,\n members: visibleMembers,\n onShare: settings.share,\n isSharing: settings.isSharing,\n })}\n </>\n )\n}\n","import { useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useArbi, useArbiWebSocket } from '@arbidocs/react'\nimport { useNotify, type AppNotification } from '@arbidocs/react/shell'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\n/** Bridge persisted document mentions to the shared bell; hosts own routing. */\nexport function useConnectedDocxNotifications(\n onOpen: (target: {\n workspaceId: string\n documentId: string\n commentId: string\n }) => void | Promise<void>\n) {\n const arbi = useArbi()\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const queries = useQueryClient()\n const source = `docx-mentions:${apiUrl}:${user?.externalId || ''}`\n const queryKey = ['docx-mentions', apiUrl, user?.externalId]\n const { data = [] } = useQuery({\n queryKey,\n queryFn: () => arbi.notifications.list({ type: 'docx_mention' }),\n enabled: status === 'authenticated',\n refetchInterval: 30_000,\n })\n useArbiWebSocket((message) => {\n if (message.type === 'docx_mention') void queries.invalidateQueries({ queryKey })\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId || !note.workspace_ext_id) continue\n try {\n const target = JSON.parse(note.content || '{}') as {\n document_id?: string\n comment_id?: string\n }\n if (!target.document_id?.startsWith('doc-') || !target.comment_id) continue\n const documentId = target.document_id,\n commentId = target.comment_id,\n workspaceId = note.workspace_ext_id\n items.push({\n id: `docx:${note.external_id}`,\n title: 'Mentioned you in a document comment',\n description: [note.sender.given_name, note.sender.family_name]\n .filter(Boolean)\n .join(' '),\n variant: 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve(onOpen({ documentId, commentId, workspaceId })).catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open the document.',\n 'error'\n )\n )\n },\n })\n } catch {\n /* Ignore invalid legacy payloads. */\n }\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n try {\n await arbi.notifications.markRead(ids)\n await queries.invalidateQueries({ queryKey })\n } catch {\n notify('Could not mark document mentions read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n if (id.startsWith('docx:')) void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter((note) => !note.read && note.recipient.external_id === user?.externalId)\n .map((note) => note.external_id)\n )\n },\n }\n}\n","import { useEffect } from 'react'\nimport { mailDraftIdFromContent, useWorkNotifications } from '@arbidocs/react'\nimport { useNotify, type AppNotification } from '@arbidocs/react/shell'\nimport type { components } from '@arbidocs/client'\nimport { useConnection } from './ConnectionProvider'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\n\nexport type WorkNotificationTarget =\n | { kind: 'conversation'; workspaceId: string; conversationId: string; messageId?: string }\n | { kind: 'workflow'; workspaceId?: string; workflowId: string }\n /** A draft an agent left for the user (`mail_draft_ready`): open it, e.g. `ConnectedMailbox draftId`. */\n | { kind: 'mail_draft'; draftId: string; mailbox?: string }\n\n/** Persisted work notifications in the shared bell; the consumer owns navigation. */\nexport function useConnectedWorkNotifications(\n onOpen: (target: WorkNotificationTarget) => void | Promise<void>\n) {\n const { status, user, apiUrl } = useConnection()\n const { notify } = useBlocksEnvironment()\n const source = `work-notifications:${apiUrl}:${user?.externalId || ''}`\n const { data = [], markRead: persistRead } = useWorkNotifications({\n apiUrl,\n userId: user?.externalId,\n enabled: status === 'authenticated',\n })\n useEffect(() => {\n const items: AppNotification[] = []\n if (status === 'authenticated')\n for (const note of data) {\n if (note.recipient.external_id !== user?.externalId) continue\n const mapped = mapWorkNotification(note)\n if (!mapped) continue\n items.push({\n id: `work:${note.external_id}`,\n title: mapped.title,\n variant:\n note.type === 'workflow_failed'\n ? 'error'\n : note.type === 'conversation_done'\n ? 'success'\n : 'info',\n ts: Date.parse(note.created_at),\n read: note.read,\n source,\n onSelect: () => {\n void Promise.resolve()\n .then(() => onOpen(mapped.target))\n .catch((error) =>\n notify(\n error instanceof Error ? error.message : 'Could not open this notification.',\n 'error'\n )\n )\n },\n })\n }\n useNotify.getState().syncSource(source, items)\n return () => useNotify.getState().syncSource(source, [])\n }, [data, status, user?.externalId, source, onOpen, notify])\n const markRead = async (ids: string[]) => {\n if (!ids.length) return\n try {\n await persistRead(ids)\n } catch {\n notify('Could not mark work notifications read.', 'error')\n }\n }\n return {\n onMarkRead: (id: string) => {\n // Only received, currently loaded work rows belong to this source.\n if (\n data.some(\n (note) =>\n `work:${note.external_id}` === id &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n )\n void markRead([id.slice(5)])\n },\n onMarkAllRead: () => {\n void markRead(\n data\n .filter(\n (note) =>\n !note.read &&\n note.recipient.external_id === user?.externalId &&\n mapWorkNotification(note)\n )\n .map((note) => note.external_id)\n )\n },\n }\n}\n\n/** Route from explicit IDs; encrypted task text is never needed for a link. */\nexport function mapWorkNotification(note: components['schemas']['NotificationResponse']): {\n title: string\n target: WorkNotificationTarget\n} | null {\n const sender =\n [note.sender.given_name, note.sender.family_name].filter(Boolean).join(' ') || note.sender.email\n if (note.type === 'workflow_failed') {\n try {\n const payload = JSON.parse(note.content || '{}') as { workflow_ext_id?: string }\n if (!payload.workflow_ext_id?.match(/^wfl-[a-zA-Z0-9]+$/)) return null\n if (\n note.workspace_ext_id?.match(/^wrk-[a-zA-Z0-9]+$/) &&\n note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/)\n ) {\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n },\n }\n }\n return {\n title: 'A workflow failed to run',\n target: {\n kind: 'workflow',\n workflowId: payload.workflow_ext_id,\n workspaceId: note.workspace_ext_id || undefined,\n },\n }\n } catch {\n return null\n }\n }\n if (note.type === 'mail_draft_ready') {\n const draftId = mailDraftIdFromContent(note.content)\n if (!draftId) return null\n // Agent drafts land in the owner's native mailbox.\n return {\n title: `${sender} left a draft email for you to review`,\n target: { kind: 'mail_draft', draftId, mailbox: 'native' },\n }\n }\n const titles: Partial<Record<components['schemas']['NotificationType'], string>> = {\n mention: `${sender} mentioned you in a conversation`,\n workspace_access_request: `${sender} needs workspace access to run a thread`,\n conversation_ready:\n note.sender.external_id === note.recipient.external_id\n ? 'Your thread is ready'\n : `${sender}’s thread is ready`,\n conversation_done: `${sender} marked a thread done`,\n }\n const title = titles[note.type]\n if (!title || !note.workspace_ext_id || !note.conversation_ext_id?.match(/^con-[a-zA-Z0-9]+$/))\n return null\n return {\n title,\n target: {\n kind: 'conversation',\n workspaceId: note.workspace_ext_id,\n conversationId: note.conversation_ext_id,\n ...(note.message_ext_id ? { messageId: note.message_ext_id } : {}),\n },\n }\n}\n","import { bytesToBase64 } from '@arbidocs/client'\nimport {\n accountPath,\n fileAttachment,\n type MailAccount,\n type MailAttachment,\n type MailClient,\n} from '@arbidocs/react'\nimport type { MailOfflineSupport } from './types'\n\nexport function attachmentPath(accountId: string, messageId: string, attachmentId: string): string {\n return `${accountPath(accountId)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`\n}\n\n/** Hand a file to the browser as a download. */\nexport function saveFile(blob: Blob, name: string): void {\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = name\n link.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/**\n * A message's attachments with their content, for a forward or a reopened draft. Offline, each\n * comes from this device (or arrives without content, and Send then names the missing file).\n */\nexport function hydrateMailAttachments(\n client: MailClient,\n account: MailAccount,\n messageId: string,\n attachments: MailAttachment[],\n { isOnline, offline }: { isOnline: boolean; offline?: MailOfflineSupport }\n): Promise<MailAttachment[]> {\n return Promise.all(\n attachments.map(async (a) => {\n if (a.content_base64 != null) return a\n if (!isOnline) {\n const file = await offline?.loadAttachment(account.id, messageId, a)\n return file\n ? { ...a, content_base64: bytesToBase64(new Uint8Array(await file.arrayBuffer())) }\n : { ...a, content_base64: null }\n }\n const response = await client.fetch(attachmentPath(account.id, messageId, a.id))\n return fileAttachment(new File([await response.blob()], a.name, { type: a.content_type }))\n })\n )\n}\n","/**\n * A composer's body in the Word editor: its draft room (opened, reopened after a reconnect or a\n * remount, shown to the chat while open) and the room's save, send and body calls.\n *\n * The room is the body: it saves itself as it is typed into, ARBI's edits land in it as tracked\n * changes, and the draft's text and HTML are made from it on the server when it is saved or sent.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useMailDraftEditor,\n type MailClient,\n type MailCompose,\n type MailProject,\n} from '@arbidocs/react'\nimport type { NativeDocxAdapter } from '../../docx/NativeDocxEditor'\nimport type { MailWordEditor } from './types'\nimport { useRegisterOpenDocument } from '../../chat/open-document'\n\n// A compose session's room, kept across the composer remounting (docked ↔ overlay), so a new\n// message not saved yet reopens its own room instead of starting an empty one.\nconst sessionRooms = new Map<string, string>()\n\nexport interface WordBody {\n adapter: NativeDocxAdapter\n /** The editor's document key: stable for this compose session. */\n documentKey: string\n stateRef: React.MutableRefObject<(() => string | undefined) | null>\n /** Opened: saving and sending can go through the room. */\n ready: boolean\n save(compose: MailCompose): Promise<{ id: string }>\n /** Send it (`request_id`: the send's idempotency key, as `/send` takes). */\n send(compose: MailCompose & { request_id: string }): Promise<{ id: string; status: string }>\n /** The body as text and HTML (`final`: refused while suggestions wait). */\n body(final: boolean): Promise<{ text: string; html: string }>\n /** The project ARBI's work on this email is billed to (known once the room opens). */\n project?: MailProject | null\n /** Bill another project the person may bill (null: their own). */\n chooseProject(projectExtId: string | null): Promise<void>\n}\n\nexport function useWordBody({\n word,\n client,\n initial,\n sessionKey,\n roomId: givenRoomId,\n onBodyChange,\n}: {\n word: MailWordEditor\n client: MailClient\n initial: MailCompose\n /** This compose session (stable across remounts); absent: one per mount. */\n sessionKey?: string\n /** An existing room to open as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** The person changed the body (it is not in Drafts until saved). */\n onBodyChange: () => void\n}): WordBody {\n const [documentKey] = useState(\n () => `mail-${sessionKey ?? initial.draft_id ?? crypto.randomUUID()}`\n )\n const roomRef = useRef<string | undefined>(sessionRooms.get(documentKey) ?? givenRoomId)\n const [roomId, setRoomId] = useState(roomRef.current)\n const [project, setProject] = useState<MailProject | null>()\n const stateRef = useRef<(() => string | undefined) | null>(null)\n const changed = useRef(onBodyChange)\n useEffect(() => {\n changed.current = onBodyChange\n })\n // The first open, while it runs: a second one (the editor remounting, a token renewal) must join it, or a new\n // message would get a second, empty room.\n const opening = useRef<ReturnType<NonNullable<MailClient['openDraftEditor']>> | null>(null)\n const adapter = useMemo<NativeDocxAdapter>(\n () => ({\n ...word.adapter,\n open: async () => {\n if (!roomRef.current && opening.current) return opening.current\n const request = client.openDraftEditor!(\n roomRef.current\n ? { roomId: roomRef.current }\n : { draftId: initial.draft_id ?? undefined, text: initial.text, html: initial.html }\n )\n if (!roomRef.current) opening.current = request\n try {\n const session = await request\n roomRef.current = session.room_id\n sessionRooms.set(documentKey, session.room_id)\n setRoomId(session.room_id)\n setProject(session.project ?? null)\n return session\n } finally {\n opening.current = null\n }\n },\n save: async () => {\n throw new Error('Save the draft from the composer')\n },\n onDirtyChange: (dirty) => {\n if (dirty) changed.current()\n },\n }),\n // The editor keeps its adapter for the session; the seed matters only when it first opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [word.adapter, client, documentKey]\n )\n // The open draft's room is the chat's open document, so ARBI edits it there as tracked changes.\n useRegisterOpenDocument({ documentId: roomId })\n const editor = useMailDraftEditor()\n const state = () => stateRef.current?.() ?? null\n return {\n adapter,\n documentKey,\n stateRef,\n ready: !!roomId,\n save: (compose) => editor.save(roomRef.current!, compose, state()),\n send: async (compose) => {\n const result = await editor.send(roomRef.current!, compose, state())\n sessionRooms.delete(documentKey) // sent: the room is gone\n return result\n },\n body: (final) => editor.body(roomRef.current!, final, state()),\n project,\n chooseProject: async (projectExtId) => {\n setProject(await editor.setProject(roomRef.current!, projectExtId))\n },\n }\n}\n","import { lazy, Suspense, useEffect, useMemo, useRef, useState, type RefObject } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Paperclip, Send, X } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n DialogDescription,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '@arbidocs/react/ui'\nimport {\n fileAttachment,\n useMailClient,\n useMailDraftReplaced,\n useMailProjects,\n useSaveMailDraft,\n useSendMail,\n useMailOnline,\n type MailAccount,\n type MailCompose,\n type MailDeliveryStatus,\n type MailMessage,\n} from '@arbidocs/react'\nimport { MailDocumentPicker } from '../../collaboration/mail/MailDocumentPicker'\nimport { PlainMailBodyEditor } from '../../collaboration/mail/PlainMailBodyEditor'\nimport { parseMailRecipients } from '../../collaboration/mail/mailCompose'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\nimport { useBlocksEnvironment, type BlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useWordBody } from './useWordBody'\n\n// The rich editor is its own chunk, on the optional peer `lexical`. If it is not installed or can't\n// be downloaded (offline before the app finished caching itself), write in plain text instead.\nconst MailBodyEditor = lazy(() =>\n import('../../collaboration/mail/MailBodyEditor').catch(() => ({\n default: PlainMailBodyEditor,\n }))\n)\n// The Word editor (a native draft's body, see MailWordEditor) is its own chunk too.\nconst NativeDocxEditor = lazy(() =>\n import('../../docx/NativeDocxEditor').then((m) => ({ default: m.NativeDocxEditor }))\n)\nconst NO_WORD: MailWordEditor = {\n adapter: {\n request: () => Promise.reject(new Error('No Word editor')),\n loadFonts: () => Promise.reject(new Error('No Word editor')),\n },\n}\n\nexport interface MailComposerFormProps {\n account?: MailAccount\n initial: MailCompose\n maxBytes: number\n ready: boolean\n /** The account's saved drafts: a new message with a draft's subject points to it. */\n drafts: MailMessage[]\n onClose: () => void\n /** Open a saved draft (from the \"already in Drafts\" notice). Absent: the notice has no button. */\n onOpenDraft?: (id: string) => void\n /** Reopen this form on a newer version of its draft, saved elsewhere (by ARBI, or in another tab). */\n onReload?: (draftId: string) => void\n /** Reports every edit so the parent can re-seed this form if it remounts (e.g. docked → overlay). */\n onChange?: (value: MailCompose) => void\n embedded?: boolean\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (saved offline): saves update it, sending removes it. */\n localDraftId?: string\n offline?: MailOfflineSupport\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor. Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote) instead of a new one. */\n roomId?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\n/**\n * Say how a send went. A mailbox on the same deployment is delivered to (or refused) before the send\n * returns, so a bounce is reported at once. Mail handed to the relay is only queued: its delivery\n * reports arrive later, in Sent.\n */\nfunction notifySent(notify: BlocksEnvironment['notify'], result: unknown) {\n const status =\n result && typeof result === 'object' && 'delivery_status' in result\n ? (result as { delivery_status?: MailDeliveryStatus | null }).delivery_status\n : null\n if (status === 'bounced')\n notify(\"Email couldn't be delivered\", 'error', { description: 'Open it in Sent to see why.' })\n else if (status === 'partially_bounced')\n notify(\"Email couldn't be delivered to every recipient\", 'error', {\n description: 'Open it in Sent to see which and why.',\n })\n else if (status === 'delivered') notify('Email delivered', 'success')\n else notify('Email queued for delivery', 'success')\n}\n\n/** Write, save and send one message. */\nexport function MailComposerForm({\n account,\n initial,\n maxBytes,\n ready,\n drafts,\n onClose,\n onOpenDraft,\n onReload,\n onChange,\n embedded = false,\n closeRequestRef,\n localDraftId: initialLocalDraftId,\n offline,\n documents,\n word,\n sessionKey,\n roomId,\n headerSlot,\n}: MailComposerFormProps) {\n const { client } = useMailClient()\n const { notify, confirm } = useBlocksEnvironment()\n const [to, setTo] = useState(initial.to.map((r) => r.email).join('; '))\n const [cc, setCc] = useState(initial.cc.map((r) => r.email).join('; '))\n const [showCc, setShowCc] = useState(initial.cc.length > 0)\n const [showBcc, setShowBcc] = useState(initial.bcc.length > 0)\n const [bcc, setBcc] = useState(initial.bcc.map((r) => r.email).join('; '))\n const [subject, setSubject] = useState(initial.subject)\n const [text, setText] = useState(initial.text)\n const [html, setHtml] = useState(initial.html)\n const [attachments, setAttachments] = useState(initial.attachments)\n const [draftId, setDraftId] = useState(initial.draft_id)\n const [error, setError] = useState('')\n const [dirty, setDirty] = useState(false)\n const [attaching, setAttaching] = useState(false)\n const [saved, setSaved] = useState(false)\n // A newer version of this draft saved elsewhere while this form had unsaved changes.\n const [replacedBy, setReplacedBy] = useState<string>()\n const isOnline = useMailOnline()\n // A native message's body opens in the Word editor when the host offers it and the server is reachable\n // (decided once: the editor is never swapped mid-message). Its room is the body; ARBI's edits are suggestions.\n const [usesWord] = useState(\n () =>\n !!word &&\n !!client.openDraftEditor &&\n account?.provider === 'native' &&\n isOnline &&\n !initialLocalDraftId\n )\n const [bodyChanged, setBodyChanged] = useState(false)\n const [wordPending, setWordPending] = useState(false)\n // The matters ARBI's work on this email can be billed to (the person's own project first).\n const projects = useMailProjects({ enabled: usesWord })\n const wordBody = useWordBody({\n word: word ?? NO_WORD,\n client,\n initial,\n sessionKey,\n roomId,\n onBodyChange: () => {\n setBodyChanged(true)\n setSaved(false)\n setDirty(true)\n },\n })\n // A draft saved while offline lives on this device until it reaches the server's Drafts.\n const [localDraftId, setLocalDraftId] = useState(initialLocalDraftId)\n const [savedLocally, setSavedLocally] = useState(false)\n const [secure, setSecure] = useState(initial.secure_delivery ?? false)\n const securePayload = useRef<unknown>(null)\n const requestId = useRef(crypto.randomUUID())\n const attemptedPayload = useRef<MailCompose | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n // Drafts are separate messages, so a new compose never replaces one on send; point to it instead.\n const sameSubjectDraft = useMemo(() => {\n const key = subject.trim().toLowerCase()\n return key\n ? drafts.find((d) => d.id !== draftId && d.subject.trim().toLowerCase() === key)\n : undefined\n }, [drafts, draftId, subject])\n const body = (): MailCompose => ({\n ...initial,\n to: parseMailRecipients(to),\n cc: parseMailRecipients(cc),\n bcc: parseMailRecipients(bcc),\n subject,\n text,\n html,\n attachments,\n draft_id: draftId,\n secure_delivery: secure,\n })\n /** Keep the draft on this device (updating the copy already there). */\n const saveOnDevice = async (compose: MailCompose) => {\n const draft = await offline!.saveDraft(account!.id, compose, localDraftId)\n setLocalDraftId(draft.id)\n }\n const save = useSaveMailDraft(\n offline && { keep: saveOnDevice, isNetworkFailure: offline.isNetworkFailure }\n )\n /** Put the message in the Outbox (with this send's request_id, so it can only go out once). */\n const queueInOutbox = async (compose: MailCompose) => {\n await offline!.queueSend({\n account: account!,\n compose,\n requestId: requestId.current,\n secure,\n securePayload: securePayload.current ?? undefined,\n })\n if (localDraftId) await offline!.deleteDraft(localDraftId)\n }\n const send = useSendMail(\n offline && { keep: queueInOutbox, isNetworkFailure: offline.isNetworkFailure }\n )\n const onSaved = (result: Awaited<ReturnType<typeof save.mutateAsync>>) => {\n setSaved(true)\n setDirty(false)\n if ('onDevice' in result) {\n setSavedLocally(true)\n return\n }\n setSavedLocally(false)\n setDraftId(result.id)\n setReplacedBy(undefined) // this version replaced the one saved elsewhere\n // The server has it now; the device copy (if this started offline) is no longer needed.\n if (localDraftId) {\n void offline?.deleteDraft(localDraftId)\n setLocalDraftId(undefined)\n }\n }\n const saveDraft = () => {\n if (usesWord) {\n // The body comes from the Word room on the server; ARBI's pending suggestions stay out of Drafts.\n if (!wordBody.ready) return setError('The editor is still opening')\n setWordPending(true)\n void wordBody\n .save(body())\n .then(\n (result) => {\n onSaved(result)\n setBodyChanged(false)\n },\n (err: Error) => setError(err.message)\n )\n .finally(() => setWordPending(false))\n return\n }\n save.mutate(\n { accountId: account!.id, compose: body() },\n { onSuccess: onSaved, onError: (err: Error) => setError(err.message) }\n )\n }\n // Saving a draft replaces it under a new id. Saved elsewhere (ARBI editing it in a private chat, another tab),\n // follow it: saves now replace the newer version; an unchanged form reopens on it, an edited one offers to.\n useMailDraftReplaced(draftId, (newId) => {\n if (save.isPending || wordPending) return // this form's own save: its answer carries the new id\n setDraftId(newId)\n if (!dirty && onReload) onReload(newId)\n else setReplacedBy(newId)\n })\n const sendMessage = async () => {\n let value = attemptedPayload.current\n if (value === null) {\n value = body()\n const recipients = [...value.to, ...value.cc, ...value.bcc]\n const problem =\n !recipients.length || recipients.length > 100\n ? 'Enter between 1 and 100 recipients'\n : recipients.some((r) => !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(r.email))\n ? 'Check the recipient email addresses'\n : value.attachments.reduce((total, a) => total + a.size, 0) > maxBytes\n ? 'Attachments exceed the email size limit'\n : null\n if (problem) return setError(problem)\n // Offline it waits in the Outbox; online the attempt is kept, so a retry resends it as is.\n if (!(offline && !isOnline)) attemptedPayload.current = value\n }\n if (usesWord) {\n if (!wordBody.ready) return setError('The editor is still opening')\n // A suggestion is never sent unreviewed: the server refuses (409) until each is accepted or rejected,\n // which is a definite refusal, so the message can be sent again once they are.\n const refused = (err: Error) => {\n setError(err.message)\n if ((err as { status?: number }).status === 409) attemptedPayload.current = null\n }\n setWordPending(true)\n try {\n if (!secure) {\n notifySent(notify, await wordBody.send({ ...value, request_id: requestId.current }))\n onClose()\n return\n }\n // Secure delivery encrypts in the browser, so it takes the body as text and HTML first.\n value = { ...value, ...(await wordBody.body(true)) }\n attemptedPayload.current = value\n } catch (err) {\n return refused(err as Error)\n } finally {\n setWordPending(false)\n }\n }\n const sending = account\n const message = value\n send.mutate(\n {\n accountId: account!.id,\n compose: message,\n requestId: requestId.current,\n // Secure delivery prepares its encrypted payload once.\n secure: secure\n ? async () => {\n if (sending?.provider !== 'native' || !client.prepareSecureMail)\n throw new Error('Choose your native inbox to send securely')\n securePayload.current ??= await client.prepareSecureMail(\n message,\n sending,\n requestId.current\n )\n return securePayload.current\n }\n : undefined,\n },\n {\n onSuccess: (result) => {\n if (result && typeof result === 'object' && 'onDevice' in result) {\n notify('Saved to your Outbox', 'info', {\n description: \"It will be sent automatically when you're back online.\",\n })\n onClose()\n return\n }\n notifySent(notify, result)\n if (localDraftId) void offline?.deleteDraft(localDraftId)\n onClose()\n },\n onError: (err: Error) => setError(err.message),\n }\n )\n }\n const busy = attaching || save.isPending || send.isPending || wordPending\n const locked = busy || attemptedPayload.current !== null\n const addFiles = async (files: FileList | null) => {\n if (!files) return\n const selected = Array.from(files)\n if (\n attachments.reduce((n, a) => n + a.size, 0) + selected.reduce((n, f) => n + f.size, 0) >\n maxBytes\n ) {\n setError(`Attachments must total less than ${Math.round(maxBytes / 1024 / 1024)} MB`)\n return\n }\n setAttaching(true)\n try {\n const added = await Promise.all(selected.map(fileAttachment))\n setAttachments((previous) => [...previous, ...added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach files')\n } finally {\n setAttaching(false)\n }\n }\n // A document of the open workspace, attached as its original file.\n const addDocument = async (documentId: string) => {\n if (!documents) return\n const used = attachments.reduce((n, a) => n + a.size, 0)\n setError('')\n setAttaching(true)\n try {\n const added = await documents.toAttachment(documentId, maxBytes - used)\n setAttachments((previous) => [...previous, added])\n setSaved(false)\n setDirty(true)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Could not attach the document')\n } finally {\n setAttaching(false)\n }\n }\n const close = () => {\n if (busy) return\n const unsaved =\n !saved &&\n (dirty || !draftId) &&\n (text || subject || to || cc || bcc || attachments.length || bodyChanged)\n if (!unsaved) return onClose()\n void confirm({\n title: 'Discard changes',\n message: 'Close this message without saving your latest changes?',\n }).then((ok) => {\n if (ok) onClose()\n })\n }\n useEffect(() => {\n if (closeRequestRef) closeRequestRef.current = close\n })\n // Moving the panel between docked and overlay remounts this form, so the parent keeps the latest\n // content and the remounted form starts from it instead of the original seed.\n useEffect(() => {\n onChange?.(body())\n // eslint-disable-next-line react-hooks/exhaustive-deps -- body() is rebuilt each render; the fields are its inputs\n }, [to, cc, bcc, subject, text, html, attachments, draftId, secure])\n // Who ARBI's work on this email is billed to: a property of the message, shown in its header, not a field of it.\n const billTo = wordBody.project && (\n <label\n className=\"flex items-center gap-1 text-xs text-muted-foreground\"\n title=\"ARBI's work on this email is billed to this project\"\n >\n Billed to\n <select\n aria-label=\"Bill to\"\n className=\"max-w-[12rem] truncate rounded bg-transparent py-0.5 text-foreground hover:bg-muted/60 focus:bg-muted/60 focus:outline-none\"\n value={wordBody.project.external_id}\n disabled={busy}\n onChange={(e) => {\n const chosen = projects.data?.find((p) => p.external_id === e.target.value)\n void wordBody\n .chooseProject(chosen && !chosen.personal ? chosen.external_id : null)\n .catch((err: Error) => setError(err.message))\n }}\n >\n {(projects.data ?? [wordBody.project]).map((p) => (\n <option key={p.external_id} value={p.external_id}>\n {p.personal ? `${p.name} (personal)` : p.name}\n </option>\n ))}\n </select>\n </label>\n )\n const form = (\n <form\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n if (ready && !busy) event.currentTarget.requestSubmit()\n } else if (event.target instanceof HTMLInputElement) {\n // Recipient/subject Enter must never send an unfinished message.\n event.preventDefault()\n }\n }}\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n void sendMessage()\n }}\n className={\n embedded\n ? 'flex h-full min-h-0 w-full flex-col bg-background'\n : 'flex max-h-[95dvh] w-full max-w-3xl flex-col rounded-xl border bg-background shadow-2xl'\n }\n >\n {!embedded && (\n <header className=\"flex items-center justify-between border-b px-5 py-3\">\n <h2 className=\"font-semibold\">New message</h2>\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-label=\"Close message\"\n disabled={busy}\n onClick={close}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto px-5 py-3\">\n {sameSubjectDraft && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n A draft with this subject is already in Drafts.\n {onOpenDraft && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n onClick={() => onOpenDraft(sameSubjectDraft.id)}\n >\n Open draft\n </Button>\n )}\n </div>\n )}\n {replacedBy && (\n <div\n role=\"status\"\n className=\"mb-3 flex items-center justify-between gap-3 rounded-md bg-muted/40 px-3 py-2 text-xs text-muted-foreground\"\n >\n This draft was changed elsewhere (by ARBI or in another tab). Saving keeps your version.\n {onReload && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n disabled={busy}\n onClick={() => {\n void confirm({\n title: 'Load changes',\n message: 'Discard your unsaved changes and load the changed draft?',\n }).then((ok) => {\n if (ok) onReload(replacedBy)\n })\n }}\n >\n Load changes\n </Button>\n )}\n </div>\n )}\n <p className=\"mb-2 flex items-center gap-3 border-b border-border/60 pb-3 text-xs text-muted-foreground\">\n <span className=\"w-14 shrink-0\">From</span>\n <span className=\"rounded bg-muted/50 px-2 py-1 text-foreground\">\n {account?.email ?? 'Connect a mailbox to send'}\n </span>\n </p>\n {usesWord && wordBody.project && !headerSlot && <p className=\"mb-2\">{billTo}</p>}\n {usesWord && wordBody.project && headerSlot && createPortal(billTo, headerSlot)}\n {(\n [\n ['To', to, setTo],\n ['Cc', cc, setCc],\n ['Bcc', bcc, setBcc],\n ] as const\n )\n .filter(\n ([label]) =>\n label === 'To' || (label === 'Cc' && showCc) || (label === 'Bcc' && showBcc)\n )\n .map(([label, value, setter]) => (\n <label\n key={label}\n className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\"\n >\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">{label}</span>\n <input\n aria-label={label}\n required={label === 'To' && !cc && !bcc}\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={value}\n placeholder={label === 'To' ? 'Add recipients' : ''}\n onChange={(e) => {\n setter(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n {label === 'To' && (\n <span className=\"flex shrink-0 gap-2\">\n {!showCc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowCc(true)}\n >\n Cc\n </button>\n )}\n {!showBcc && (\n <button\n type=\"button\"\n disabled={locked}\n className=\"text-xs text-muted-foreground hover:text-primary\"\n onClick={() => setShowBcc(true)}\n >\n Bcc\n </button>\n )}\n </span>\n )}\n </label>\n ))}\n <label className=\"flex items-center gap-3 border-b border-border/60 py-2.5 text-sm focus-within:border-primary\">\n <span className=\"w-14 shrink-0 text-xs text-muted-foreground\">Subject</span>\n <input\n aria-label=\"Subject\"\n placeholder=\"Add a subject\"\n disabled={locked}\n className=\"min-w-0 flex-1 bg-transparent outline-none\"\n value={subject}\n onChange={(e) => {\n setSubject(e.target.value)\n setSaved(false)\n setDirty(true)\n }}\n />\n </label>\n <Suspense fallback={<p className=\"py-4 text-sm text-muted-foreground\">Loading editor…</p>}>\n {usesWord ? (\n <div\n // The body is the rest of the composer, edge to edge: no box around the letter.\n className=\"-mx-5 -mb-3 flex min-h-[22rem] flex-1 flex-col border-t border-border/60\"\n data-testid=\"mail-word-body\"\n // The editor's own forms (a comment, a reply) submit there: never as this message (that would send it).\n onSubmit={(event) => event.stopPropagation()}\n >\n <NativeDocxEditor\n compact\n adapter={wordBody.adapter}\n documentId={wordBody.documentKey}\n title=\"Email\"\n stateRef={wordBody.stateRef}\n />\n </div>\n ) : (\n <MailBodyEditor\n text={text}\n html={html}\n disabled={locked}\n onChange={(nextText, nextHtml) => {\n setText(nextText)\n setHtml(nextHtml)\n setSaved(false)\n }}\n />\n )}\n </Suspense>\n <div className=\"flex flex-wrap gap-2\">\n {attachments.map((attachment, index) => (\n <span\n key={`${attachment.name}-${index}`}\n className=\"flex items-center gap-2 rounded-md border border-border/70 bg-muted/30 px-3 py-2 text-xs\"\n >\n <Paperclip className=\"size-3\" />\n {attachment.name}\n <button\n type=\"button\"\n disabled={locked}\n aria-label={`Remove ${attachment.name}`}\n onClick={() => {\n setAttachments((a) => a.filter((_, i) => i !== index))\n setSaved(false)\n setDirty(true)\n }}\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n </div>\n {error && (\n <p role=\"alert\" className=\"mt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n <footer className=\"flex flex-wrap items-center gap-1 border-t border-border/60 bg-muted/20 px-4 py-2 [&_button]:h-8 [&_button]:text-xs\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!ready || locked}\n onClick={() => {\n setError('')\n saveDraft()\n }}\n >\n {save.isPending ? 'Saving…' : 'Save draft'}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={locked}\n onClick={() => fileInput.current?.click()}\n >\n <Paperclip className=\"mr-2 size-4\" />\n Attach\n </Button>\n {documents && (\n <MailDocumentPicker\n documents={documents.documents}\n disabled={locked}\n onAttach={(doc) => void addDocument(doc.id)}\n />\n )}\n <input\n ref={fileInput}\n type=\"file\"\n multiple\n hidden\n onChange={(e) => {\n void addFiles(e.target.files)\n e.target.value = ''\n }}\n />\n {saved && (\n <span className=\"whitespace-nowrap text-xs text-muted-foreground\">\n {savedLocally\n ? 'Saved on this device · syncs to Drafts when online'\n : 'Saved to Drafts'}\n </span>\n )}\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n {account?.provider === 'native' && client.prepareSecureMail && (\n <Tooltip>\n <TooltipTrigger asChild showWithText>\n <label className=\"flex h-8 shrink-0 cursor-pointer items-center gap-1.5 rounded border border-border/70 px-2 text-xs text-primary\">\n <input\n type=\"checkbox\"\n className=\"size-3.5 accent-primary\"\n checked={secure}\n disabled={locked}\n onChange={(e) => setSecure(e.target.checked)}\n />\n Secure\n </label>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n The recipient will receive a secure link to access the message through the platform.\n </TooltipContent>\n </Tooltip>\n )}\n <Button\n type=\"submit\"\n className=\"h-8 rounded bg-primary px-4 text-primary-foreground shadow-none hover:bg-primary/90\"\n disabled={!ready || busy}\n >\n <Send className=\"mr-2 size-4\" />\n {send.isPending ? 'Sending…' : attemptedPayload.current ? 'Check send result' : 'Send'}\n </Button>\n </div>\n {offline && !isOnline && (\n <p\n className=\"w-full text-[11px] text-muted-foreground\"\n data-testid=\"compose-offline-hint\"\n >\n {\n \"You're offline. Send puts this message in your Outbox; it goes out when you reconnect.\"\n }\n </p>\n )}\n </footer>\n </form>\n )\n if (embedded)\n return (\n <div role=\"dialog\" aria-label=\"Compose email\" className=\"h-full min-h-0\">\n {form}\n </div>\n )\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) close()\n }}\n >\n <DialogContent className=\"max-h-[95dvh] max-w-3xl overflow-auto p-0\">\n <DialogTitle className=\"sr-only\">Compose email</DialogTitle>\n <DialogDescription className=\"sr-only\">Write a message and attach files.</DialogDescription>\n {form}\n </DialogContent>\n </Dialog>\n )\n}\n","import type { MailAccount } from '@arbidocs/react'\n\n/** The account a `mailbox` choice names: an account id, or `'native'` for the user's own inbox. */\nexport function resolveMailbox(\n accounts: MailAccount[] | undefined,\n mailbox: string | undefined\n): MailAccount | undefined {\n if (!accounts) return undefined\n if (mailbox === 'native') return accounts.find((a) => a.provider === 'native')\n return mailbox ? accounts.find((a) => a.id === mailbox) : undefined\n}\n","/**\n * The mail composer bound to the mail client in scope: write a new message, or open a saved draft\n * (`draftId`), save it to Drafts and send it, with files and workspace documents attached.\n *\n * Inside `ConnectedMailbox` everything is passed in; on its own it finds what it needs: the account\n * (`mailbox`, default the native inbox), the attachment limit, the unlock and the saved drafts.\n */\n\nimport { useMemo, useState, type RefObject } from 'react'\nimport {\n useMailAccounts,\n useMailClient,\n useMailDraftCompose,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAccount,\n type MailCompose,\n type MailMessage,\n} from '@arbidocs/react'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { hydrateMailAttachments } from './attachments'\nimport { MailComposerForm } from './MailComposerForm'\nimport { resolveMailbox } from './mailbox'\nimport type { MailDocumentSource, MailOfflineSupport, MailWordEditor } from './types'\n\nconst DEFAULT_MAX_BYTES = 15 * 1024 * 1024\n\nexport interface ConnectedMailComposerProps {\n /** Open this saved draft (from the account's Drafts) instead of a new message. */\n draftId?: string\n /** The message to start from (new, reply, forward). Default: empty, or the draft. */\n initial?: MailCompose\n /** Send from this account. Default: the `mailbox` account. */\n account?: MailAccount\n /** Which account to send from when `account` is not given: an id, or `'native'` (default). */\n mailbox?: string\n /** The attachment limit. Default: the deployment's. */\n maxBytes?: number\n /** Whether saving and sending can run. Default: once the account is unlocked (or offline). */\n ready?: boolean\n /** Saved drafts, for the \"already in Drafts\" notice. Default: the account's Drafts. */\n drafts?: MailMessage[]\n onClose: () => void\n onOpenDraft?: (id: string) => void\n onChange?: (value: MailCompose) => void\n /** Fill the parent (a panel) instead of opening as a dialog. */\n embedded?: boolean\n /** Receives the close request (asks before discarding unsaved changes). */\n closeRequestRef?: RefObject<(() => void) | null>\n /** Editing a draft kept on this device (see {@link MailOfflineSupport}). */\n localDraftId?: string\n offline?: MailOfflineSupport\n /** Workspace documents to attach (\"From workspace\"). Absent: not offered. */\n documents?: MailDocumentSource\n /** A native draft's body in the Word editor (see {@link MailWordEditor}). Absent: the rich-text body. */\n word?: MailWordEditor\n /** This compose session, stable across remounts (its Word room is kept for it). */\n sessionKey?: string\n /** Open this Word room as the body (a new message whose body ARBI wrote). */\n roomId?: string\n /** A reply to this email (its id): the composer starts addressed and threaded as one; the body is `roomId`. */\n replyTo?: string\n /** The host's header for this message (a panel's title bar): who ARBI's work is billed to shows there. */\n headerSlot?: HTMLElement | null\n}\n\nexport function ConnectedMailComposer({\n draftId,\n initial,\n account: accountProp,\n mailbox = 'native',\n maxBytes: maxBytesProp,\n ready: readyProp,\n drafts: draftsProp,\n offline,\n replyTo,\n ...rest\n}: ConnectedMailComposerProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const policy = useMailPolicy()\n const accounts = useMailAccounts({ enabled: !accountProp && !!policy.data?.enabled })\n const account = accountProp ?? resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(readyProp === undefined ? account : undefined)\n const ready = readyProp ?? (!!account && (!!unlock.data || !isOnline))\n const folders = useMailFolders(account, { enabled: !draftsProp && ready })\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const draftsList = useMailMessages(account, draftsFolderId, '', null, {\n enabled: !draftsProp && ready,\n })\n // A newer version of the draft, saved elsewhere (see MailComposerForm's onReload): reopen on it.\n const [reloaded, setReloaded] = useState<string>()\n const openId = reloaded ?? draftId\n const draft = useMailDraftCompose(\n account,\n openId,\n async (from, id) => {\n const message = await client.getMessage(from, id)\n return draftMailCompose(\n message,\n await hydrateMailAttachments(client, from, message.id, message.attachments, {\n isOnline,\n offline,\n })\n )\n },\n { enabled: (!initial || !!reloaded) && ready }\n )\n const original = useMailMessage(account, replyTo, { enabled: !!replyTo && ready })\n const start = useMemo(() => {\n if (replyTo)\n return original.data && account\n ? {\n ...replyMailCompose(original.data, { account, folderRole: 'inbox' }),\n text: '',\n html: '',\n }\n : undefined\n return reloaded ? draft.data : (initial ?? (openId ? draft.data : emptyMailCompose()))\n }, [replyTo, original.data, account, reloaded, initial, openId, draft.data])\n if (!start)\n return (draft.error ?? original.error) ? (\n <p role=\"alert\" className=\"p-4 text-sm text-destructive\">\n {(draft.error ?? original.error)?.message}\n </p>\n ) : (\n <p className=\"p-4 text-sm text-muted-foreground\">Loading draft…</p>\n )\n return (\n <MailComposerForm\n key={`${account?.id}-${openId ?? ''}`}\n account={account}\n initial={start}\n maxBytes={maxBytesProp ?? policy.data?.max_attachment_bytes ?? DEFAULT_MAX_BYTES}\n ready={ready}\n drafts={draftsProp ?? draftsList.data?.messages ?? []}\n offline={offline}\n onReload={setReloaded}\n {...rest}\n />\n )\n}\n","import { useState } from 'react'\nimport { Mail as MailIcon } from 'lucide-react'\nimport { Button, Input } from '@arbidocs/react/ui'\nimport {\n aliasTakenMessage,\n defaultMailAlias,\n isAliasTakenError,\n nextAliasSuggestion,\n useClaimNativeAlias,\n useMailOnline,\n type MailPolicy,\n} from '@arbidocs/react'\nimport type { MailAliasUser } from './ConnectedMailAccounts'\n\n/**\n * First run of Mail, in the main screen rather than a dialog: the user confirms the suggested\n * address and is straight into their inbox. External accounts (Gmail, Outlook, IMAP) stay one\n * click away, in the accounts dialog, for deployments that enable them.\n */\nexport function ConnectedMailSetup({\n policy,\n user,\n productName,\n onClaimed,\n onConnectExisting,\n}: {\n policy: MailPolicy\n user?: MailAliasUser | null\n /** The product's name in the copy (\"Set up your ARBI email\"). Default: none. */\n productName?: string\n /** The inbox exists now (the alias that was claimed). */\n onClaimed: (alias: string) => void\n onConnectExisting: () => void\n}) {\n const isOnline = useMailOnline()\n const [alias, setAlias] = useState(() => defaultMailAlias(user))\n const [error, setError] = useState('')\n const claim = useClaimNativeAlias(onClaimed)\n const hasExternal = policy.oauth_providers.length > 0 || policy.server_profiles.length > 0\n const onClaimError = (err: Error) => {\n if (!isAliasTakenError(err)) return setError(err.message)\n const suggestion = nextAliasSuggestion(alias)\n setAlias(suggestion)\n setError(aliasTakenMessage(alias, suggestion, policy.native_domain))\n }\n\n return (\n <div\n data-testid=\"mail-setup\"\n className=\"mx-auto flex max-w-xl flex-col items-center gap-6 px-6 py-16 text-center\"\n >\n <MailIcon className=\"size-10 text-muted-foreground\" aria-hidden />\n {policy.native_enabled ? (\n <>\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">\n Set up your {productName ? `${productName} ` : ''}email\n </h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Confirm your address and you are ready to go: you can send and receive email as\n </p>\n </div>\n <form\n className=\"flex w-full flex-col items-center gap-4\"\n onSubmit={(e) => {\n e.preventDefault()\n setError('')\n claim.mutate(alias, { onError: onClaimError })\n }}\n >\n <div className=\"flex w-full items-center justify-center gap-2 text-base\">\n <Input\n aria-label=\"Email alias\"\n required\n pattern={'[a-z0-9][a-z0-9._\\\\-]{0,62}'}\n autoFocus\n className=\"max-w-60 text-right\"\n value={alias}\n onChange={(e) => setAlias(e.target.value.toLowerCase())}\n />\n <span className=\"text-foreground\">@{policy.native_domain}</span>\n </div>\n <Button\n type=\"submit\"\n disabled={claim.isPending || !alias || !isOnline}\n title={isOnline ? undefined : 'Available when you are back online'}\n >\n {claim.isPending ? 'Setting up…' : 'Confirm'}\n </Button>\n </form>\n </>\n ) : (\n <div>\n <h2 className=\"text-xl font-semibold text-foreground\">Connect your email</h2>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n Connect an existing account to read and send email{' '}\n {productName ? `from ${productName}` : 'here'}.\n </p>\n </div>\n )}\n {hasExternal && (\n <Button\n variant={policy.native_enabled ? 'ghost' : 'default'}\n onClick={onConnectExisting}\n className={policy.native_enabled ? 'text-muted-foreground' : undefined}\n >\n {policy.native_enabled\n ? 'Connect an existing email account instead'\n : 'Connect an email account'}\n </Button>\n )}\n {!policy.native_enabled && !hasExternal && (\n <p className=\"text-sm text-muted-foreground\">\n Mail is not set up for this deployment yet. Ask your administrator.\n </p>\n )}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </div>\n )\n}\n","/**\n * The whole mail screen bound to the mail client in scope (`MailClientProvider`, else the\n * `ArbiProvider` session): first-run setup or the accounts, the folder picker and filter, the message\n * list, the reader and the composer.\n *\n * The host owns navigation: it can ask for a draft (`draftId`), a folder (`folder`) or a new message\n * with attachments (`composeAttachments`); each is taken once and reported back (`on…Opened`), so\n * asking again for the same thing works. Device storage (offline reading, the Outbox), workspace\n * documents and saving to a workspace are optional host capabilities passed as props.\n */\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { GridState } from 'ag-grid-community'\nimport { ArrowLeft, Mail as MailIcon, Plus, Settings, X } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogTitle, DialogDescription } from '@arbidocs/react/ui'\nimport {\n accountPath,\n mailJson,\n useMailCache,\n MailOfflineUnavailableError,\n useMailAccounts,\n useMailClient,\n useMailFolders,\n useMailMessage,\n useMailMessages,\n useMailOnline,\n useMailPolicy,\n useMailUnlock,\n type MailAddress,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailFolder,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { FilterInput } from '../../shell/FilterInput'\nimport { TabHeader } from '../../shell/TabHeader'\nimport { FolderPickerRow } from '../../files/FolderPicker'\nimport { FolderFilterButton } from '../../files/bulk/FolderFilterButton'\nimport { FilesFilterBar } from '../../files/page/FilesPageParts'\nimport { TriStateFilterMenu, type TriState } from '../../settings/TriStateFilterMenu'\nimport { ConfirmDialog } from '../../settings/ConfirmDialog'\nimport { MailGrid } from '../../collaboration/mail/MailGrid'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport {\n draftMailCompose,\n emptyMailCompose,\n replyMailCompose,\n} from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { ConnectedMailAccounts, type MailAliasUser } from './ConnectedMailAccounts'\nimport { ConnectedMailComposer } from './ConnectedMailComposer'\nimport { resolveMailbox } from './mailbox'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { ConnectedMailSetup } from './ConnectedMailSetup'\nimport type {\n MailDocumentSource,\n MailLocalDraft,\n MailOutboxEntry,\n MailOfflineSupport,\n MailPanelProps,\n MailSaveToWorkspace,\n MailWordEditor,\n} from './types'\n\ntype MailQuickFilter = 'unread' | 'attachments' | 'secure'\n\nconst NO_DRAFTS: MailLocalDraft[] = []\nconst NO_OUTBOX: MailOutboxEntry[] = []\n\n/** Row ids of drafts kept on this device, in the Drafts list. */\nconst LOCAL_DRAFT_PREFIX = 'local-draft:'\n/** Offline with no folders saved on this device: Drafts (kept here) and the Outbox still work. */\nconst OFFLINE_FOLDERS: MailFolder[] = [\n { id: 'device:drafts', name: 'Drafts', role: 'drafts', unread: 0 },\n]\n\n/** A draft kept on this device, as a row of the Drafts folder. */\nfunction localDraftRow(draft: MailLocalDraft): MailMessage {\n return {\n id: LOCAL_DRAFT_PREFIX + draft.id,\n subject: draft.compose.subject,\n sender: [],\n to: draft.compose.to,\n cc: draft.compose.cc,\n bcc: draft.compose.bcc,\n received_at: new Date(draft.updatedAt).toISOString(),\n preview: draft.error\n ? `Saved on this device only: ${draft.error}`\n : 'Saved on this device · syncs to Drafts when online',\n unread: false,\n text: '',\n references: [],\n attachments: draft.compose.attachments.map((a) => ({ ...a, content_base64: null })),\n }\n}\n\n/** Excluded wins; with any included, an item needs one of them. */\nfunction applyQuickFilters(\n messages: MailMessage[],\n filters: Map<MailQuickFilter, TriState>\n): MailMessage[] {\n const included = [...filters].filter(([, s]) => s === 'include').map(([k]) => k)\n const excluded = [...filters].filter(([, s]) => s === 'exclude').map(([k]) => k)\n if (!included.length && !excluded.length) return messages\n return messages.filter((m) => {\n const has: Record<MailQuickFilter, boolean> = {\n unread: m.unread,\n attachments: m.attachments.length > 0,\n secure: !!m.secure_delivery,\n }\n if (excluded.some((k) => has[k])) return false\n return !included.length || included.some((k) => has[k])\n })\n}\n\n/** The default panel: the reader and composer beside the list. */\nfunction SidePanel({ isOpen, title, onClose, children }: MailPanelProps) {\n if (!isOpen) return null\n return (\n <aside\n aria-label={title}\n className=\"flex min-h-0 w-full max-w-2xl shrink-0 flex-col border-l border-border bg-background\"\n >\n <header className=\"flex items-center justify-between gap-2 border-b px-3 py-2\">\n <h2 className=\"truncate text-sm font-semibold\">{title}</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Close\"\n data-testid=\"close-mail-viewer\"\n onClick={onClose}\n >\n <X className=\"size-4\" />\n </Button>\n </header>\n <div className=\"flex min-h-0 flex-1\">{children}</div>\n </aside>\n )\n}\n\nexport interface ConnectedMailboxProps {\n /** Which mailbox: an account id, or `'native'` for the user's own inbox. Default: the first. */\n mailbox?: string\n /** Open this draft (in the native mailbox's Drafts); taken once, then `onDraftOpened`. */\n draftId?: string | null\n onDraftOpened?: () => void\n /** Open this folder (a role such as `inbox`, or an id); taken once, then `onFolderOpened`. */\n folder?: string | null\n onFolderOpened?: () => void\n /** Start a new message with these attachments; taken once, then `onComposeOpened`. */\n composeAttachments?: MailAttachment[] | null\n onComposeOpened?: () => void\n /**\n * Open a document: offered as \"Open\" on the notice after an email is saved into a workspace\n * (when `saveToWorkspace.save` resolves with the new document's id).\n */\n onOpenDocument?: (documentId: string, workspaceId: string) => void\n /** The user, for the suggested native address (`given.family`). */\n user?: MailAliasUser | null\n /** The product's name in the setup copy (\"Set up your ARBI email\"). */\n productName?: string\n /** Where an OAuth provider returns after connecting. Default: the current page. */\n oauthReturnPath?: string\n /** How a person is named (e.g. from contacts). Default: the name on the message, else the address. */\n personLabel?: (person: MailAddress) => string\n /** Device storage: offline reading, the Outbox, drafts written offline. Absent: online only. */\n offline?: MailOfflineSupport\n /** The open workspace's documents, attachable in the composer. */\n documents?: MailDocumentSource\n /** Saving an email into a workspace (\"Save to workspace\" on native mail). */\n saveToWorkspace?: MailSaveToWorkspace\n /** Native drafts' bodies in the Word editor, where ARBI's edits are suggestions. Absent: rich text. */\n word?: MailWordEditor\n /** \"Reply with ARBI\" on a native message: the host starts the chat that drafts it. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n /** A calendar invite card for a message with an .ics part. */\n renderInvite?: (props: {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n }) => ReactNode\n /** Where the reader and composer open. Default: a panel beside the list. */\n renderPanel?: (props: MailPanelProps) => ReactNode\n /** The reader or composer opened or closed. */\n onViewerOpenChange?: (open: boolean) => void\n /** The message list's column state, and where to persist it. */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n /** The message opened first (e.g. restored after a redirect). */\n initialMessageId?: string | null\n}\n\nexport function ConnectedMailbox({\n mailbox,\n draftId,\n onDraftOpened,\n folder: requestedFolder,\n onFolderOpened,\n composeAttachments,\n onComposeOpened,\n onOpenDocument,\n user,\n productName,\n oauthReturnPath,\n personLabel,\n offline,\n documents,\n saveToWorkspace,\n word,\n onReplyWithArbi,\n renderInvite,\n renderPanel = SidePanel,\n onViewerOpenChange,\n gridState,\n onGridStateChange,\n initialMessageId = null,\n}: ConnectedMailboxProps) {\n const { notify } = useBlocksEnvironment()\n const cache = useMailCache()\n const { client } = useMailClient()\n const [savingToWorkspace, setSavingToWorkspace] = useState(false)\n const [savePending, setSavePending] = useState(false)\n const [saveWorkspaceId, setSaveWorkspaceId] = useState('')\n const { data: policy, error: policyError } = useMailPolicy()\n const isOnline = useMailOnline()\n // Mail queries run offline too (networkMode 'always'): a host's client answers from this device,\n // or says plainly that something isn't saved here, instead of waiting forever for a connection.\n const accounts = useMailAccounts({ enabled: !!policy?.enabled })\n const [accountId, setAccountId] = useState('')\n const account =\n accounts.data?.find((a) => a.id === accountId) ??\n resolveMailbox(accounts.data, mailbox) ??\n accounts.data?.[0]\n const unlock = useMailUnlock(account)\n const [folder, setFolder] = useState('inbox')\n const [folderMenuOpen, setFolderMenuOpen] = useState(false)\n const [filterMenuOpen, setFilterMenuOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [mailFilters, setMailFilters] = useState<Map<MailQuickFilter, TriState>>(new Map())\n const [cursor, setCursor] = useState<string | null>(null)\n const [selected, setSelected] = useState<string | null>(initialMessageId)\n const [compose, setCompose] = useState<MailCompose | null>(null)\n // Set when the open compose is a draft kept on this device.\n const [composeLocalDraftId, setComposeLocalDraftId] = useState<string | undefined>()\n // Each compose the user opens (new, reply, forward, a draft) gets a fresh form. Edits reported by\n // the form (onChange) keep the same one, so moving the panel never resets what was typed.\n const [composeSession, setComposeSession] = useState(0)\n // Unique to this mailbox, so a compose session's key (which keeps its Word room) never repeats.\n const [mailboxKey] = useState(() => crypto.randomUUID())\n const openCompose = (value: MailCompose, localDraftId?: string) => {\n setComposeSession((n) => n + 1)\n setComposeLocalDraftId(localDraftId)\n setCompose(value)\n }\n const composeClose = useRef<(() => void) | null>(null)\n useEffect(() => {\n onViewerOpenChange?.(!!selected || !!compose)\n }, [selected, compose, onViewerOpenChange])\n useEffect(() => () => onViewerOpenChange?.(false), [onViewerOpenChange])\n const [settings, setSettings] = useState(false)\n // Set once the user has just created their inbox, to greet them with their new address.\n const [justCreated, setJustCreated] = useState(false)\n const [actionError, setActionError] = useState('')\n // Offline the account can't be unlocked, and needn't be: reads come from this device and sends\n // wait in the Outbox. Unlocking runs as soon as the connection is back.\n const ready = !!account && (!!unlock.data || !isOnline)\n useEffect(() => {\n // Reads that ran before the unlock finished (e.g. right after reconnecting) get another go.\n if (unlock.data) void cache.refreshFolders()\n }, [unlock.data, cache])\n const folders = useMailFolders(account, { enabled: ready })\n const outbox = offline?.useOutbox() ?? NO_OUTBOX\n const outboxRole = offline?.outboxRole\n const waitingInOutbox = outbox.filter(\n (item) => item.account.id === account?.id && item.status !== 'sent'\n ).length\n // The server's folders, plus the Outbox (the server's own when it has one, else this device's).\n const folderList = useMemo(() => {\n const base =\n folders.data ?? (offline && !isOnline && folders.error ? OFFLINE_FOLDERS : undefined)\n if (!base || !outboxRole) return base\n const withCount = (f: MailFolder) =>\n f.role === outboxRole ? { ...f, unread: f.unread + waitingInOutbox } : f\n return base.some((f) => f.role === outboxRole)\n ? base.map(withCount)\n : [...base, withCount({ id: 'device:outbox', name: 'Outbox', role: outboxRole, unread: 0 })]\n }, [folders.data, folders.error, isOnline, waitingInOutbox, offline, outboxRole])\n const folderId =\n folderList?.find((f) => f.role === folder || f.id === folder)?.id ?? folderList?.[0]?.id\n const folderRole = folderList?.find((f) => f.id === folderId)?.role ?? folder\n // Folders that exist only on this device have no server list.\n const deviceFolder = !!folderId?.startsWith('device:')\n const list = useMailMessages(account, folderId, query, cursor, {\n enabled: ready && !deviceFolder,\n refetchInterval: 60_000,\n })\n const localDrafts = offline?.useLocalDrafts(account?.id) ?? NO_DRAFTS\n // Same key as the list above when Drafts is open, so the cache is shared.\n const draftsFolderId = folders.data?.find((f) => f.role === 'drafts')?.id\n const drafts = useMailMessages(account, draftsFolderId, '', null, {\n enabled: ready && !!compose,\n })\n // Quick filters (the dropdown inside the filter box) narrow the messages already loaded.\n const loadedMessages = useMemo(() => {\n if (folderRole !== 'drafts') return list.data?.messages\n const words = query.toLowerCase()\n const mine = localDrafts\n .map(localDraftRow)\n .filter(\n (m) =>\n !words ||\n `${m.subject} ${m.to.map((r) => r.email).join(' ')}`.toLowerCase().includes(words)\n )\n return [...mine, ...(list.data?.messages ?? [])]\n }, [folderRole, list.data, localDrafts, query])\n const filteredMessages = useMemo(\n () => applyQuickFilters(loadedMessages ?? [], mailFilters),\n [loadedMessages, mailFilters]\n )\n const mailFilterOptions = useMemo(\n () => [\n {\n id: 'unread' as const,\n label: 'Unread',\n count: (loadedMessages ?? []).filter((m) => m.unread).length,\n },\n {\n id: 'attachments' as const,\n label: 'Has attachments',\n count: (loadedMessages ?? []).filter((m) => m.attachments.length > 0).length,\n },\n {\n id: 'secure' as const,\n label: 'Secure delivery',\n count: (loadedMessages ?? []).filter((m) => m.secure_delivery).length,\n },\n ],\n [loadedMessages]\n )\n const hasActiveFilters = !!query || [...mailFilters.values()].some(Boolean)\n const detail = useMailMessage(account, selected, { enabled: ready && !compose })\n const message = detail.data\n // A new message with attachments asked for by the host (e.g. \"Email\" on a document).\n useEffect(() => {\n if (!composeAttachments?.length) return\n openCompose({ ...emptyMailCompose(), attachments: composeAttachments })\n onComposeOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [composeAttachments])\n useEffect(() => {\n if (!requestedFolder) return\n setFolder(requestedFolder)\n setCursor(null)\n setSelected(null)\n onFolderOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [requestedFolder])\n // A draft asked for by the host: it is in the native mailbox's Drafts, so it is selected once the\n // accounts are known and that account is chosen (never read from another).\n const [pendingDraft, setPendingDraft] = useState<string | null>(null)\n useEffect(() => {\n if (!draftId) return\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(null)\n setPendingDraft(draftId)\n onDraftOpened?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps -- taken once per request\n }, [draftId])\n useEffect(() => {\n if (!pendingDraft || !accounts.data) return\n const native = accounts.data.find((a) => a.provider === 'native')\n if (native) setAccountId(native.id)\n setSelected(pendingDraft)\n setPendingDraft(null)\n }, [pendingDraft, accounts.data])\n // The host switched mailbox.\n useEffect(() => {\n const chosen = resolveMailbox(accounts.data, mailbox)\n if (!chosen) return\n setAccountId(chosen.id)\n // eslint-disable-next-line react-hooks/exhaustive-deps -- follows the host's choice only\n }, [mailbox, !!accounts.data])\n const patch = (messageId: string, body: MailMessageUpdate) =>\n mailJson(\n client.fetch,\n `${accountPath(account!.id)}/messages/${encodeURIComponent(messageId)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n // ARBI mail's Trash: Restore (back where it came from), Delete forever, Empty Trash. Mail in the Trash\n // still counts against the person's storage until it is deleted or purged.\n const nativeTrash = account?.provider === 'native' && folderRole === 'trash'\n const [confirmDelete, setConfirmDelete] = useState<'message' | 'trash' | null>(null)\n const [deleting, setDeleting] = useState(false)\n const deleteForever = async () => {\n if (!account || !isOnline || !confirmDelete) return\n setDeleting(true)\n try {\n if (confirmDelete === 'message' && selected) {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(selected)}`,\n { method: 'DELETE' }\n )\n setSelected(null)\n } else if (confirmDelete === 'trash') {\n await mailJson(client.fetch, `${accountPath(account.id)}/messages?folder=trash`, {\n method: 'DELETE',\n })\n setSelected(null)\n }\n await cache.refreshAll()\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not delete')\n } finally {\n setDeleting(false)\n setConfirmDelete(null)\n }\n }\n const update = async (body: MailMessageUpdate) => {\n if (!selected || !account || !isOnline) return\n try {\n await patch(selected, body)\n await cache.refreshAll()\n if (body.folder_id || body.action) setSelected(null)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n const response = await client.fetch(path)\n saveFile(await response.blob(), name)\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const downloadAttachment = async (a: MailAttachment) => {\n if (!message || !account) return\n if (isOnline) {\n await download(attachmentPath(account.id, message.id, a.id), a.name)\n return\n }\n const file = await offline?.loadAttachment(account.id, message.id, a)\n if (!file) {\n setActionError(`${a.name} isn't saved on this device. Open it when you're back online.`)\n return\n }\n saveFile(file, a.name)\n }\n const saveEmail = async () => {\n if (!message || !account || !saveWorkspaceId || !saveToWorkspace) return\n setSavePending(true)\n try {\n const response = await client.fetch(\n `${accountPath(account.id)}/messages/${message.id}/original`\n )\n const fileName = `${message.subject.replace(/[^a-zA-Z0-9 ._-]/g, '').slice(0, 80) || 'email'}.eml`\n const workspaceId = saveWorkspaceId\n const documentId = await saveToWorkspace.save(\n workspaceId,\n new File([await response.blob()], fileName, { type: 'message/rfc822' })\n )\n setSavingToWorkspace(false)\n notify(\n 'Email saved to workspace',\n 'success',\n documentId && onOpenDocument\n ? { action: { label: 'Open', onClick: () => onOpenDocument(documentId, workspaceId) } }\n : undefined\n )\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not save email to workspace')\n } finally {\n setSavePending(false)\n }\n }\n const hydrate = (attachments: MailAttachment[]) =>\n message && account\n ? hydrateMailAttachments(client, account, message.id, attachments, { isOnline, offline })\n : Promise.resolve([])\n const editDraft = async () => {\n if (!message) return\n try {\n openCompose(draftMailCompose(message, await hydrate(message.attachments)))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not load draft attachments')\n }\n }\n const reply = async (forward = false, all = false) => {\n if (!message || !account) return\n try {\n const attachments = forward ? await hydrate(message.attachments) : []\n openCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n const failures = [policyError, accounts.error, unlock.error, folders.error, list.error]\n const offlineNotice = failures.find((e) => e instanceof MailOfflineUnavailableError)?.message\n const error =\n actionError ||\n failures.find((e) => e && !(e instanceof MailOfflineUnavailableError))?.message ||\n (detail.error instanceof MailOfflineUnavailableError ? undefined : detail.error?.message)\n return (\n <section className=\"flex h-full min-h-0 flex-col bg-background\" aria-label=\"Mail\">\n <header className=\"sticky top-0 z-10 bg-background\">\n <TabHeader\n testId=\"mail-tab-header\"\n tabs={[\n {\n id: 'mail',\n // Icon + count only, like the Files, Facts and Threads headers.\n label: '',\n count: filteredMessages.length,\n countIcon: <MailIcon className=\"size-3.5\" />,\n countPlacement: 'leading',\n presentation: 'count',\n hasActiveFilters,\n testId: 'mail-tab',\n },\n ]}\n activeTabId=\"mail\"\n onTabChange={() => {}}\n compactBreakpoint={360}\n firstTabContent={\n account ? (\n <FilesFilterBar>\n <FilterInput\n value={query}\n onChange={(q) => {\n setQuery(q)\n setCursor(null)\n }}\n hideFieldPicker\n fields={['text']}\n onFieldsChange={() => {}}\n ariaLabel=\"Filter mail\"\n labels={{ placeholder: 'Filter...' }}\n testIds={{ root: 'mail-search', input: 'mail-filter-input' }}\n className=\"min-w-28 flex-1 sm:max-w-72\"\n filter={\n <TriStateFilterMenu\n testId=\"mail-bar-filter-button\"\n open={filterMenuOpen}\n onOpenChange={setFilterMenuOpen}\n filterStates={mailFilters}\n onFiltersChange={setMailFilters}\n options={mailFilterOptions}\n groups={[{ label: 'Messages', options: ['unread', 'attachments', 'secure'] }]}\n renderChevron\n disableHoverOpen\n triggerClassName=\"inline-flex items-center gap-0.5 h-6 rounded px-1 text-muted-foreground hover:bg-foreground/10 cursor-pointer transition-colors pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center\"\n />\n }\n />\n {folderList && (\n <div className=\"flex shrink-0 items-center gap-2\">\n <FolderFilterButton\n label={folderList.find((f) => f.id === folderId)?.name ?? 'Folders'}\n isActive={false}\n open={folderMenuOpen}\n onOpenChange={setFolderMenuOpen}\n testId=\"mail-folder-button\"\n >\n {folderList.map((item) => (\n <FolderPickerRow\n key={item.id}\n label={item.name}\n count={item.unread > 0 ? item.unread : undefined}\n depth={0}\n isActive={item.id === folderId}\n onClick={() => {\n setFolder(item.id)\n setCursor(null)\n setSelected(null)\n setFolderMenuOpen(false)\n }}\n />\n ))}\n </FolderFilterButton>\n </div>\n )}\n </FilesFilterBar>\n ) : undefined\n }\n rightContent={\n <span className=\"flex items-center gap-1\">\n {account && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label=\"Mail settings\"\n data-testid=\"mail-settings-button\"\n onClick={() => setSettings(true)}\n >\n <Settings className=\"size-4\" />\n </Button>\n )}\n {nativeTrash && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!isOnline}\n data-testid=\"mail-empty-trash-button\"\n onClick={() => setConfirmDelete('trash')}\n >\n Empty Trash\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={!ready || !!compose}\n onClick={() => openCompose(emptyMailCompose())}\n >\n <Plus className=\"mr-1.5 size-4\" />\n Email\n </Button>\n </span>\n }\n />\n {/* No refresh button: native mail refreshes the moment the server pushes `native_mail_received`,\n and the list re-polls every minute (and on window focus) for every other provider. */}\n {(accounts.data?.length ?? 0) > 1 && (\n <div className=\"flex items-center gap-2 px-3 py-1\">\n <select\n aria-label=\"Mail account\"\n disabled={!!compose}\n className=\"min-w-0 max-w-64 rounded border-0 bg-transparent px-2 py-1.5 text-xs text-muted-foreground\"\n value={account?.id ?? ''}\n onChange={(e) => {\n setAccountId(e.target.value)\n setFolder('inbox')\n setCursor(null)\n setSelected(null)\n }}\n >\n {accounts.data?.map((a) => (\n <option key={a.id} value={a.id}>\n {a.email}\n </option>\n ))}\n </select>\n </div>\n )}\n </header>\n {account && offline?.renderStatus?.()}\n {error && (\n <p role=\"alert\" className=\"border-b p-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n {!error && offlineNotice && (\n <p role=\"status\" className=\"border-b p-3 text-sm text-muted-foreground\">\n {offlineNotice}\n </p>\n )}\n {policy && !policy.enabled && (\n <p className=\"p-6 text-muted-foreground\">Mail is not enabled on this deployment.</p>\n )}\n {/* Setting up an inbox needs the server; offline (accounts unknown) the notice above says why. */}\n {policy?.enabled && accounts.isSuccess && !account && (\n <ConnectedMailSetup\n policy={policy}\n user={user}\n productName={productName}\n onClaimed={() => setJustCreated(true)}\n onConnectExisting={() => setSettings(true)}\n />\n )}\n {account && justCreated && (\n <div\n role=\"status\"\n data-testid=\"mail-ready-banner\"\n className=\"flex items-start justify-between gap-3 border-b bg-accent/40 px-4 py-3 text-sm\"\n >\n <p>\n <span className=\"font-semibold\">\n Your {productName ? `${productName} ` : ''}email is ready to go.\n </span>{' '}\n You can send and receive email as <span className=\"font-medium\">{account.email}</span>.\n </p>\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => setJustCreated(false)}\n >\n ×\n </button>\n </div>\n )}\n {account && (\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex min-h-0 w-full flex-col\">\n {outboxRole &&\n folderRole === outboxRole &&\n offline?.renderOutbox({\n accountId: account.id,\n onEdit: (value) => openCompose({ ...value }),\n })}\n <div className={deviceFolder ? 'hidden' : 'min-h-0 flex-1'}>\n <MailGrid\n messages={filteredMessages}\n loading={list.isPending && list.fetchStatus !== 'idle'}\n selected={selected}\n outgoing={\n folderRole === 'sent' || folderRole === 'drafts' || folderRole === outboxRole\n }\n personLabel={personLabel}\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n onSelect={(id) => {\n if (id.startsWith(LOCAL_DRAFT_PREFIX)) {\n const draft = localDrafts.find((d) => LOCAL_DRAFT_PREFIX + d.id === id)\n if (draft) openCompose({ ...draft.compose }, draft.id)\n return\n }\n setSelected(id)\n if (isOnline && list.data?.messages.find((m) => m.id === id)?.unread) {\n void patch(id, { unread: false })\n // An initial read can finish after the PATCH with the old unread flag.\n .then(() => cache.settleMessage(account.id, id))\n .catch((error: Error) => setActionError(error.message))\n }\n }}\n />\n </div>\n {(cursor || list.data?.next_cursor) && (\n <footer className=\"flex gap-2 p-2\">\n {cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(null)}>\n First page\n </Button>\n )}\n {list.data?.next_cursor && (\n <Button variant=\"ghost\" onClick={() => setCursor(list.data!.next_cursor!)}>\n Next page\n </Button>\n )}\n </footer>\n )}\n </div>\n {renderPanel({\n isOpen: !!selected || !!compose,\n title: compose ? 'New message' : message?.subject || 'Mail',\n onClose: () => {\n if (compose) composeClose.current?.()\n else setSelected(null)\n },\n children: compose ? (\n <ConnectedMailComposer\n key={`${account?.id}-${composeSession}`}\n account={account}\n initial={compose}\n maxBytes={policy?.max_attachment_bytes ?? 15 * 1024 * 1024}\n ready={ready}\n drafts={drafts.data?.messages ?? []}\n embedded\n localDraftId={composeLocalDraftId}\n offline={offline}\n documents={documents}\n word={word}\n sessionKey={`${mailboxKey}-${composeSession}`}\n onChange={setCompose}\n closeRequestRef={composeClose}\n onClose={() => {\n setCompose(null)\n if (compose.draft_id) setSelected(null)\n }}\n onOpenDraft={(id) => {\n // Closing asks before discarding unsaved changes.\n composeClose.current?.()\n setFolder('drafts')\n setCursor(null)\n setSelected(id)\n }}\n />\n ) : message && selected ? (\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={folders.data}\n isOnline={isOnline}\n loading={detail.isFetching}\n uploadPending={savePending}\n personLabel={personLabel}\n renderInvite={\n renderInvite &&\n (() =>\n renderInvite({\n accountId: account.id,\n messageId: message.id,\n attachments: message.attachments,\n isOnline,\n }))\n }\n onBack={() => setSelected(null)}\n onEditDraft={() => void editDraft()}\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onRestore={nativeTrash ? () => void update({ action: 'restore' }) : undefined}\n onDeleteForever={nativeTrash ? () => setConfirmDelete('message') : undefined}\n onDownloadAttachment={(a) => void downloadAttachment(a)}\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n onSaveToWorkspace={\n saveToWorkspace &&\n (() => {\n setSaveWorkspaceId(\n saveToWorkspace.defaultWorkspaceId ?? saveToWorkspace.workspaces[0]?.id ?? ''\n )\n setSavingToWorkspace(true)\n })\n }\n />\n ) : (\n <article className=\"min-w-0 flex-1 overflow-auto p-4 sm:p-5\">\n {selected && (\n <Button className=\"mb-3\" variant=\"ghost\" onClick={() => setSelected(null)}>\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n )}\n {detail.isFetching && selected && (\n <p className=\"text-muted-foreground\">Loading message…</p>\n )}\n {detail.error instanceof MailOfflineUnavailableError && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {detail.error.message}\n </p>\n )}\n </article>\n ),\n })}\n </div>\n )}\n {saveToWorkspace && (\n <Dialog open={savingToWorkspace} onOpenChange={setSavingToWorkspace}>\n <DialogContent>\n <DialogTitle>Save email to workspace</DialogTitle>\n <DialogDescription>\n Save a copy as an .eml file. Members with access to the file can read it.\n </DialogDescription>\n <select\n aria-label=\"Destination workspace\"\n value={saveWorkspaceId}\n onChange={(e) => setSaveWorkspaceId(e.target.value)}\n className=\"rounded border bg-background p-2\"\n >\n <option value=\"\" disabled>\n Choose a workspace\n </option>\n {saveToWorkspace.workspaces.map((w) => (\n <option key={w.id} value={w.id}>\n {w.name}\n </option>\n ))}\n </select>\n <Button disabled={!saveWorkspaceId || savePending} onClick={() => void saveEmail()}>\n {savePending ? 'Saving…' : 'Save email'}\n </Button>\n {actionError && <p role=\"alert\">{actionError}</p>}\n </DialogContent>\n </Dialog>\n )}\n {settings && policy && (\n <ConnectedMailAccounts\n policy={policy}\n accounts={accounts.data ?? []}\n user={user}\n oauthReturnPath={oauthReturnPath}\n settings={offline?.renderSettings?.()}\n onClose={() => setSettings(false)}\n />\n )}\n <ConfirmDialog\n isOpen={confirmDelete !== null}\n onClose={() => setConfirmDelete(null)}\n onConfirm={() => void deleteForever()}\n isLoading={deleting}\n title={confirmDelete === 'trash' ? 'Empty Trash?' : 'Delete forever?'}\n description={\n confirmDelete === 'trash'\n ? 'Every message in the Trash is deleted permanently and stops using your storage. This cannot be undone.'\n : 'This message is deleted permanently and stops using your storage. This cannot be undone.'\n }\n confirmText={confirmDelete === 'trash' ? 'Empty Trash' : 'Delete forever'}\n testId=\"mail-delete-forever-dialog\"\n />\n </section>\n )\n}\n","/**\n * One email of the mail client in scope, shown on its own (e.g. in a panel beside a chat): its actions,\n * sender, recipients, attachments and body, as the mailbox shows it. Replying hands the new message to\n * the host (`onCompose`), and so does asking ARBI to draft the reply (`onReplyWithArbi`).\n */\n\nimport { useState } from 'react'\nimport {\n accountPath,\n mailJson,\n useMailAccounts,\n useMailCache,\n useMailClient,\n useMailMessage,\n useMailOnline,\n useMailUnlock,\n type MailAccount,\n type MailAttachment,\n type MailCompose,\n type MailMessage,\n type MailMessageUpdate,\n} from '@arbidocs/react'\nimport { MailMessageView } from '../../collaboration/mail/MailMessageView'\nimport { draftMailCompose, replyMailCompose } from '../../collaboration/mail/mailCompose'\nimport { attachmentPath, hydrateMailAttachments, saveFile } from './attachments'\nimport { resolveMailbox } from './mailbox'\n\nexport interface ConnectedMailMessageProps {\n messageId: string\n /** The account the message is in: an id, or `'native'` (default). */\n mailbox?: string\n /** The folder it is in (replying from Sent goes to its recipients). Default: the inbox. */\n folderRole?: string\n onClose: () => void\n /** Reply / reply all / forward: the new message, to open in a composer. */\n onCompose: (initial: MailCompose) => void\n /** Ask ARBI to draft the reply. Absent: not offered. */\n onReplyWithArbi?: (message: MailMessage, account: MailAccount) => void\n}\n\nexport function ConnectedMailMessage({\n messageId,\n mailbox = 'native',\n folderRole = 'inbox',\n onClose,\n onCompose,\n onReplyWithArbi,\n}: ConnectedMailMessageProps) {\n const { client } = useMailClient()\n const isOnline = useMailOnline()\n const cache = useMailCache()\n const accounts = useMailAccounts()\n const account = resolveMailbox(accounts.data, mailbox)\n const unlock = useMailUnlock(account)\n const detail = useMailMessage(account, messageId, { enabled: !!unlock.data || !isOnline })\n const [error, setError] = useState('')\n const message = detail.data\n if (!account || !message)\n return (\n <p role={detail.error ? 'alert' : 'status'} className=\"p-4 text-sm text-muted-foreground\">\n {detail.error?.message ?? 'Loading message…'}\n </p>\n )\n const update = async (body: MailMessageUpdate) => {\n try {\n await mailJson(\n client.fetch,\n `${accountPath(account.id)}/messages/${encodeURIComponent(message.id)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(body),\n }\n )\n await cache.refreshAll()\n if (body.folder_id || body.action) onClose()\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not update message')\n }\n }\n const download = async (path: string, name: string) => {\n try {\n saveFile(await (await client.fetch(path)).blob(), name)\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Download failed')\n }\n }\n const reply = async (forward = false, all = false) => {\n try {\n const attachments = forward\n ? await hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n : []\n onCompose(replyMailCompose(message, { account, folderRole, forward, all, attachments }))\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Could not prepare forwarded attachments')\n }\n }\n return (\n <div className=\"flex h-full min-h-0 flex-col\">\n {error && (\n <p role=\"alert\" className=\"px-4 pt-3 text-sm text-destructive\">\n {error}\n </p>\n )}\n <MailMessageView\n account={account}\n message={message}\n folderRole={folderRole}\n folders={undefined}\n isOnline={isOnline}\n loading={detail.isFetching}\n onBack={onClose}\n onEditDraft={() =>\n void hydrateMailAttachments(client, account, message.id, message.attachments, {\n isOnline,\n })\n .then((attachments) => onCompose(draftMailCompose(message, attachments)))\n .catch((e: Error) => setError(e.message))\n }\n onReply={(forward, all) => void reply(forward, all)}\n onReplyWithArbi={\n onReplyWithArbi && account.provider === 'native'\n ? () => onReplyWithArbi(message, account)\n : undefined\n }\n onUpdate={(body) => void update(body)}\n onDownloadAttachment={(a: MailAttachment) =>\n void download(attachmentPath(account.id, message.id, a.id), a.name)\n }\n onDownloadOriginal={() =>\n void download(\n `${accountPath(account.id)}/messages/${message.id}/original`,\n 'original.eml'\n )\n }\n />\n </div>\n )\n}\n","/** \"Subscribe from URL\" and \"Holidays\" dialogs of the calendar list's Add menu. */\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport { useAddHolidayCalendar, useHolidayCountries, useSubscribeCalendar } from '@arbidocs/react'\nimport { normalizeFeedUrl } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nexport function SubscribeDialog({\n open,\n timeZone,\n onClose,\n}: {\n open: boolean\n timeZone: string\n onClose: () => void\n}) {\n const { notify } = useBlocksEnvironment()\n const subscribe = useSubscribeCalendar()\n const [url, setUrl] = useState('')\n const [name, setName] = useState('')\n const [refresh, setRefresh] = useState(720)\n useEffect(() => {\n if (open) {\n setUrl('')\n setName('')\n subscribe.reset()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n const normalized = normalizeFeedUrl(url)\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"calendar-subscribe-dialog\">\n <DialogHeader>\n <DialogTitle>Subscribe to a calendar</DialogTitle>\n <DialogDescription>\n Paste an iCalendar feed (https:// or webcal://). It refreshes automatically and is\n read-only.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n if (!normalized) return\n subscribe.mutate(\n {\n url: normalized,\n name: name.trim() || null,\n refresh_minutes: refresh,\n timezone: timeZone,\n },\n {\n onSuccess: (cal) => {\n notify(`Subscribed to “${cal.name ?? 'calendar'}”`, 'success')\n onClose()\n },\n }\n )\n }}\n >\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Feed URL</span>\n <Input\n autoFocus\n value={url}\n placeholder=\"webcal://…\"\n onChange={(e) => setUrl(e.target.value)}\n data-testid=\"calendar-subscribe-url\"\n />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Name (optional)</span>\n <Input value={name} onChange={(e) => setName(e.target.value)} />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Refresh</span>\n <select\n className={selectClass}\n value={refresh}\n onChange={(e) => setRefresh(Number(e.target.value))}\n >\n <option value={60}>Every hour</option>\n <option value={360}>Every 6 hours</option>\n <option value={720}>Every 12 hours</option>\n <option value={1440}>Daily</option>\n </select>\n </label>\n {subscribe.error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {subscribe.error.message}\n </p>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={!normalized || subscribe.isPending}\n data-testid=\"calendar-subscribe-save\"\n >\n {subscribe.isPending ? 'Subscribing…' : 'Subscribe'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport function HolidaysDialog({ open, onClose }: { open: boolean; onClose: () => void }) {\n const { data: countries = [], isLoading } = useHolidayCountries(open)\n const { notify } = useBlocksEnvironment()\n const add = useAddHolidayCalendar()\n const [country, setCountry] = useState('')\n const [subdivision, setSubdivision] = useState('')\n useEffect(() => {\n if (open) add.reset()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n const sorted = useMemo(\n () => [...countries].sort((a, b) => a.name.localeCompare(b.name)),\n [countries]\n )\n const subdivisions = countries.find((c) => c.code === country)?.subdivisions ?? []\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"calendar-holidays-dialog\">\n <DialogHeader>\n <DialogTitle>Add holidays</DialogTitle>\n <DialogDescription>\n Public holidays for a country or region, as a read-only calendar.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n if (!country) return\n add.mutate(\n { country, subdivision: subdivision || null },\n {\n onSuccess: (cal) => {\n notify(`Added “${cal.name ?? 'Holidays'}”`, 'success')\n onClose()\n },\n }\n )\n }}\n >\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Country</span>\n <select\n className={selectClass}\n value={country}\n onChange={(e) => {\n setCountry(e.target.value)\n setSubdivision('')\n }}\n disabled={isLoading}\n data-testid=\"calendar-holidays-country\"\n >\n <option value=\"\">{isLoading ? 'Loading…' : 'Choose a country'}</option>\n {sorted.map((c) => (\n <option key={c.code} value={c.code}>\n {c.name}\n </option>\n ))}\n </select>\n </label>\n {subdivisions.length > 0 && (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Region (optional)</span>\n <select\n className={selectClass}\n value={subdivision}\n onChange={(e) => setSubdivision(e.target.value)}\n data-testid=\"calendar-holidays-subdivision\"\n >\n <option value=\"\">Whole country</option>\n {subdivisions.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n </label>\n )}\n {add.error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {add.error.message}\n </p>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={!country || add.isPending}\n data-testid=\"calendar-holidays-save\"\n >\n {add.isPending ? 'Adding…' : 'Add'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Connected calendar accounts (P3): mirror Google / Microsoft calendars (via the user's connector grant) or a\n * CalDAV server (iCloud, Fastmail, Nextcloud, …) into ARBI, two-way. Per account: status, last sync / error,\n * \"Sync now\", background sync opt-in and disconnect.\n *\n * Self-contained: renders as a plain section, so the calendar can mount it in a dialog or a settings tab.\n */\nimport { useState } from 'react'\nimport { AlertTriangle, CheckCircle2, Loader2, RefreshCw, Trash2 } from 'lucide-react'\nimport { Button, Input, Label, Switch, cn } from '@arbidocs/react/ui'\nimport {\n ACCOUNT_VENDOR,\n useCalDavProfiles,\n useCalendarAccounts,\n useCalendarSupport,\n useConnectCalDavAccount,\n useConnectOAuthAccount,\n useDisconnectCalendarAccount,\n useResumeCalendarAccountConnect,\n useStartCalendarAccountOAuth,\n useSyncCalendarAccount,\n useUpdateCalendarAccount,\n type CalendarAccount,\n} from '@arbidocs/react'\nimport { describeCalendarError } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport const BACKGROUND_SYNC_EXPLANATION =\n \"Keeps syncing while you're signed out. The refresh token (or CalDAV password) and the mirrored \" +\n \"calendars' keys are stored wrapped with the server's deployment key, so the server can sync without \" +\n 'your session. Turn it off to remove those wraps; the account then syncs only while you use ARBI.'\n\nconst KIND_LABEL: Record<CalendarAccount['kind'], string> = {\n google: 'Google Calendar',\n microsoft: 'Microsoft Outlook',\n caldav: 'CalDAV',\n}\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction formatSyncTime(iso: string | null | undefined, now: Date = new Date()): string {\n if (!iso) return 'Never synced'\n const t = new Date(iso)\n const mins = Math.round((now.getTime() - t.getTime()) / 60_000)\n if (mins < 1) return 'Synced just now'\n if (mins < 60) return `Synced ${mins} min ago`\n return `Synced ${t.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })}`\n}\n\nfunction StatusBadge({ account }: { account: CalendarAccount }) {\n const ok = account.status === 'ok'\n const label =\n account.status === 'needs_reauth' ? 'Reconnect needed' : ok ? 'Connected' : 'Sync error'\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs',\n ok\n ? 'bg-emerald-500/10 text-emerald-700 dark:text-emerald-400'\n : 'bg-destructive/10 text-destructive'\n )}\n data-testid={`calendar-account-status-${account.id}`}\n >\n {ok ? <CheckCircle2 className=\"size-3\" /> : <AlertTriangle className=\"size-3\" />}\n {label}\n </span>\n )\n}\n\nfunction AccountRow({ account }: { account: CalendarAccount }) {\n const { notify } = useBlocksEnvironment()\n const startOAuth = useStartCalendarAccountOAuth()\n const sync = useSyncCalendarAccount()\n const update = useUpdateCalendarAccount()\n const disconnect = useDisconnectCalendarAccount()\n const [confirming, setConfirming] = useState(false)\n const fail = (what: string) => (err: unknown) =>\n notify(`${what}: ${describeCalendarError(err)}`, 'error')\n const reconnect =\n !!startOAuth &&\n account.status === 'needs_reauth' &&\n (account.kind === 'google' || account.kind === 'microsoft')\n\n return (\n <li\n className=\"grid gap-2 rounded-lg border border-border bg-card p-3 text-sm\"\n data-testid={`calendar-account-${account.id}`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"font-medium text-foreground\">{KIND_LABEL[account.kind]}</div>\n <div className=\"truncate text-muted-foreground\">{account.address || '—'}</div>\n <div className=\"mt-1 flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <StatusBadge account={account} />\n <span>{formatSyncTime(account.last_sync_at)}</span>\n {account.calendars?.length ? (\n <span>\n {account.calendars.length} calendar{account.calendars.length === 1 ? '' : 's'}\n </span>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {reconnect && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n void startOAuth?.(\n account.kind as 'google' | 'microsoft',\n account.background_sync\n ).catch(fail('Could not reconnect'))\n }\n >\n Reconnect\n </Button>\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={sync.isPending}\n onClick={() =>\n sync.mutate(account.id, {\n onSuccess: (r) =>\n r?.error\n ? notify(`Sync failed: ${describeCalendarError(r.error)}`, 'error')\n : notify('Calendar synced', 'success'),\n onError: fail('Sync failed'),\n })\n }\n data-testid={`calendar-account-sync-${account.id}`}\n >\n {sync.isPending ? (\n <Loader2 className=\"mr-1 size-4 animate-spin\" />\n ) : (\n <RefreshCw className=\"mr-1 size-4\" />\n )}\n Sync now\n </Button>\n {confirming ? (\n <>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n disabled={disconnect.isPending}\n onClick={() =>\n disconnect.mutate(account.id, {\n onError: fail('Could not disconnect'),\n onSettled: () => setConfirming(false),\n })\n }\n data-testid={`calendar-account-disconnect-confirm-${account.id}`}\n >\n Disconnect\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirming(false)}>\n Cancel\n </Button>\n </>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Disconnect ${account.address}`}\n onClick={() => setConfirming(true)}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n {confirming && (\n <p className=\"text-xs text-muted-foreground\">\n Stops syncing and removes the mirrored calendars from ARBI. Nothing is deleted at{' '}\n {KIND_LABEL[account.kind]}.\n </p>\n )}\n {account.last_error && (\n <p role=\"alert\" className=\"rounded bg-destructive/10 px-2 py-1 text-xs text-destructive\">\n {describeCalendarError(account.last_error)}\n </p>\n )}\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Switch\n checked={account.background_sync}\n disabled={update.isPending}\n onCheckedChange={(checked) =>\n update.mutate(\n { id: account.id, backgroundSync: checked },\n { onError: fail('Could not change background sync') }\n )\n }\n aria-label=\"Background sync\"\n data-testid={`calendar-account-background-${account.id}`}\n />\n <span>\n <span className=\"font-medium text-foreground\">Background sync.</span>{' '}\n {BACKGROUND_SYNC_EXPLANATION}\n </span>\n </label>\n </li>\n )\n}\n\nfunction CalDavForm({ onDone }: { onDone: () => void }) {\n const { notify } = useBlocksEnvironment()\n const { data: profiles = [] } = useCalDavProfiles()\n const connect = useConnectCalDavAccount()\n const [profileId, setProfileId] = useState('')\n const [url, setUrl] = useState('')\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [background, setBackground] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const useUrl = !profileId\n\n return (\n <form\n className=\"grid gap-3 rounded-lg border border-border p-3\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (useUrl && !url.trim()) return setError('Choose a server or enter its CalDAV URL')\n connect.mutate(\n {\n profile_id: profileId || null,\n url: useUrl ? url : null,\n username,\n password,\n background_sync: background,\n },\n {\n onSuccess: () => {\n setPassword('')\n notify('CalDAV account connected', 'success')\n onDone()\n },\n onError: (err) => setError(describeCalendarError(err, 'Could not connect')),\n }\n )\n }}\n data-testid=\"calendar-caldav-form\"\n >\n {profiles.length > 0 && (\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-profile\">Server</Label>\n <select\n id=\"caldav-profile\"\n className={selectClass}\n value={profileId}\n onChange={(e) => setProfileId(e.target.value)}\n >\n <option value=\"\">Other (enter URL)</option>\n {profiles.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n </div>\n )}\n {useUrl && (\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-url\">CalDAV URL</Label>\n <Input\n id=\"caldav-url\"\n type=\"url\"\n placeholder=\"https://caldav.example.com/\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n )}\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-username\">Username</Label>\n <Input\n id=\"caldav-username\"\n required\n autoComplete=\"username\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"caldav-password\">App-specific password</Label>\n <Input\n id=\"caldav-password\"\n required\n type=\"password\"\n autoComplete=\"new-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n />\n <span className=\"text-xs text-muted-foreground\">\n Create one in your provider&apos;s security settings (e.g. appleid.apple.com for iCloud).\n </span>\n </div>\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Switch checked={background} onCheckedChange={setBackground} aria-label=\"Background sync\" />\n <span>\n <span className=\"font-medium text-foreground\">Background sync.</span>{' '}\n {BACKGROUND_SYNC_EXPLANATION}\n </span>\n </label>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={connect.isPending}>\n {connect.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Connect\n </Button>\n </div>\n </form>\n )\n}\n\nexport interface CalendarAccountsPanelProps {\n className?: string\n}\n\nexport function CalendarAccountsPanel({ className }: CalendarAccountsPanelProps) {\n const { notify } = useBlocksEnvironment()\n const { connectors } = useCalendarSupport()\n const startOAuth = useStartCalendarAccountOAuth()\n const { data: accounts = [], isLoading, error } = useCalendarAccounts()\n const connectOAuth = useConnectOAuthAccount()\n const [caldavOpen, setCaldavOpen] = useState(false)\n const [background, setBackground] = useState(false)\n const [pendingKind, setPendingKind] = useState<'google' | 'microsoft' | null>(null)\n const [oauthError, setOauthError] = useState<string | null>(null)\n\n const resumed = useResumeCalendarAccountConnect(({ account, error: err }) => {\n if (account) notify(`${KIND_LABEL[account.kind]} connected`, 'success')\n if (err) setOauthError(describeCalendarError(err, 'Could not connect the account'))\n })\n\n const connect = async (kind: 'google' | 'microsoft') => {\n setOauthError(null)\n setPendingKind(kind)\n try {\n const vendors = (await connectors?.connectedVendors()) ?? []\n if (vendors.includes(ACCOUNT_VENDOR[kind])) {\n await connectOAuth.mutateAsync({ kind, backgroundSync: background })\n notify(`${KIND_LABEL[kind]} connected`, 'success')\n } else {\n await startOAuth?.(kind, background)\n }\n } catch (err) {\n setOauthError(describeCalendarError(err, 'Could not connect the account'))\n } finally {\n setPendingKind(null)\n }\n }\n\n const busy = connectOAuth.isPending || resumed.isPending\n // Google and Outlook connect through the host's connector OAuth; without it, CalDAV only.\n const oauth = !!connectors && !!startOAuth\n\n return (\n <section className={cn('grid gap-4', className)} data-testid=\"calendar-accounts-panel\">\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">Connected calendars</h3>\n <p className=\"text-sm text-muted-foreground\">\n Bring your Google, Outlook or CalDAV calendars into ARBI. Changes sync both ways.\n </p>\n </div>\n\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\">Loading accounts…</p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load accounts')}\n </p>\n ) : accounts.length === 0 ? (\n <p className=\"rounded-lg border border-dashed border-border p-4 text-sm text-muted-foreground\">\n No calendar accounts connected yet.\n </p>\n ) : (\n <ul className=\"grid gap-2\">\n {accounts.map((a) => (\n <AccountRow key={a.id} account={a} />\n ))}\n </ul>\n )}\n\n <div className=\"grid gap-2\">\n <div className=\"flex flex-wrap gap-2\">\n {oauth &&\n (['google', 'microsoft'] as const).map((kind) => (\n <Button\n key={kind}\n variant=\"outline\"\n disabled={busy}\n onClick={() => void connect(kind)}\n data-testid={`calendar-connect-${kind}`}\n >\n {pendingKind === kind && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Connect {KIND_LABEL[kind]}\n </Button>\n ))}\n <Button\n variant=\"outline\"\n onClick={() => setCaldavOpen((v) => !v)}\n data-testid=\"calendar-connect-caldav\"\n >\n Connect CalDAV (iCloud, Fastmail, …)\n </Button>\n </div>\n {oauth && (\n <>\n <label className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Switch\n checked={background}\n onCheckedChange={setBackground}\n aria-label=\"Background sync for new Google / Outlook accounts\"\n />\n <span>Turn on background sync for the new Google / Outlook account.</span>\n </label>\n <p className=\"text-xs text-muted-foreground\">\n Google and Outlook use your connector sign-in; you&apos;ll be sent to the provider to\n allow calendar access if you haven&apos;t already.\n </p>\n </>\n )}\n {oauthError && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"calendar-connect-error\">\n {oauthError}\n </p>\n )}\n </div>\n\n {caldavOpen && <CalDavForm onDone={() => setCaldavOpen(false)} />}\n </section>\n )\n}\n","import { useCopyText } from '../../citations/QuietMarks'\n\n/** Copy a calendar value (a password, a link, an address) and say \"<what> copied to clipboard\". */\nexport function useCalendarCopy() {\n const copy = useCopyText({ copyFailed: 'Could not copy. Select the text and copy it manually.' })\n return (value: string, what = 'Copied') => copy(value, `${what} to clipboard`)\n}\n","/** A read-only value with a Copy button (passwords, server URLs, feed links, booking links). */\nimport { useState } from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { useCalendarCopy } from './copy'\n\nexport interface CopyFieldProps {\n label: string\n value: string\n /** Monospace + break anywhere (secrets, URLs). */\n mono?: boolean\n testId?: string\n className?: string\n}\n\nexport function CopyField({ label, value, mono = true, testId, className }: CopyFieldProps) {\n const [copied, setCopied] = useState(false)\n const copyText = useCalendarCopy()\n return (\n <div className={cn('grid gap-1', className)}>\n <span className=\"text-xs font-medium text-muted-foreground\">{label}</span>\n <div className=\"flex items-center gap-2\">\n <code\n className={cn(\n 'min-w-0 flex-1 select-all rounded-md border border-border bg-muted/40 px-2 py-1.5 text-sm text-foreground',\n mono ? 'font-mono break-all' : 'break-words'\n )}\n data-testid={testId}\n >\n {value}\n </code>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n aria-label={`Copy ${label}`}\n onClick={() =>\n void copyText(value, label).then((ok) => {\n if (!ok) return\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n })\n }\n >\n {copied ? <Check className=\"size-4\" /> : <Copy className=\"size-4\" />}\n </Button>\n </div>\n </div>\n )\n}\n","/**\n * Open access (P4): app passwords for CalDAV/CardDAV clients (Apple Calendar, Thunderbird, DAVx5, eM Client)\n * and secret read-only ICS feed URLs per calendar (full details or free/busy only). Secrets are shown once.\n *\n * Self-contained section; `calendars` defaults to the user's calendar list.\n */\nimport { useMemo, useState } from 'react'\nimport { KeyRound, Link2, Loader2, Trash2 } from 'lucide-react'\nimport { Button, Input, Label, cn } from '@arbidocs/react/ui'\nimport {\n splitAppPasswords,\n useAppPasswords,\n useCalendars,\n useCreateAppPassword,\n useCreateFeed,\n useRevokeAppPassword,\n type AppPassword,\n type AppPasswordCreated,\n type CalendarRead,\n type FeedLevel,\n} from '@arbidocs/react'\nimport { describeCalendarError, setupSteps } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { CopyField } from './CopyField'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction formatDate(iso: string | null | undefined): string {\n if (!iso) return 'never'\n return new Date(iso).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })\n}\n\nfunction calendarNames(ids: string[] | undefined, calendars: CalendarRead[]): string {\n if (!ids?.length) return 'No calendars'\n const names = ids.map((id) => calendars.find((c) => c.id === id)?.name).filter(Boolean)\n return names.length ? names.join(', ') : `${ids.length} calendar${ids.length === 1 ? '' : 's'}`\n}\n\nfunction RevokeButton({ row }: { row: AppPassword }) {\n const { notify } = useBlocksEnvironment()\n const revoke = useRevokeAppPassword()\n const [confirming, setConfirming] = useState(false)\n if (!confirming)\n return (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Revoke ${row.label}`}\n onClick={() => setConfirming(true)}\n data-testid={`calendar-apw-revoke-${row.id}`}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )\n return (\n <span className=\"flex gap-1\">\n <Button\n size=\"sm\"\n variant=\"destructive\"\n disabled={revoke.isPending}\n onClick={() =>\n revoke.mutate(row.id, {\n onSuccess: () => notify(`Revoked “${row.label}”`, 'success'),\n onError: (err) => notify(`Could not revoke: ${describeCalendarError(err)}`, 'error'),\n onSettled: () => setConfirming(false),\n })\n }\n data-testid={`calendar-apw-revoke-confirm-${row.id}`}\n >\n Revoke\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirming(false)}>\n Cancel\n </Button>\n </span>\n )\n}\n\nfunction CreatedPassword({ created, onDone }: { created: AppPasswordCreated; onDone: () => void }) {\n const server = created.server_url || `${window.location.origin}/dav/`\n const username = created.username || ''\n return (\n <div\n className=\"grid gap-3 rounded-lg border border-primary/40 bg-primary/5 p-3\"\n data-testid=\"calendar-apw-created\"\n >\n <p className=\"text-sm font-medium text-foreground\">\n Password for “{created.label}” — copy it now, it won&apos;t be shown again.\n </p>\n <CopyField label=\"Password\" value={created.password ?? ''} testId=\"calendar-apw-password\" />\n <CopyField label=\"User name\" value={username} />\n <CopyField label=\"Server URL\" value={server} />\n <details className=\"text-sm\">\n <summary className=\"cursor-pointer font-medium text-foreground\">Setup steps</summary>\n <ul className=\"mt-2 grid gap-2\">\n {setupSteps(server, username).map((s) => (\n <li key={s.client}>\n <div className=\"font-medium text-foreground\">{s.client}</div>\n <ol className=\"ml-4 list-decimal text-muted-foreground\">\n {s.steps.map((step) => (\n <li key={step}>{step}</li>\n ))}\n </ol>\n </li>\n ))}\n </ul>\n </details>\n <div className=\"flex justify-end\">\n <Button size=\"sm\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n )\n}\n\nfunction AppPasswordsSection({\n rows,\n calendars,\n}: {\n rows: AppPassword[]\n calendars: CalendarRead[]\n}) {\n const create = useCreateAppPassword()\n const [label, setLabel] = useState('')\n const [allCalendars, setAllCalendars] = useState(true)\n const [selected, setSelected] = useState<string[]>([])\n const [created, setCreated] = useState<AppPasswordCreated | null>(null)\n const [error, setError] = useState<string | null>(null)\n const pickable = calendars.filter((c) => !c.locked && c.role !== 'freebusy')\n\n return (\n <div className=\"grid gap-3\">\n <div>\n <h4 className=\"flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <KeyRound className=\"size-4\" /> App passwords\n </h4>\n <p className=\"text-sm text-muted-foreground\">\n Use your calendars and contacts in Apple Calendar, Thunderbird, DAVx5 or eM Client. Create\n one password per device and revoke it when you no longer use the device.\n </p>\n </div>\n {created ? (\n <CreatedPassword created={created} onDone={() => setCreated(null)} />\n ) : (\n <form\n className=\"grid gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (!label.trim()) return setError('Name the device, e.g. “iPhone”')\n if (!allCalendars && !selected.length) return setError('Pick at least one calendar')\n create.mutate(\n { label, calendar_ids: allCalendars ? null : selected },\n {\n onSuccess: (result) => {\n setCreated(result)\n setLabel('')\n },\n onError: (err) => setError(describeCalendarError(err, 'Could not create password')),\n }\n )\n }}\n data-testid=\"calendar-apw-form\"\n >\n <div className=\"flex flex-wrap gap-2\">\n <Input\n className=\"min-w-0 flex-1\"\n placeholder=\"Device name, e.g. iPhone\"\n aria-label=\"Device name\"\n maxLength={200}\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n data-testid=\"calendar-apw-label\"\n />\n <Button type=\"submit\" disabled={create.isPending}>\n {create.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Create password\n </Button>\n </div>\n <label className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={allCalendars}\n onChange={(e) => setAllCalendars(e.target.checked)}\n />\n All calendars I can read (and my contacts)\n </label>\n {!allCalendars && (\n <fieldset className=\"grid gap-1 rounded-md border border-border p-2 text-sm\">\n <legend className=\"px-1 text-xs text-muted-foreground\">\n Calendars this device can read\n </legend>\n {pickable.map((c) => (\n <label key={c.id} className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={selected.includes(c.id)}\n onChange={(e) =>\n setSelected((s) =>\n e.target.checked ? [...s, c.id] : s.filter((id) => id !== c.id)\n )\n }\n />\n <span className=\"size-2.5 rounded-full\" style={{ background: c.color }} />\n {c.name}\n </label>\n ))}\n </fieldset>\n )}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n </form>\n )}\n {rows.length > 0 && (\n <ul className=\"grid gap-1\" data-testid=\"calendar-apw-list\">\n {rows.map((r) => (\n <li\n key={r.id}\n className=\"flex items-center justify-between gap-2 rounded-md border border-border px-3 py-2 text-sm\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-foreground\">{r.label}</div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {calendarNames(r.calendar_ids, calendars)} · created {formatDate(r.created_at)} ·\n last used {formatDate(r.last_used_at)}\n </div>\n </div>\n <RevokeButton row={r} />\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nfunction FeedsSection({ rows, calendars }: { rows: AppPassword[]; calendars: CalendarRead[] }) {\n const create = useCreateFeed()\n const readable = calendars.filter((c) => !c.locked)\n const [calendarId, setCalendarId] = useState('')\n const [level, setLevel] = useState<FeedLevel>('full')\n const [created, setCreated] = useState<AppPasswordCreated | null>(null)\n const [error, setError] = useState<string | null>(null)\n const chosen = calendarId || readable[0]?.id || ''\n\n return (\n <div className=\"grid gap-3\">\n <div>\n <h4 className=\"flex items-center gap-1.5 text-sm font-semibold text-foreground\">\n <Link2 className=\"size-4\" /> Calendar feeds (ICS)\n </h4>\n <p className=\"text-sm text-muted-foreground\">\n A secret, read-only link anyone with the URL can subscribe to. Free/busy feeds show only\n when you&apos;re busy, without titles.\n </p>\n </div>\n <form\n className=\"flex flex-wrap items-end gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (!chosen) return setError('Pick a calendar')\n const name = calendars.find((c) => c.id === chosen)?.name ?? 'Calendar'\n create.mutate(\n {\n calendar_id: chosen,\n level,\n label: `${name}${level === 'freebusy' ? ' (free/busy)' : ''}`,\n },\n {\n onSuccess: setCreated,\n onError: (err) => setError(describeCalendarError(err, 'Could not create feed')),\n }\n )\n }}\n data-testid=\"calendar-feed-form\"\n >\n <div className=\"grid min-w-40 flex-1 gap-1\">\n <Label htmlFor=\"feed-calendar\">Calendar</Label>\n <select\n id=\"feed-calendar\"\n className={selectClass}\n value={chosen}\n onChange={(e) => setCalendarId(e.target.value)}\n >\n {readable.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </select>\n </div>\n <div className=\"grid min-w-40 gap-1\">\n <Label htmlFor=\"feed-level\">Shows</Label>\n <select\n id=\"feed-level\"\n className={selectClass}\n value={level}\n onChange={(e) => setLevel(e.target.value as FeedLevel)}\n >\n <option value=\"full\">All event details</option>\n <option value=\"freebusy\">Free/busy only</option>\n </select>\n </div>\n <Button type=\"submit\" disabled={create.isPending || !chosen}>\n {create.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Create feed link\n </Button>\n </form>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n {created?.feed_url && (\n <div\n className=\"grid gap-2 rounded-lg border border-primary/40 bg-primary/5 p-3 text-sm\"\n data-testid=\"calendar-feed-created\"\n >\n <p className=\"font-medium text-foreground\">\n Copy this link now — it won&apos;t be shown again.\n </p>\n <CopyField label=\"Feed URL\" value={created.feed_url} testId=\"calendar-feed-url\" />\n <ul className=\"ml-4 list-disc text-xs text-muted-foreground\">\n <li>Outlook: Add calendar → Subscribe from web → paste the URL.</li>\n <li>Google Calendar: Other calendars → + → From URL → paste the URL.</li>\n <li>Apple Calendar: File → New Calendar Subscription → paste the URL.</li>\n </ul>\n <div className=\"flex justify-end\">\n <Button size=\"sm\" onClick={() => setCreated(null)}>\n Done\n </Button>\n </div>\n </div>\n )}\n {rows.length > 0 && (\n <ul className=\"grid gap-1\" data-testid=\"calendar-feed-list\">\n {rows.map((r) => (\n <li\n key={r.id}\n className=\"flex items-center justify-between gap-2 rounded-md border border-border px-3 py-2 text-sm\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium text-foreground\">\n {r.label}{' '}\n <span className=\"text-xs font-normal text-muted-foreground\">\n {r.kind === 'freebusy' ? 'free/busy' : 'full details'}\n </span>\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {calendarNames(r.calendar_ids, calendars)} · created {formatDate(r.created_at)} ·\n last fetched {formatDate(r.last_used_at)}\n </div>\n </div>\n <RevokeButton row={r} />\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\nexport interface OpenAccessPanelProps {\n /** Calendars to offer; defaults to `useCalendars()`. */\n calendars?: CalendarRead[]\n className?: string\n}\n\nexport function OpenAccessPanel({ calendars: given, className }: OpenAccessPanelProps) {\n const { data: fetched = [] } = useCalendars()\n const calendars = given ?? fetched\n const { data: rows = [], isLoading, error } = useAppPasswords()\n const { devices, feeds } = useMemo(() => splitAppPasswords(rows), [rows])\n\n return (\n <section className={cn('grid gap-6', className)} data-testid=\"calendar-open-access-panel\">\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">Use in other apps</h3>\n <p className=\"text-sm text-muted-foreground\">\n Sync ARBI calendars to your phone or desktop calendar app, or publish a subscription link.\n </p>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load app passwords')}\n </p>\n )}\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : (\n <>\n <AppPasswordsSection rows={devices} calendars={calendars} />\n <FeedsSection rows={feeds} calendars={calendars} />\n </>\n )}\n </section>\n )\n}\n","/**\n * Booking pages (P5): public `/book/<slug>` pages where anyone can pick a free slot from your calendar.\n * List, create / edit (durations, zone, weekly hours, buffer, notice, horizon, daily limit, location, active),\n * copy the public link, delete.\n */\nimport { useState } from 'react'\nimport { CalendarCheck, ExternalLink, Loader2, Pencil, Plus, Trash2 } from 'lucide-react'\nimport { Button, Input, Label, Switch, Textarea, cn } from '@arbidocs/react/ui'\nimport {\n useBookingPages,\n useCalendarSettings,\n useDeleteBookingPage,\n useSaveBookingPage,\n type BookingPage,\n} from '@arbidocs/react'\nimport {\n WEEKDAY_NAMES,\n WeeklyHoursEditor,\n bookingLink,\n bookingToForm,\n describeCalendarError,\n detectTimeZone,\n emptyBookingForm,\n formToBookingBody,\n slugify,\n validateBookingForm,\n zoneOptions,\n type BookingFormState,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useCalendarCopy } from './copy'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction summarizeWeekly(page: BookingPage): string {\n const days = [...new Set((page.weekly ?? []).map((w) => Number(w.day)))].sort()\n if (!days.length) return 'No hours set'\n return days.map((d) => WEEKDAY_NAMES[d]?.slice(0, 3)).join(', ')\n}\n\nexport interface BookingPageFormProps {\n page?: BookingPage | null\n defaultTimeZone: string\n onDone: () => void\n}\n\nexport function BookingPageForm({ page, defaultTimeZone, onDone }: BookingPageFormProps) {\n const { notify } = useBlocksEnvironment()\n const copyText = useCalendarCopy()\n const [form, setForm] = useState<BookingFormState>(() =>\n page ? bookingToForm(page) : emptyBookingForm(defaultTimeZone)\n )\n const [slugTouched, setSlugTouched] = useState(!!page)\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [serverError, setServerError] = useState<string | null>(null)\n const save = useSaveBookingPage()\n const set = <K extends keyof BookingFormState>(key: K, value: BookingFormState[K]) =>\n setForm((f) => ({ ...f, [key]: value }))\n\n const num = (\n key: 'bufferMinutes' | 'minNoticeHours' | 'maxDaysAhead' | 'dailyLimit',\n label: string,\n hint?: string\n ) => (\n <div className=\"grid gap-1\">\n <Label htmlFor={`booking-${key}`}>{label}</Label>\n <Input\n id={`booking-${key}`}\n type=\"number\"\n inputMode=\"numeric\"\n min={0}\n placeholder={hint}\n value={form[key]}\n onChange={(e) => set(key, e.target.value)}\n aria-invalid={!!errors[key]}\n data-testid={`booking-${key}`}\n />\n {errors[key] && <span className=\"text-xs text-destructive\">{errors[key]}</span>}\n </div>\n )\n\n return (\n <form\n className=\"grid gap-4\"\n onSubmit={(e) => {\n e.preventDefault()\n const found = validateBookingForm(form)\n setErrors(found)\n setServerError(null)\n if (Object.keys(found).length) return\n save.mutate(formToBookingBody(form), {\n onSuccess: (saved) => {\n notify(page ? 'Booking page saved' : 'Booking page published', 'success')\n if (!page) void copyText(bookingLink(saved), 'Booking link')\n onDone()\n },\n onError: (err) =>\n setServerError(\n (err as { status?: number }).status === 409\n ? 'That link is taken. Choose another.'\n : describeCalendarError(err, 'Could not save')\n ),\n })\n }}\n data-testid=\"booking-page-form\"\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-title\">Title</Label>\n <Input\n id=\"booking-title\"\n placeholder=\"30-minute intro call\"\n value={form.title}\n onChange={(e) => {\n const title = e.target.value\n setForm((f) => ({ ...f, title, slug: slugTouched ? f.slug : slugify(title) }))\n }}\n aria-invalid={!!errors.title}\n data-testid=\"booking-title\"\n />\n {errors.title && <span className=\"text-xs text-destructive\">{errors.title}</span>}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-slug\">Link</Label>\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <span className=\"shrink-0\">/book/</span>\n <Input\n id=\"booking-slug\"\n value={form.slug}\n disabled={!!page}\n onChange={(e) => {\n setSlugTouched(true)\n set('slug', e.target.value.toLowerCase())\n }}\n aria-invalid={!!errors.slug}\n data-testid=\"booking-slug\"\n />\n </div>\n {errors.slug && <span className=\"text-xs text-destructive\">{errors.slug}</span>}\n </div>\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-description\">Description</Label>\n <Textarea\n id=\"booking-description\"\n rows={2}\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n />\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-durations\">Durations (minutes)</Label>\n <Input\n id=\"booking-durations\"\n placeholder=\"15, 30, 60\"\n value={form.durations}\n onChange={(e) => set('durations', e.target.value)}\n aria-invalid={!!errors.durations}\n data-testid=\"booking-durations\"\n />\n {errors.durations && <span className=\"text-xs text-destructive\">{errors.durations}</span>}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-zone\">Time zone of your hours</Label>\n <select\n id=\"booking-zone\"\n className={selectClass}\n value={form.timeZone}\n onChange={(e) => set('timeZone', e.target.value)}\n >\n {zoneOptions(form.timeZone).map((z) => (\n <option key={z} value={z}>\n {z.replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </div>\n </div>\n <fieldset className=\"grid gap-2\">\n <legend className=\"mb-1 text-sm font-medium text-foreground\">Weekly hours</legend>\n <WeeklyHoursEditor value={form.weekly} onChange={(weekly) => set('weekly', weekly)} />\n {errors.weekly && <span className=\"text-xs text-destructive\">{errors.weekly}</span>}\n <p className=\"text-xs text-muted-foreground\">\n Only times free in your calendars within these hours are offered.\n </p>\n </fieldset>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {num('bufferMinutes', 'Buffer between meetings (minutes)')}\n {num('minNoticeHours', 'Minimum notice (hours)')}\n {num('maxDaysAhead', 'Bookable up to (days ahead)')}\n {num('dailyLimit', 'Max bookings per day', 'No limit')}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"booking-location\">Location</Label>\n <Input\n id=\"booking-location\"\n placeholder=\"Office, phone, or a meeting link\"\n value={form.location}\n onChange={(e) => set('location', e.target.value)}\n />\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={form.active}\n onCheckedChange={(active) => set('active', active)}\n aria-label=\"Accepting bookings\"\n data-testid=\"booking-active\"\n />\n Accepting bookings\n </label>\n {serverError && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {serverError}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={save.isPending} data-testid=\"booking-save\">\n {save.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n {page ? 'Save' : 'Publish'}\n </Button>\n </div>\n </form>\n )\n}\n\nexport interface BookingPagesPanelProps {\n /** Zone for new pages; defaults to the calendar settings zone, then the browser's. */\n defaultTimeZone?: string\n className?: string\n}\n\nexport function BookingPagesPanel({ defaultTimeZone, className }: BookingPagesPanelProps) {\n const { notify } = useBlocksEnvironment()\n const copyText = useCalendarCopy()\n const { data: pages = [], isLoading, error } = useBookingPages()\n const { data: settings } = useCalendarSettings(!defaultTimeZone)\n const remove = useDeleteBookingPage()\n const [editing, setEditing] = useState<BookingPage | 'new' | null>(null)\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null)\n const zone = defaultTimeZone || settings?.time_zone || detectTimeZone()\n\n if (editing)\n return (\n <section className={cn('grid gap-3', className)} data-testid=\"calendar-booking-panel\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {editing === 'new' ? 'New booking page' : `Edit “${editing.title}”`}\n </h3>\n <BookingPageForm\n key={editing === 'new' ? 'new' : editing.slug}\n page={editing === 'new' ? null : editing}\n defaultTimeZone={zone}\n onDone={() => setEditing(null)}\n />\n </section>\n )\n\n return (\n <section className={cn('grid gap-3', className)} data-testid=\"calendar-booking-panel\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">Booking pages</h3>\n <p className=\"text-sm text-muted-foreground\">\n Share a link; people pick a free time and it lands in your calendar.\n </p>\n </div>\n <Button size=\"sm\" onClick={() => setEditing('new')} data-testid=\"booking-page-new\">\n <Plus className=\"mr-1 size-4\" /> New booking page\n </Button>\n </div>\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load booking pages')}\n </p>\n ) : pages.length === 0 ? (\n <div className=\"grid justify-items-center gap-2 rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">\n <CalendarCheck className=\"size-6\" />\n <p>No booking pages yet.</p>\n </div>\n ) : (\n <ul className=\"grid gap-2\">\n {pages.map((p) => (\n <li\n key={p.id}\n className=\"grid gap-2 rounded-lg border border-border bg-card p-3 text-sm\"\n data-testid={`booking-page-${p.slug}`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 font-medium text-foreground\">\n {p.title}\n {!p.active && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n Paused\n </span>\n )}\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {p.durations.map((d) => `${d} min`).join(' / ')} · {summarizeWeekly(p)} ·{' '}\n {p.time_zone.replace(/_/g, ' ')}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void copyText(bookingLink(p), 'Booking link')}\n >\n Copy link\n </Button>\n <Button size=\"sm\" variant=\"ghost\" asChild aria-label={`Open ${p.title}`}>\n <a href={bookingLink(p)} target=\"_blank\" rel=\"noreferrer\">\n <ExternalLink className=\"size-4\" />\n </a>\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Edit ${p.title}`}\n onClick={() => setEditing(p)}\n >\n <Pencil className=\"size-4\" />\n </Button>\n {confirmDelete === p.slug ? (\n <>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n disabled={remove.isPending}\n onClick={() =>\n remove.mutate(p.slug, {\n onError: (err) =>\n notify(`Could not delete: ${describeCalendarError(err)}`, 'error'),\n onSettled: () => setConfirmDelete(null),\n })\n }\n >\n Delete\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirmDelete(null)}>\n Cancel\n </Button>\n </>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Delete ${p.title}`}\n onClick={() => setConfirmDelete(p.slug)}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n </section>\n )\n}\n","/**\n * Rooms directory: find a room (min capacity, feature, building) and see whether it is free for a time\n * window; create a room or piece of equipment. Book a room by inviting its address to an event.\n */\nimport { useMemo, useState } from 'react'\nimport { DoorOpen, Loader2, Plus } from 'lucide-react'\nimport { Button, Input, Label, Switch, cn } from '@arbidocs/react/ui'\nimport {\n useCalendarSettings,\n useCreateRoom,\n useRooms,\n type RoomQuery,\n type RoomRead,\n} from '@arbidocs/react'\nimport {\n defaultRoomWindow,\n describeCalendarError,\n detectTimeZone,\n formatBusy,\n safeZone,\n wallToUtc,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { useCalendarCopy } from './copy'\n\nconst selectClass =\n 'h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction CreateRoomForm({ zone, onDone }: { zone: string; onDone: () => void }) {\n const { notify } = useBlocksEnvironment()\n const create = useCreateRoom()\n const [name, setName] = useState('')\n const [type, setType] = useState<'room' | 'equipment'>('room')\n const [capacity, setCapacity] = useState('')\n const [building, setBuilding] = useState('')\n const [floor, setFloor] = useState('')\n const [features, setFeatures] = useState('')\n const [autoAccept, setAutoAccept] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n return (\n <form\n className=\"grid gap-3 rounded-lg border border-border p-3\"\n onSubmit={(e) => {\n e.preventDefault()\n setError(null)\n if (!name.trim()) return setError('Enter a name')\n const cap = capacity.trim() ? Number(capacity) : null\n if (cap !== null && (!Number.isInteger(cap) || cap < 1))\n return setError('Capacity must be a whole number')\n create.mutate(\n {\n name: name.trim(),\n type,\n capacity: cap,\n building: building.trim() || null,\n floor: floor.trim() || null,\n features: features\n .split(',')\n .map((f) => f.trim())\n .filter(Boolean),\n auto_accept: autoAccept,\n timezone: zone,\n },\n {\n onSuccess: (room) => {\n notify(`Created ${room.name} (${room.email})`, 'success')\n onDone()\n },\n onError: (err) => setError(describeCalendarError(err, 'Could not create')),\n }\n )\n }}\n data-testid=\"room-create-form\"\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-name\">Name</Label>\n <Input id=\"room-name\" value={name} onChange={(e) => setName(e.target.value)} />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-type\">Type</Label>\n <select\n id=\"room-type\"\n className={selectClass}\n value={type}\n onChange={(e) => setType(e.target.value as 'room' | 'equipment')}\n >\n <option value=\"room\">Room</option>\n <option value=\"equipment\">Equipment</option>\n </select>\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-capacity\">Capacity</Label>\n <Input\n id=\"room-capacity\"\n type=\"number\"\n min={1}\n value={capacity}\n onChange={(e) => setCapacity(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-building\">Building</Label>\n <Input\n id=\"room-building\"\n value={building}\n onChange={(e) => setBuilding(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-floor\">Floor</Label>\n <Input id=\"room-floor\" value={floor} onChange={(e) => setFloor(e.target.value)} />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"room-features\">Features (comma-separated)</Label>\n <Input\n id=\"room-features\"\n placeholder=\"projector, whiteboard, video\"\n value={features}\n onChange={(e) => setFeatures(e.target.value)}\n />\n </div>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch checked={autoAccept} onCheckedChange={setAutoAccept} aria-label=\"Auto-accept\" />\n Accept invitations automatically when free\n </label>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onDone}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={create.isPending}>\n {create.isPending && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Create\n </Button>\n </div>\n </form>\n )\n}\n\nfunction RoomRow({ room, zone, checked }: { room: RoomRead; zone: string; checked: boolean }) {\n const copyText = useCalendarCopy()\n return (\n <li\n className=\"flex flex-wrap items-start justify-between gap-2 px-3 py-2 text-sm\"\n data-testid={`room-${room.id}`}\n >\n <div className=\"min-w-0\">\n <div className=\"font-medium text-foreground\">\n {room.name}\n {room.type === 'equipment' && (\n <span className=\"ml-1 text-xs font-normal text-muted-foreground\">(equipment)</span>\n )}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {[\n room.capacity ? `${room.capacity} people` : null,\n [room.building, room.floor && `floor ${room.floor}`].filter(Boolean).join(', ') || null,\n room.features?.length ? room.features.join(', ') : null,\n ]\n .filter(Boolean)\n .join(' · ')}\n </div>\n <button\n type=\"button\"\n className=\"text-xs text-primary underline-offset-2 hover:underline\"\n onClick={() => void copyText(room.email, 'Room address')}\n >\n {room.email}\n </button>\n {checked && !!room.busy?.length && (\n <div className=\"mt-1 text-xs text-muted-foreground\">\n Busy {(room.busy ?? []).map((b) => formatBusy(b.start, b.end, zone)).join(', ')}\n </div>\n )}\n </div>\n {checked && room.free !== null && room.free !== undefined && (\n <span\n className={cn(\n 'rounded-full px-2 py-0.5 text-xs',\n room.free\n ? 'bg-emerald-500/10 text-emerald-700 dark:text-emerald-400'\n : 'bg-destructive/10 text-destructive'\n )}\n data-testid={`room-free-${room.id}`}\n >\n {room.free ? 'Free' : 'Busy'}\n </span>\n )}\n </li>\n )\n}\n\nexport interface RoomsDirectoryPanelProps {\n /** Zone for the time-window inputs; defaults to the calendar settings zone. */\n timeZone?: string\n /** Show \"New room\" (any user may create; workspace rooms need workspace access). Default true. */\n canCreate?: boolean\n className?: string\n}\n\nexport function RoomsDirectoryPanel({\n timeZone,\n canCreate = true,\n className,\n}: RoomsDirectoryPanelProps) {\n const { data: settings } = useCalendarSettings(!timeZone)\n const zone = safeZone(timeZone || settings?.time_zone, detectTimeZone())\n const [initial] = useState(() => defaultRoomWindow(zone))\n const [minCapacity, setMinCapacity] = useState('')\n const [feature, setFeature] = useState('')\n const [building, setBuilding] = useState('')\n const [start, setStart] = useState(initial.start)\n const [end, setEnd] = useState(initial.end)\n const [checkWindow, setCheckWindow] = useState(true)\n const [creating, setCreating] = useState(false)\n\n const windowError = checkWindow && start && end && end <= start ? 'End must be after start' : null\n const query = useMemo<RoomQuery>(\n () => ({\n min_capacity: Number(minCapacity) > 0 ? Number(minCapacity) : undefined,\n feature: feature.trim() ? [feature.trim()] : undefined,\n building: building.trim() || undefined,\n ...(checkWindow && start && end && !windowError\n ? { start: wallToUtc(start, zone), end: wallToUtc(end, zone) }\n : {}),\n }),\n [minCapacity, feature, building, checkWindow, start, end, zone, windowError]\n )\n const { data: rooms = [], isFetching, error } = useRooms(query)\n const sorted = useMemo(\n () =>\n [...rooms].sort(\n (a, b) => Number(b.free ?? 0) - Number(a.free ?? 0) || a.name.localeCompare(b.name)\n ),\n [rooms]\n )\n\n return (\n <section className={cn('grid gap-3', className)} data-testid=\"calendar-rooms-panel\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div>\n <h3 className=\"flex items-center gap-1.5 text-base font-semibold text-foreground\">\n <DoorOpen className=\"size-4\" /> Rooms\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n Book a room by inviting its address to your event.\n </p>\n </div>\n {canCreate && !creating && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setCreating(true)}\n data-testid=\"room-new\"\n >\n <Plus className=\"mr-1 size-4\" /> New room\n </Button>\n )}\n </div>\n {creating && <CreateRoomForm zone={zone} onDone={() => setCreating(false)} />}\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-capacity\">Min. capacity</Label>\n <Input\n id=\"rooms-capacity\"\n type=\"number\"\n min={1}\n value={minCapacity}\n onChange={(e) => setMinCapacity(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-feature\">Feature</Label>\n <Input\n id=\"rooms-feature\"\n placeholder=\"projector\"\n value={feature}\n onChange={(e) => setFeature(e.target.value)}\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-building\">Building</Label>\n <Input\n id=\"rooms-building\"\n value={building}\n onChange={(e) => setBuilding(e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-2\">\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={checkWindow}\n onCheckedChange={setCheckWindow}\n aria-label=\"Check availability\"\n />\n Check availability ({zone.replace(/_/g, ' ')})\n </label>\n {checkWindow && (\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-start\">From</Label>\n <Input\n id=\"rooms-start\"\n type=\"datetime-local\"\n value={start}\n onChange={(e) => setStart(e.target.value)}\n data-testid=\"rooms-start\"\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"rooms-end\">To</Label>\n <Input\n id=\"rooms-end\"\n type=\"datetime-local\"\n value={end}\n onChange={(e) => setEnd(e.target.value)}\n data-testid=\"rooms-end\"\n />\n </div>\n {windowError && <span className=\"text-xs text-destructive\">{windowError}</span>}\n </div>\n )}\n </div>\n {error ? (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {describeCalendarError(error, 'Could not load rooms')}\n </p>\n ) : sorted.length === 0 ? (\n <p className=\"rounded-lg border border-dashed border-border p-4 text-sm text-muted-foreground\">\n {isFetching ? 'Loading rooms…' : 'No rooms match.'}\n </p>\n ) : (\n <ul\n className=\"grid divide-y divide-border rounded-lg border border-border\"\n data-testid=\"rooms-list\"\n >\n {sorted.map((r) => (\n <RoomRow key={r.id} room={r} zone={zone} checked={!!query.start} />\n ))}\n </ul>\n )}\n </section>\n )\n}\n","/**\n * Calendar settings dialog. Tabs: General (GET/PUT /v1/calendar/settings via the block's form), Accounts\n * (connected Google / Outlook / CalDAV), Sync & devices (app passwords + feeds), Booking pages, Rooms.\n * The panels are self-contained and only mount when their tab is shown. Contacts are not here: they live in\n * the host's contacts.\n */\nimport { useEffect, useState } from 'react'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@arbidocs/react/ui'\nimport { useSaveCalendarSettings, type CalendarSettings } from '@arbidocs/react'\nimport {\n CalendarSettingsForm,\n describeCalendarError,\n toSettingsValue,\n type CalendarListItem,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport { CalendarAccountsPanel } from './CalendarAccountsPanel'\nimport { OpenAccessPanel } from './OpenAccessPanel'\nimport { BookingPagesPanel } from './BookingPagesPanel'\nimport { RoomsDirectoryPanel } from './RoomsDirectoryPanel'\n\nexport type CalendarSettingsTab = 'general' | 'accounts' | 'access' | 'booking' | 'rooms'\n\nconst TABS: { value: CalendarSettingsTab; label: string }[] = [\n { value: 'general', label: 'General' },\n { value: 'accounts', label: 'Accounts' },\n { value: 'access', label: 'Sync & devices' },\n { value: 'booking', label: 'Booking pages' },\n { value: 'rooms', label: 'Rooms' },\n]\n\nexport interface CalendarSettingsDialogProps {\n open: boolean\n settings: CalendarSettings\n calendars: CalendarListItem[]\n /** Tab to show when the dialog opens (default General). */\n initialTab?: CalendarSettingsTab\n onClose: () => void\n}\n\nexport function CalendarSettingsDialog({\n open,\n settings,\n calendars,\n initialTab = 'general',\n onClose,\n}: CalendarSettingsDialogProps) {\n const { notify } = useBlocksEnvironment()\n const save = useSaveCalendarSettings()\n const [value, setValue] = useState(() => toSettingsValue(settings))\n const [tab, setTab] = useState<CalendarSettingsTab>(initialTab)\n useEffect(() => {\n if (open) {\n setValue(toSettingsValue(settings))\n setTab(initialTab)\n save.reset()\n }\n // Reset only when the dialog opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n return (\n <Dialog open={open} onOpenChange={(next) => !next && onClose()}>\n <DialogContent\n className=\"max-h-[90vh] overflow-y-auto sm:max-w-3xl\"\n presentation=\"full\"\n data-testid=\"calendar-settings-dialog\"\n >\n <DialogHeader>\n <DialogTitle>Calendar settings</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preferences, connected accounts, device sync, booking pages and rooms\n </DialogDescription>\n </DialogHeader>\n <Tabs value={tab} onValueChange={(v) => setTab(v as CalendarSettingsTab)}>\n <TabsList\n className=\"flex h-auto flex-wrap justify-start\"\n data-testid=\"calendar-settings-tabs\"\n >\n {TABS.map((t) => (\n <TabsTrigger\n key={t.value}\n value={t.value}\n data-testid={`calendar-settings-tab-${t.value}`}\n >\n {t.label}\n </TabsTrigger>\n ))}\n </TabsList>\n <TabsContent value=\"general\" className=\"pt-3\">\n <CalendarSettingsForm\n value={value}\n onChange={setValue}\n calendars={calendars.filter((c) => c.canWrite)}\n saving={save.isPending}\n error={save.error ? describeCalendarError(save.error) : null}\n onCancel={onClose}\n onSave={() =>\n save.mutate({ ...settings, ...value } as CalendarSettings, {\n onSuccess: () => {\n notify('Calendar settings saved', 'success')\n onClose()\n },\n })\n }\n />\n </TabsContent>\n <TabsContent value=\"accounts\" className=\"pt-3\">\n {tab === 'accounts' && <CalendarAccountsPanel />}\n </TabsContent>\n <TabsContent value=\"access\" className=\"pt-3\">\n {tab === 'access' && <OpenAccessPanel />}\n </TabsContent>\n <TabsContent value=\"booking\" className=\"pt-3\">\n {tab === 'booking' && <BookingPagesPanel defaultTimeZone={settings.time_zone} />}\n </TabsContent>\n <TabsContent value=\"rooms\" className=\"pt-3\">\n {tab === 'rooms' && <RoomsDirectoryPanel timeZone={settings.time_zone} />}\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The editor's scheduling section: attendees' free/busy over the event's day (POST /freebusy), \"Find a\n * time\" (POST /find-time) that moves the draft, and the room finder (GET /rooms) that books a room by adding\n * it as an attendee with kind \"room\". Collapsed until opened, so the editor does not fetch on every open.\n */\nimport { useMemo, useState } from 'react'\nimport { CalendarSearch } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useArbi, useFindTime, useFreeBusy, useRooms } from '@arbidocs/react'\nimport {\n RoomFinder,\n SchedulingAssistant,\n applySuggestion,\n draftRangeUtc,\n freeBusyToRows,\n isAllDayDraft,\n toSuggestionViews,\n utcToDate,\n type EventDraft,\n type TimeSuggestionView,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport interface EventSchedulingProps {\n draft: EventDraft\n onChange: (draft: EventDraft) => void\n timeZone: string\n workingStartHour?: number\n}\n\nconst attendeeKey = (a: NonNullable<EventDraft['attendees']>[number]) =>\n (a.email ?? a.user_id ?? '').toLowerCase()\n\nexport function EventScheduling({\n draft,\n onChange,\n timeZone,\n workingStartHour = 7,\n}: EventSchedulingProps) {\n const [open, setOpen] = useState(false)\n const { notify } = useBlocksEnvironment()\n const arbi = useArbi()\n const me = arbi.isLoggedIn ? (arbi.user.identity()?.email ?? null) : null\n const allDay = isAllDayDraft(draft)\n const range = useMemo(() => {\n try {\n const { startMs, endMs } = draftRangeUtc(draft, timeZone)\n if (!Number.isFinite(startMs) || !Number.isFinite(endMs) || endMs <= startMs) return null\n return { start: new Date(startMs).toISOString(), end: new Date(endMs).toISOString() }\n } catch {\n return null\n }\n }, [draft, timeZone])\n const eventDate = range ? utcToDate(range.start, timeZone) : null\n const [dayOverride, setDayOverride] = useState<string | null>(null)\n const date = dayOverride ?? eventDate\n\n const attendees = useMemo(() => draft.attendees ?? [], [draft.attendees])\n const roomEmails = useMemo(\n () => new Set(attendees.filter((a) => a.kind === 'room').map(attendeeKey)),\n [attendees]\n )\n const ids = useMemo(() => {\n const list = attendees.map(attendeeKey).filter(Boolean)\n if (me && !list.includes(me.toLowerCase())) list.unshift(me.toLowerCase())\n return list\n }, [attendees, me])\n const labelOf = (id: string) => {\n if (me && id === me.toLowerCase()) return 'You'\n const a = attendees.find((x) => attendeeKey(x) === id)\n return a?.name || a?.email || id\n }\n\n const dayStart = date ? `${date}T00:00:00Z` : null\n const fbWindow = date\n ? {\n start: new Date(Date.parse(`${date}T00:00:00Z`) - 86400_000).toISOString(),\n end: new Date(Date.parse(`${date}T00:00:00Z`) + 2 * 86400_000).toISOString(),\n }\n : null\n const freeBusy = useFreeBusy(open ? ids : [], fbWindow?.start ?? null, fbWindow?.end ?? null)\n const rows = useMemo(\n () => (date && freeBusy.data ? freeBusyToRows(freeBusy.data, date, labelOf, roomEmails) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [freeBusy.data, date, roomEmails, attendees, me]\n )\n\n const [filters, setFilters] = useState<{ minCapacity: number | null; feature: string }>({\n minCapacity: null,\n feature: '',\n })\n const rooms = useRooms(\n open && range\n ? {\n start: range.start,\n end: range.end,\n min_capacity: filters.minCapacity ?? undefined,\n feature: filters.feature.trim() ? [filters.feature.trim()] : undefined,\n }\n : null\n )\n\n const findTime = useFindTime()\n const [suggestions, setSuggestions] = useState<TimeSuggestionView[] | null>(null)\n const duration = range\n ? Math.round((Date.parse(range.end) - Date.parse(range.start)) / 60_000)\n : 30\n\n if (allDay) return null\n if (!open)\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n data-testid=\"calendar-open-scheduling\"\n >\n <CalendarSearch className=\"mr-1 size-4\" /> Scheduling assistant &amp; rooms\n </Button>\n )\n\n return (\n <div\n className=\"space-y-4 rounded-md border border-border p-3\"\n data-testid=\"calendar-scheduling-section\"\n >\n {date && (\n <SchedulingAssistant\n date={date}\n timeZone={timeZone}\n rows={rows}\n selection={range ? { startUtc: range.start, endUtc: range.end } : null}\n dayStartHour={Math.max(0, Math.min(workingStartHour, 8) - 1)}\n dayEndHour={21}\n loading={freeBusy.isFetching}\n suggestions={suggestions}\n finding={findTime.isPending}\n onDateChange={setDayOverride}\n onFindTime={() =>\n dayStart &&\n findTime.mutate(\n {\n attendees: ids,\n duration_minutes: Math.max(5, Math.min(duration, 24 * 60)),\n start: new Date(\n Math.max(Date.now(), Date.parse(dayStart) - 86400_000)\n ).toISOString(),\n end: new Date(Date.parse(dayStart) + 7 * 86400_000).toISOString(),\n working_hours_only: true,\n time_zone: timeZone,\n limit: 8,\n },\n {\n onSuccess: (s) => setSuggestions(toSuggestionViews(s)),\n onError: (err) => notify(`Could not find times: ${err.message}`, 'error'),\n }\n )\n }\n onPickSuggestion={(s) => {\n onChange(applySuggestion(draft, s, timeZone))\n setDayOverride(null)\n }}\n />\n )}\n <RoomFinder\n rooms={(rooms.data ?? []).map((r) => ({\n id: r.id,\n name: r.name,\n email: r.email,\n capacity: r.capacity,\n building: r.building,\n floor: r.floor,\n features: r.features,\n free: r.free,\n }))}\n loading={rooms.isFetching}\n minCapacity={filters.minCapacity}\n feature={filters.feature}\n onFiltersChange={setFilters}\n addedEmails={attendees.map((a) => a.email ?? '').filter(Boolean)}\n onAdd={(room) =>\n onChange({\n ...draft,\n location: draft.location || room.name,\n attendees: [\n ...attendees,\n { email: room.email, name: room.name, kind: 'room', role: 'non_participant' },\n ],\n })\n }\n />\n </div>\n )\n}\n","/**\n * The event editor in its dialog: the draft form with attendee suggestions from the user's\n * contacts, the scheduling assistant and room finder, and, when an event is scheduled from a\n * thread or DM, the \"Add an ARBI call\" choice.\n */\nimport { useState } from 'react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { useSearchContacts, type CalendarEvent, type CalendarSettings } from '@arbidocs/react'\nimport {\n EventEditor,\n type AttendeeDraft,\n type CalendarListItem,\n type EventDraft,\n} from '../../calendar'\nimport { EventScheduling } from './EventScheduling'\n\nexport interface EditorState {\n mode: 'create' | 'edit'\n event?: CalendarEvent\n original: EventDraft\n draft: EventDraft\n error: string | null\n /** \"Add ARBI call\" pre-ticked (scheduled from a thread / DM): the call is made when the event is saved. */\n autoCall?: boolean\n}\n\nexport interface EventEditorDialogProps {\n editor: EditorState | null\n onChange: (update: (editor: EditorState | null) => EditorState | null) => void\n onSave: () => void\n onDelete: (event: CalendarEvent) => void\n /** The calendars an event can be saved to. */\n calendars: CalendarListItem[]\n callsEnabled: boolean\n onAddCall: (draft: EventDraft) => Promise<{ call_id: string; url: string }>\n isWebinarAttendee: (attendee: AttendeeDraft) => boolean\n timeZone: string\n workingHours: CalendarSettings['working_hours']\n saving: boolean\n}\n\nexport function EventEditorDialog({\n editor,\n onChange,\n onSave,\n onDelete,\n calendars,\n callsEnabled,\n onAddCall,\n isWebinarAttendee,\n timeZone,\n workingHours,\n saving,\n}: EventEditorDialogProps) {\n const [attendeeQuery, setAttendeeQuery] = useState('')\n const people = useSearchContacts(editor ? attendeeQuery : '')\n const setDraft = (draft: EventDraft) => onChange((e) => (e ? { ...e, draft, error: null } : e))\n return (\n <Dialog open={!!editor} onOpenChange={(open) => !open && onChange(() => null)}>\n <DialogContent\n className=\"max-h-[92vh] overflow-y-auto sm:max-w-2xl\"\n presentation=\"full\"\n data-testid=\"calendar-event-editor-dialog\"\n >\n <DialogTitle className=\"sr-only\">\n {editor?.mode === 'edit' ? 'Edit event' : 'New event'}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">Event details form</DialogDescription>\n {editor &&\n editor.mode === 'create' &&\n callsEnabled &&\n !editor.draft.conference &&\n editor.autoCall !== undefined && (\n <label className=\"mb-2 flex items-center gap-2 rounded-md bg-muted/40 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={!!editor.autoCall}\n onChange={(e) => onChange((x) => (x ? { ...x, autoCall: e.target.checked } : x))}\n data-testid=\"calendar-editor-auto-call\"\n />\n Add an ARBI call (the link is created when you save)\n </label>\n )}\n {editor && (\n <EventEditor\n value={editor.draft}\n onChange={setDraft}\n onSave={onSave}\n onCancel={() => onChange(() => null)}\n onDelete={\n editor.mode === 'edit' && editor.event\n ? () => onDelete(editor.event as CalendarEvent)\n : undefined\n }\n calendars={calendars}\n mode={editor.mode}\n canAddCall={callsEnabled}\n onAddCall={callsEnabled ? () => onAddCall(editor.draft) : undefined}\n canAddWebinar={callsEnabled}\n isWebinarAttendee={isWebinarAttendee}\n defaultTimeZone={timeZone}\n attendeeSuggestions={(people.data ?? []).map((p) => ({\n email: p.email,\n name: p.name ?? null,\n detail: p.source === 'contacts' ? 'Contact' : 'ARBI',\n }))}\n onAttendeeQueryChange={setAttendeeQuery}\n schedulingSlot={\n <EventScheduling\n draft={editor.draft}\n timeZone={timeZone}\n workingStartHour={Number(\n (workingHours ?? [])\n .map((w) => w.start)\n .sort()[0]\n ?.slice(0, 2) ?? 8\n )}\n onChange={setDraft}\n />\n }\n saving={saving}\n error={editor.error}\n />\n )}\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Invitations waiting for me (GET /invitations): answer an invitation (accept / maybe / decline with an\n * optional note, or propose a new time), or decide on a proposed new time (COUNTER) for my own event.\n * Rendered as a toolbar button with a count badge that opens a popover.\n */\nimport { useState } from 'react'\nimport { Inbox } from 'lucide-react'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\nimport {\n useCalendarInvitations,\n useDecideCounter,\n useRespondToEvent,\n type InvitationRead,\n} from '@arbidocs/react'\nimport { ProposeTimeDialog, formatEventWhen, formatInZone, wallToUtc } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport interface InvitationsPanelProps {\n timeZone: string\n onOpenEvent?: (eventId: string) => void\n}\n\nfunction when(inv: InvitationRead, zone: string): string {\n if (!inv.start_utc || !inv.end_utc) return ''\n return formatEventWhen(\n { all_day: false, start_utc: inv.start_utc, end_utc: inv.end_utc, start: {}, end: {} },\n zone\n )\n}\n\nfunction proposed(inv: InvitationRead, zone: string): string {\n const s = inv.proposed_start\n const e = inv.proposed_end\n if (!s) return ''\n const toUtc = (spec: typeof s) =>\n spec?.date_time ? wallToUtc(spec.date_time, spec.time_zone || zone) : `${spec?.date}T00:00:00Z`\n const su = toUtc(s)\n const eu = e ? toUtc(e) : su\n return `${formatInZone(su, zone, { weekday: 'short', day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit' })} – ${formatInZone(eu, zone, { hour: 'numeric', minute: '2-digit' })}`\n}\n\nexport function InvitationsPanel({ timeZone, onOpenEvent }: InvitationsPanelProps) {\n const { notify } = useBlocksEnvironment()\n const { data: items = [], refetch } = useCalendarInvitations()\n const respond = useRespondToEvent()\n const decide = useDecideCounter()\n const [open, setOpen] = useState(false)\n const [notes, setNotes] = useState<Record<string, string>>({})\n const [proposeFor, setProposeFor] = useState<InvitationRead | null>(null)\n const fail = (err: Error) => notify(`Could not send: ${err.message}`, 'error')\n\n const answer = (inv: InvitationRead, partstat: 'accepted' | 'tentative' | 'declined') =>\n respond.mutate(\n { id: inv.event_id ?? inv.id, partstat, comment: notes[inv.id]?.trim() || null },\n { onError: fail }\n )\n\n return (\n <>\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next)\n if (next) void refetch()\n }}\n >\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"relative\"\n aria-label={`Invitations${items.length ? `, ${items.length} waiting` : ''}`}\n data-testid=\"calendar-invitations-button\"\n >\n <Inbox className=\"size-4\" />\n {items.length > 0 && (\n <span\n className=\"absolute -right-0.5 -top-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-semibold text-primary-foreground\"\n data-testid=\"calendar-invitations-badge\"\n >\n {items.length}\n </span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"max-h-[70vh] w-96 max-w-[calc(100vw-2rem)] overflow-y-auto p-0\"\n data-testid=\"calendar-invitations-panel\"\n >\n <div className=\"border-b border-border px-3 py-2 text-sm font-semibold\">Invitations</div>\n {items.length === 0 && (\n <p className=\"px-3 py-4 text-sm text-muted-foreground\">Nothing waiting for you.</p>\n )}\n <ul className=\"divide-y divide-border\">\n {items.map((inv) => (\n <li\n key={inv.id}\n className=\"space-y-1.5 px-3 py-2.5 text-sm\"\n data-testid=\"calendar-invitation\"\n data-kind={inv.kind}\n >\n <button\n type=\"button\"\n className=\"block w-full text-left\"\n onClick={() => {\n if (inv.event_id && onOpenEvent) {\n setOpen(false)\n onOpenEvent(inv.event_id)\n }\n }}\n >\n <div className=\"truncate font-medium\">{inv.title || 'Untitled event'}</div>\n <div className=\"text-xs text-muted-foreground\">{when(inv, timeZone)}</div>\n <div className=\"text-xs text-muted-foreground\">\n {inv.kind === 'counter'\n ? `${inv.from_email ?? 'A guest'} proposed: ${proposed(inv, timeZone)}`\n : `From ${inv.organizer?.name || inv.organizer?.email || inv.from_email || 'the organiser'}`}\n </div>\n {inv.comment && <div className=\"text-xs italic\">“{inv.comment}”</div>}\n </button>\n {inv.kind === 'invitation' ? (\n <>\n <Input\n className=\"h-8\"\n placeholder=\"Add a note (optional)\"\n value={notes[inv.id] ?? ''}\n onChange={(e) => setNotes({ ...notes, [inv.id]: e.target.value })}\n />\n <div className=\"flex flex-wrap gap-1.5\">\n <Button\n size=\"sm\"\n onClick={() => answer(inv, 'accepted')}\n data-testid=\"calendar-invitation-accept\"\n >\n Accept\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => answer(inv, 'tentative')}>\n Maybe\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => answer(inv, 'declined')}>\n Decline\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setProposeFor(inv)}\n data-testid=\"calendar-invitation-propose\"\n >\n Propose new time\n </Button>\n </div>\n </>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n <Button\n size=\"sm\"\n onClick={() => decide.mutate({ id: inv.id, accept: true }, { onError: fail })}\n data-testid=\"calendar-counter-accept\"\n >\n Accept new time\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n decide.mutate({ id: inv.id, accept: false }, { onError: fail })\n }\n data-testid=\"calendar-counter-decline\"\n >\n Keep current time\n </Button>\n </div>\n )}\n </li>\n ))}\n </ul>\n </PopoverContent>\n </Popover>\n <ProposeTimeDialog\n open={!!proposeFor}\n startUtc={proposeFor?.start_utc ?? null}\n endUtc={proposeFor?.end_utc ?? null}\n timeZone={timeZone}\n sending={respond.isPending}\n onCancel={() => setProposeFor(null)}\n onSend={(v) => {\n const inv = proposeFor\n if (!inv) return\n respond.mutate(\n {\n id: inv.event_id ?? inv.id,\n partstat: 'tentative',\n comment: v.comment,\n propose_start: v.start,\n propose_end: v.end,\n },\n {\n onSuccess: () => {\n setProposeFor(null)\n notify('New time proposed to the organiser', 'success')\n },\n onError: fail,\n }\n )\n }}\n />\n </>\n )\n}\n","/** \"Publish to…\": mirror an own native calendar into a connected Google / Outlook / CalDAV account. */\nimport { useEffect, useState } from 'react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { useCalendarAccounts, usePublishCalendar } from '@arbidocs/react'\nimport { describeCalendarError } from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nconst KIND: Record<string, string> = { google: 'Google', microsoft: 'Outlook', caldav: 'CalDAV' }\n\nexport interface PublishCalendarDialogProps {\n calendarId: string | null\n calendarName?: string | null\n onClose: () => void\n /** Open the Accounts tab when there is no account yet. */\n onConnectAccount?: () => void\n}\n\nexport function PublishCalendarDialog({\n calendarId,\n calendarName,\n onClose,\n onConnectAccount,\n}: PublishCalendarDialogProps) {\n const { notify } = useBlocksEnvironment()\n const { data: accounts = [], isLoading } = useCalendarAccounts(!!calendarId)\n const publish = usePublishCalendar()\n const [accountId, setAccountId] = useState('')\n useEffect(() => {\n if (calendarId) {\n setAccountId('')\n publish.reset()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [calendarId])\n const chosen = accountId || accounts[0]?.id || ''\n\n return (\n <Dialog open={!!calendarId} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"calendar-publish-dialog\">\n <DialogHeader>\n <DialogTitle>Publish “{calendarName || 'Calendar'}”</DialogTitle>\n <DialogDescription>\n Creates a copy at the provider and keeps both in sync, so it shows in Outlook, Google or\n Apple Calendar.\n </DialogDescription>\n </DialogHeader>\n {!isLoading && accounts.length === 0 ? (\n <div className=\"space-y-3 text-sm\">\n <p className=\"text-muted-foreground\">Connect an account first.</p>\n {onConnectAccount && (\n <Button type=\"button\" variant=\"outline\" onClick={onConnectAccount}>\n Connect an account\n </Button>\n )}\n </div>\n ) : (\n <label className=\"flex flex-col gap-1 text-sm\">\n <span className=\"font-medium\">Account</span>\n <select\n className=\"h-9 rounded-md border border-input bg-background px-2 text-sm\"\n value={chosen}\n onChange={(e) => setAccountId(e.target.value)}\n data-testid=\"calendar-publish-account\"\n >\n {accounts.map((a) => (\n <option key={a.id} value={a.id}>\n {KIND[a.kind] ?? a.kind} · {a.address}\n </option>\n ))}\n </select>\n </label>\n )}\n {publish.error && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {describeCalendarError(publish.error, 'Could not publish the calendar')}\n </p>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n disabled={!chosen || !calendarId || publish.isPending}\n onClick={() =>\n calendarId &&\n publish.mutate(\n { accountId: chosen, calendarId },\n {\n onSuccess: () => {\n notify('Calendar published', 'success')\n onClose()\n },\n }\n )\n }\n data-testid=\"calendar-publish-save\"\n >\n {publish.isPending ? 'Publishing…' : 'Publish'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/** Share a calendar with ARBI users: list grantees, add by e-mail with a role, change role, remove. */\nimport { useState } from 'react'\nimport { Trash2 } from 'lucide-react'\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Input,\n} from '@arbidocs/react/ui'\nimport {\n useCalendarShares,\n useShareCalendar,\n useUnshareCalendar,\n type ShareRole,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nconst SHARE_ROLES: { value: ShareRole; label: string }[] = [\n { value: 'freebusy', label: 'See only free/busy' },\n { value: 'read_basic', label: 'See times and titles' },\n { value: 'read', label: 'See all event details' },\n { value: 'write', label: 'Make changes to events' },\n { value: 'delegate', label: 'Make changes and respond for me' },\n]\n\nconst selectClass =\n 'h-9 rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nexport interface ShareCalendarDialogProps {\n calendarId: string | null\n calendarName?: string | null\n onClose: () => void\n}\n\nexport function ShareCalendarDialog({\n calendarId,\n calendarName,\n onClose,\n}: ShareCalendarDialogProps) {\n const { notify } = useBlocksEnvironment()\n const { data: shares = [], isLoading } = useCalendarShares(calendarId)\n const share = useShareCalendar()\n const unshare = useUnshareCalendar()\n const [email, setEmail] = useState('')\n const [role, setRole] = useState<ShareRole>('read')\n const fail = (err: Error) => notify(`Could not update sharing: ${err.message}`, 'error')\n\n const add = () => {\n const grantee = email.trim().toLowerCase()\n if (!calendarId || !grantee) return\n share.mutate(\n { calId: calendarId, grantee, role },\n { onSuccess: () => setEmail(''), onError: fail }\n )\n }\n\n return (\n <Dialog open={!!calendarId} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-lg\" data-testid=\"calendar-share-dialog\">\n <DialogHeader>\n <DialogTitle>Share “{calendarName || 'Calendar'}”</DialogTitle>\n <DialogDescription>\n People you add get their own key to this calendar. Removing someone rotates the key.\n </DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-wrap items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n add()\n }}\n >\n <Input\n type=\"email\"\n className=\"min-w-0 flex-1\"\n placeholder=\"name@example.com\"\n aria-label=\"E-mail of the person to share with\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n data-testid=\"calendar-share-email\"\n />\n <select\n className={selectClass}\n aria-label=\"Permission\"\n value={role}\n onChange={(e) => setRole(e.target.value as ShareRole)}\n data-testid=\"calendar-share-role\"\n >\n {SHARE_ROLES.map((r) => (\n <option key={r.value} value={r.value}>\n {r.label}\n </option>\n ))}\n </select>\n <Button\n type=\"submit\"\n disabled={!email.trim() || share.isPending}\n data-testid=\"calendar-share-add\"\n >\n Share\n </Button>\n </form>\n <ul\n className=\"divide-y divide-border rounded-md border border-border\"\n data-testid=\"calendar-share-list\"\n >\n {isLoading && <li className=\"px-3 py-2 text-sm text-muted-foreground\">Loading…</li>}\n {shares.map((s) => (\n <li\n key={s.user_id}\n className=\"flex items-center gap-2 px-3 py-2 text-sm\"\n data-testid=\"calendar-share-row\"\n data-user-id={s.user_id}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium\">{s.name || s.email || s.user_id}</div>\n {s.name && s.email && (\n <div className=\"truncate text-xs text-muted-foreground\">{s.email}</div>\n )}\n </div>\n {s.role === 'owner' ? (\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n ) : (\n <>\n <select\n className={`${selectClass} h-8`}\n aria-label={`Permission for ${s.email ?? s.user_id}`}\n value={s.role}\n disabled={s.is_agent}\n onChange={(e) =>\n calendarId &&\n share.mutate(\n {\n calId: calendarId,\n grantee: s.user_id,\n role: e.target.value as ShareRole,\n },\n { onError: fail }\n )\n }\n >\n {SHARE_ROLES.map((r) => (\n <option key={r.value} value={r.value}>\n {r.label}\n </option>\n ))}\n </select>\n {!s.is_agent && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Stop sharing with ${s.email ?? s.user_id}`}\n onClick={() =>\n calendarId &&\n unshare.mutate({ calId: calendarId, userId: s.user_id }, { onError: fail })\n }\n >\n <Trash2 className=\"size-4\" />\n </Button>\n )}\n </>\n )}\n </li>\n ))}\n </ul>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The connected calendar's view state: the chosen view is remembered across reloads (localStorage),\n * the anchor date lives for the session, and two requests carry intents from elsewhere into the\n * calendar once it mounts: an event to open (a deep link, a reminder) and a prefilled new event\n * (\"Schedule a call\" from a thread). The host navigates to its calendar page after making one.\n */\nimport { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport type { CalendarViewKind } from '../../calendar/types'\n\n/** \"Schedule a call\" from elsewhere (a thread, a DM, a dashboard): the editor opens prefilled. */\nexport interface CalendarComposerPrefill {\n title?: string\n attendees?: { email?: string | null; user_id?: string | null; name?: string | null }[]\n conversationId?: string | null\n /** Add an ARBI call when the event is saved (\"Add ARBI call\" ticked). */\n addCall?: boolean\n}\n\nexport interface PendingCalendarEvent {\n id: string\n recurrenceId?: string | null\n}\n\ninterface CalendarViewState {\n /** `null` until the user picks one: the settings' default view applies. */\n view: CalendarViewKind | null\n /** YYYY-MM-DD anchor; `null` = today. */\n date: string | null\n pendingEvent: PendingCalendarEvent | null\n pendingComposer: CalendarComposerPrefill | null\n setPendingComposer: (prefill: CalendarComposerPrefill | null) => void\n setView: (view: CalendarViewKind) => void\n setDate: (date: string | null) => void\n setPendingEvent: (pending: PendingCalendarEvent | null) => void\n}\n\nexport const useCalendarViewStore = create<CalendarViewState>()(\n persist(\n (set) => ({\n view: null,\n date: null,\n pendingEvent: null,\n pendingComposer: null,\n setPendingComposer: (pendingComposer) => set({ pendingComposer }),\n setView: (view) => set({ view }),\n setDate: (date) => set({ date }),\n setPendingEvent: (pendingEvent) => set({ pendingEvent }),\n }),\n {\n name: 'arbi-calendar-view',\n storage: createJSONStorage(() => localStorage),\n partialize: (s) => ({ view: s.view }),\n }\n )\n)\n\nconst EVT_RE = /^evt-[A-Za-z0-9]{8}$/\n\n/** Ask the calendar to open on an event (ignored unless it is an `evt-` id). */\nexport function requestCalendarEvent(event: PendingCalendarEvent): void {\n if (EVT_RE.test(event.id)) useCalendarViewStore.getState().setPendingEvent(event)\n}\n\n/** Ask the calendar to open the event editor prefilled. */\nexport function requestCalendarComposer(prefill: CalendarComposerPrefill): void {\n useCalendarViewStore.getState().setPendingComposer(prefill)\n}\n","import type { AttendeeDraft, EventDraft, WebinarRole } from '../../calendar/types'\n\n/**\n * ARBI calls for calendar events, from the host (the calls stack lives there). Without it the\n * editor offers no \"Add ARBI call\" or webinar, and Join opens the meeting link in a new tab.\n */\nexport interface CalendarCallSupport {\n /** Whether \"Add ARBI call\", webinars and \"Schedule call\" are offered (the user may host calls). */\n canSchedule: boolean\n /**\n * Make the call for a draft: its key sealed to me and to the draft's ARBI attendees (who share its\n * meeting chat). A webinar gives each attendee its role (`attendeeKey` → role).\n */\n create(\n draft: EventDraft,\n webinarRoles?: Record<string, WebinarRole>\n ): Promise<{ call_id: string; url: string }>\n /** After a save: seal the call's key to ARBI attendees added since it was made. */\n share(draft: EventDraft): Promise<void>\n /** A saved webinar's roles (they live on its call), keyed by `attendeeKey`; `null`: not a webinar. */\n loadWebinarRoles(\n url: string,\n attendees: AttendeeDraft[]\n ): Promise<Record<string, WebinarRole> | null>\n /** Save a webinar's changed roles on its call. */\n saveWebinarRoles(\n url: string,\n roles: Record<string, WebinarRole> | undefined,\n attendees: AttendeeDraft[]\n ): Promise<void>\n /** The attendees (`attendeeKey`) that are ARBI users: who gets a role in a new webinar. */\n arbiAttendees(attendees: AttendeeDraft[]): Promise<Set<string>>\n /** Join a meeting link (an ARBI call opens in the app; anything else in a new tab). */\n join(url: string): void\n /** Open an ARBI call's meeting chat. */\n openChat(url: string): void\n}\n\n/** Open a meeting link without call support: a new tab. */\nexport function openMeetingLink(url: string): void {\n if (/^https?:\\/\\//i.test(url)) window.open(url, '_blank', 'noopener,noreferrer')\n}\n\n/** Where an overlay item on the calendar points (`fact:…`, `workflow:…`, `conversation:…`). */\nexport interface CalendarOverlayLink {\n kind: 'fact' | 'workflow' | 'conversation'\n id: string\n}\n","/** \"Upcoming\": my events in the next 7 days (GET /events), soonest first, with Join for online meetings. */\nimport { useMemo, useState } from 'react'\nimport { Video } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { useCalendarEvents, useCalendars, type CalendarEvent } from '@arbidocs/react'\nimport {\n canJoinEvent,\n conferenceUrl,\n formatInZone,\n formatPlainDate,\n isWebinarConference,\n upcomingOf,\n utcToDate,\n} from '../../calendar'\nimport { openMeetingLink } from './types'\n\nexport interface ConnectedUpcomingEventsProps {\n timeZone: string\n days?: number\n limit?: number\n showDeclined?: boolean\n onOpen?: (event: CalendarEvent) => void\n /** Join an event's meeting (the host's calls). Default: the link opens in a new tab. */\n onJoin?: (event: CalendarEvent) => void\n className?: string\n}\n\nexport function ConnectedUpcomingEvents({\n timeZone,\n days = 7,\n limit = 8,\n showDeclined,\n onOpen,\n onJoin,\n className,\n}: ConnectedUpcomingEventsProps) {\n // Round \"now\" to the minute so the query key is stable across renders.\n const [now] = useState(() => Math.floor(Date.now() / 60_000) * 60_000)\n const range = useMemo(\n () => ({\n start: new Date(now).toISOString(),\n end: new Date(now + days * 86400_000).toISOString(),\n }),\n [now, days]\n )\n const { data: events = [], isLoading } = useCalendarEvents(range)\n const { data: calendars = [] } = useCalendars()\n const hidden = useMemo(\n () => new Set(calendars.filter((c) => c.hidden).map((c) => c.id)),\n [calendars]\n )\n const list = upcomingOf(events, Date.now(), { showDeclined, hidden }).slice(0, limit)\n\n let lastDay = ''\n return (\n <section className={cn('space-y-1 text-sm', className)} data-testid=\"calendar-upcoming\">\n <h4 className=\"px-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Upcoming\n </h4>\n {!isLoading && list.length === 0 && (\n <p className=\"px-1 text-xs text-muted-foreground\">Nothing in the next {days} days.</p>\n )}\n <ul className=\"space-y-0.5\">\n {list.map((e) => {\n const day = e.all_day ? (e.start.date ?? '') : utcToDate(e.start_utc, timeZone)\n const header = day !== lastDay\n lastDay = day\n return (\n <li key={e.instance_id}>\n {header && (\n <div className=\"px-1 pt-1.5 text-[11px] font-medium text-muted-foreground\">\n {formatPlainDate(day, { weekday: 'short', day: 'numeric', month: 'short' })}\n </div>\n )}\n <div\n className=\"flex items-center gap-1.5 rounded-md px-1 py-0.5 hover:bg-muted/60\"\n data-testid=\"calendar-upcoming-item\"\n >\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-baseline gap-1.5 text-left\"\n onClick={() => onOpen?.(e)}\n >\n <span className=\"w-12 shrink-0 text-xs text-muted-foreground\">\n {e.all_day\n ? 'All day'\n : formatInZone(e.start_utc, timeZone, { hour: 'numeric', minute: '2-digit' })}\n </span>\n <span\n className={cn('min-w-0 truncate', e.my_partstat === 'needs_action' && 'italic')}\n >\n {e.restricted ? 'Busy' : e.title || 'Untitled'}\n </span>\n </button>\n {conferenceUrl(e) && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={canJoinEvent(e) ? 'default' : 'ghost'}\n className=\"h-6 px-2 text-xs\"\n onClick={() =>\n onJoin ? onJoin(e) : openMeetingLink(conferenceUrl(e) as string)\n }\n aria-label={`Join ${e.title}`}\n data-testid=\"calendar-upcoming-join\"\n >\n <Video className=\"mr-1 size-3\" />{' '}\n {isWebinarConference(e.conference) ? 'Join webinar' : 'Join'}\n </Button>\n )}\n </div>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","/**\n * Which attendees of the editor's webinar get a role select: for a saved webinar its invitees (roles apply to\n * them only — the call lists every one), for a new one the attendees that are ARBI users (the people its call\n * key is sealed to; looked up as they are added).\n */\nimport { useCallback, useEffect, useState } from 'react'\nimport { attendeeKey, type AttendeeDraft, type EventDraft } from '../../calendar'\nimport type { CalendarCallSupport } from './types'\n\nexport function useWebinarAttendee(\n draft: EventDraft | null | undefined,\n calls: CalendarCallSupport | undefined\n): (attendee: AttendeeDraft) => boolean {\n const conference = draft?.conference\n const pending = conference?.kind === 'webinar' && !conference.url\n const attendees = JSON.stringify(draft?.attendees ?? [])\n const [arbiUsers, setArbiUsers] = useState<ReadonlySet<string>>(new Set())\n useEffect(() => {\n if (!pending || !calls) return\n let live = true\n calls\n .arbiAttendees(JSON.parse(attendees) as AttendeeDraft[])\n .then((users) => live && setArbiUsers(users))\n .catch(() => {})\n return () => {\n live = false\n }\n }, [pending, attendees, calls])\n const roles = conference?.url ? conference.roles : null\n return useCallback(\n (a: AttendeeDraft) => (roles ? attendeeKey(a) in roles : arbiUsers.has(attendeeKey(a))),\n [roles, arbiUsers]\n )\n}\n","/**\n * The connected native calendar: a left rail (mini month, calendar list with overlay toggles,\n * upcoming events), the grid, and the dialogs around it (event details, editor, recurrence scope,\n * calendar create / rename, sharing, publishing, subscriptions, holidays, settings). Data comes\n * from the `@arbidocs/react` calendar hooks (offline when the host's `CalendarSupportProvider`\n * keeps the calendar on the device); ARBI calls come from the host (`calls`).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { Plus, Printer, Settings } from 'lucide-react'\nimport { Button, Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport {\n isQueuedCalendarWrite,\n useArbi,\n useCalendarAccounts,\n useCalendarEvent,\n useCalendarEvents,\n useCalendarOutbox,\n useCalendarOverlays,\n useCalendarSettings,\n useCalendars,\n useCreateCalendar,\n useCreateEvent,\n useDeleteCalendar,\n useDeleteEvent,\n useFetchCalendarEvent,\n useImportCalendar,\n useMoveEvent,\n useRefreshCalendar,\n useResumeCalendarAccountConnect,\n useRespondToEvent,\n useSaveCalendarSettings,\n useSyncAccountsOnOpen,\n useUpdateCalendar,\n useUpdateEvent,\n type CalendarEvent,\n type CalendarSettings,\n type EditScope,\n type OverlayItem,\n} from '@arbidocs/react'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\nimport {\n CalendarFormDialog,\n CalendarGrid,\n CalendarList,\n CALENDAR_DEFAULT_LABELS,\n EventDetails,\n MiniMonth,\n ProposeTimeDialog,\n ScopeDialog,\n buildCreateBody,\n buildDeleteTarget,\n buildEditRequest,\n buildGridEvents,\n buildTimeChangeRequest,\n calendarToListItem,\n canJoinEvent,\n conferenceUrl,\n describeCalendarError,\n detectTimeZone,\n eventToDraft,\n isWebinarConference,\n needsScope,\n newEventDraft,\n parseOverlayLink,\n pendingCreateToGrid,\n printCalendar,\n safeZone,\n todayInZone,\n utcToDate,\n validateDraft,\n type CalendarFormValue,\n type CalendarViewKind,\n type EventDraft,\n type EventTimeChange,\n type GridEvent,\n type GridRange,\n type OverlayLayer,\n type PrintView,\n type SlotSelection,\n} from '../../calendar'\nimport { HolidaysDialog, SubscribeDialog } from './AddCalendarDialogs'\nimport { CalendarSettingsDialog, type CalendarSettingsTab } from './CalendarSettingsDialog'\nimport { EventEditorDialog, type EditorState } from './EventEditorDialog'\nimport { InvitationsPanel } from './InvitationsPanel'\nimport { PublishCalendarDialog } from './PublishCalendarDialog'\nimport { ShareCalendarDialog } from './ShareCalendarDialog'\nimport { useCalendarViewStore } from './store'\nimport { openMeetingLink, type CalendarCallSupport, type CalendarOverlayLink } from './types'\nimport { ConnectedUpcomingEvents } from './ConnectedUpcomingEvents'\nimport { useWebinarAttendee } from './useWebinarAttendee'\n\nexport interface ConnectedCalendarProps {\n /** ARBI calls for events (the host's calls stack). Without it: no \"Add ARBI call\", Join opens links. */\n calls?: CalendarCallSupport\n /**\n * Open what an overlay item (a fact, workflow or task) points to. Default: a conversation opens\n * through the blocks environment; the rest does nothing.\n */\n onOpenOverlay?: (link: CalendarOverlayLink) => void\n /** Turn the account sync on open off (a host that syncs elsewhere). Default on. */\n syncAccountsOnOpen?: boolean\n}\n\nconst FALLBACK_SETTINGS: CalendarSettings = {\n time_zone: detectTimeZone(),\n secondary_time_zone: null,\n week_start: 1,\n working_hours: [0, 1, 2, 3, 4].map((day) => ({ day, start: '09:00', end: '17:00' })),\n default_view: 'week',\n default_duration_minutes: 30,\n default_calendar_id: null,\n show_declined: false,\n show_week_numbers: false,\n auto_add_invitations: 'all',\n decline_message: null,\n overlays: [],\n}\n\nconst PHONE_QUERY = '(max-width: 639px)'\nfunction subscribePhone(cb: () => void) {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {}\n const mq = window.matchMedia(PHONE_QUERY)\n mq?.addEventListener?.('change', cb)\n return () => mq?.removeEventListener?.('change', cb)\n}\nconst isPhoneNow = () =>\n typeof window !== 'undefined' && !!window.matchMedia?.(PHONE_QUERY)?.matches\nfunction useIsPhone() {\n return useSyncExternalStore(subscribePhone, isPhoneNow, () => false)\n}\n\n// 422s from Microsoft / Google mirrored calendars get a plain explanation (unrepresentable recurrence).\nconst errorText = (err: unknown) => describeCalendarError(err)\n\nconst PRINT_VIEW: Record<CalendarViewKind, PrintView> = {\n day: 'day',\n week: 'week',\n work_week: 'week',\n month: 'month',\n agenda: 'agenda',\n year: 'month',\n}\n\ninterface ScopePrompt {\n action: 'edit' | 'delete' | 'respond'\n allowFollowing: boolean\n choose: (scope: EditScope) => void\n cancel?: () => void\n}\n\ntype Selected = { kind: 'event'; event: CalendarEvent } | null\n\nconst safeName = (name: string | null | undefined, fallback: string) =>\n (name ?? '').replace(/[^\\w\\- ]+/g, '').trim() || fallback\n\nexport function ConnectedCalendar({\n calls,\n onOpenOverlay,\n syncAccountsOnOpen = true,\n}: ConnectedCalendarProps = {}) {\n const { confirm, notify, openConversation } = useBlocksEnvironment()\n const arbi = useArbi()\n const fetchEvent = useFetchCalendarEvent()\n const notifyError = (prefix: string, err: unknown) =>\n notify(`${prefix}: ${errorText(err)}`, 'error')\n const isPhone = useIsPhone()\n const { data: settingsData } = useCalendarSettings()\n const settings = settingsData ?? FALLBACK_SETTINGS\n const zone = safeZone(settings.time_zone, detectTimeZone())\n const { data: calendars = [] } = useCalendars()\n\n const storedView = useCalendarViewStore((s) => s.view)\n const storedDate = useCalendarViewStore((s) => s.date)\n const setView = useCalendarViewStore((s) => s.setView)\n const setDate = useCalendarViewStore((s) => s.setDate)\n const pendingEvent = useCalendarViewStore((s) => s.pendingEvent)\n const setPendingEvent = useCalendarViewStore((s) => s.setPendingEvent)\n const view: CalendarViewKind =\n storedView ?? (isPhone ? 'agenda' : (settings.default_view as CalendarViewKind) || 'week')\n const date = storedDate ?? todayInZone(zone)\n\n const [range, setRange] = useState<{ start: string; end: string } | null>(null)\n const [highlight, setHighlight] = useState<{ start: string; end: string } | null>(null)\n const overlayLayers = useMemo(() => settings.overlays ?? [], [settings.overlays])\n\n const { data: events } = useCalendarEvents(range)\n const { data: overlays } = useCalendarOverlays(range, overlayLayers)\n\n const { data: outbox } = useCalendarOutbox()\n // Mirrored calendars: the account lists them even where the calendar row does not carry the provider.\n const { data: accounts } = useCalendarAccounts()\n const listItems = useMemo(() => {\n const kindOf = new Map<string, string>()\n for (const acc of accounts ?? []) for (const id of acc.calendars ?? []) kindOf.set(id, acc.kind)\n return calendars.map((c) => {\n const item = calendarToListItem(c)\n return item.provider ? item : { ...item, provider: kindOf.get(c.id) ?? null }\n })\n }, [calendars, accounts])\n const gridEvents = useMemo(() => {\n const out = buildGridEvents(events, calendars, overlays, {\n zone,\n showDeclined: !!settings.show_declined,\n })\n // Creates made offline show as pending until the outbox replays them.\n const pending: GridEvent[] = []\n for (const item of outbox ?? []) {\n if (item.op.kind !== 'create' || item.state === 'sent') continue\n const g = pendingCreateToGrid(item.requestId, item.op.body as EventDraft, zone)\n if (g) pending.push(g)\n }\n return pending.length ? [...out, ...pending] : out\n }, [events, calendars, overlays, outbox, zone, settings.show_declined])\n const eventByInstance = useMemo(\n () => new Map((events ?? []).map((e) => [e.instance_id, e])),\n [events]\n )\n const overlayByInstance = useMemo(\n () => new Map((overlays ?? []).map((o) => [`${o.layer}:${o.instance_id}`, o])),\n [overlays]\n )\n const defaultCalendarId =\n settings.default_calendar_id ??\n calendars.find((c) => c.is_default && c.can_write)?.id ??\n calendars.find((c) => c.can_write)?.id ??\n null\n\n // Unlock the calendar keys for this session as soon as the page opens.\n useEffect(() => {\n if (arbi.isLoggedIn) void arbi.calendar.unlock()\n }, [arbi])\n\n const [selected, setSelected] = useState<Selected>(null)\n const [editor, setEditor] = useState<EditorState | null>(null)\n const [scopePrompt, setScopePrompt] = useState<ScopePrompt | null>(null)\n const [calendarForm, setCalendarForm] = useState<\n { mode: 'create' } | { mode: 'edit'; id: string; initial: CalendarFormValue } | null\n >(null)\n const [settingsOpen, setSettingsOpen] = useState(false)\n const [settingsTab, setSettingsTab] = useState<CalendarSettingsTab>('general')\n const [publishFor, setPublishFor] = useState<string | null>(null)\n const callsEnabled = !!calls?.canSchedule\n const pendingComposer = useCalendarViewStore((s) => s.pendingComposer)\n const setPendingComposer = useCalendarViewStore((s) => s.setPendingComposer)\n /** Make the ARBI call for a draft (K sealed to me + its ARBI attendees, who share its meeting chat). */\n const makeCall = (draft: EventDraft) => {\n if (!calls) throw new Error('Calls are not available')\n return calls.create(draft)\n }\n /** After a save: seal K to ARBI attendees added since the call was made (best effort). */\n const shareCall = (draft: EventDraft) => {\n if (!calls || draft.conference?.type !== 'arbi' || !draft.attendees?.length) return\n calls.share(draft).catch((err) => notifyError('Could not share the call with new guests', err))\n }\n /**\n * The event's ARBI call, made on save: a webinar picked in the editor (made with its roles, once they are\n * picked), or \"Add ARBI call\" ticked when scheduling from a thread / DM.\n */\n const withCall = async (draft: EventDraft, autoCall?: boolean): Promise<EventDraft> => {\n const c = draft.conference\n if (calls && c?.type === 'arbi' && c.kind === 'webinar' && !c.url) {\n const call = await calls.create(draft, c.roles ?? {})\n return { ...draft, conference: { ...c, url: call.url, call_id: call.call_id } }\n }\n if (autoCall && !c) {\n const call = await makeCall(draft)\n return { ...draft, conference: { type: 'arbi', url: call.url, call_id: call.call_id } }\n }\n return draft\n }\n /** {@link withCall}, keeping the made call in the editor so a failed save is retried without a second one. */\n const withCallKept = async (draft: EventDraft, autoCall?: boolean): Promise<EventDraft> => {\n const next = await withCall(draft, autoCall)\n if (next !== draft) setEditor((e) => (e ? { ...e, draft: next, autoCall: false } : e))\n return next\n }\n /** After saving a webinar whose roles changed: PATCH them on its call (best effort). */\n const saveWebinarRoles = (original: EventDraft, draft: EventDraft) => {\n const c = draft.conference\n if (!calls || !isWebinarConference(c) || !c?.url || !original.conference?.url) return\n if (JSON.stringify(original.conference.roles ?? {}) === JSON.stringify(c.roles ?? {})) return\n calls\n .saveWebinarRoles(c.url, c.roles, draft.attendees ?? [])\n .catch((err) => notifyError('Could not update the webinar roles', err))\n }\n const isWebinarAttendee = useWebinarAttendee(editor?.draft, calls)\n /** Join a meeting: an ARBI call through the host's calls, any other link in a new tab. */\n const joinMeeting = (event: Pick<CalendarEvent, 'conference'>) => {\n const url = conferenceUrl(event)\n if (!url) return\n if (calls) calls.join(url)\n else openMeetingLink(url)\n }\n\n // Connected accounts: pull/push once per session when the calendar opens, and finish an OAuth connect\n // that left for the provider and came back here.\n useSyncAccountsOnOpen(syncAccountsOnOpen)\n useResumeCalendarAccountConnect(({ account, error }) => {\n if (account) notify('Calendar account connected', 'success')\n if (error) notifyError('Could not connect the account', error)\n })\n const [shareFor, setShareFor] = useState<string | null>(null)\n const [addDialog, setAddDialog] = useState<'subscribe' | 'holidays' | null>(null)\n const [proposeFor, setProposeFor] = useState<CalendarEvent | null>(null)\n const importTarget = useRef<string | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n\n const createEvent = useCreateEvent()\n const updateEvent = useUpdateEvent()\n const deleteEvent = useDeleteEvent()\n const moveEvent = useMoveEvent()\n const respond = useRespondToEvent()\n const createCalendar = useCreateCalendar()\n const updateCalendar = useUpdateCalendar()\n const deleteCalendar = useDeleteCalendar()\n const importCalendar = useImportCalendar()\n const saveSettings = useSaveCalendarSettings()\n const refreshCalendar = useRefreshCalendar()\n\n // Deep link (`&event=evt-…`, a reminder): fetch that event, jump to its date and open it.\n useEffect(() => {\n if (!pendingEvent) return\n setPendingEvent(null)\n fetchEvent(pendingEvent.id, pendingEvent.recurrenceId)\n .then((event) => {\n setDate(utcToDate(event.start_utc, zone))\n setSelected({ kind: 'event', event })\n })\n .catch((err) => notifyError('Could not open the event', err))\n // Runs when a request arrives, not when the helpers' identities change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pendingEvent, setPendingEvent, setDate, zone])\n\n // ── grid callbacks ──────────────────────────────────────────────────────\n\n const onRangeChange = useCallback(\n (r: GridRange) => {\n const next = { start: r.start.toISOString(), end: r.end.toISOString() }\n setRange((prev) => (prev && prev.start === next.start && prev.end === next.end ? prev : next))\n const last = new Date(r.end.getTime() - 1)\n setHighlight({ start: utcToDate(r.start, zone), end: utcToDate(last, zone) })\n },\n [zone]\n )\n\n const openCreate = useCallback(\n (slot?: SlotSelection | null) => {\n const draft = newEventDraft(settings, { slot, calendarId: defaultCalendarId })\n setEditor({ mode: 'create', original: draft, draft, error: null })\n },\n [settings, defaultCalendarId]\n )\n\n // \"Schedule call\" from a thread / DM / the dashboard: open the editor prefilled.\n useEffect(() => {\n if (!pendingComposer) return\n setPendingComposer(null)\n const base = newEventDraft(settings, { calendarId: defaultCalendarId })\n const draft: EventDraft = {\n ...base,\n title: pendingComposer.title ?? '',\n conversation_id: pendingComposer.conversationId ?? null,\n attendees: (pendingComposer.attendees ?? []).map((a) => ({\n email: a.email ?? null,\n user_id: a.user_id ?? null,\n name: a.name ?? null,\n role: 'required',\n kind: 'individual',\n })),\n }\n setEditor({\n mode: 'create',\n original: draft,\n draft,\n error: null,\n autoCall: !!pendingComposer.addCall && callsEnabled,\n })\n }, [pendingComposer, setPendingComposer, settings, defaultCalendarId, callsEnabled])\n\n const openOverlay = (item: OverlayItem) => {\n const link = parseOverlayLink(item.link)\n if (!link) return\n if (onOpenOverlay) onOpenOverlay(link)\n else if (link.kind === 'conversation') openConversation(link.id)\n }\n\n const onEventClick = (instanceId: string) => {\n const event = eventByInstance.get(instanceId)\n if (event) {\n setSelected({ kind: 'event', event })\n return\n }\n const overlay = overlayByInstance.get(instanceId)\n if (overlay) openOverlay(overlay)\n }\n\n const withScope = (\n event: CalendarEvent,\n action: 'edit' | 'delete',\n run: (scope: EditScope) => void,\n cancel?: () => void\n ) => {\n if (!needsScope(event)) {\n run('all')\n return\n }\n setScopePrompt({\n action,\n allowFollowing: !event.is_exception,\n choose: (scope) => {\n setScopePrompt(null)\n run(scope)\n },\n cancel: () => {\n setScopePrompt(null)\n cancel?.()\n },\n })\n }\n\n const onEventChange = (change: EventTimeChange) => {\n const event = eventByInstance.get(change.instanceId)\n if (!event || !event.can_edit || event.restricted) {\n change.revert()\n return\n }\n withScope(\n event,\n 'edit',\n (scope) => {\n const { target, body } = buildTimeChangeRequest(event, change, scope, zone)\n updateEvent.mutate(\n { target, body },\n {\n onError: (err) => {\n change.revert()\n notifyError('Could not move the event', err)\n },\n }\n )\n },\n change.revert\n )\n }\n\n // ── details / editor actions ───────────────────────────────────────────\n\n const openEdit = async (event: CalendarEvent) => {\n setSelected(null)\n let master: CalendarEvent | null = null\n if (event.recurrence_id && !event.recurrence) {\n try {\n master = await fetchEvent(event.id)\n } catch {\n master = null\n }\n }\n let draft = eventToDraft(event, master)\n // A webinar's roles live on its call: show them in the editor.\n if (calls && draft.conference?.url && isWebinarConference(draft.conference)) {\n try {\n const roles = await calls.loadWebinarRoles(draft.conference.url, draft.attendees ?? [])\n if (roles) draft = { ...draft, conference: { ...draft.conference, kind: 'webinar', roles } }\n } catch (err) {\n notifyError('Could not load the webinar roles', err)\n }\n }\n setEditor({ mode: 'edit', event, original: draft, draft, error: null })\n }\n\n const removeEvent = (event: CalendarEvent) => {\n const run = (scope: EditScope) =>\n deleteEvent.mutate(buildDeleteTarget(event, scope), {\n onSuccess: () => {\n setSelected(null)\n setEditor(null)\n },\n onError: (err) => notifyError('Could not delete the event', err),\n })\n const invitee = event.is_organizer === false && event.my_partstat != null\n if (needsScope(event)) withScope(event, 'delete', run)\n else\n void confirm({\n message: invitee\n ? `Remove “${event.title || 'this event'}” from your calendar? The organiser is told you declined.`\n : `Delete “${event.title || 'this event'}”?`,\n title: invitee ? 'Remove from calendar' : 'Delete event',\n }).then((ok) => ok && run('all'))\n }\n\n const saveEditor = () => {\n if (!editor) return\n const problem = validateDraft(editor.draft, zone)\n if (problem) {\n setEditor({ ...editor, error: CALENDAR_DEFAULT_LABELS[problem] })\n return\n }\n if (editor.mode === 'create') {\n void (async () => {\n let draft: EventDraft\n try {\n draft = await withCallKept(editor.draft, editor.autoCall)\n } catch (err) {\n setEditor((e) =>\n e ? { ...e, error: `Could not add the ARBI call: ${errorText(err)}` } : e\n )\n return\n }\n createEvent.mutate(buildCreateBody(draft), {\n onSuccess: (event) => {\n shareCall(draft)\n setEditor(null)\n if (isQueuedCalendarWrite(event))\n notify('Saved on this device — it syncs when you are back online', 'info')\n else setDate(utcToDate(event.start_utc, zone))\n },\n onError: (err) => setEditor((e) => (e ? { ...e, error: errorText(err) } : e)),\n })\n })()\n return\n }\n const event = editor.event\n if (!event) return\n withScope(event, 'edit', async (scope) => {\n let draft: EventDraft\n try {\n draft = await withCallKept(editor.draft)\n } catch (err) {\n setEditor((e) =>\n e ? { ...e, error: `Could not add the ARBI call: ${errorText(err)}` } : e\n )\n return\n }\n const { target, body, moveTo } = buildEditRequest(event, editor.original, draft, scope)\n try {\n let id = event.id\n let queued = false\n if (Object.keys(body).length) {\n const updated = await updateEvent.mutateAsync({ target, body })\n if (isQueuedCalendarWrite(updated)) queued = true\n else id = updated.id\n }\n if (moveTo && !queued) await moveEvent.mutateAsync({ id, calendarId: moveTo })\n if (!queued) {\n shareCall(draft)\n saveWebinarRoles(editor.original, draft)\n }\n setEditor(null)\n if (queued) notify('Saved on this device — it syncs when you are back online', 'info')\n } catch (err) {\n setEditor((e) => (e ? { ...e, error: errorText(err) } : e))\n }\n })\n }\n\n const onRespond = (event: CalendarEvent, partstat: 'accepted' | 'declined' | 'tentative') => {\n const send = (scope: EditScope) =>\n respond.mutate(\n scope === 'this' && event.recurrence_id\n ? { id: event.id, partstat, scope: 'this', recurrence_id: event.recurrence_id }\n : { id: event.id, partstat },\n {\n onSuccess: (updated) =>\n setSelected((s) =>\n s?.event.instance_id === event.instance_id\n ? {\n kind: 'event',\n event: {\n ...s.event,\n my_partstat: isQueuedCalendarWrite(updated) ? partstat : updated.my_partstat,\n },\n }\n : s\n ),\n onError: (err) => notifyError('Could not send your response', err),\n }\n )\n if (!event.recurrence_id) return send('all')\n setScopePrompt({\n action: 'respond',\n allowFollowing: false,\n choose: (scope) => {\n setScopePrompt(null)\n send(scope)\n },\n })\n }\n\n // ── calendar list actions ──────────────────────────────────────────────\n\n const calendarById = (id: string) => calendars.find((c) => c.id === id)\n\n const patchCalendar = (id: string, body: Parameters<typeof updateCalendar.mutate>[0]['body']) =>\n updateCalendar.mutate(\n { id, body },\n { onError: (err) => notifyError('Could not update the calendar', err) }\n )\n\n const toggleOverlay = (layer: OverlayLayer) => {\n const on = overlayLayers.includes(layer)\n saveSettings.mutate(\n {\n ...settings,\n overlays: on ? overlayLayers.filter((l) => l !== layer) : [...overlayLayers, layer],\n },\n { onError: (err) => notifyError('Could not save the setting', err) }\n )\n }\n\n const onImportFile = async (file: File) => {\n try {\n const ics = await file.text()\n const result = await importCalendar.mutateAsync({ ics, calendarId: importTarget.current })\n const parts = [`${result.created} added`, `${result.updated} updated`]\n if (result.skipped) parts.push(`${result.skipped} skipped`)\n notify(`Imported: ${parts.join(', ')}`, result.errors?.length ? 'warning' : 'success')\n } catch (err) {\n notifyError('Import failed', err)\n }\n }\n\n const onDeleteCalendar = async (id: string) => {\n const cal = calendarById(id)\n const ok = await confirm({\n message: `Delete the calendar “${cal?.name ?? 'Untitled'}” and all its events?`,\n title: 'Delete calendar',\n })\n if (ok)\n deleteCalendar.mutate(id, {\n onError: (err) => notifyError('Could not delete the calendar', err),\n })\n }\n\n const saveCalendarForm = (value: CalendarFormValue) => {\n if (!calendarForm) return\n const done = {\n onSuccess: () => setCalendarForm(null),\n onError: (err: Error) => notifyError('Could not save the calendar', err),\n }\n if (calendarForm.mode === 'create')\n createCalendar.mutate({ name: value.name, color: value.color, timezone: zone }, done)\n else updateCalendar.mutate({ id: calendarForm.id, body: value }, done)\n }\n\n // The list copy can lag (e.g. a room answers right after a save): show the event's own fresh copy.\n const { data: freshSelected } = useCalendarEvent(\n selected?.event.id.startsWith('evt-') ? selected.event.id : null,\n selected?.event.recurrence_id\n )\n const selectedEvent = selected\n ? freshSelected &&\n freshSelected.id === selected.event.id &&\n (freshSelected.recurrence_id ?? null) === (selected.event.recurrence_id ?? null)\n ? freshSelected\n : selected.event\n : null\n const selectedCalendar = selectedEvent ? calendarById(selectedEvent.calendar_id) : undefined\n\n return (\n <div className=\"flex h-full min-h-0 w-full gap-3 p-2 sm:p-3\" data-testid=\"calendar-page\">\n <aside\n className=\"hidden w-64 shrink-0 flex-col gap-4 overflow-y-auto md:flex\"\n data-testid=\"calendar-rail\"\n >\n <Button\n onClick={() => openCreate(null)}\n data-testid=\"calendar-new-event\"\n className=\"w-full\"\n >\n <Plus className=\"mr-1 size-4\" /> New event\n </Button>\n <MiniMonth\n date={date}\n weekStart={settings.week_start}\n timeZone={zone}\n highlightRange={highlight}\n showWeekNumbers={settings.show_week_numbers}\n onSelect={(d) => setDate(d)}\n />\n <CalendarList\n calendars={listItems}\n overlays={{\n facts: overlayLayers.includes('facts'),\n workflows: overlayLayers.includes('workflows'),\n tasks: overlayLayers.includes('tasks'),\n }}\n onToggleHidden={(id) => {\n const cal = calendarById(id)\n if (cal) patchCalendar(id, { hidden: !cal.hidden })\n }}\n onColorChange={(id, color) => patchCalendar(id, { color })}\n onToggleOverlay={toggleOverlay}\n onCreate={() => setCalendarForm({ mode: 'create' })}\n onEdit={(id) => {\n const cal = calendarById(id)\n if (cal)\n setCalendarForm({\n mode: 'edit',\n id,\n initial: { name: cal.name ?? '', color: cal.color },\n })\n }}\n onImport={(id) => {\n importTarget.current = id\n fileInput.current?.click()\n }}\n onExport={(id) => {\n const cal = calendarById(id)\n if (cal)\n arbi.calendar\n .exportCalendar(cal.id)\n .then((blob) => downloadBlob(blob, `${safeName(cal.name, 'calendar')}.ics`))\n .catch((err) => notifyError('Export failed', err))\n }}\n onDelete={(id) => void onDeleteCalendar(id)}\n onShare={(id) => setShareFor(id)}\n onRefresh={(id) =>\n refreshCalendar.mutate(id, {\n onSuccess: () => notify('Calendar refreshed', 'success'),\n onError: (err) => notifyError('Could not refresh', err),\n })\n }\n onPublish={(id) => setPublishFor(id)}\n onSubscribe={() => setAddDialog('subscribe')}\n onAddHolidays={() => setAddDialog('holidays')}\n onImportFile={() => {\n importTarget.current = null\n fileInput.current?.click()\n }}\n />\n <ConnectedUpcomingEvents\n timeZone={zone}\n showDeclined={!!settings.show_declined}\n onOpen={(event) => setSelected({ kind: 'event', event })}\n onJoin={joinMeeting}\n />\n </aside>\n\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col\" data-testid=\"calendar-main\">\n <CalendarGrid\n events={gridEvents}\n view={view}\n date={date}\n timeZone={zone}\n secondaryTimeZone={settings.secondary_time_zone ?? null}\n weekStart={settings.week_start}\n workingHours={settings.working_hours}\n showWeekNumbers={settings.show_week_numbers}\n nowIndicator\n\n onRangeChange={onRangeChange}\n onSelectSlot={(slot) => openCreate(slot)}\n onEventClick={(instanceId) => onEventClick(instanceId)}\n onEventChange={onEventChange}\n onViewChange={setView}\n onDateChange={(d) => setDate(d)}\n onCreateShortcut={() => openCreate(null)}\n toolbarEnd={\n <div className=\"flex items-center gap-1\">\n <Button\n size=\"sm\"\n className=\"md:hidden\"\n onClick={() => openCreate(null)}\n aria-label=\"New event\"\n >\n <Plus className=\"size-4\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Print\"\n title=\"Print\"\n data-testid=\"calendar-print-button\"\n onClick={() =>\n printCalendar({\n events: (events ?? []).filter(\n (e) => !calendars.find((c) => c.id === e.calendar_id)?.hidden\n ),\n view: PRINT_VIEW[view],\n date,\n timeZone: zone,\n weekStart: settings.week_start,\n calendars: calendars.map((c) => ({ id: c.id, name: c.name, color: c.color })),\n })\n }\n >\n <Printer className=\"size-4\" />\n </Button>\n <InvitationsPanel timeZone={zone} onOpenEvent={(id) => setPendingEvent({ id })} />\n <Button\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Calendar settings\"\n data-testid=\"calendar-settings-button\"\n onClick={() => {\n setSettingsTab('general')\n setSettingsOpen(true)\n }}\n >\n <Settings className=\"size-4\" />\n </Button>\n </div>\n }\n />\n </main>\n\n <input\n ref={fileInput}\n type=\"file\"\n accept=\".ics,text/calendar\"\n className=\"hidden\"\n data-testid=\"calendar-import-input\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (file) void onImportFile(file)\n }}\n />\n\n <Dialog\n open={!!selectedEvent && !scopePrompt}\n onOpenChange={(open) => !open && setSelected(null)}\n >\n <DialogContent\n className=\"sm:max-w-md\"\n presentation=\"sheet\"\n hideCloseButton\n data-testid=\"calendar-event-details-dialog\"\n >\n <DialogTitle className=\"sr-only\">{selectedEvent?.title || 'Event'}</DialogTitle>\n <DialogDescription className=\"sr-only\">Event details</DialogDescription>\n {selectedEvent && (\n <EventDetails\n event={selectedEvent}\n timeZone={zone}\n calendarName={selectedCalendar?.name ?? null}\n calendarColor={selectedCalendar?.color ?? null}\n canJoin={canJoinEvent(selectedEvent)}\n onClose={() => setSelected(null)}\n onEdit={\n selectedEvent.can_edit && !selectedEvent.restricted\n ? () => void openEdit(selectedEvent)\n : undefined\n }\n onDelete={\n selectedEvent.can_edit ||\n (selectedEvent.is_organizer === false && selectedEvent.my_partstat != null)\n ? () => removeEvent(selectedEvent)\n : undefined\n }\n onProposeTime={\n selectedEvent.my_partstat && !selectedEvent.is_organizer\n ? () => setProposeFor(selectedEvent)\n : undefined\n }\n onRespond={\n selectedEvent.my_partstat && !selectedEvent.is_organizer\n ? (p) => onRespond(selectedEvent, p)\n : undefined\n }\n onJoin={\n selectedEvent.conference?.url\n ? () => {\n // Close the details first: the call's pre-join opens on top of the page.\n setSelected(null)\n joinMeeting(selectedEvent)\n }\n : undefined\n }\n onOpenMeetingChat={\n calls && selectedEvent.conference?.type === 'arbi' && conferenceUrl(selectedEvent)\n ? () => {\n setSelected(null)\n calls.openChat(conferenceUrl(selectedEvent) as string)\n }\n : undefined\n }\n />\n )}\n </DialogContent>\n </Dialog>\n\n <EventEditorDialog\n editor={editor}\n onChange={setEditor}\n onSave={saveEditor}\n onDelete={(event) => removeEvent(event)}\n calendars={listItems.filter((c) => c.canWrite && !c.locked)}\n callsEnabled={callsEnabled}\n onAddCall={makeCall}\n isWebinarAttendee={isWebinarAttendee}\n timeZone={zone}\n workingHours={settings.working_hours}\n saving={createEvent.isPending || updateEvent.isPending || moveEvent.isPending}\n />\n\n <ScopeDialog\n open={!!scopePrompt}\n action={scopePrompt?.action ?? 'edit'}\n allowFollowing={scopePrompt?.allowFollowing ?? true}\n onChoose={(scope) => scopePrompt?.choose(scope)}\n onCancel={() => (scopePrompt?.cancel ? scopePrompt.cancel() : setScopePrompt(null))}\n />\n\n <CalendarFormDialog\n open={!!calendarForm}\n mode={calendarForm?.mode ?? 'create'}\n initial={\n calendarForm?.mode === 'edit' ? calendarForm.initial : { name: '', color: '#3b82f6' }\n }\n saving={createCalendar.isPending || updateCalendar.isPending}\n onSave={saveCalendarForm}\n onCancel={() => setCalendarForm(null)}\n />\n\n <CalendarSettingsDialog\n open={settingsOpen}\n settings={settings}\n calendars={listItems}\n initialTab={settingsTab}\n onClose={() => setSettingsOpen(false)}\n />\n <PublishCalendarDialog\n calendarId={publishFor}\n calendarName={publishFor ? calendarById(publishFor)?.name : null}\n onClose={() => setPublishFor(null)}\n onConnectAccount={() => {\n setPublishFor(null)\n setSettingsTab('accounts')\n setSettingsOpen(true)\n }}\n />\n\n <ShareCalendarDialog\n calendarId={shareFor}\n calendarName={shareFor ? calendarById(shareFor)?.name : null}\n onClose={() => setShareFor(null)}\n />\n <SubscribeDialog\n open={addDialog === 'subscribe'}\n timeZone={zone}\n onClose={() => setAddDialog(null)}\n />\n <HolidaysDialog open={addDialog === 'holidays'} onClose={() => setAddDialog(null)} />\n <ProposeTimeDialog\n open={!!proposeFor}\n startUtc={proposeFor?.start_utc ?? null}\n endUtc={proposeFor?.end_utc ?? null}\n timeZone={zone}\n sending={respond.isPending}\n onCancel={() => setProposeFor(null)}\n onSend={(v) => {\n const event = proposeFor\n if (!event) return\n respond.mutate(\n {\n id: event.id,\n partstat: 'tentative',\n comment: v.comment,\n propose_start: v.start,\n propose_end: v.end,\n ...(event.recurrence_id\n ? { scope: 'this' as const, recurrence_id: event.recurrence_id }\n : {}),\n },\n {\n onSuccess: () => {\n setProposeFor(null)\n notify('New time proposed to the organiser', 'success')\n },\n onError: (err) => notifyError('Could not send the proposal', err),\n }\n )\n }}\n />\n </div>\n )\n}\n","/**\n * Invitation card in the Mail message view: when the message carries an iCalendar part, show the event\n * (parsed client-side) and, if it is in my calendar (GET /lookup?uid=), Accept / Maybe / Decline and\n * Open in calendar. Self-contained so the mail view only mounts it.\n */\nimport { useEffect, useState } from 'react'\nimport { CalendarDays } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport {\n isQueuedCalendarWrite,\n useCalendarEventByUid,\n useCalendarSettings,\n useMailAttachmentText,\n useRespondToEvent,\n type MailAttachment,\n} from '@arbidocs/react'\nimport {\n detectTimeZone,\n formatEventWhen,\n isCalendarAttachment,\n parseIcsInvite,\n safeZone,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\nexport interface ConnectedMailInviteCardProps {\n accountId: string\n messageId: string\n attachments: MailAttachment[]\n isOnline: boolean\n /** Open the event in the host's calendar (\"Open in calendar\"); without it the button is hidden. */\n onOpenEvent?: (event: { id: string }) => void\n}\n\nconst PARTSTAT_TEXT: Record<string, string> = {\n accepted: 'You accepted',\n declined: 'You declined',\n tentative: 'You said maybe',\n needs_action: 'Not answered yet',\n}\n\nexport function ConnectedMailInviteCard({\n accountId,\n messageId,\n attachments,\n isOnline,\n onOpenEvent,\n}: ConnectedMailInviteCardProps) {\n const { notify } = useBlocksEnvironment()\n const part = attachments.find(isCalendarAttachment)\n const { data: settings } = useCalendarSettings(!!part)\n const zone = safeZone(settings?.time_zone, detectTimeZone())\n const { data: ics } = useMailAttachmentText(accountId, messageId, part, { enabled: isOnline })\n const invite = ics ? parseIcsInvite(ics, zone) : null\n const lookup = useCalendarEventByUid(invite?.uid && invite.method !== 'REPLY' ? invite.uid : null)\n const respond = useRespondToEvent()\n const [partstat, setPartstat] = useState<string | null>(null)\n const event = lookup.data ?? null\n useEffect(() => setPartstat(event?.my_partstat ?? null), [event?.my_partstat])\n\n if (!part || !invite) return null\n const cancelled = invite.method === 'CANCEL' || invite.status === 'CANCELLED'\n const when =\n invite.startUtc && invite.endUtc\n ? formatEventWhen(\n {\n all_day: invite.allDay,\n start_utc: invite.startUtc,\n end_utc: invite.endUtc,\n start: { date: invite.startDate },\n end: { date: invite.endDate },\n },\n zone\n )\n : ''\n const canRespond = !!event && !event.is_organizer && event.my_partstat != null && !cancelled\n\n const answer = (p: 'accepted' | 'tentative' | 'declined') =>\n event &&\n respond.mutate(\n { id: event.id, partstat: p },\n {\n onSuccess: (updated) =>\n setPartstat(isQueuedCalendarWrite(updated) ? p : (updated.my_partstat ?? p)),\n onError: (err) => notify(`Could not send your response: ${err.message}`, 'error'),\n }\n )\n\n return (\n <div\n className=\"mb-4 flex gap-3 rounded-lg border border-border bg-muted/20 p-3\"\n data-testid=\"mail-invite-card\"\n >\n <CalendarDays className=\"mt-0.5 size-5 shrink-0 text-primary\" aria-hidden />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div\n className={cn('font-medium', cancelled && 'line-through')}\n data-testid=\"mail-invite-title\"\n >\n {invite.title || 'Untitled event'}\n </div>\n <div className=\"text-sm text-muted-foreground\">{when}</div>\n {invite.location && <div className=\"text-sm text-muted-foreground\">{invite.location}</div>}\n {invite.organizer && (\n <div className=\"text-xs text-muted-foreground\">\n Organiser: {invite.organizer.name || invite.organizer.email}\n </div>\n )}\n {cancelled && <div className=\"text-sm text-destructive\">This event was cancelled.</div>}\n {invite.method === 'REPLY' && (\n <div className=\"text-sm text-muted-foreground\">A guest replied to your invitation.</div>\n )}\n {!cancelled && invite.method !== 'REPLY' && !lookup.isLoading && !event && isOnline && (\n <div className=\"text-xs text-muted-foreground\">Not in your calendar yet.</div>\n )}\n {canRespond && partstat && (\n <div className=\"text-xs text-muted-foreground\" data-testid=\"mail-invite-status\">\n {PARTSTAT_TEXT[partstat] ?? partstat}\n </div>\n )}\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {canRespond && (\n <>\n <Button\n size=\"sm\"\n variant={partstat === 'accepted' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('accepted')}\n data-testid=\"mail-invite-accept\"\n >\n Accept\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'tentative' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('tentative')}\n >\n Maybe\n </Button>\n <Button\n size=\"sm\"\n variant={partstat === 'declined' ? 'default' : 'outline'}\n disabled={!isOnline || respond.isPending}\n onClick={() => answer('declined')}\n >\n Decline\n </Button>\n </>\n )}\n {event && onOpenEvent && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onOpenEvent({ id: event.id })}\n data-testid=\"mail-invite-open\"\n >\n Open in calendar\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * The PUBLIC booking page (`/book/:slug`, no sign-in). A visitor picks a duration and a free slot\n * (shown in THEIR detected time zone, changeable), enters name + e-mail, and books. The confirmation\n * offers an .ics download and a private cancel link (`/book/:slug?cancel=<token>`), which this page\n * also handles. Requests go to the blocks environment's API base URL.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { CalendarCheck, CalendarX, Clock, Globe, Loader2, MapPin } from 'lucide-react'\nimport { Button, Input, Label, Textarea, cn } from '@arbidocs/react/ui'\nimport {\n PublicBookingError,\n bookPublicSlot,\n cancelPublicBooking,\n getPublicBookingPage,\n type BookingConfirmation,\n type PublicBookingPage,\n} from '@arbidocs/react'\nimport { downloadBlob } from '@arbidocs/react/document-tools'\nimport {\n addDays,\n detectTimeZone,\n formatSlotRange,\n groupSlotsByDay,\n publicBookingMessage,\n todayInZone,\n zoneOptions,\n} from '../../calendar'\nimport { useBlocksEnvironment } from '../../provider/BlocksProvider'\n\n/** The cancel link a guest can keep: this page with `?cancel=<token>`. */\nexport function bookingCancelLink(\n slug: string,\n token: string,\n origin = window.location.origin\n): string {\n return `${origin}/book/${encodeURIComponent(slug)}?cancel=${encodeURIComponent(token)}`\n}\n\nfunction downloadIcs(ics: string, filename: string) {\n downloadBlob(new Blob([ics], { type: 'text/calendar;charset=utf-8' }), filename)\n}\n\nconst PAGE_DAYS = 14\nconst selectClass =\n 'h-9 rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm'\n\nfunction Shell({ children, wide = false }: { children: React.ReactNode; wide?: boolean }) {\n return (\n <main className=\"flex min-h-dvh items-start justify-center bg-background px-4 py-6 text-foreground sm:items-center sm:py-10\">\n <div\n className={cn(\n 'w-full rounded-lg border border-border bg-card p-5 shadow-sm sm:p-6',\n wide ? 'max-w-2xl' : 'max-w-md'\n )}\n >\n {children}\n <p className=\"mt-6 text-center text-xs text-muted-foreground\">Scheduling by ARBI</p>\n </div>\n </main>\n )\n}\n\nfunction CancelView({ slug, token }: { slug: string; token: string }) {\n const { apiBaseUrl } = useBlocksEnvironment().runtimeConfig\n const [state, setState] = useState<'idle' | 'busy' | 'done'>('idle')\n const [error, setError] = useState<string | null>(null)\n return (\n <Shell>\n <div className=\"grid gap-4\" data-testid=\"book-cancel\">\n <div className=\"flex items-center gap-2\">\n <CalendarX className=\"size-5 text-muted-foreground\" />\n <h1 className=\"text-lg font-semibold\">\n {state === 'done' ? 'Booking cancelled' : 'Cancel your booking?'}\n </h1>\n </div>\n {state === 'done' ? (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"book-cancel-done\">\n Your booking has been cancelled and the organiser has been told. You can close this\n page.\n </p>\n ) : (\n <>\n <p className=\"text-sm text-muted-foreground\">\n The organiser will be notified and the time will be freed up.\n </p>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-error\">\n {error}\n </p>\n )}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"destructive\"\n disabled={state === 'busy'}\n onClick={() => {\n setState('busy')\n setError(null)\n cancelPublicBooking(apiBaseUrl, slug, token)\n .then(() => setState('done'))\n .catch((err) => {\n setState('idle')\n setError(\n err instanceof PublicBookingError && err.status === 404\n ? 'This booking was not found — it may already be cancelled.'\n : publicBookingMessage(err)\n )\n })\n }}\n data-testid=\"book-cancel-confirm\"\n >\n {state === 'busy' && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Cancel booking\n </Button>\n <Button variant=\"ghost\" asChild>\n <a href={`/book/${encodeURIComponent(slug)}`}>Book another time</a>\n </Button>\n </div>\n </>\n )}\n </div>\n </Shell>\n )\n}\n\nfunction Confirmation({\n slug,\n confirmation,\n zone,\n}: {\n slug: string\n confirmation: BookingConfirmation\n zone: string\n}) {\n const link = bookingCancelLink(slug, confirmation.cancel_token)\n return (\n <Shell>\n <div className=\"grid gap-4\" data-testid=\"book-confirmed\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"size-5 text-emerald-600 dark:text-emerald-400\" />\n <h1 className=\"text-lg font-semibold\">You&apos;re booked</h1>\n </div>\n <div className=\"grid gap-1 text-sm\">\n <div className=\"font-medium\">{confirmation.title}</div>\n <div className=\"text-muted-foreground\" data-testid=\"book-confirmed-when\">\n {formatSlotRange(confirmation.start, confirmation.end, zone)}\n </div>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n A confirmation has been sent to your e-mail.\n </p>\n <Button\n onClick={() => downloadIcs(confirmation.ics, `${slug}.ics`)}\n data-testid=\"book-add-to-calendar\"\n >\n Add to calendar (.ics)\n </Button>\n <div className=\"grid gap-1 text-sm\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Need to cancel? Keep this link:\n </span>\n <a\n className=\"break-all text-primary underline-offset-2 hover:underline\"\n href={link}\n data-testid=\"book-cancel-link\"\n >\n {link}\n </a>\n </div>\n </div>\n </Shell>\n )\n}\n\nexport interface ConnectedPublicBookingProps {\n /** The booking page's slug (`/book/<slug>`). */\n slug: string\n /** A guest's cancel token (`?cancel=`): the page offers to cancel that booking instead. */\n cancelToken?: string | null\n}\n\nexport function ConnectedPublicBooking({ slug, cancelToken }: ConnectedPublicBookingProps) {\n const { apiBaseUrl } = useBlocksEnvironment().runtimeConfig\n\n const [zone, setZone] = useState(detectTimeZone)\n const [duration, setDuration] = useState<number | undefined>(undefined)\n const [offset, setOffset] = useState(0)\n const [page, setPage] = useState<PublicBookingPage | null>(null)\n const [loading, setLoading] = useState(true)\n const [loadError, setLoadError] = useState<unknown>(null)\n const [reload, setReload] = useState(0)\n const [picked, setPicked] = useState<string | null>(null)\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [note, setNote] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [confirmation, setConfirmation] = useState<BookingConfirmation | null>(null)\n\n const ownerZone = page?.time_zone\n useEffect(() => {\n if (cancelToken || !slug) return\n // A stale-response flag rather than an AbortController: the app's global fetch layer can share one\n // in-flight request between StrictMode's double-run effects, so aborting the first fails the second.\n let stale = false\n setLoading(true)\n setLoadError(null)\n const start =\n offset > 0 && ownerZone ? addDays(todayInZone(ownerZone), offset * PAGE_DAYS) : undefined\n getPublicBookingPage(apiBaseUrl, slug, { duration, start, days: PAGE_DAYS })\n .then((p) => {\n if (stale) return\n setPage(p)\n setLoading(false)\n })\n .catch((err) => {\n if (stale) return\n setLoadError(err)\n setLoading(false)\n })\n return () => {\n stale = true\n }\n // ownerZone is only needed to compute later pages; it does not trigger a refetch on its own.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [apiBaseUrl, slug, duration, offset, reload, cancelToken])\n\n const chosenDuration = duration ?? page?.durations[0] ?? 30\n const days = useMemo(() => groupSlotsByDay(page?.slots ?? [], zone), [page?.slots, zone])\n\n const submit = useCallback(async () => {\n if (!picked) return\n setSubmitting(true)\n setSubmitError(null)\n try {\n setConfirmation(\n await bookPublicSlot(apiBaseUrl, slug, {\n start: picked,\n duration: chosenDuration,\n name,\n email,\n note,\n })\n )\n } catch (err) {\n setSubmitError(publicBookingMessage(err))\n if (err instanceof PublicBookingError && err.status === 409) {\n setPicked(null)\n setReload((n) => n + 1)\n }\n } finally {\n setSubmitting(false)\n }\n }, [apiBaseUrl, picked, slug, chosenDuration, name, email, note])\n\n if (cancelToken) return <CancelView slug={slug} token={cancelToken} />\n if (confirmation) return <Confirmation slug={slug} confirmation={confirmation} zone={zone} />\n\n if (!page) {\n return (\n <Shell>\n {loading ? (\n <div\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n data-testid=\"book-loading\"\n >\n <Loader2 className=\"size-4 animate-spin\" /> Loading…\n </div>\n ) : (\n <div className=\"grid gap-3\" data-testid=\"book-error\">\n <h1 className=\"text-lg font-semibold\">\n {loadError instanceof PublicBookingError && loadError.status === 404\n ? 'Page not found'\n : 'Could not load this page'}\n </h1>\n <p role=\"alert\" className=\"text-sm text-muted-foreground\">\n {publicBookingMessage(loadError)}\n </p>\n {!(loadError instanceof PublicBookingError && loadError.status === 404) && (\n <Button variant=\"outline\" onClick={() => setReload((n) => n + 1)}>\n Try again\n </Button>\n )}\n </div>\n )}\n </Shell>\n )\n }\n\n const pickedLabel = picked\n ? formatSlotRange(\n picked,\n new Date(new Date(picked).getTime() + chosenDuration * 60_000).toISOString(),\n zone\n )\n : ''\n\n return (\n <Shell wide>\n <header className=\"mb-5 grid gap-1\">\n {page.owner_name && (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"book-owner\">\n {page.owner_name}\n </p>\n )}\n <h1 className=\"text-xl font-semibold\" data-testid=\"book-title\">\n {page.title}\n </h1>\n {page.description && (\n <p className=\"whitespace-pre-line text-sm text-muted-foreground\">{page.description}</p>\n )}\n <div className=\"mt-1 flex flex-wrap gap-x-4 gap-y-1 text-sm text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"size-4\" /> {chosenDuration} min\n </span>\n {page.location && (\n <span className=\"inline-flex items-center gap-1\">\n <MapPin className=\"size-4\" /> {page.location}\n </span>\n )}\n </div>\n </header>\n\n {picked ? (\n <form\n className=\"grid gap-3\"\n onSubmit={(e) => {\n e.preventDefault()\n void submit()\n }}\n data-testid=\"book-form\"\n >\n <div className=\"rounded-md bg-muted/50 px-3 py-2 text-sm\" data-testid=\"book-picked\">\n {pickedLabel}\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"book-name\">Your name</Label>\n <Input\n id=\"book-name\"\n required\n autoComplete=\"name\"\n maxLength={200}\n value={name}\n onChange={(e) => setName(e.target.value)}\n data-testid=\"book-name\"\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"book-email\">E-mail</Label>\n <Input\n id=\"book-email\"\n required\n type=\"email\"\n autoComplete=\"email\"\n maxLength={320}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n data-testid=\"book-email\"\n />\n </div>\n <div className=\"grid gap-1\">\n <Label htmlFor=\"book-note\">Anything to share? (optional)</Label>\n <Textarea\n id=\"book-note\"\n rows={3}\n maxLength={2000}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n </div>\n {submitError && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-submit-error\">\n {submitError}\n </p>\n )}\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={() => setPicked(null)}>\n Back\n </Button>\n <Button type=\"submit\" disabled={submitting} data-testid=\"book-submit\">\n {submitting && <Loader2 className=\"mr-1 size-4 animate-spin\" />}\n Confirm booking\n </Button>\n </div>\n </form>\n ) : (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-end gap-3\">\n {page.durations.length > 1 && (\n <div className=\"grid gap-1\" role=\"group\" aria-label=\"Duration\">\n <span className=\"text-xs font-medium text-muted-foreground\">Duration</span>\n <div className=\"flex flex-wrap gap-1\">\n {page.durations.map((d) => (\n <Button\n key={d}\n size=\"sm\"\n variant={d === chosenDuration ? 'default' : 'outline'}\n aria-pressed={d === chosenDuration}\n onClick={() => {\n setDuration(d)\n setOffset(0)\n }}\n data-testid={`book-duration-${d}`}\n >\n {d} min\n </Button>\n ))}\n </div>\n </div>\n )}\n <label className=\"grid gap-1\">\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <Globe className=\"size-3.5\" /> Your time zone\n </span>\n <select\n className={cn(selectClass, 'max-w-full')}\n value={zone}\n onChange={(e) => setZone(e.target.value)}\n aria-label=\"Your time zone\"\n data-testid=\"book-zone\"\n >\n {zoneOptions(zone).map((z) => (\n <option key={z} value={z}>\n {z.replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {submitError && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-submit-error\">\n {submitError}\n </p>\n )}\n\n {loading ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> Finding free times…\n </div>\n ) : loadError ? (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"book-error\">\n {publicBookingMessage(loadError)}\n </p>\n ) : days.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"book-no-slots\">\n No free times in these two weeks.\n </p>\n ) : (\n <div className=\"grid gap-4\" data-testid=\"book-days\">\n {days.map((day) => (\n <section key={day.date} className=\"grid gap-2\" data-testid={`book-day-${day.date}`}>\n <h2 className=\"text-sm font-medium\">{day.label}</h2>\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4 md:grid-cols-5\">\n {day.slots.map((s) => (\n <Button\n key={s.start}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setSubmitError(null)\n setPicked(s.start)\n }}\n data-testid={`book-slot-${s.start}`}\n >\n {s.label}\n </Button>\n ))}\n </div>\n </section>\n ))}\n </div>\n )}\n\n <div className=\"flex justify-between gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={offset === 0 || loading}\n onClick={() => setOffset((o) => Math.max(0, o - 1))}\n >\n Earlier\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={loading}\n onClick={() => setOffset((o) => o + 1)}\n data-testid=\"book-later\"\n >\n Later dates\n </Button>\n </div>\n </div>\n )}\n </Shell>\n )\n}\n","import {\n useAgentSession,\n useStartAgentSession,\n useCloseAgentSession,\n useArbiChat,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { ChatPage } from '../chat/ChatPage'\nimport { takeOpenDocumentForTurn } from '../chat/open-document'\n\nexport interface ConnectedAgentChatPanelProps {\n agentId: string\n workspaceId: string\n agentName?: string\n}\n\nfunction ActiveChat({ agentId, workspaceId }: ConnectedAgentChatPanelProps) {\n // The agent drafts in the open document too, when it is in the agent's workspace.\n const chat = useArbiChat({\n agentId,\n workspaceId,\n activeArtifact: () => takeOpenDocumentForTurn({ workspaceId }),\n })\n return (\n <ChatPage\n chat={{ ...chat, assistantMode: undefined, setAssistantMode: undefined }}\n documentsRequired={false}\n compactHeader\n surface=\"dock\"\n emptyTitle=\"What would you like me to do?\"\n emptyDescription=\"This agent works through its own login. Upload files here to stage them in its sandbox.\"\n className=\"h-[min(65vh,650px)] min-h-[380px]\"\n />\n )\n}\n\n/** An owned agent's independent login and chat, using the shared controller and chat surface. */\nexport function ConnectedAgentChatPanel({\n agentId,\n workspaceId,\n agentName = 'Agent',\n}: ConnectedAgentChatPanelProps) {\n const session = useAgentSession(agentId)\n const start = useStartAgentSession()\n const close = useCloseAgentSession()\n const ready = session.data?.active && session.data.workspace_ext_id === workspaceId\n const busy = start.isPending || close.isPending\n const error = start.error ?? close.error ?? session.error\n return (\n <section className=\"space-y-3\" data-testid=\"agent-chat-panel\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <p className=\"text-sm\" data-testid=\"agent-chat-session-status\">\n {agentName} ·{' '}\n {ready\n ? 'Signed in to this workspace'\n : session.data?.active\n ? `Signed in to ${session.data.workspace_name ?? 'another workspace'}`\n : 'Signed out'}\n </p>\n <div className=\"flex gap-2\">\n {!ready && (\n <Button\n type=\"button\"\n disabled={busy || session.isLoading}\n onClick={() => start.mutate({ agentId, workspaceId })}\n data-testid=\"agent-chat-login\"\n >\n {start.isPending ? 'Signing in…' : 'Sign in here'}\n </Button>\n )}\n {session.data?.active && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={busy}\n onClick={() => close.mutate(agentId)}\n data-testid=\"agent-chat-logout\"\n >\n {close.isPending ? 'Signing out…' : 'Sign out agent'}\n </Button>\n )}\n </div>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {error.message}\n </p>\n )}\n {ready && (\n <ActiveChat key={`${agentId}:${workspaceId}`} agentId={agentId} workspaceId={workspaceId} />\n )}\n </section>\n )\n}\n"]}