@rapidmx/web-client 0.21.0 → 0.22.0

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 (885) hide show
  1. package/README.md +48 -14
  2. package/apps/admin/_layout.tsx +2 -2
  3. package/apps/admin/audit-log/index.tsx +4 -4
  4. package/apps/admin/branding/index.tsx +3 -3
  5. package/apps/admin/data-requests/index.tsx +8 -8
  6. package/apps/admin/distribution-lists/[uid].tsx +3 -3
  7. package/apps/admin/distribution-lists/index.tsx +4 -4
  8. package/apps/admin/distribution-lists/new/index.tsx +5 -5
  9. package/apps/admin/domains/[uid].tsx +6 -6
  10. package/apps/admin/domains/index.tsx +4 -4
  11. package/apps/admin/domains/new/index.tsx +5 -5
  12. package/apps/admin/encryption-policy/index.tsx +1 -1
  13. package/apps/admin/escrow-scopes/[uid].tsx +7 -7
  14. package/apps/admin/escrow-scopes/index.tsx +4 -4
  15. package/apps/admin/escrow-scopes/new/index.tsx +5 -5
  16. package/apps/admin/index.tsx +6 -6
  17. package/apps/admin/ingest-queue/index.tsx +4 -4
  18. package/apps/admin/mailbox-policy/index.tsx +1 -1
  19. package/apps/admin/mailboxes/[uid].tsx +5 -5
  20. package/apps/admin/quarantine/index.tsx +5 -5
  21. package/apps/admin/retention-policy/index.tsx +3 -3
  22. package/apps/admin/signing-certificates/index.tsx +5 -5
  23. package/apps/admin/transport-rules/[uid].tsx +5 -5
  24. package/apps/admin/transport-rules/_transportRuleConfig.tsx +3 -3
  25. package/apps/admin/transport-rules/index.tsx +4 -4
  26. package/apps/admin/transport-rules/new/index.tsx +5 -5
  27. package/apps/escrow/_layout.tsx +1 -1
  28. package/apps/escrow/audit-log/index.tsx +4 -4
  29. package/apps/escrow/index.tsx +4 -4
  30. package/apps/escrow/matters/[uid].tsx +10 -10
  31. package/apps/escrow/matters/new/index.tsx +6 -6
  32. package/apps/shared/appearance/AppearanceForm.tsx +3 -3
  33. package/apps/shared/appearance/AppearanceHead.tsx +1 -1
  34. package/apps/shared/appearance/AppearanceProvider.tsx +3 -3
  35. package/apps/shared/appearance/appearanceCache.ts +1 -1
  36. package/apps/shared/appearance/appearanceContext.ts +1 -1
  37. package/apps/shared/appearance/theme.ts +1 -1
  38. package/apps/shared/auth/adminAccess.ts +1 -1
  39. package/apps/shared/calendar/bookingPlugin.ts +1 -1
  40. package/apps/shared/calendar/calendarLiveUpdates.ts +1 -1
  41. package/apps/shared/calendar/calendarReminders.ts +1 -1
  42. package/apps/shared/calendar/useCalendarReminders.ts +1 -1
  43. package/apps/shared/components/admin/diagnostics/DiagnosticsManager.tsx +1 -1
  44. package/apps/shared/components/admin/diagnostics/InstalledPlugins.tsx +2 -2
  45. package/apps/shared/components/admin/diagnostics/LogsPanel.tsx +2 -2
  46. package/apps/shared/components/admin/diagnostics/PackagesTable.tsx +1 -1
  47. package/apps/shared/components/admin/diagnostics/RuntimePanel.tsx +1 -1
  48. package/apps/shared/components/admin/diagnostics/SystemPanel.tsx +2 -2
  49. package/apps/shared/components/admin/diagnostics/VersionsPanel.tsx +1 -1
  50. package/apps/shared/components/admin/diagnostics/diagnosticsApi.ts +1 -1
  51. package/apps/shared/components/admin/diagnostics/format.ts +1 -1
  52. package/apps/shared/components/admin/diagnostics/logClient.ts +1 -1
  53. package/apps/shared/components/admin/distributionLists/MemberListCard.tsx +4 -4
  54. package/apps/shared/components/admin/elevation.ts +1 -1
  55. package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +3 -3
  56. package/apps/shared/components/admin/layout/AdminShell.tsx +8 -8
  57. package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +6 -6
  58. package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +10 -8
  59. package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +4 -4
  60. package/apps/shared/components/admin/mailboxes/MailboxTable.tsx +1 -1
  61. package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +19 -14
  62. package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +5 -5
  63. package/apps/shared/components/admin/settings/BrandingForm.tsx +5 -5
  64. package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +5 -5
  65. package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +4 -4
  66. package/apps/shared/components/admin/settings/LoadedSettingsForm.tsx +2 -2
  67. package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +32 -27
  68. package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +4 -4
  69. package/apps/shared/components/admin/settings/PluginsManager.tsx +5 -5
  70. package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +5 -5
  71. package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +7 -7
  72. package/apps/shared/components/admin/setup/SetupWizard.tsx +27 -23
  73. package/apps/shared/components/admin/signOut.ts +1 -1
  74. package/apps/shared/components/admin/usePagedList.tsx +2 -2
  75. package/apps/shared/components/calendar/AppointmentQuickForm.tsx +3 -3
  76. package/apps/shared/components/calendar/CalendarListSidebar.tsx +3 -3
  77. package/apps/shared/components/calendar/DescriptionEditor.tsx +1 -1
  78. package/apps/shared/components/calendar/EventDescriptionView.tsx +1 -1
  79. package/apps/shared/components/calendar/EventDetails.tsx +16 -14
  80. package/apps/shared/components/calendar/EventEditor.tsx +54 -39
  81. package/apps/shared/components/calendar/EventExpandedForm.tsx +3 -3
  82. package/apps/shared/components/calendar/EventFormParts.tsx +2 -2
  83. package/apps/shared/components/calendar/EventModal.tsx +5 -5
  84. package/apps/shared/components/calendar/EventQuickForm.tsx +3 -3
  85. package/apps/shared/components/calendar/EventShell.tsx +1 -1
  86. package/apps/shared/components/calendar/FindATime.tsx +6 -4
  87. package/apps/shared/components/calendar/GuestInput.tsx +2 -2
  88. package/apps/shared/components/calendar/MonthView.tsx +2 -2
  89. package/apps/shared/components/calendar/QuickCreateFaces.tsx +1 -1
  90. package/apps/shared/components/calendar/QuickFaceFrame.tsx +1 -1
  91. package/apps/shared/components/calendar/RecurrenceEditor.tsx +2 -2
  92. package/apps/shared/components/calendar/RequestChangeForm.tsx +8 -6
  93. package/apps/shared/components/calendar/ResourcePicker.tsx +7 -5
  94. package/apps/shared/components/calendar/SplitDayView.tsx +1 -1
  95. package/apps/shared/components/calendar/TaskQuickForm.tsx +23 -18
  96. package/apps/shared/components/calendar/TimeGridView.tsx +2 -2
  97. package/apps/shared/components/calendar/allDay.ts +2 -2
  98. package/apps/shared/components/calendar/eventDialogFields.ts +3 -3
  99. package/apps/shared/components/calendar/eventForm.ts +3 -3
  100. package/apps/shared/components/calendar/eventFormat.ts +3 -3
  101. package/apps/shared/components/calendar/findTimeGrid.ts +2 -2
  102. package/apps/shared/components/calendar/layout/CalendarShell.tsx +11 -9
  103. package/apps/shared/components/contacts/ContactDetailPane.tsx +4 -4
  104. package/apps/shared/components/contacts/ContactForm.tsx +27 -17
  105. package/apps/shared/components/contacts/ContactsSidebar.tsx +7 -5
  106. package/apps/shared/components/contacts/KeyChangeReview.tsx +5 -5
  107. package/apps/shared/components/contacts/contactKeys.ts +3 -3
  108. package/apps/shared/components/contacts/layout/ContactsShell.tsx +9 -7
  109. package/apps/shared/components/escrow/layout/EscrowShell.tsx +6 -6
  110. package/apps/shared/components/forms/StringListField.tsx +1 -1
  111. package/apps/shared/components/layout/AppShell.tsx +12 -10
  112. package/apps/shared/components/layout/BrandingChrome.tsx +1 -1
  113. package/apps/shared/components/layout/KeyEnrollmentGate.tsx +9 -9
  114. package/apps/shared/components/layout/MailboxProvisioning.tsx +8 -6
  115. package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +9 -9
  116. package/apps/shared/components/layout/ThemeSwitch.tsx +1 -1
  117. package/apps/shared/components/layout/UnlockPromptProvider.tsx +6 -6
  118. package/apps/shared/components/layout/UserMenu.tsx +6 -4
  119. package/apps/shared/components/mail/ConversationList.tsx +7 -5
  120. package/apps/shared/components/mail/ConversationThreadPane.tsx +26 -15
  121. package/apps/shared/components/mail/InviteCard.tsx +11 -9
  122. package/apps/shared/components/mail/LazyReadingPane.tsx +2 -2
  123. package/apps/shared/components/mail/MailAddress.tsx +1 -1
  124. package/apps/shared/components/mail/MailListToolbar.tsx +2 -2
  125. package/apps/shared/components/mail/MailSelectionBar.tsx +2 -2
  126. package/apps/shared/components/mail/MenuButton.tsx +1 -1
  127. package/apps/shared/components/mail/MessageDetailPane.tsx +32 -30
  128. package/apps/shared/components/mail/MoveToFolderDialog.tsx +8 -6
  129. package/apps/shared/components/mail/OutboxRowStatus.tsx +1 -1
  130. package/apps/shared/components/mail/PermanentDeleteDialog.tsx +2 -2
  131. package/apps/shared/components/mail/compose/ComposeContext.tsx +14 -3
  132. package/apps/shared/components/mail/compose/ComposeWindow.tsx +34 -30
  133. package/apps/shared/components/mail/compose/ComposeWindowPlaceholder.tsx +4 -4
  134. package/apps/shared/components/mail/compose/EmojiPicker.tsx +2 -2
  135. package/apps/shared/components/mail/compose/GifPicker.tsx +3 -3
  136. package/apps/shared/components/mail/compose/RecipientInput.tsx +1 -1
  137. package/apps/shared/components/mail/compose/ScheduleSendPicker.tsx +1 -1
  138. package/apps/shared/components/mail/compose/encryptionRequirement.ts +2 -2
  139. package/apps/shared/components/mail/compose/quotedBody.ts +5 -5
  140. package/apps/shared/components/mail/compose/recipients.ts +1 -1
  141. package/apps/shared/components/mail/invite/InviteRowChip.tsx +2 -2
  142. package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +9 -7
  143. package/apps/shared/components/mail/invite/InviteTimeline.tsx +1 -1
  144. package/apps/shared/components/mail/invite/ProposeTimeForm.tsx +2 -2
  145. package/apps/shared/components/mail/invite/inviteFormat.ts +2 -2
  146. package/apps/shared/components/mail/invite/inviteStore.ts +14 -6
  147. package/apps/shared/components/mail/labelMenu.tsx +9 -7
  148. package/apps/shared/components/mail/layout/MailShell.tsx +4 -4
  149. package/apps/shared/components/mail/listPreferences.ts +2 -2
  150. package/apps/shared/components/mail/pinnedSigners.ts +45 -19
  151. package/apps/shared/components/mail/reading/EncryptedBody.tsx +2 -2
  152. package/apps/shared/components/mail/reading/MessageBody.tsx +6 -6
  153. package/apps/shared/components/mail/reading/MessageCard.tsx +3 -3
  154. package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +3 -3
  155. package/apps/shared/components/mail/reading/PendingMessageCard.tsx +1 -1
  156. package/apps/shared/components/mail/reading/bodyContent.ts +3 -3
  157. package/apps/shared/components/mail/reading/bodyHtml.ts +1 -1
  158. package/apps/shared/components/mail/reading/messageExport.ts +1 -1
  159. package/apps/shared/components/mail/reading/printMessage.ts +2 -2
  160. package/apps/shared/components/mail/reading/useMessageActions.ts +28 -21
  161. package/apps/shared/components/mail/unreadStyle.tsx +1 -1
  162. package/apps/shared/components/mail/verificationSeals.ts +16 -12
  163. package/apps/shared/components/mail/writableMailboxes.ts +14 -7
  164. package/apps/shared/components/rules/RuleBuilder.tsx +1 -1
  165. package/apps/shared/components/settings/SigningCertificateCard.tsx +4 -4
  166. package/apps/shared/components/settings/layout/SettingsShell.tsx +8 -6
  167. package/apps/shared/components/sharing/PrincipalListField.tsx +1 -1
  168. package/apps/shared/components/sharing/PrincipalPicker.tsx +1 -1
  169. package/apps/shared/components/sharing/PrincipalResolver.tsx +4 -4
  170. package/apps/shared/components/tasks/TasksSidebar.tsx +7 -5
  171. package/apps/shared/components/tasks/layout/TasksShell.tsx +9 -7
  172. package/apps/shared/keyboard/ShortcutsDialog.tsx +1 -1
  173. package/apps/shared/mail/findWellKnownFolderUid.ts +6 -4
  174. package/apps/shared/mail/folderCounts.ts +8 -4
  175. package/apps/shared/mail/folderOfType.ts +5 -3
  176. package/apps/shared/mail/folderTree.ts +1 -1
  177. package/apps/shared/mail/listSnapshots.ts +2 -2
  178. package/apps/shared/mail/messageReadState.ts +6 -5
  179. package/apps/shared/mail/newMailNotifications.ts +2 -2
  180. package/apps/shared/mail/outbox/composeBridge.ts +2 -2
  181. package/apps/shared/mail/outbox/outboxState.ts +1 -1
  182. package/apps/shared/mail/outbox/outgoingReplies.ts +2 -2
  183. package/apps/shared/mail/outbox/sendDecision.ts +2 -2
  184. package/apps/shared/mail/outbox/sendJob.ts +40 -35
  185. package/apps/shared/mail/outbox/sendOutcomes.ts +20 -15
  186. package/apps/shared/mail/outbox/useOutboxStatus.ts +5 -3
  187. package/apps/shared/mail/permanentDelete.ts +8 -7
  188. package/apps/shared/mail/primaryMailbox.ts +1 -1
  189. package/apps/shared/mail/reportNotices.ts +1 -1
  190. package/apps/shared/mail/senderBlocking.ts +36 -20
  191. package/apps/shared/mail/useMailConnection.ts +12 -10
  192. package/apps/shared/mail/useMailLiveUpdates.ts +3 -3
  193. package/apps/shared/mail/useMailboxUpdateAccess.ts +35 -11
  194. package/apps/shared/mail/useMarkMessageRead.ts +14 -7
  195. package/apps/shared/mail/useNewMailNotifications.ts +1 -1
  196. package/apps/shared/mail/usePermanentDelete.tsx +5 -3
  197. package/apps/shared/navigation/pageTitle.ts +1 -1
  198. package/apps/shared/notifications/NotificationCenter.tsx +1 -1
  199. package/apps/shared/notifications/NotificationHistoryDialog.tsx +2 -2
  200. package/apps/shared/notifications/apiErrors.ts +2 -2
  201. package/apps/shared/notifications/pushStatus.ts +1 -1
  202. package/apps/shared/notifications/systemErrors.ts +1 -1
  203. package/apps/shared/search/LocalIndexLifecycle.tsx +18 -12
  204. package/apps/shared/search/crossMailboxSearch.ts +3 -3
  205. package/apps/shared/search/localIndexBuilder.ts +24 -12
  206. package/apps/shared/search/localIndexKey.ts +1 -1
  207. package/apps/shared/search/localIndexRpcClient.ts +150 -30
  208. package/apps/shared/search/localIndexTransport.ts +84 -0
  209. package/apps/shared/search/localIndexWorker.ts +1 -1
  210. package/apps/shared/search/searchTier2.ts +3 -3
  211. package/apps/shared/signing/enrollmentTracker.ts +3 -3
  212. package/apps/shared/signing/enrollmentView.ts +1 -1
  213. package/apps/shared/signing/signingInfo.ts +1 -1
  214. package/apps/shared/signing/useSigningEnrollmentWatcher.ts +6 -4
  215. package/apps/shared/styles/app.css +14 -23
  216. package/apps/www/_layout.tsx +2 -2
  217. package/apps/www/calendar/index.tsx +20 -18
  218. package/apps/www/contacts/[uid].tsx +8 -6
  219. package/apps/www/contacts/index.tsx +19 -17
  220. package/apps/www/index.tsx +57 -48
  221. package/apps/www/messages/[uid].tsx +11 -9
  222. package/apps/www/settings/auto-reply/index.tsx +6 -4
  223. package/apps/www/settings/blocked-senders/index.tsx +9 -7
  224. package/apps/www/settings/encryption/index.tsx +38 -32
  225. package/apps/www/settings/filters/[uid].tsx +19 -14
  226. package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +2 -2
  227. package/apps/www/settings/filters/index.tsx +4 -4
  228. package/apps/www/settings/filters/new/index.tsx +10 -8
  229. package/apps/www/settings/labels/index.tsx +12 -10
  230. package/apps/www/settings/privacy/index.tsx +18 -14
  231. package/apps/www/settings/profile/index.tsx +16 -11
  232. package/apps/www/settings/read-receipts/index.tsx +17 -12
  233. package/apps/www/settings/sharing/index.tsx +6 -6
  234. package/apps/www/settings/signatures/[uid].tsx +5 -5
  235. package/apps/www/settings/signatures/index.tsx +4 -4
  236. package/apps/www/settings/signatures/new/index.tsx +4 -4
  237. package/apps/www/settings/signatures/signatureDefaults.ts +1 -1
  238. package/apps/www/tasks/index.tsx +28 -23
  239. package/dist/apps/admin/_layout.d.ts +1 -1
  240. package/dist/apps/admin/_layout.js +1 -1
  241. package/dist/apps/admin/audit-log/index.d.ts +1 -1
  242. package/dist/apps/admin/audit-log/index.js +4 -4
  243. package/dist/apps/admin/branding/index.js +3 -3
  244. package/dist/apps/admin/data-requests/index.js +8 -8
  245. package/dist/apps/admin/distribution-lists/[uid].js +3 -3
  246. package/dist/apps/admin/distribution-lists/index.js +4 -4
  247. package/dist/apps/admin/distribution-lists/new/index.js +5 -5
  248. package/dist/apps/admin/domains/[uid].js +6 -6
  249. package/dist/apps/admin/domains/index.js +4 -4
  250. package/dist/apps/admin/domains/new/index.js +5 -5
  251. package/dist/apps/admin/encryption-policy/index.js +1 -1
  252. package/dist/apps/admin/escrow-scopes/[uid].d.ts +1 -1
  253. package/dist/apps/admin/escrow-scopes/[uid].js +7 -7
  254. package/dist/apps/admin/escrow-scopes/index.js +4 -4
  255. package/dist/apps/admin/escrow-scopes/new/index.js +5 -5
  256. package/dist/apps/admin/index.js +6 -6
  257. package/dist/apps/admin/ingest-queue/index.js +4 -4
  258. package/dist/apps/admin/mailbox-policy/index.js +1 -1
  259. package/dist/apps/admin/mailboxes/[uid].js +5 -5
  260. package/dist/apps/admin/quarantine/index.js +5 -5
  261. package/dist/apps/admin/retention-policy/index.js +3 -3
  262. package/dist/apps/admin/signing-certificates/index.js +5 -5
  263. package/dist/apps/admin/transport-rules/[uid].js +5 -5
  264. package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +1 -1
  265. package/dist/apps/admin/transport-rules/_transportRuleConfig.js +2 -2
  266. package/dist/apps/admin/transport-rules/index.js +4 -4
  267. package/dist/apps/admin/transport-rules/new/index.js +5 -5
  268. package/dist/apps/escrow/_layout.d.ts +1 -1
  269. package/dist/apps/escrow/audit-log/index.d.ts +1 -1
  270. package/dist/apps/escrow/audit-log/index.js +4 -4
  271. package/dist/apps/escrow/index.js +4 -4
  272. package/dist/apps/escrow/matters/[uid].js +10 -10
  273. package/dist/apps/escrow/matters/new/index.js +6 -6
  274. package/dist/apps/shared/appearance/AppearanceForm.js +3 -3
  275. package/dist/apps/shared/appearance/AppearanceHead.js +1 -1
  276. package/dist/apps/shared/appearance/AppearanceProvider.d.ts +1 -1
  277. package/dist/apps/shared/appearance/AppearanceProvider.js +3 -3
  278. package/dist/apps/shared/appearance/appearanceCache.d.ts +1 -1
  279. package/dist/apps/shared/appearance/appearanceCache.js +1 -1
  280. package/dist/apps/shared/appearance/appearanceContext.d.ts +1 -1
  281. package/dist/apps/shared/appearance/theme.d.ts +1 -1
  282. package/dist/apps/shared/auth/adminAccess.js +1 -1
  283. package/dist/apps/shared/calendar/bookingPlugin.js +1 -1
  284. package/dist/apps/shared/calendar/calendarLiveUpdates.d.ts +1 -1
  285. package/dist/apps/shared/calendar/calendarReminders.d.ts +1 -1
  286. package/dist/apps/shared/calendar/useCalendarReminders.js +1 -1
  287. package/dist/apps/shared/components/admin/diagnostics/DiagnosticsManager.js +1 -1
  288. package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.d.ts +1 -1
  289. package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.js +2 -2
  290. package/dist/apps/shared/components/admin/diagnostics/LogsPanel.js +2 -2
  291. package/dist/apps/shared/components/admin/diagnostics/PackagesTable.js +1 -1
  292. package/dist/apps/shared/components/admin/diagnostics/RuntimePanel.js +1 -1
  293. package/dist/apps/shared/components/admin/diagnostics/SystemPanel.js +2 -2
  294. package/dist/apps/shared/components/admin/diagnostics/VersionsPanel.js +1 -1
  295. package/dist/apps/shared/components/admin/diagnostics/diagnosticsApi.js +1 -1
  296. package/dist/apps/shared/components/admin/diagnostics/format.js +1 -1
  297. package/dist/apps/shared/components/admin/diagnostics/logClient.js +1 -1
  298. package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +1 -1
  299. package/dist/apps/shared/components/admin/distributionLists/MemberListCard.js +4 -4
  300. package/dist/apps/shared/components/admin/elevation.js +1 -1
  301. package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +3 -3
  302. package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +1 -1
  303. package/dist/apps/shared/components/admin/layout/AdminShell.js +7 -7
  304. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +1 -1
  305. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +6 -6
  306. package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +1 -1
  307. package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +10 -8
  308. package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +4 -4
  309. package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +1 -1
  310. package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +1 -1
  311. package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +7 -5
  312. package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +5 -5
  313. package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +1 -1
  314. package/dist/apps/shared/components/admin/settings/BrandingForm.js +5 -5
  315. package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +1 -1
  316. package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +5 -5
  317. package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +1 -1
  318. package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +4 -4
  319. package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.js +2 -2
  320. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +1 -1
  321. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +14 -12
  322. package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +1 -1
  323. package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +4 -4
  324. package/dist/apps/shared/components/admin/settings/PluginsManager.js +5 -5
  325. package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +1 -1
  326. package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +5 -5
  327. package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +7 -7
  328. package/dist/apps/shared/components/admin/setup/SetupWizard.js +26 -22
  329. package/dist/apps/shared/components/admin/signOut.js +1 -1
  330. package/dist/apps/shared/components/admin/usePagedList.js +2 -2
  331. package/dist/apps/shared/components/calendar/AppointmentQuickForm.js +3 -3
  332. package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +1 -1
  333. package/dist/apps/shared/components/calendar/CalendarListSidebar.js +2 -2
  334. package/dist/apps/shared/components/calendar/DescriptionEditor.js +1 -1
  335. package/dist/apps/shared/components/calendar/EventDescriptionView.js +1 -1
  336. package/dist/apps/shared/components/calendar/EventDetails.d.ts +2 -2
  337. package/dist/apps/shared/components/calendar/EventDetails.js +16 -14
  338. package/dist/apps/shared/components/calendar/EventEditor.d.ts +2 -2
  339. package/dist/apps/shared/components/calendar/EventEditor.js +22 -20
  340. package/dist/apps/shared/components/calendar/EventExpandedForm.js +2 -2
  341. package/dist/apps/shared/components/calendar/EventFormParts.d.ts +1 -1
  342. package/dist/apps/shared/components/calendar/EventFormParts.js +1 -1
  343. package/dist/apps/shared/components/calendar/EventModal.d.ts +2 -2
  344. package/dist/apps/shared/components/calendar/EventModal.js +3 -3
  345. package/dist/apps/shared/components/calendar/EventQuickForm.js +3 -3
  346. package/dist/apps/shared/components/calendar/EventShell.js +1 -1
  347. package/dist/apps/shared/components/calendar/FindATime.js +6 -4
  348. package/dist/apps/shared/components/calendar/GuestInput.d.ts +2 -2
  349. package/dist/apps/shared/components/calendar/MonthView.d.ts +1 -1
  350. package/dist/apps/shared/components/calendar/MonthView.js +1 -1
  351. package/dist/apps/shared/components/calendar/QuickCreateFaces.js +1 -1
  352. package/dist/apps/shared/components/calendar/QuickFaceFrame.js +1 -1
  353. package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +1 -1
  354. package/dist/apps/shared/components/calendar/RecurrenceEditor.js +1 -1
  355. package/dist/apps/shared/components/calendar/RequestChangeForm.js +8 -6
  356. package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +1 -1
  357. package/dist/apps/shared/components/calendar/ResourcePicker.js +7 -5
  358. package/dist/apps/shared/components/calendar/SplitDayView.d.ts +1 -1
  359. package/dist/apps/shared/components/calendar/TaskQuickForm.d.ts +1 -1
  360. package/dist/apps/shared/components/calendar/TaskQuickForm.js +9 -7
  361. package/dist/apps/shared/components/calendar/TimeGridView.d.ts +1 -1
  362. package/dist/apps/shared/components/calendar/TimeGridView.js +1 -1
  363. package/dist/apps/shared/components/calendar/allDay.d.ts +2 -2
  364. package/dist/apps/shared/components/calendar/allDay.js +1 -1
  365. package/dist/apps/shared/components/calendar/eventDialogFields.d.ts +2 -2
  366. package/dist/apps/shared/components/calendar/eventDialogFields.js +2 -2
  367. package/dist/apps/shared/components/calendar/eventForm.d.ts +3 -3
  368. package/dist/apps/shared/components/calendar/eventFormat.d.ts +1 -1
  369. package/dist/apps/shared/components/calendar/eventFormat.js +2 -2
  370. package/dist/apps/shared/components/calendar/findTimeGrid.d.ts +1 -1
  371. package/dist/apps/shared/components/calendar/findTimeGrid.js +1 -1
  372. package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +1 -1
  373. package/dist/apps/shared/components/calendar/layout/CalendarShell.js +11 -9
  374. package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +1 -1
  375. package/dist/apps/shared/components/contacts/ContactDetailPane.js +2 -2
  376. package/dist/apps/shared/components/contacts/ContactForm.d.ts +2 -2
  377. package/dist/apps/shared/components/contacts/ContactForm.js +12 -8
  378. package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +1 -1
  379. package/dist/apps/shared/components/contacts/ContactsSidebar.js +7 -5
  380. package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +1 -1
  381. package/dist/apps/shared/components/contacts/KeyChangeReview.js +5 -5
  382. package/dist/apps/shared/components/contacts/contactKeys.d.ts +2 -2
  383. package/dist/apps/shared/components/contacts/contactKeys.js +2 -2
  384. package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +1 -1
  385. package/dist/apps/shared/components/contacts/layout/ContactsShell.js +9 -7
  386. package/dist/apps/shared/components/escrow/layout/EscrowShell.js +6 -6
  387. package/dist/apps/shared/components/forms/StringListField.js +1 -1
  388. package/dist/apps/shared/components/layout/AppShell.d.ts +2 -2
  389. package/dist/apps/shared/components/layout/AppShell.js +11 -9
  390. package/dist/apps/shared/components/layout/BrandingChrome.d.ts +1 -1
  391. package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +1 -1
  392. package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +9 -9
  393. package/dist/apps/shared/components/layout/MailboxProvisioning.js +8 -6
  394. package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +1 -1
  395. package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +9 -9
  396. package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +2 -2
  397. package/dist/apps/shared/components/layout/UnlockPromptProvider.js +5 -5
  398. package/dist/apps/shared/components/layout/UserMenu.js +6 -4
  399. package/dist/apps/shared/components/mail/ConversationList.d.ts +2 -2
  400. package/dist/apps/shared/components/mail/ConversationList.js +6 -4
  401. package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
  402. package/dist/apps/shared/components/mail/ConversationThreadPane.js +13 -11
  403. package/dist/apps/shared/components/mail/InviteCard.js +10 -8
  404. package/dist/apps/shared/components/mail/LazyReadingPane.js +2 -2
  405. package/dist/apps/shared/components/mail/MailAddress.d.ts +1 -1
  406. package/dist/apps/shared/components/mail/MailAddress.js +1 -1
  407. package/dist/apps/shared/components/mail/MailListToolbar.d.ts +2 -2
  408. package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +2 -2
  409. package/dist/apps/shared/components/mail/MenuButton.js +1 -1
  410. package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +3 -3
  411. package/dist/apps/shared/components/mail/MessageDetailPane.js +30 -28
  412. package/dist/apps/shared/components/mail/MoveToFolderDialog.d.ts +1 -1
  413. package/dist/apps/shared/components/mail/MoveToFolderDialog.js +8 -6
  414. package/dist/apps/shared/components/mail/OutboxRowStatus.d.ts +1 -1
  415. package/dist/apps/shared/components/mail/PermanentDeleteDialog.js +2 -2
  416. package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +10 -1
  417. package/dist/apps/shared/components/mail/compose/ComposeContext.js +4 -2
  418. package/dist/apps/shared/components/mail/compose/ComposeWindow.js +34 -30
  419. package/dist/apps/shared/components/mail/compose/ComposeWindowPlaceholder.js +4 -4
  420. package/dist/apps/shared/components/mail/compose/EmojiPicker.js +2 -2
  421. package/dist/apps/shared/components/mail/compose/GifPicker.js +3 -3
  422. package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +1 -1
  423. package/dist/apps/shared/components/mail/compose/RecipientInput.js +1 -1
  424. package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.js +1 -1
  425. package/dist/apps/shared/components/mail/compose/encryptionRequirement.d.ts +2 -2
  426. package/dist/apps/shared/components/mail/compose/encryptionRequirement.js +1 -1
  427. package/dist/apps/shared/components/mail/compose/quotedBody.d.ts +3 -3
  428. package/dist/apps/shared/components/mail/compose/quotedBody.js +3 -3
  429. package/dist/apps/shared/components/mail/compose/recipients.d.ts +1 -1
  430. package/dist/apps/shared/components/mail/invite/InviteRowChip.d.ts +1 -1
  431. package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +1 -1
  432. package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +9 -7
  433. package/dist/apps/shared/components/mail/invite/InviteTimeline.d.ts +1 -1
  434. package/dist/apps/shared/components/mail/invite/ProposeTimeForm.d.ts +1 -1
  435. package/dist/apps/shared/components/mail/invite/ProposeTimeForm.js +1 -1
  436. package/dist/apps/shared/components/mail/invite/inviteFormat.d.ts +2 -2
  437. package/dist/apps/shared/components/mail/invite/inviteStore.d.ts +9 -3
  438. package/dist/apps/shared/components/mail/invite/inviteStore.js +13 -6
  439. package/dist/apps/shared/components/mail/labelMenu.d.ts +1 -1
  440. package/dist/apps/shared/components/mail/labelMenu.js +9 -7
  441. package/dist/apps/shared/components/mail/layout/MailShell.d.ts +1 -1
  442. package/dist/apps/shared/components/mail/layout/MailShell.js +3 -3
  443. package/dist/apps/shared/components/mail/listPreferences.d.ts +2 -2
  444. package/dist/apps/shared/components/mail/listPreferences.js +1 -1
  445. package/dist/apps/shared/components/mail/pinnedSigners.d.ts +12 -5
  446. package/dist/apps/shared/components/mail/pinnedSigners.js +37 -18
  447. package/dist/apps/shared/components/mail/reading/EncryptedBody.js +2 -2
  448. package/dist/apps/shared/components/mail/reading/MessageBody.d.ts +2 -2
  449. package/dist/apps/shared/components/mail/reading/MessageBody.js +4 -4
  450. package/dist/apps/shared/components/mail/reading/MessageCard.d.ts +1 -1
  451. package/dist/apps/shared/components/mail/reading/MessageCard.js +2 -2
  452. package/dist/apps/shared/components/mail/reading/MessageSourceDialog.js +3 -3
  453. package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +1 -1
  454. package/dist/apps/shared/components/mail/reading/bodyContent.d.ts +2 -2
  455. package/dist/apps/shared/components/mail/reading/bodyContent.js +2 -2
  456. package/dist/apps/shared/components/mail/reading/bodyHtml.js +1 -1
  457. package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
  458. package/dist/apps/shared/components/mail/reading/printMessage.d.ts +2 -2
  459. package/dist/apps/shared/components/mail/reading/useMessageActions.d.ts +1 -1
  460. package/dist/apps/shared/components/mail/reading/useMessageActions.js +18 -16
  461. package/dist/apps/shared/components/mail/unreadStyle.d.ts +1 -1
  462. package/dist/apps/shared/components/mail/verificationSeals.d.ts +27 -6
  463. package/dist/apps/shared/components/mail/verificationSeals.js +15 -11
  464. package/dist/apps/shared/components/mail/writableMailboxes.d.ts +8 -3
  465. package/dist/apps/shared/components/mail/writableMailboxes.js +12 -6
  466. package/dist/apps/shared/components/rules/RuleBuilder.js +1 -1
  467. package/dist/apps/shared/components/settings/SigningCertificateCard.d.ts +1 -1
  468. package/dist/apps/shared/components/settings/SigningCertificateCard.js +3 -3
  469. package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +1 -1
  470. package/dist/apps/shared/components/settings/layout/SettingsShell.js +8 -6
  471. package/dist/apps/shared/components/sharing/PrincipalListField.d.ts +1 -1
  472. package/dist/apps/shared/components/sharing/PrincipalPicker.d.ts +1 -1
  473. package/dist/apps/shared/components/sharing/PrincipalPicker.js +1 -1
  474. package/dist/apps/shared/components/sharing/PrincipalResolver.d.ts +1 -1
  475. package/dist/apps/shared/components/sharing/PrincipalResolver.js +3 -3
  476. package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +1 -1
  477. package/dist/apps/shared/components/tasks/TasksSidebar.js +7 -5
  478. package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +1 -1
  479. package/dist/apps/shared/components/tasks/layout/TasksShell.js +9 -7
  480. package/dist/apps/shared/keyboard/ShortcutsDialog.js +1 -1
  481. package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -3
  482. package/dist/apps/shared/mail/findWellKnownFolderUid.js +5 -4
  483. package/dist/apps/shared/mail/folderCounts.d.ts +1 -1
  484. package/dist/apps/shared/mail/folderCounts.js +6 -4
  485. package/dist/apps/shared/mail/folderOfType.d.ts +3 -2
  486. package/dist/apps/shared/mail/folderOfType.js +4 -4
  487. package/dist/apps/shared/mail/folderTree.d.ts +1 -1
  488. package/dist/apps/shared/mail/listSnapshots.d.ts +2 -2
  489. package/dist/apps/shared/mail/messageReadState.d.ts +4 -3
  490. package/dist/apps/shared/mail/messageReadState.js +5 -5
  491. package/dist/apps/shared/mail/newMailNotifications.d.ts +1 -1
  492. package/dist/apps/shared/mail/newMailNotifications.js +1 -1
  493. package/dist/apps/shared/mail/outbox/composeBridge.d.ts +2 -2
  494. package/dist/apps/shared/mail/outbox/outboxState.d.ts +1 -1
  495. package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +2 -2
  496. package/dist/apps/shared/mail/outbox/sendDecision.d.ts +2 -2
  497. package/dist/apps/shared/mail/outbox/sendDecision.js +1 -1
  498. package/dist/apps/shared/mail/outbox/sendJob.d.ts +10 -6
  499. package/dist/apps/shared/mail/outbox/sendJob.js +39 -35
  500. package/dist/apps/shared/mail/outbox/sendOutcomes.d.ts +6 -3
  501. package/dist/apps/shared/mail/outbox/sendOutcomes.js +19 -15
  502. package/dist/apps/shared/mail/outbox/useOutboxStatus.js +5 -3
  503. package/dist/apps/shared/mail/permanentDelete.d.ts +4 -3
  504. package/dist/apps/shared/mail/permanentDelete.js +8 -8
  505. package/dist/apps/shared/mail/primaryMailbox.d.ts +1 -1
  506. package/dist/apps/shared/mail/primaryMailbox.js +1 -1
  507. package/dist/apps/shared/mail/reportNotices.d.ts +1 -1
  508. package/dist/apps/shared/mail/senderBlocking.d.ts +5 -4
  509. package/dist/apps/shared/mail/senderBlocking.js +19 -16
  510. package/dist/apps/shared/mail/useMailConnection.d.ts +1 -1
  511. package/dist/apps/shared/mail/useMailConnection.js +12 -10
  512. package/dist/apps/shared/mail/useMailLiveUpdates.d.ts +2 -2
  513. package/dist/apps/shared/mail/useMailLiveUpdates.js +2 -2
  514. package/dist/apps/shared/mail/useMailboxUpdateAccess.d.ts +3 -2
  515. package/dist/apps/shared/mail/useMailboxUpdateAccess.js +31 -10
  516. package/dist/apps/shared/mail/useMarkMessageRead.d.ts +1 -1
  517. package/dist/apps/shared/mail/useMarkMessageRead.js +5 -3
  518. package/dist/apps/shared/mail/useNewMailNotifications.d.ts +1 -1
  519. package/dist/apps/shared/mail/usePermanentDelete.d.ts +1 -1
  520. package/dist/apps/shared/mail/usePermanentDelete.js +4 -2
  521. package/dist/apps/shared/navigation/pageTitle.d.ts +1 -1
  522. package/dist/apps/shared/notifications/NotificationCenter.js +1 -1
  523. package/dist/apps/shared/notifications/NotificationHistoryDialog.js +2 -2
  524. package/dist/apps/shared/notifications/apiErrors.js +2 -2
  525. package/dist/apps/shared/notifications/pushStatus.js +1 -1
  526. package/dist/apps/shared/notifications/systemErrors.js +1 -1
  527. package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +2 -2
  528. package/dist/apps/shared/search/LocalIndexLifecycle.js +15 -10
  529. package/dist/apps/shared/search/crossMailboxSearch.d.ts +1 -1
  530. package/dist/apps/shared/search/crossMailboxSearch.js +2 -2
  531. package/dist/apps/shared/search/localIndexBuilder.d.ts +4 -3
  532. package/dist/apps/shared/search/localIndexBuilder.js +15 -12
  533. package/dist/apps/shared/search/localIndexKey.js +1 -1
  534. package/dist/apps/shared/search/localIndexRpcClient.d.ts +43 -31
  535. package/dist/apps/shared/search/localIndexRpcClient.js +113 -20
  536. package/dist/apps/shared/search/localIndexTransport.d.ts +77 -0
  537. package/dist/apps/shared/search/localIndexTransport.js +1 -0
  538. package/dist/apps/shared/search/localIndexWorker.d.ts +1 -1
  539. package/dist/apps/shared/search/searchTier2.d.ts +3 -3
  540. package/dist/apps/shared/signing/enrollmentTracker.d.ts +1 -1
  541. package/dist/apps/shared/signing/enrollmentTracker.js +3 -3
  542. package/dist/apps/shared/signing/enrollmentView.d.ts +1 -1
  543. package/dist/apps/shared/signing/signingInfo.d.ts +1 -1
  544. package/dist/apps/shared/signing/signingInfo.js +1 -1
  545. package/dist/apps/shared/signing/useSigningEnrollmentWatcher.d.ts +1 -1
  546. package/dist/apps/shared/signing/useSigningEnrollmentWatcher.js +5 -3
  547. package/dist/apps/shared/styles/app.css +14 -23
  548. package/dist/apps/www/_layout.d.ts +1 -1
  549. package/dist/apps/www/_layout.js +1 -1
  550. package/dist/apps/www/calendar/index.d.ts +1 -1
  551. package/dist/apps/www/calendar/index.js +20 -18
  552. package/dist/apps/www/contacts/[uid].d.ts +1 -1
  553. package/dist/apps/www/contacts/[uid].js +8 -6
  554. package/dist/apps/www/contacts/index.d.ts +1 -1
  555. package/dist/apps/www/contacts/index.js +19 -17
  556. package/dist/apps/www/index.d.ts +1 -1
  557. package/dist/apps/www/index.js +54 -50
  558. package/dist/apps/www/messages/[uid].d.ts +1 -1
  559. package/dist/apps/www/messages/[uid].js +11 -9
  560. package/dist/apps/www/settings/appearance/index.d.ts +1 -1
  561. package/dist/apps/www/settings/auto-reply/index.d.ts +1 -1
  562. package/dist/apps/www/settings/auto-reply/index.js +6 -4
  563. package/dist/apps/www/settings/blocked-senders/index.d.ts +1 -1
  564. package/dist/apps/www/settings/blocked-senders/index.js +6 -4
  565. package/dist/apps/www/settings/encryption/index.d.ts +1 -1
  566. package/dist/apps/www/settings/encryption/index.js +31 -29
  567. package/dist/apps/www/settings/filters/[uid].d.ts +1 -1
  568. package/dist/apps/www/settings/filters/[uid].js +11 -9
  569. package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +2 -2
  570. package/dist/apps/www/settings/filters/index.d.ts +1 -1
  571. package/dist/apps/www/settings/filters/index.js +4 -4
  572. package/dist/apps/www/settings/filters/new/index.d.ts +1 -1
  573. package/dist/apps/www/settings/filters/new/index.js +10 -8
  574. package/dist/apps/www/settings/labels/index.d.ts +1 -1
  575. package/dist/apps/www/settings/labels/index.js +12 -10
  576. package/dist/apps/www/settings/privacy/index.d.ts +1 -1
  577. package/dist/apps/www/settings/privacy/index.js +18 -14
  578. package/dist/apps/www/settings/profile/index.d.ts +1 -1
  579. package/dist/apps/www/settings/profile/index.js +7 -5
  580. package/dist/apps/www/settings/read-receipts/index.d.ts +1 -1
  581. package/dist/apps/www/settings/read-receipts/index.js +5 -3
  582. package/dist/apps/www/settings/sharing/index.d.ts +1 -1
  583. package/dist/apps/www/settings/sharing/index.js +6 -6
  584. package/dist/apps/www/settings/signatures/[uid].d.ts +1 -1
  585. package/dist/apps/www/settings/signatures/[uid].js +5 -5
  586. package/dist/apps/www/settings/signatures/index.d.ts +1 -1
  587. package/dist/apps/www/settings/signatures/index.js +4 -4
  588. package/dist/apps/www/settings/signatures/new/index.d.ts +1 -1
  589. package/dist/apps/www/settings/signatures/new/index.js +4 -4
  590. package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +1 -1
  591. package/dist/apps/www/settings/signatures/signatureDefaults.js +1 -1
  592. package/dist/apps/www/tasks/index.d.ts +1 -1
  593. package/dist/apps/www/tasks/index.js +17 -15
  594. package/dist/lib/admin/auditLogApi.d.ts +32 -0
  595. package/dist/lib/admin/auditLogApi.js +27 -0
  596. package/dist/lib/admin/distributionListsApi.d.ts +47 -0
  597. package/dist/lib/admin/distributionListsApi.js +34 -0
  598. package/dist/lib/admin/domainsApi.d.ts +75 -0
  599. package/dist/lib/admin/domainsApi.js +44 -0
  600. package/dist/lib/admin/escrowAccessRequestsApi.d.ts +79 -0
  601. package/dist/lib/admin/escrowAccessRequestsApi.js +46 -0
  602. package/dist/lib/admin/escrowAuditLogApi.d.ts +66 -0
  603. package/dist/lib/admin/escrowAuditLogApi.js +31 -0
  604. package/dist/lib/admin/escrowScopesApi.d.ts +78 -0
  605. package/dist/lib/admin/escrowScopesApi.js +50 -0
  606. package/dist/lib/admin/leftoverMailboxApi.d.ts +73 -0
  607. package/dist/lib/admin/leftoverMailboxApi.js +67 -0
  608. package/dist/lib/admin/mailboxPolicyApi.d.ts +27 -0
  609. package/dist/lib/admin/mailboxPolicyApi.js +21 -0
  610. package/dist/lib/admin/matterExportApi.d.ts +40 -0
  611. package/dist/lib/admin/matterExportApi.js +39 -0
  612. package/dist/lib/admin/matterSearchApi.d.ts +20 -0
  613. package/dist/lib/admin/matterSearchApi.js +27 -0
  614. package/dist/lib/admin/mattersApi.d.ts +56 -0
  615. package/dist/lib/admin/mattersApi.js +40 -0
  616. package/dist/lib/admin/pluginsApi.d.ts +265 -0
  617. package/dist/lib/admin/pluginsApi.js +102 -0
  618. package/dist/lib/admin/retentionPolicyApi.d.ts +32 -0
  619. package/dist/lib/admin/retentionPolicyApi.js +29 -0
  620. package/dist/lib/admin/setupApi.d.ts +23 -0
  621. package/dist/lib/admin/setupApi.js +26 -0
  622. package/dist/lib/admin/transportRulesApi.d.ts +66 -0
  623. package/dist/lib/admin/transportRulesApi.js +43 -0
  624. package/dist/lib/appearance/preferencesApi.d.ts +128 -0
  625. package/dist/lib/appearance/preferencesApi.js +257 -0
  626. package/dist/lib/auth/profileApi.d.ts +33 -0
  627. package/dist/lib/auth/profileApi.js +52 -0
  628. package/dist/lib/auth/session.d.ts +70 -0
  629. package/dist/lib/auth/session.js +210 -0
  630. package/dist/lib/branding/brandingApi.d.ts +47 -0
  631. package/dist/lib/branding/brandingApi.js +61 -0
  632. package/dist/lib/branding/useBranding.d.ts +23 -0
  633. package/dist/lib/branding/useBranding.js +65 -0
  634. package/dist/lib/calendar/calendarApi.d.ts +230 -0
  635. package/dist/lib/calendar/calendarApi.js +106 -0
  636. package/dist/lib/calendar/calendarColors.d.ts +18 -0
  637. package/dist/lib/calendar/calendarColors.js +39 -0
  638. package/dist/lib/calendar/calendarDragIds.d.ts +42 -0
  639. package/dist/lib/calendar/calendarDragIds.js +92 -0
  640. package/dist/lib/calendar/calendarMutations.d.ts +68 -0
  641. package/dist/lib/calendar/calendarMutations.js +190 -0
  642. package/dist/lib/calendar/eventDescription.d.ts +43 -0
  643. package/dist/lib/calendar/eventDescription.js +195 -0
  644. package/dist/lib/calendar/freeBusyApi.d.ts +100 -0
  645. package/dist/lib/calendar/freeBusyApi.js +119 -0
  646. package/dist/lib/calendar/inviteApi.d.ts +121 -0
  647. package/dist/lib/calendar/inviteApi.js +54 -0
  648. package/dist/lib/calendar/recurrence.d.ts +60 -0
  649. package/dist/lib/calendar/recurrence.js +225 -0
  650. package/dist/lib/components/avatar/ContactAvatar.d.ts +8 -0
  651. package/dist/lib/components/avatar/ContactAvatar.js +26 -0
  652. package/dist/lib/components/buttons/Button.d.ts +9 -0
  653. package/dist/lib/components/buttons/Button.js +14 -0
  654. package/dist/lib/components/buttons/CopyButton.d.ts +18 -0
  655. package/dist/lib/components/buttons/CopyButton.js +14 -0
  656. package/dist/lib/components/feedback/Alert.d.ts +4 -0
  657. package/dist/lib/components/feedback/Alert.js +4 -0
  658. package/dist/lib/components/feedback/Skeleton.d.ts +21 -0
  659. package/dist/lib/components/feedback/Skeleton.js +14 -0
  660. package/dist/lib/components/forms/FormField.d.ts +8 -0
  661. package/dist/lib/components/forms/FormField.js +5 -0
  662. package/dist/lib/components/navigation/BottomTabBar.d.ts +27 -0
  663. package/dist/lib/components/navigation/BottomTabBar.js +32 -0
  664. package/dist/lib/components/overlays/Drawer.d.ts +20 -0
  665. package/dist/lib/components/overlays/Drawer.js +27 -0
  666. package/dist/lib/components/overlays/Modal.d.ts +17 -0
  667. package/dist/lib/components/overlays/Modal.js +25 -0
  668. package/dist/lib/components/overlays/PopoverPortal.d.ts +23 -0
  669. package/dist/lib/components/overlays/PopoverPortal.js +53 -0
  670. package/dist/lib/components/overlays/overlayStack.d.ts +31 -0
  671. package/dist/lib/components/overlays/overlayStack.js +143 -0
  672. package/dist/lib/components/pickers/MiniDatePicker.d.ts +13 -0
  673. package/dist/lib/components/pickers/MiniDatePicker.js +42 -0
  674. package/dist/lib/contacts/contactsApi.d.ts +174 -0
  675. package/dist/lib/contacts/contactsApi.js +139 -0
  676. package/dist/lib/contacts/vcard.d.ts +23 -0
  677. package/dist/lib/contacts/vcard.js +179 -0
  678. package/dist/lib/crypto/composeSecurity.d.ts +67 -0
  679. package/dist/lib/crypto/composeSecurity.js +93 -0
  680. package/dist/lib/crypto/encoding.d.ts +9 -0
  681. package/dist/lib/crypto/encoding.js +32 -0
  682. package/dist/lib/crypto/escrowKeys.d.ts +25 -0
  683. package/dist/lib/crypto/escrowKeys.js +59 -0
  684. package/dist/lib/crypto/idleTimeout.d.ts +16 -0
  685. package/dist/lib/crypto/idleTimeout.js +47 -0
  686. package/dist/lib/crypto/keySession.d.ts +159 -0
  687. package/dist/lib/crypto/keySession.js +367 -0
  688. package/dist/lib/crypto/keys.d.ts +50 -0
  689. package/dist/lib/crypto/keys.js +89 -0
  690. package/dist/lib/crypto/keyvaultApi.d.ts +394 -0
  691. package/dist/lib/crypto/keyvaultApi.js +350 -0
  692. package/dist/lib/crypto/masterKey.d.ts +59 -0
  693. package/dist/lib/crypto/masterKey.js +104 -0
  694. package/dist/lib/crypto/masterKeyWraps.d.ts +108 -0
  695. package/dist/lib/crypto/masterKeyWraps.js +228 -0
  696. package/dist/lib/crypto/messageSecurity.d.ts +248 -0
  697. package/dist/lib/crypto/messageSecurity.js +367 -0
  698. package/dist/lib/crypto/mime.d.ts +143 -0
  699. package/dist/lib/crypto/mime.js +504 -0
  700. package/dist/lib/crypto/passkeyUnlock.d.ts +20 -0
  701. package/dist/lib/crypto/passkeyUnlock.js +79 -0
  702. package/dist/lib/crypto/passwordUnlock.d.ts +39 -0
  703. package/dist/lib/crypto/passwordUnlock.js +73 -0
  704. package/dist/lib/crypto/recoveryCode.d.ts +28 -0
  705. package/dist/lib/crypto/recoveryCode.js +86 -0
  706. package/dist/lib/crypto/signingProviderApi.d.ts +95 -0
  707. package/dist/lib/crypto/signingProviderApi.js +60 -0
  708. package/dist/lib/crypto/smime.d.ts +128 -0
  709. package/dist/lib/crypto/smime.js +402 -0
  710. package/dist/lib/crypto/smimeMessage.d.ts +132 -0
  711. package/dist/lib/crypto/smimeMessage.js +341 -0
  712. package/dist/lib/crypto/useIdleKeyTimeout.d.ts +10 -0
  713. package/dist/lib/crypto/useIdleKeyTimeout.js +163 -0
  714. package/dist/lib/crypto/verificationSeal.d.ts +56 -0
  715. package/dist/lib/crypto/verificationSeal.js +220 -0
  716. package/dist/lib/mail/compose/composeQuoting.d.ts +88 -0
  717. package/dist/lib/mail/compose/composeQuoting.js +204 -0
  718. package/dist/lib/mail/compose/emojiData.d.ts +9 -0
  719. package/dist/lib/mail/compose/emojiData.js +18 -0
  720. package/dist/lib/mail/compose/giphyApi.d.ts +17 -0
  721. package/dist/lib/mail/compose/giphyApi.js +20 -0
  722. package/dist/lib/mail/conversationsApi.d.ts +80 -0
  723. package/dist/lib/mail/conversationsApi.js +44 -0
  724. package/dist/lib/mail/dataExportApi.d.ts +50 -0
  725. package/dist/lib/mail/dataExportApi.js +40 -0
  726. package/dist/lib/mail/directoryApi.d.ts +49 -0
  727. package/dist/lib/mail/directoryApi.js +101 -0
  728. package/dist/lib/mail/erasureRequestApi.d.ts +45 -0
  729. package/dist/lib/mail/erasureRequestApi.js +43 -0
  730. package/dist/lib/mail/flaggedMessages.d.ts +22 -0
  731. package/dist/lib/mail/flaggedMessages.js +73 -0
  732. package/dist/lib/mail/focusedInboxOverridesApi.d.ts +37 -0
  733. package/dist/lib/mail/focusedInboxOverridesApi.js +34 -0
  734. package/dist/lib/mail/labelsApi.d.ts +47 -0
  735. package/dist/lib/mail/labelsApi.js +38 -0
  736. package/dist/lib/mail/mailAddress.d.ts +27 -0
  737. package/dist/lib/mail/mailAddress.js +54 -0
  738. package/dist/lib/mail/mailApi.d.ts +850 -0
  739. package/dist/lib/mail/mailApi.js +602 -0
  740. package/dist/lib/mail/mailDetailHooks.d.ts +10 -0
  741. package/dist/lib/mail/mailDetailHooks.js +53 -0
  742. package/dist/lib/mail/mailFilterRulesApi.d.ts +76 -0
  743. package/dist/lib/mail/mailFilterRulesApi.js +45 -0
  744. package/dist/lib/mail/mailSignaturesApi.d.ts +49 -0
  745. package/dist/lib/mail/mailSignaturesApi.js +42 -0
  746. package/dist/lib/mail/mailboxAccessApi.d.ts +74 -0
  747. package/dist/lib/mail/mailboxAccessApi.js +56 -0
  748. package/dist/lib/mail/mailboxImportApi.d.ts +53 -0
  749. package/dist/lib/mail/mailboxImportApi.js +51 -0
  750. package/dist/lib/mail/messageBodySanitizer.d.ts +16 -0
  751. package/dist/lib/mail/messageBodySanitizer.js +118 -0
  752. package/dist/lib/mail/pushClient.d.ts +106 -0
  753. package/dist/lib/mail/pushClient.js +317 -0
  754. package/dist/lib/mail/sendEvents.d.ts +33 -0
  755. package/dist/lib/mail/sendEvents.js +44 -0
  756. package/dist/lib/mail/sendFailure.d.ts +16 -0
  757. package/dist/lib/mail/sendFailure.js +86 -0
  758. package/dist/lib/mail/senderListsApi.d.ts +69 -0
  759. package/dist/lib/mail/senderListsApi.js +126 -0
  760. package/dist/lib/search/queryGrammar.d.ts +51 -0
  761. package/dist/lib/search/queryGrammar.js +111 -0
  762. package/dist/lib/search/searchApi.d.ts +100 -0
  763. package/dist/lib/search/searchApi.js +107 -0
  764. package/dist/lib/search/searchScoring.d.ts +34 -0
  765. package/dist/lib/search/searchScoring.js +44 -0
  766. package/dist/lib/search/searchTier3.d.ts +64 -0
  767. package/dist/lib/search/searchTier3.js +335 -0
  768. package/dist/lib/tasks/tasksApi.d.ts +85 -0
  769. package/dist/lib/tasks/tasksApi.js +55 -0
  770. package/dist/lib/util/api.d.ts +160 -0
  771. package/dist/lib/util/api.js +251 -0
  772. package/dist/lib/util/apiClientContext.d.ts +7 -0
  773. package/dist/lib/util/apiClientContext.js +32 -0
  774. package/dist/lib/util/apiQuery.d.ts +32 -0
  775. package/dist/lib/util/apiQuery.js +42 -0
  776. package/dist/lib/util/clipboard.d.ts +7 -0
  777. package/dist/lib/util/clipboard.js +56 -0
  778. package/dist/lib/util/dateInput.d.ts +6 -0
  779. package/dist/lib/util/dateInput.js +14 -0
  780. package/dist/lib/util/timeZone.d.ts +12 -0
  781. package/dist/lib/util/timeZone.js +32 -0
  782. package/dist/lib/util/useCopyToClipboard.d.ts +12 -0
  783. package/dist/lib/util/useCopyToClipboard.js +34 -0
  784. package/dist/lib/util/useIsMobile.d.ts +10 -0
  785. package/dist/lib/util/useIsMobile.js +29 -0
  786. package/dist/lib/videoconf/videoMeetingsApi.d.ts +116 -0
  787. package/dist/lib/videoconf/videoMeetingsApi.js +49 -0
  788. package/lib/admin/auditLogApi.ts +48 -0
  789. package/lib/admin/distributionListsApi.ts +77 -0
  790. package/lib/admin/domainsApi.ts +113 -0
  791. package/lib/admin/escrowAccessRequestsApi.ts +110 -0
  792. package/lib/admin/escrowAuditLogApi.ts +101 -0
  793. package/lib/admin/escrowScopesApi.ts +112 -0
  794. package/lib/admin/leftoverMailboxApi.ts +120 -0
  795. package/lib/admin/mailboxPolicyApi.ts +38 -0
  796. package/lib/admin/matterExportApi.ts +62 -0
  797. package/lib/admin/matterSearchApi.ts +35 -0
  798. package/lib/admin/mattersApi.ts +86 -0
  799. package/lib/admin/pluginsApi.ts +339 -0
  800. package/lib/admin/retentionPolicyApi.ts +46 -0
  801. package/lib/admin/setupApi.ts +40 -0
  802. package/lib/admin/transportRulesApi.ts +106 -0
  803. package/lib/appearance/preferencesApi.ts +335 -0
  804. package/lib/auth/profileApi.ts +77 -0
  805. package/lib/auth/session.ts +238 -0
  806. package/lib/branding/brandingApi.ts +97 -0
  807. package/lib/branding/useBranding.ts +81 -0
  808. package/lib/calendar/calendarApi.ts +309 -0
  809. package/lib/calendar/calendarColors.ts +45 -0
  810. package/lib/calendar/calendarDragIds.ts +112 -0
  811. package/lib/calendar/calendarMutations.ts +236 -0
  812. package/lib/calendar/eventDescription.ts +211 -0
  813. package/lib/calendar/freeBusyApi.ts +197 -0
  814. package/lib/calendar/inviteApi.ts +154 -0
  815. package/lib/calendar/recurrence.ts +285 -0
  816. package/lib/components/avatar/ContactAvatar.tsx +47 -0
  817. package/lib/components/buttons/Button.tsx +40 -0
  818. package/lib/components/buttons/CopyButton.tsx +45 -0
  819. package/lib/components/feedback/Alert.tsx +13 -0
  820. package/lib/components/feedback/Skeleton.tsx +38 -0
  821. package/lib/components/forms/FormField.tsx +23 -0
  822. package/lib/components/navigation/BottomTabBar.tsx +66 -0
  823. package/lib/components/overlays/Drawer.tsx +72 -0
  824. package/lib/components/overlays/Modal.tsx +64 -0
  825. package/lib/components/overlays/PopoverPortal.tsx +74 -0
  826. package/lib/components/overlays/overlayStack.ts +165 -0
  827. package/lib/components/pickers/MiniDatePicker.tsx +90 -0
  828. package/lib/contacts/contactsApi.ts +289 -0
  829. package/lib/contacts/vcard.ts +197 -0
  830. package/lib/crypto/composeSecurity.ts +140 -0
  831. package/lib/crypto/encoding.ts +36 -0
  832. package/lib/crypto/escrowKeys.ts +74 -0
  833. package/lib/crypto/idleTimeout.ts +49 -0
  834. package/lib/crypto/keySession.ts +483 -0
  835. package/lib/crypto/keys.ts +105 -0
  836. package/lib/crypto/keyvaultApi.ts +674 -0
  837. package/lib/crypto/masterKey.ts +134 -0
  838. package/lib/crypto/masterKeyWraps.ts +269 -0
  839. package/lib/crypto/messageSecurity.ts +600 -0
  840. package/lib/crypto/mime.ts +568 -0
  841. package/lib/crypto/passkeyUnlock.ts +103 -0
  842. package/lib/crypto/passwordUnlock.ts +98 -0
  843. package/lib/crypto/recoveryCode.ts +93 -0
  844. package/lib/crypto/signingProviderApi.ts +135 -0
  845. package/lib/crypto/smime.ts +459 -0
  846. package/lib/crypto/smimeMessage.ts +491 -0
  847. package/lib/crypto/useIdleKeyTimeout.ts +176 -0
  848. package/lib/crypto/verificationSeal.ts +288 -0
  849. package/lib/mail/compose/composeQuoting.ts +243 -0
  850. package/lib/mail/compose/emojiData.ts +34 -0
  851. package/lib/mail/compose/giphyApi.ts +31 -0
  852. package/lib/mail/conversationsApi.ts +123 -0
  853. package/lib/mail/dataExportApi.ts +73 -0
  854. package/lib/mail/directoryApi.ts +161 -0
  855. package/lib/mail/erasureRequestApi.ts +71 -0
  856. package/lib/mail/flaggedMessages.ts +80 -0
  857. package/lib/mail/focusedInboxOverridesApi.ts +64 -0
  858. package/lib/mail/labelsApi.ts +71 -0
  859. package/lib/mail/mailAddress.ts +76 -0
  860. package/lib/mail/mailApi.ts +1286 -0
  861. package/lib/mail/mailDetailHooks.ts +57 -0
  862. package/lib/mail/mailFilterRulesApi.ts +116 -0
  863. package/lib/mail/mailSignaturesApi.ts +84 -0
  864. package/lib/mail/mailboxAccessApi.ts +106 -0
  865. package/lib/mail/mailboxImportApi.ts +87 -0
  866. package/lib/mail/messageBodySanitizer.ts +129 -0
  867. package/lib/mail/pushClient.ts +375 -0
  868. package/lib/mail/sendEvents.ts +72 -0
  869. package/lib/mail/sendFailure.ts +98 -0
  870. package/lib/mail/senderListsApi.ts +161 -0
  871. package/lib/search/queryGrammar.ts +179 -0
  872. package/lib/search/searchApi.ts +199 -0
  873. package/lib/search/searchScoring.ts +46 -0
  874. package/lib/search/searchTier3.ts +406 -0
  875. package/lib/tasks/tasksApi.ts +128 -0
  876. package/lib/util/api.ts +318 -0
  877. package/lib/util/apiClientContext.ts +35 -0
  878. package/lib/util/apiQuery.ts +61 -0
  879. package/lib/util/clipboard.ts +55 -0
  880. package/lib/util/dateInput.ts +15 -0
  881. package/lib/util/timeZone.ts +33 -0
  882. package/lib/util/useCopyToClipboard.ts +48 -0
  883. package/lib/util/useIsMobile.ts +34 -0
  884. package/lib/videoconf/videoMeetingsApi.ts +144 -0
  885. package/package.json +10 -4
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Client-side re-scoring per `specs/search.md` §7 "Ranking and Merge": scores from different search
3
+ * sources are not comparable — a Postgres `ts_rank`, an OpenSearch `_score`, and a future local FTS5
4
+ * `bm25()` value occupy different, provider-specific ranges. The spec requires normalizing every
5
+ * source's scores into one shared space rather than interleaving raw values.
6
+ *
7
+ * This pass only has one source (Tier 1 - the server), so there is nothing to *merge* yet - the real
8
+ * cross-tier merge (§7's full ranking pass, §8's composite pagination cursor) is Tier 2/3 work,
9
+ * deliberately out of scope for this pass. What's implemented here is the normalization step itself,
10
+ * written generically (one page's raw scores in, normalized scores out) so a future per-source call
11
+ * into the same function is all cross-tier merging needs to add - not a second implementation of
12
+ * normalization.
13
+ */
14
+ /** The spec's own field-weight table (§7), exported for reuse by whichever component eventually
15
+ * computes a *local* (Tier 2) score from decrypted content - the same weights must produce ranking
16
+ * that matches today's server-side behavior. */
17
+ export declare const SEARCH_FIELD_WEIGHTS: {
18
+ readonly subject: 3;
19
+ readonly participants: 2;
20
+ readonly body: 1;
21
+ readonly attachmentText: 1;
22
+ };
23
+ /**
24
+ * Normalizes one page's raw provider scores into `[0, 1]`, preserving relative order, so a caller never
25
+ * has to reason about a specific provider's raw score range. `0` for every result when every score in
26
+ * the page is equal (including the degenerate single-result and all-zero cases) - there is no relative
27
+ * ordering information to preserve in that case, and `0` is a safer default than an arbitrary `1`.
28
+ */
29
+ export declare function normalizeServerScores<T extends {
30
+ score: number;
31
+ }>(results: readonly T[]): {
32
+ result: T;
33
+ normalizedScore: number;
34
+ }[];
@@ -0,0 +1,44 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Client-side re-scoring per `specs/search.md` §7 "Ranking and Merge": scores from different search
7
+ * sources are not comparable — a Postgres `ts_rank`, an OpenSearch `_score`, and a future local FTS5
8
+ * `bm25()` value occupy different, provider-specific ranges. The spec requires normalizing every
9
+ * source's scores into one shared space rather than interleaving raw values.
10
+ *
11
+ * This pass only has one source (Tier 1 - the server), so there is nothing to *merge* yet - the real
12
+ * cross-tier merge (§7's full ranking pass, §8's composite pagination cursor) is Tier 2/3 work,
13
+ * deliberately out of scope for this pass. What's implemented here is the normalization step itself,
14
+ * written generically (one page's raw scores in, normalized scores out) so a future per-source call
15
+ * into the same function is all cross-tier merging needs to add - not a second implementation of
16
+ * normalization.
17
+ */
18
+ /** The spec's own field-weight table (§7), exported for reuse by whichever component eventually
19
+ * computes a *local* (Tier 2) score from decrypted content - the same weights must produce ranking
20
+ * that matches today's server-side behavior. */
21
+ export const SEARCH_FIELD_WEIGHTS = {
22
+ subject: 3,
23
+ participants: 2,
24
+ body: 1,
25
+ attachmentText: 1,
26
+ };
27
+ /**
28
+ * Normalizes one page's raw provider scores into `[0, 1]`, preserving relative order, so a caller never
29
+ * has to reason about a specific provider's raw score range. `0` for every result when every score in
30
+ * the page is equal (including the degenerate single-result and all-zero cases) - there is no relative
31
+ * ordering information to preserve in that case, and `0` is a safer default than an arbitrary `1`.
32
+ */
33
+ export function normalizeServerScores(results) {
34
+ if (results.length === 0) {
35
+ return [];
36
+ }
37
+ const maxScore = Math.max(...results.map((r) => r.score));
38
+ const minScore = Math.min(...results.map((r) => r.score));
39
+ const range = maxScore - minScore;
40
+ return results.map((result) => ({
41
+ result,
42
+ normalizedScore: range === 0 ? 0 : (result.score - minScore) / range,
43
+ }));
44
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Tier 3 — server-assisted narrowing (`specs/search.md` §6/§14): for an encrypted message, the
3
+ * server's own index has no `body`/`subject` field to match free text against (§2) - a free-text query
4
+ * can only ever surface one via a `participants` coincidence or a pure-operator query. This module
5
+ * closes that gap: it asks the server to narrow by metadata it can actually see (participants, dates,
6
+ * folder, flags - never content, via `searchApi.ts#candidates()`), then fetches, decrypts, and matches
7
+ * each candidate's real content client-side - the part the server structurally cannot do.
8
+ *
9
+ * **No new leakage** (§6): the server never learns which candidate actually matched, only that this
10
+ * client asked about a bounded set of participants/dates/folders it could already see for delivery.
11
+ *
12
+ * Deliberately scoped to `entityType: "message"` only - contacts are never encrypted (Tier 1 already
13
+ * covers them in full), and calendarEvent/note/task encryption has no client-side decrypt path
14
+ * anywhere in this codebase yet (no calendar/notes/tasks E2E UI has been built), so including those
15
+ * types here would just produce fetch/decrypt failures for entities this module has no way to open.
16
+ */
17
+ import type { UnlockedKeys } from "../crypto/keySession.js";
18
+ import type { ParsedSearchQuery } from "./queryGrammar.js";
19
+ import { SearchResult } from "./searchApi.js";
20
+ /** Longest decrypted HTML body `stripHtml()` examines, in UTF-16 code units - content past it is ignored
21
+ * for Tier 3 matching. A hostile sender controls this input entirely, so it is bounded on top of the
22
+ * stripper itself being linear-time. */
23
+ export declare const TIER3_MAX_HTML_LENGTH = 2000000;
24
+ /** Strips HTML down to plain text for content matching. Deliberately not `dompurify` (used elsewhere
25
+ * in this codebase for sanitizing a decrypted body before it touches a real DOM) - `dompurify` only
26
+ * produces a working `sanitize()` once handed a real `window`, which this module cannot assume: it
27
+ * needs to run identically in a browser tab, an Electron renderer, and this package's own Node-based
28
+ * test suite (no jsdom - `pkijs`'s ECDH key derivation, which every test here depends on, breaks under
29
+ * jsdom's WebCrypto shim). This is not a security boundary - the output only ever feeds a
30
+ * case-insensitive substring match, never rendered back into any DOM.
31
+ *
32
+ * A single left-to-right pass rather than the previous `/<(script|style)[^>]*>[\s\S]*?<\/\1>/gi` regex,
33
+ * which backtracked quadratically on a body of repeated unclosed `<style>` tags (round-4 review: 280 KB
34
+ * took over a second, growing 4x per doubling). `<script>`/`<style>` elements are dropped with their
35
+ * content up to the matching close tag; an unclosed one drops only its own tag (matching the old
36
+ * behavior); any other `<...>` tag becomes a space; an unterminated `<` is kept as text. */
37
+ export declare function stripHtml(html: string): string;
38
+ /** How many candidates are fetched/decrypted at once - bounds the burst of raw-MIME requests and
39
+ * concurrent WebCrypto work a large candidate page would otherwise fire all at once. */
40
+ export declare const TIER3_DECRYPT_CONCURRENCY = 4;
41
+ export interface SearchEncryptedCandidatesOptions {
42
+ /** Forwarded to `candidates()` - which accessible mailbox to search (e.g. the one currently open).
43
+ * Omitted, the server uses the caller's own mailbox. */
44
+ mailboxUid?: string;
45
+ }
46
+ /**
47
+ * Runs Tier 3 for one parsed query: fetches a bounded candidate set from the server, decrypts each
48
+ * candidate this device can open (at most `TIER3_DECRYPT_CONCURRENCY` at a time), and returns only the
49
+ * ones whose real (decrypted) content actually matches - each with a raw (not yet normalized) score the
50
+ * caller should run through `searchScoring.ts#normalizeServerScores()` alongside Tier 1's own scores
51
+ * before merging.
52
+ *
53
+ * Honors every operator `parseSearchQuery()` produces, not just free text: `subject:` must appear
54
+ * (case-insensitively) in the *decrypted* subject, and `has:attachment` is checked against the
55
+ * message's own `Message.hasAttachments` (fetched via `getMessage()` before decrypting, so a mismatch
56
+ * never pays for a decrypt). The candidates endpoint accepts neither filter, so both are applied here.
57
+ *
58
+ * Returns `[]` (never throws) when `unlocked` is absent or destroyed (`UnlockedKeys.destroyed`, checked on
59
+ * entry, before each decrypt and again before building results) - nothing can be decrypted without it, so
60
+ * there is nothing this tier can contribute - or when the query has no free text and no structured
61
+ * filter at all, mirroring `BaseSearchRoute`'s own "at least one of q or a filter" requirement rather
62
+ * than pulling a pointless full-mailbox candidate set.
63
+ */
64
+ export declare function searchEncryptedCandidates(parsed: ParsedSearchQuery, unlocked: UnlockedKeys | undefined, limit?: number, options?: SearchEncryptedCandidatesOptions): Promise<SearchResult[]>;
@@ -0,0 +1,335 @@
1
+ import { evaluateMessageSecurity } from "../crypto/messageSecurity.js";
2
+ import { getMessage, getMessageRawContent } from "../mail/mailApi.js";
3
+ import { SEARCH_FIELD_WEIGHTS } from "./searchScoring.js";
4
+ import { candidates } from "./searchApi.js";
5
+ /** Longest decrypted HTML body `stripHtml()` examines, in UTF-16 code units - content past it is ignored
6
+ * for Tier 3 matching. A hostile sender controls this input entirely, so it is bounded on top of the
7
+ * stripper itself being linear-time. */
8
+ export const TIER3_MAX_HTML_LENGTH = 2000000;
9
+ /** Finds the next `</name` close tag at or after `from`, memoizing per tag name so repeated lookups
10
+ * across one input never rescan the same text: a cached position still ahead of `from` is reused, and a
11
+ * cached "no close tag at all" (-1) stays true for every later `from`. Total work is linear in `lower`. */
12
+ function makeCloseTagFinder(lower) {
13
+ const cache = {};
14
+ return (name, from) => {
15
+ const cached = cache[name];
16
+ if (cached === -1 || (cached !== undefined && cached >= from)) {
17
+ return cached;
18
+ }
19
+ const found = lower.indexOf(`</${name}`, from);
20
+ cache[name] = found;
21
+ return found;
22
+ };
23
+ }
24
+ /** Which raw-text element (`script`/`style`) a tag body (the text between `<` and `>`) opens, if any. */
25
+ function rawTextElementOf(tagBody) {
26
+ const match = /^(script|style)(?=[\s/]|$)/i.exec(tagBody);
27
+ return match ? match[1].toLowerCase() : undefined;
28
+ }
29
+ /** Strips HTML down to plain text for content matching. Deliberately not `dompurify` (used elsewhere
30
+ * in this codebase for sanitizing a decrypted body before it touches a real DOM) - `dompurify` only
31
+ * produces a working `sanitize()` once handed a real `window`, which this module cannot assume: it
32
+ * needs to run identically in a browser tab, an Electron renderer, and this package's own Node-based
33
+ * test suite (no jsdom - `pkijs`'s ECDH key derivation, which every test here depends on, breaks under
34
+ * jsdom's WebCrypto shim). This is not a security boundary - the output only ever feeds a
35
+ * case-insensitive substring match, never rendered back into any DOM.
36
+ *
37
+ * A single left-to-right pass rather than the previous `/<(script|style)[^>]*>[\s\S]*?<\/\1>/gi` regex,
38
+ * which backtracked quadratically on a body of repeated unclosed `<style>` tags (round-4 review: 280 KB
39
+ * took over a second, growing 4x per doubling). `<script>`/`<style>` elements are dropped with their
40
+ * content up to the matching close tag; an unclosed one drops only its own tag (matching the old
41
+ * behavior); any other `<...>` tag becomes a space; an unterminated `<` is kept as text. */
42
+ export function stripHtml(html) {
43
+ const input = html.length > TIER3_MAX_HTML_LENGTH ? html.slice(0, TIER3_MAX_HTML_LENGTH) : html;
44
+ const findClose = makeCloseTagFinder(input.toLowerCase());
45
+ const pieces = [];
46
+ let position = 0;
47
+ while (position < input.length) {
48
+ const open = input.indexOf("<", position);
49
+ if (open === -1) {
50
+ pieces.push(input.slice(position));
51
+ break;
52
+ }
53
+ pieces.push(input.slice(position, open));
54
+ const close = input.indexOf(">", open + 1);
55
+ if (close === -1) {
56
+ pieces.push(input.slice(open));
57
+ break;
58
+ }
59
+ if (close === open + 1) {
60
+ // `<>` is not a tag - kept as text, as the old `<[^>]+>` pattern did.
61
+ pieces.push("<>");
62
+ position = close + 1;
63
+ continue;
64
+ }
65
+ pieces.push(" ");
66
+ position = close + 1;
67
+ const element = rawTextElementOf(input.slice(open + 1, Math.min(close, open + 8)));
68
+ if (element) {
69
+ const endTag = findClose(element, position);
70
+ if (endTag !== -1) {
71
+ const endTagClose = input.indexOf(">", endTag);
72
+ position = endTagClose === -1 ? input.length : endTagClose + 1;
73
+ }
74
+ }
75
+ }
76
+ return pieces
77
+ .join("")
78
+ .replace(/&nbsp;/gi, " ")
79
+ .replace(/&amp;/gi, "&")
80
+ .replace(/&lt;/gi, "<")
81
+ .replace(/&gt;/gi, ">")
82
+ .replace(/&quot;/gi, '"')
83
+ .replace(/&#0*39;/gi, "'")
84
+ .replace(/\s+/g, " ")
85
+ .trim();
86
+ }
87
+ /** Tokenizes `queryText`'s free-text remainder the same way `queryGrammar.ts`'s own doc comment says a
88
+ * provider's free-text engine is expected to (Postgres's `websearch_to_tsquery` in particular) - a
89
+ * `"quoted phrase"` is one term, and a leading `-` (`-word`/`-"a phrase"`) negates it. Without this,
90
+ * Tier 3's own matching silently diverged from Tier 1's (a quoted phrase split into separate
91
+ * AND-matched words; `-excluded` treated as a literal required word instead of a negation) - `specs/
92
+ * search.md` §14 requires the same query language across tiers "or the tiering becomes visible to the
93
+ * user." */
94
+ function tokenizeFreeText(queryText) {
95
+ const terms = [];
96
+ const pattern = /(-?)"([^"]*)"|(-?)(\S+)/g;
97
+ let match;
98
+ while ((match = pattern.exec(queryText)) !== null) {
99
+ if (match[2] !== undefined) {
100
+ if (match[2]) {
101
+ terms.push({ text: match[2], negated: match[1] === "-", isPhrase: true });
102
+ }
103
+ }
104
+ else {
105
+ // match[4] is always non-empty here: the `(-?)(\S+)` alternative only ever matches via `\S+`,
106
+ // which requires at least one character.
107
+ terms.push({ text: match[4], negated: match[3] === "-", isPhrase: false });
108
+ }
109
+ }
110
+ return terms;
111
+ }
112
+ /** Splits a flat term list into `OR`-separated alternative groups (each an implicit AND of its own
113
+ * terms), mirroring `websearch_to_tsquery`'s `OR` support - `budget OR forecast` matches either, not
114
+ * both. A bare, unquoted, unnegated `OR` token is the separator itself, never matched against content;
115
+ * an empty group (a leading/trailing/doubled `OR`) is dropped. */
116
+ function groupByOr(terms) {
117
+ const groups = [[]];
118
+ for (const term of terms) {
119
+ if (!term.isPhrase && !term.negated && term.text === "OR") {
120
+ groups.push([]);
121
+ }
122
+ else {
123
+ groups[groups.length - 1].push(term);
124
+ }
125
+ }
126
+ return groups.filter((group) => group.length > 0);
127
+ }
128
+ /** The positive (non-negated, non-`OR`-separator) term texts in `queryText`, for scoring/snippet
129
+ * purposes only - those don't need OR's alternative-groups structure, just "what to count/highlight". */
130
+ function positiveTermTexts(queryText) {
131
+ return tokenizeFreeText(queryText)
132
+ .filter((term) => !term.negated && !(term.isPhrase === false && term.text === "OR"))
133
+ .map((term) => term.text);
134
+ }
135
+ /** `true` when `haystack` satisfies `queryText`'s free-text remainder - quoted phrases matched whole,
136
+ * a `-`-prefixed term required absent, and (at least) one `OR`-separated group's terms all satisfied.
137
+ * An empty `queryText` (a pure-operator query - the operators themselves already did the narrowing)
138
+ * matches unconditionally. */
139
+ function matchesFreeText(queryText, haystack) {
140
+ const terms = tokenizeFreeText(queryText);
141
+ if (terms.length === 0) {
142
+ return true;
143
+ }
144
+ const groups = groupByOr(terms);
145
+ if (groups.length === 0) {
146
+ return true;
147
+ }
148
+ const lowerHaystack = haystack.toLowerCase();
149
+ return groups.some((group) => group.every((term) => {
150
+ const present = lowerHaystack.includes(term.text.toLowerCase());
151
+ return term.negated ? !present : present;
152
+ }));
153
+ }
154
+ /** Counts (case-insensitive, overlapping-safe-enough for scoring purposes) occurrences of every
155
+ * positive term/phrase in `queryText` within `haystack` - used only to weight a match's score, not to
156
+ * decide whether it matches at all (`matchesFreeText()` already decided that).
157
+ *
158
+ * Returns the same flat `1` for a query with real free text that happens to be entirely `-negated`
159
+ * (e.g. `-spam -junk`) as for a true pure-operator query with no free text at all - there is no positive
160
+ * term to count occurrences of either way, so no content-relevance signal exists to differentiate on.
161
+ * This is not a scoring regression relative to Tier 1: `PostgresFullTextSearchProvider`'s own
162
+ * `ts_rank(search_vector, websearch_to_tsquery(...))` degrades identically for an all-negative tsquery
163
+ * (no positive lexeme contributes rank weight), so every Tier 1 result for the same query is equally
164
+ * flat before `normalizeServerScores()` sinks both tiers' batches to `0` together - consistent, not a
165
+ * one-sided disadvantage for Tier 3. */
166
+ function countTermOccurrences(queryText, haystack) {
167
+ const terms = positiveTermTexts(queryText);
168
+ if (terms.length === 0) {
169
+ return 1;
170
+ }
171
+ const lowerHaystack = haystack.toLowerCase();
172
+ return terms.reduce((total, term) => {
173
+ // Never empty: tokenizeFreeText() only ever pushes a term with at least one character, whether
174
+ // matched via `\S+` (which requires one) or a quoted phrase (explicitly checked non-empty there).
175
+ const lowerTerm = term.toLowerCase();
176
+ let count = 0;
177
+ let index = lowerHaystack.indexOf(lowerTerm);
178
+ while (index !== -1) {
179
+ count += 1;
180
+ index = lowerHaystack.indexOf(lowerTerm, index + lowerTerm.length);
181
+ }
182
+ return total + count;
183
+ }, 0);
184
+ }
185
+ /** Builds a snippet the same way `specs/search.md` §7 "Snippets" requires for a Tier 3 result -
186
+ * "the client MUST generate snippets locally for any result it has decrypted... so snippet presence
187
+ * does not visibly differ by tier." A window of context around the first matched term when there is
188
+ * free text to match on, otherwise the start of the body (falling back to the subject if the body is
189
+ * empty). Never called with both `subjectText`/`bodyText` empty - the caller's own
190
+ * `!security.html && !security.subject` guard already discards a candidate with nothing at all before
191
+ * reaching this function. */
192
+ function buildSnippet(queryText, subjectText, bodyText) {
193
+ const source = bodyText || subjectText;
194
+ const terms = positiveTermTexts(queryText);
195
+ const lowerSource = source.toLowerCase();
196
+ let matchIndex = -1;
197
+ for (const term of terms) {
198
+ const index = lowerSource.indexOf(term.toLowerCase());
199
+ if (index !== -1 && (matchIndex === -1 || index < matchIndex)) {
200
+ matchIndex = index;
201
+ }
202
+ }
203
+ const CONTEXT_BEFORE = 40;
204
+ const CONTEXT_AFTER = 100;
205
+ const start = matchIndex === -1 ? 0 : Math.max(0, matchIndex - CONTEXT_BEFORE);
206
+ const end = matchIndex === -1 ? Math.min(source.length, CONTEXT_BEFORE + CONTEXT_AFTER) : Math.min(source.length, matchIndex + CONTEXT_AFTER);
207
+ const prefix = start > 0 ? "…" : "";
208
+ const suffix = end < source.length ? "…" : "";
209
+ return `${prefix}${source.slice(start, end).trim()}${suffix}`;
210
+ }
211
+ function hasAnyFilter(parsed) {
212
+ return Boolean(parsed.text ||
213
+ parsed.from ||
214
+ parsed.to ||
215
+ parsed.cc ||
216
+ parsed.subject ||
217
+ parsed.hasAttachment !== undefined ||
218
+ parsed.before ||
219
+ parsed.after ||
220
+ parsed.folderUid ||
221
+ parsed.flags?.length ||
222
+ parsed.labels?.length);
223
+ }
224
+ /** How many candidates are fetched/decrypted at once - bounds the burst of raw-MIME requests and
225
+ * concurrent WebCrypto work a large candidate page would otherwise fire all at once. */
226
+ export const TIER3_DECRYPT_CONCURRENCY = 4;
227
+ /** `Promise.allSettled()` over `items`, but never running more than `concurrency` `task`s at a time.
228
+ * Outcomes are returned in `items`' own order. */
229
+ async function settleWithConcurrency(items, concurrency, task) {
230
+ const outcomes = new Array(items.length);
231
+ let next = 0;
232
+ async function worker() {
233
+ while (next < items.length) {
234
+ const index = next++;
235
+ try {
236
+ outcomes[index] = { status: "fulfilled", value: await task(items[index]) };
237
+ }
238
+ catch (reason) {
239
+ outcomes[index] = { status: "rejected", reason };
240
+ }
241
+ }
242
+ }
243
+ await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
244
+ return outcomes;
245
+ }
246
+ /**
247
+ * Runs Tier 3 for one parsed query: fetches a bounded candidate set from the server, decrypts each
248
+ * candidate this device can open (at most `TIER3_DECRYPT_CONCURRENCY` at a time), and returns only the
249
+ * ones whose real (decrypted) content actually matches - each with a raw (not yet normalized) score the
250
+ * caller should run through `searchScoring.ts#normalizeServerScores()` alongside Tier 1's own scores
251
+ * before merging.
252
+ *
253
+ * Honors every operator `parseSearchQuery()` produces, not just free text: `subject:` must appear
254
+ * (case-insensitively) in the *decrypted* subject, and `has:attachment` is checked against the
255
+ * message's own `Message.hasAttachments` (fetched via `getMessage()` before decrypting, so a mismatch
256
+ * never pays for a decrypt). The candidates endpoint accepts neither filter, so both are applied here.
257
+ *
258
+ * Returns `[]` (never throws) when `unlocked` is absent or destroyed (`UnlockedKeys.destroyed`, checked on
259
+ * entry, before each decrypt and again before building results) - nothing can be decrypted without it, so
260
+ * there is nothing this tier can contribute - or when the query has no free text and no structured
261
+ * filter at all, mirroring `BaseSearchRoute`'s own "at least one of q or a filter" requirement rather
262
+ * than pulling a pointless full-mailbox candidate set.
263
+ */
264
+ export async function searchEncryptedCandidates(parsed, unlocked, limit = 50, options = {}) {
265
+ if (!unlocked || unlocked.destroyed || !hasAnyFilter(parsed)) {
266
+ return [];
267
+ }
268
+ const participants = [parsed.from, parsed.to, parsed.cc].filter((value) => Boolean(value));
269
+ const page = await candidates({
270
+ types: ["message"],
271
+ participants: participants.length > 0 ? participants : undefined,
272
+ before: parsed.before,
273
+ after: parsed.after,
274
+ folderUid: parsed.folderUid,
275
+ flags: parsed.flags,
276
+ labels: parsed.labels,
277
+ limit,
278
+ mailboxUid: options.mailboxUid,
279
+ });
280
+ const settled = await settleWithConcurrency(page.candidates.filter((candidate) => candidate.entityType === "message"), TIER3_DECRYPT_CONCURRENCY, async (candidate) => {
281
+ if (parsed.hasAttachment !== undefined) {
282
+ const message = await getMessage(candidate.entityUid);
283
+ if (Boolean(message.hasAttachments) !== parsed.hasAttachment) {
284
+ return undefined;
285
+ }
286
+ }
287
+ const rawMime = await getMessageRawContent(candidate.entityUid);
288
+ if (unlocked.destroyed) {
289
+ return undefined;
290
+ }
291
+ const security = await evaluateMessageSecurity(rawMime, unlocked);
292
+ return { entityUid: candidate.entityUid, security };
293
+ });
294
+ if (unlocked.destroyed) {
295
+ // Locked while candidates were being fetched/decrypted - don't surface decrypted content after a lock.
296
+ return [];
297
+ }
298
+ const subjectFilter = parsed.subject?.toLowerCase();
299
+ const results = [];
300
+ for (const outcome of settled) {
301
+ if (outcome.status === "rejected" || !outcome.value) {
302
+ continue;
303
+ }
304
+ const { entityUid, security } = outcome.value;
305
+ if (!security.html && !security.subject) {
306
+ // Nothing recovered - unprotected with no content override, a failed decrypt, or a
307
+ // signature failure with no body - this candidate contributes nothing Tier 1 didn't
308
+ // already have a chance to see, so there's no point matching against it here.
309
+ continue;
310
+ }
311
+ const subjectText = security.subject ?? "";
312
+ // Prefer the raw plain text when the body was text/plain - `html` is then only an escaped
313
+ // `<pre>` rendering of it (always set alongside `text`, so the guard above needn't check
314
+ // `text` separately) - and fall back to stripping a real text/html body.
315
+ const bodyText = security.text ?? (security.html ? stripHtml(security.html) : "");
316
+ if (subjectFilter && !subjectText.toLowerCase().includes(subjectFilter)) {
317
+ continue;
318
+ }
319
+ const haystack = `${subjectText} ${bodyText}`;
320
+ if (!matchesFreeText(parsed.text, haystack)) {
321
+ continue;
322
+ }
323
+ const score = countTermOccurrences(parsed.text, subjectText) * SEARCH_FIELD_WEIGHTS.subject +
324
+ countTermOccurrences(parsed.text, bodyText) * SEARCH_FIELD_WEIGHTS.body;
325
+ results.push({
326
+ entityType: "message",
327
+ entityUid,
328
+ score,
329
+ source: "candidate",
330
+ metadataOnly: false,
331
+ snippet: buildSnippet(parsed.text, subjectText, bodyText),
332
+ });
333
+ }
334
+ return results;
335
+ }
@@ -0,0 +1,85 @@
1
+ /** Typed wrappers over `@rapidmx/restapi`'s `/mail/tasks` REST surface — see `mailApi.ts`'s own header
2
+ * comment for the shared ACL/authorization model every wrapper file here follows. */
3
+ import { ApiClient } from "../util/api.js";
4
+ import { ListParams } from "../util/apiQuery.js";
5
+ export type TaskPriority = "low" | "normal" | "high";
6
+ export interface Task {
7
+ uid: string;
8
+ version: number;
9
+ dateCreated: string;
10
+ dateModified: string;
11
+ mailboxUid: string;
12
+ folderUid: string;
13
+ title: string;
14
+ body?: string;
15
+ dueDate?: string;
16
+ completed: boolean;
17
+ priority: TaskPriority;
18
+ reminderDate?: string;
19
+ /** The `TaskList` this task is a member of, if any — undefined means the default flat "Tasks" list. */
20
+ taskListUid?: string;
21
+ /** Whether the caller has manually added this task to their curated "My Day" working set. Absent is
22
+ * equivalent to `false` — not derived from `dueDate`, since an undated (or future-dated) task can
23
+ * still be added to today's list. */
24
+ myDay?: boolean;
25
+ /** The uid of the user this task is assigned to, if any. */
26
+ assignedTo?: string;
27
+ }
28
+ /** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
29
+ * account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
30
+ * own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
31
+ /** Lists a folder's tasks, soonest due date first (tasks with no due date sort last). */
32
+ export declare function listTasks(folderUid: string, params?: ListParams, client?: ApiClient): Promise<Task[]>;
33
+ export interface CreateTaskInput {
34
+ mailboxUid: string;
35
+ folderUid: string;
36
+ title: string;
37
+ body?: string;
38
+ dueDate?: string;
39
+ priority?: TaskPriority;
40
+ reminderDate?: string;
41
+ taskListUid?: string;
42
+ myDay?: boolean;
43
+ assignedTo?: string;
44
+ }
45
+ export declare function createTask(input: CreateTaskInput, client?: ApiClient): Promise<Task>;
46
+ export interface UpdateTaskInput {
47
+ uid: string;
48
+ version: number;
49
+ title?: string;
50
+ body?: string;
51
+ dueDate?: string;
52
+ completed?: boolean;
53
+ priority?: TaskPriority;
54
+ reminderDate?: string;
55
+ taskListUid?: string;
56
+ myDay?: boolean;
57
+ assignedTo?: string;
58
+ }
59
+ export declare function updateTask(input: UpdateTaskInput, client?: ApiClient): Promise<Task>;
60
+ /** Toggles a task's `completed` flag in place — same pattern as `mailApi.ts`'s `setMessageRead`. */
61
+ export declare function setTaskCompleted(task: Task, completed: boolean, client?: ApiClient): Promise<Task>;
62
+ /** Adds/removes a task from the caller's curated "My Day" working set — same thin-wrapper pattern as
63
+ * `setTaskCompleted`. */
64
+ export declare function setTaskMyDay(task: Task, myDay: boolean, client?: ApiClient): Promise<Task>;
65
+ export declare function deleteTask(uid: string, version: number, client?: ApiClient): Promise<void>;
66
+ export interface TaskList {
67
+ uid: string;
68
+ version: number;
69
+ dateCreated: string;
70
+ dateModified: string;
71
+ mailboxUid: string;
72
+ name: string;
73
+ }
74
+ /** Lists a mailbox's task lists (Outlook To-Do-style custom lists), alphabetically by name. */
75
+ export declare function listTaskLists(mailboxUid: string, params?: ListParams, client?: ApiClient): Promise<TaskList[]>;
76
+ export declare function createTaskList(input: {
77
+ mailboxUid: string;
78
+ name: string;
79
+ }, client?: ApiClient): Promise<TaskList>;
80
+ export declare function updateTaskList(input: {
81
+ uid: string;
82
+ version: number;
83
+ name: string;
84
+ }, client?: ApiClient): Promise<TaskList>;
85
+ export declare function deleteTaskList(uid: string, version: number, client?: ApiClient): Promise<void>;
@@ -0,0 +1,55 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /** Typed wrappers over `@rapidmx/restapi`'s `/mail/tasks` REST surface — see `mailApi.ts`'s own header
6
+ * comment for the shared ACL/authorization model every wrapper file here follows. */
7
+ import { withClient } from "../util/api.js";
8
+ import { buildQuery } from "../util/apiQuery.js";
9
+ /** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
10
+ * account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
11
+ * own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
12
+ /** Lists a folder's tasks, soonest due date first (tasks with no due date sort last). */
13
+ export function listTasks(folderUid, params = {}, client) {
14
+ return withClient(client, `/mail/tasks?${buildQuery(params, { folderUid, sort: JSON.stringify({ dueDate: "ASC" }) })}`);
15
+ }
16
+ export function createTask(input, client) {
17
+ return withClient(client, "/mail/tasks", {
18
+ method: "POST",
19
+ body: JSON.stringify({ completed: false, priority: "normal", ...input }),
20
+ });
21
+ }
22
+ export function updateTask(input, client) {
23
+ return withClient(client, `/mail/tasks/${encodeURIComponent(input.uid)}`, {
24
+ method: "PUT",
25
+ body: JSON.stringify(input),
26
+ });
27
+ }
28
+ /** Toggles a task's `completed` flag in place — same pattern as `mailApi.ts`'s `setMessageRead`. */
29
+ export function setTaskCompleted(task, completed, client) {
30
+ return updateTask({ uid: task.uid, version: task.version, completed }, client);
31
+ }
32
+ /** Adds/removes a task from the caller's curated "My Day" working set — same thin-wrapper pattern as
33
+ * `setTaskCompleted`. */
34
+ export function setTaskMyDay(task, myDay, client) {
35
+ return updateTask({ uid: task.uid, version: task.version, myDay }, client);
36
+ }
37
+ export function deleteTask(uid, version, client) {
38
+ return withClient(client, `/mail/tasks/${encodeURIComponent(uid)}?version=${version}`, { method: "DELETE" });
39
+ }
40
+ /** Lists a mailbox's task lists (Outlook To-Do-style custom lists), alphabetically by name. */
41
+ export function listTaskLists(mailboxUid, params = {}, client) {
42
+ return withClient(client, `/mail/task-lists?${buildQuery(params, { mailboxUid, sort: JSON.stringify({ name: "ASC" }) })}`);
43
+ }
44
+ export function createTaskList(input, client) {
45
+ return withClient(client, "/mail/task-lists", { method: "POST", body: JSON.stringify(input) });
46
+ }
47
+ export function updateTaskList(input, client) {
48
+ return withClient(client, `/mail/task-lists/${encodeURIComponent(input.uid)}`, {
49
+ method: "PUT",
50
+ body: JSON.stringify(input),
51
+ });
52
+ }
53
+ export function deleteTaskList(uid, version, client) {
54
+ return withClient(client, `/mail/task-lists/${encodeURIComponent(uid)}?version=${version}`, { method: "DELETE" });
55
+ }