gucmail 1.1.0__tar.gz

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 (542) hide show
  1. gucmail-1.1.0/.gitignore +52 -0
  2. gucmail-1.1.0/PKG-INFO +227 -0
  3. gucmail-1.1.0/README.md +175 -0
  4. gucmail-1.1.0/docs/STATUS.md +34 -0
  5. gucmail-1.1.0/docs/advanced/index.md +50 -0
  6. gucmail-1.1.0/docs/api/index.md +19 -0
  7. gucmail-1.1.0/docs/architecture/index.md +191 -0
  8. gucmail-1.1.0/docs/backup/index.md +169 -0
  9. gucmail-1.1.0/docs/calendar/index.md +195 -0
  10. gucmail-1.1.0/docs/command-reference/index.md +245 -0
  11. gucmail-1.1.0/docs/configuration/index.md +508 -0
  12. gucmail-1.1.0/docs/contacts/groups.md +52 -0
  13. gucmail-1.1.0/docs/contacts/index.md +169 -0
  14. gucmail-1.1.0/docs/development/index.md +43 -0
  15. gucmail-1.1.0/docs/development/live-readonly-smoke.md +57 -0
  16. gucmail-1.1.0/docs/ews/index.md +38 -0
  17. gucmail-1.1.0/docs/ews/known-server-limitations.md +30 -0
  18. gucmail-1.1.0/docs/ews/operation-matrix.md +101 -0
  19. gucmail-1.1.0/docs/examples/backup-layout.example.txt +9 -0
  20. gucmail-1.1.0/docs/examples/config.example.toml +34 -0
  21. gucmail-1.1.0/docs/examples/ndjson-events.example.ndjson +2 -0
  22. gucmail-1.1.0/docs/examples/scheduled-timeline.example.txt +5 -0
  23. gucmail-1.1.0/docs/examples/webhook-event.example.json +18 -0
  24. gucmail-1.1.0/docs/features/index.md +108 -0
  25. gucmail-1.1.0/docs/features/storage-and-quota.md +65 -0
  26. gucmail-1.1.0/docs/features/support-status.md +81 -0
  27. gucmail-1.1.0/docs/getting-started/index.md +424 -0
  28. gucmail-1.1.0/docs/glossary/index.md +71 -0
  29. gucmail-1.1.0/docs/img/backups.png +0 -0
  30. gucmail-1.1.0/docs/img/calendar.png +0 -0
  31. gucmail-1.1.0/docs/img/compose.png +0 -0
  32. gucmail-1.1.0/docs/img/contacts.png +0 -0
  33. gucmail-1.1.0/docs/img/mail-browse-demo.gif +0 -0
  34. gucmail-1.1.0/docs/img/mail.png +0 -0
  35. gucmail-1.1.0/docs/img/palette-demo.gif +0 -0
  36. gucmail-1.1.0/docs/img/palette.png +0 -0
  37. gucmail-1.1.0/docs/img/scheduled.png +0 -0
  38. gucmail-1.1.0/docs/img/settings.png +0 -0
  39. gucmail-1.1.0/docs/img/tasks.png +0 -0
  40. gucmail-1.1.0/docs/img/themes.png +0 -0
  41. gucmail-1.1.0/docs/index.md +61 -0
  42. gucmail-1.1.0/docs/integrations/automatic-replies.md +31 -0
  43. gucmail-1.1.0/docs/integrations/discord.md +64 -0
  44. gucmail-1.1.0/docs/integrations/inbox-rules.md +50 -0
  45. gucmail-1.1.0/docs/integrations/index.md +38 -0
  46. gucmail-1.1.0/docs/integrations/windows-desktop.md +108 -0
  47. gucmail-1.1.0/docs/monitoring/headless-deployment.md +95 -0
  48. gucmail-1.1.0/docs/monitoring/index.md +119 -0
  49. gucmail-1.1.0/docs/privacy-and-security/index.md +109 -0
  50. gucmail-1.1.0/docs/privacy-and-security/local-data-locations-and-retention.md +25 -0
  51. gucmail-1.1.0/docs/scheduling/index.md +214 -0
  52. gucmail-1.1.0/docs/scheduling/windows-task-scheduler.md +80 -0
  53. gucmail-1.1.0/docs/search/index.md +398 -0
  54. gucmail-1.1.0/docs/tasks/index.md +202 -0
  55. gucmail-1.1.0/docs/troubleshooting/index.md +113 -0
  56. gucmail-1.1.0/docs/user-guide/index.md +87 -0
  57. gucmail-1.1.0/pyproject.toml +163 -0
  58. gucmail-1.1.0/requirements.lock +79 -0
  59. gucmail-1.1.0/scripts/build_theme_catalogue.py +42 -0
  60. gucmail-1.1.0/scripts/capture_continuation_workflows.py +525 -0
  61. gucmail-1.1.0/scripts/generate_ews_operation_matrix.py +71 -0
  62. gucmail-1.1.0/scripts/generate_shortcut_catalog.py +138 -0
  63. gucmail-1.1.0/scripts/live_readonly_smoke.py +360 -0
  64. gucmail-1.1.0/scripts/offline_audit/__init__.py +1 -0
  65. gucmail-1.1.0/scripts/offline_audit/benchmark.py +101 -0
  66. gucmail-1.1.0/scripts/offline_audit/children.py +16 -0
  67. gucmail-1.1.0/scripts/offline_audit/datasets.py +217 -0
  68. gucmail-1.1.0/scripts/offline_audit/guard.py +462 -0
  69. gucmail-1.1.0/scripts/offline_audit/install.py +45 -0
  70. gucmail-1.1.0/scripts/offline_audit/mailbox.py +458 -0
  71. gucmail-1.1.0/scripts/offline_audit/preflight.py +99 -0
  72. gucmail-1.1.0/scripts/offline_audit/run.py +143 -0
  73. gucmail-1.1.0/scripts/offline_audit/workflows.py +179 -0
  74. gucmail-1.1.0/scripts/readiness_mail.py +437 -0
  75. gucmail-1.1.0/scripts/readiness_restore_replay_probe.py +126 -0
  76. gucmail-1.1.0/scripts/readiness_restore_ui_probe.py +148 -0
  77. gucmail-1.1.0/scripts/readiness_startup.py +243 -0
  78. gucmail-1.1.0/src/gucmail/__init__.py +7 -0
  79. gucmail-1.1.0/src/gucmail/__main__.py +6 -0
  80. gucmail-1.1.0/src/gucmail/actions.py +200 -0
  81. gucmail-1.1.0/src/gucmail/backup_format.py +740 -0
  82. gucmail-1.1.0/src/gucmail/bootstrap.py +157 -0
  83. gucmail-1.1.0/src/gucmail/cli.py +9024 -0
  84. gucmail-1.1.0/src/gucmail/command_catalog.py +2464 -0
  85. gucmail-1.1.0/src/gucmail/commands.py +1181 -0
  86. gucmail-1.1.0/src/gucmail/config.py +1323 -0
  87. gucmail-1.1.0/src/gucmail/constants.py +20 -0
  88. gucmail-1.1.0/src/gucmail/credentials.py +309 -0
  89. gucmail-1.1.0/src/gucmail/data/__init__.py +1 -0
  90. gucmail-1.1.0/src/gucmail/data/builtin-themes.json.gz +0 -0
  91. gucmail-1.1.0/src/gucmail/data/command_corpus.json +993 -0
  92. gucmail-1.1.0/src/gucmail/data/shortcut_catalog.json +2952 -0
  93. gucmail-1.1.0/src/gucmail/dates.py +235 -0
  94. gucmail-1.1.0/src/gucmail/doctor.py +155 -0
  95. gucmail-1.1.0/src/gucmail/errors.py +196 -0
  96. gucmail-1.1.0/src/gucmail/ews/__init__.py +5 -0
  97. gucmail-1.1.0/src/gucmail/ews/adapter.py +5601 -0
  98. gucmail-1.1.0/src/gucmail/ews/capabilities.py +711 -0
  99. gucmail-1.1.0/src/gucmail/ews/delegates.py +115 -0
  100. gucmail-1.1.0/src/gucmail/ews/inbox_rules.py +225 -0
  101. gucmail-1.1.0/src/gucmail/ews/mapping.py +940 -0
  102. gucmail-1.1.0/src/gucmail/ews/native_items.py +166 -0
  103. gucmail-1.1.0/src/gucmail/ews/soap.py +267 -0
  104. gucmail-1.1.0/src/gucmail/ews/sync.py +101 -0
  105. gucmail-1.1.0/src/gucmail/file_completion.py +58 -0
  106. gucmail-1.1.0/src/gucmail/formatting.py +183 -0
  107. gucmail-1.1.0/src/gucmail/headless.py +1050 -0
  108. gucmail-1.1.0/src/gucmail/help/__init__.py +62 -0
  109. gucmail-1.1.0/src/gucmail/help/catalog.toml +889 -0
  110. gucmail-1.1.0/src/gucmail/help/cli_syntax.py +183 -0
  111. gucmail-1.1.0/src/gucmail/help/history.py +159 -0
  112. gucmail-1.1.0/src/gucmail/help/links.py +93 -0
  113. gucmail-1.1.0/src/gucmail/help/models.py +234 -0
  114. gucmail-1.1.0/src/gucmail/help/pages/advanced/ews.md +19 -0
  115. gucmail-1.1.0/src/gucmail/help/pages/appearance/branding.md +15 -0
  116. gucmail-1.1.0/src/gucmail/help/pages/appearance/layout.md +41 -0
  117. gucmail-1.1.0/src/gucmail/help/pages/appearance/themes.md +11 -0
  118. gucmail-1.1.0/src/gucmail/help/pages/attachments/safety.md +13 -0
  119. gucmail-1.1.0/src/gucmail/help/pages/backup/offline.md +13 -0
  120. gucmail-1.1.0/src/gucmail/help/pages/backup/overview.md +49 -0
  121. gucmail-1.1.0/src/gucmail/help/pages/diagnostics/doctor.md +11 -0
  122. gucmail-1.1.0/src/gucmail/help/pages/faq/common.md +52 -0
  123. gucmail-1.1.0/src/gucmail/help/pages/faq/pc-on.md +13 -0
  124. gucmail-1.1.0/src/gucmail/help/pages/integrations/discord.md +38 -0
  125. gucmail-1.1.0/src/gucmail/help/pages/integrations/providers.md +40 -0
  126. gucmail-1.1.0/src/gucmail/help/pages/integrations/webhooks.md +34 -0
  127. gucmail-1.1.0/src/gucmail/help/pages/mail/compose.md +53 -0
  128. gucmail-1.1.0/src/gucmail/help/pages/mail/deleted-items.md +14 -0
  129. gucmail-1.1.0/src/gucmail/help/pages/mail/drafts.md +43 -0
  130. gucmail-1.1.0/src/gucmail/help/pages/mail/folders.md +43 -0
  131. gucmail-1.1.0/src/gucmail/help/pages/mail/reading.md +62 -0
  132. gucmail-1.1.0/src/gucmail/help/pages/mail/scheduled.md +13 -0
  133. gucmail-1.1.0/src/gucmail/help/pages/notifications/monitoring.md +17 -0
  134. gucmail-1.1.0/src/gucmail/help/pages/notifications/rules.md +75 -0
  135. gucmail-1.1.0/src/gucmail/help/pages/notifications/windows-startup.md +64 -0
  136. gucmail-1.1.0/src/gucmail/help/pages/notifications/windows.md +59 -0
  137. gucmail-1.1.0/src/gucmail/help/pages/palette/overview.md +21 -0
  138. gucmail-1.1.0/src/gucmail/help/pages/pim/calendar.md +105 -0
  139. gucmail-1.1.0/src/gucmail/help/pages/pim/contacts.md +95 -0
  140. gucmail-1.1.0/src/gucmail/help/pages/pim/tasks.md +113 -0
  141. gucmail-1.1.0/src/gucmail/help/pages/privacy/credentials.md +11 -0
  142. gucmail-1.1.0/src/gucmail/help/pages/privacy/local-data.md +19 -0
  143. gucmail-1.1.0/src/gucmail/help/pages/reference/commands.md +11 -0
  144. gucmail-1.1.0/src/gucmail/help/pages/reference/glossary.md +127 -0
  145. gucmail-1.1.0/src/gucmail/help/pages/reference/shortcuts.md +47 -0
  146. gucmail-1.1.0/src/gucmail/help/pages/search/local.md +93 -0
  147. gucmail-1.1.0/src/gucmail/help/pages/search/overview.md +56 -0
  148. gucmail-1.1.0/src/gucmail/help/pages/server/headless.md +70 -0
  149. gucmail-1.1.0/src/gucmail/help/pages/settings/overview.md +25 -0
  150. gucmail-1.1.0/src/gucmail/help/pages/start/first-launch.md +47 -0
  151. gucmail-1.1.0/src/gucmail/help/pages/start/interface.md +43 -0
  152. gucmail-1.1.0/src/gucmail/help/pages/start/login.md +13 -0
  153. gucmail-1.1.0/src/gucmail/help/pages/start/overview.md +20 -0
  154. gucmail-1.1.0/src/gucmail/help/pages/start/using-help.md +46 -0
  155. gucmail-1.1.0/src/gucmail/help/pages/storage/cleanup.md +11 -0
  156. gucmail-1.1.0/src/gucmail/help/pages/storage/quota.md +50 -0
  157. gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/backup-search.md +47 -0
  158. gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/connection.md +32 -0
  159. gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/database.md +13 -0
  160. gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/notifications.md +35 -0
  161. gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/sending.md +13 -0
  162. gucmail-1.1.0/src/gucmail/help/pages/tutorials/backup.md +18 -0
  163. gucmail-1.1.0/src/gucmail/help/pages/tutorials/first-message.md +16 -0
  164. gucmail-1.1.0/src/gucmail/help/pages/tutorials/notifications.md +13 -0
  165. gucmail-1.1.0/src/gucmail/help/pages/tutorials/palette.md +13 -0
  166. gucmail-1.1.0/src/gucmail/help/pages/tutorials/scheduling.md +16 -0
  167. gucmail-1.1.0/src/gucmail/help/reference.py +371 -0
  168. gucmail-1.1.0/src/gucmail/help/repository.py +475 -0
  169. gucmail-1.1.0/src/gucmail/help/search.py +392 -0
  170. gucmail-1.1.0/src/gucmail/help/structure.py +139 -0
  171. gucmail-1.1.0/src/gucmail/help/tutorials.py +374 -0
  172. gucmail-1.1.0/src/gucmail/help/validation.py +379 -0
  173. gucmail-1.1.0/src/gucmail/logging_config.py +47 -0
  174. gucmail-1.1.0/src/gucmail/models.py +767 -0
  175. gucmail-1.1.0/src/gucmail/nlp.py +3057 -0
  176. gucmail-1.1.0/src/gucmail/notification_events.py +386 -0
  177. gucmail-1.1.0/src/gucmail/notification_history.py +459 -0
  178. gucmail-1.1.0/src/gucmail/notification_policies.py +1239 -0
  179. gucmail-1.1.0/src/gucmail/notification_providers/__init__.py +163 -0
  180. gucmail-1.1.0/src/gucmail/notification_providers/compat.py +283 -0
  181. gucmail-1.1.0/src/gucmail/notification_providers/core.py +712 -0
  182. gucmail-1.1.0/src/gucmail/notification_providers/reliability.py +373 -0
  183. gucmail-1.1.0/src/gucmail/notification_providers/webhook_payloads.py +734 -0
  184. gucmail-1.1.0/src/gucmail/notification_providers/windows.py +493 -0
  185. gucmail-1.1.0/src/gucmail/notification_rules.py +1217 -0
  186. gucmail-1.1.0/src/gucmail/onboarding.py +122 -0
  187. gucmail-1.1.0/src/gucmail/output.py +157 -0
  188. gucmail-1.1.0/src/gucmail/palette.py +639 -0
  189. gucmail-1.1.0/src/gucmail/platform_scheduler.py +403 -0
  190. gucmail-1.1.0/src/gucmail/py.typed +1 -0
  191. gucmail-1.1.0/src/gucmail/scheduler_entry.py +23 -0
  192. gucmail-1.1.0/src/gucmail/secret_store.py +263 -0
  193. gucmail-1.1.0/src/gucmail/security.py +222 -0
  194. gucmail-1.1.0/src/gucmail/services/__init__.py +100 -0
  195. gucmail-1.1.0/src/gucmail/services/_base.py +169 -0
  196. gucmail-1.1.0/src/gucmail/services/attachment_indexing.py +395 -0
  197. gucmail-1.1.0/src/gucmail/services/attachment_preferences.py +20 -0
  198. gucmail-1.1.0/src/gucmail/services/attachment_uploads.py +40 -0
  199. gucmail-1.1.0/src/gucmail/services/attachments.py +454 -0
  200. gucmail-1.1.0/src/gucmail/services/automatic_replies.py +158 -0
  201. gucmail-1.1.0/src/gucmail/services/backup.py +3005 -0
  202. gucmail-1.1.0/src/gucmail/services/calendar.py +1151 -0
  203. gucmail-1.1.0/src/gucmail/services/calendar_display.py +151 -0
  204. gucmail-1.1.0/src/gucmail/services/calendar_history.py +92 -0
  205. gucmail-1.1.0/src/gucmail/services/calendar_paging.py +186 -0
  206. gucmail-1.1.0/src/gucmail/services/calendar_preferences.py +88 -0
  207. gucmail-1.1.0/src/gucmail/services/calendar_working_time.py +211 -0
  208. gucmail-1.1.0/src/gucmail/services/cleanup.py +465 -0
  209. gucmail-1.1.0/src/gucmail/services/clusters.py +1048 -0
  210. gucmail-1.1.0/src/gucmail/services/compose.py +896 -0
  211. gucmail-1.1.0/src/gucmail/services/compose_preferences.py +115 -0
  212. gucmail-1.1.0/src/gucmail/services/contact_groups.py +250 -0
  213. gucmail-1.1.0/src/gucmail/services/contact_history.py +165 -0
  214. gucmail-1.1.0/src/gucmail/services/contact_preferences.py +70 -0
  215. gucmail-1.1.0/src/gucmail/services/contacts.py +1265 -0
  216. gucmail-1.1.0/src/gucmail/services/contacts_display.py +124 -0
  217. gucmail-1.1.0/src/gucmail/services/delegates.py +98 -0
  218. gucmail-1.1.0/src/gucmail/services/drafts.py +1601 -0
  219. gucmail-1.1.0/src/gucmail/services/editor.py +231 -0
  220. gucmail-1.1.0/src/gucmail/services/exchange_values.py +164 -0
  221. gucmail-1.1.0/src/gucmail/services/extractors.py +1081 -0
  222. gucmail-1.1.0/src/gucmail/services/folders.py +408 -0
  223. gucmail-1.1.0/src/gucmail/services/gateway.py +16 -0
  224. gucmail-1.1.0/src/gucmail/services/inbox_rules.py +172 -0
  225. gucmail-1.1.0/src/gucmail/services/index.py +1134 -0
  226. gucmail-1.1.0/src/gucmail/services/insights.py +764 -0
  227. gucmail-1.1.0/src/gucmail/services/interchange.py +878 -0
  228. gucmail-1.1.0/src/gucmail/services/keyboard_bindings.py +144 -0
  229. gucmail-1.1.0/src/gucmail/services/keyboard_preferences.py +165 -0
  230. gucmail-1.1.0/src/gucmail/services/layout_presets.py +164 -0
  231. gucmail-1.1.0/src/gucmail/services/local_features.py +295 -0
  232. gucmail-1.1.0/src/gucmail/services/local_search.py +571 -0
  233. gucmail-1.1.0/src/gucmail/services/mail_preferences.py +159 -0
  234. gucmail-1.1.0/src/gucmail/services/message_columns.py +99 -0
  235. gucmail-1.1.0/src/gucmail/services/message_export.py +146 -0
  236. gucmail-1.1.0/src/gucmail/services/message_scan.py +47 -0
  237. gucmail-1.1.0/src/gucmail/services/messages.py +521 -0
  238. gucmail-1.1.0/src/gucmail/services/monitoring.py +1209 -0
  239. gucmail-1.1.0/src/gucmail/services/monitoring_outbox.py +729 -0
  240. gucmail-1.1.0/src/gucmail/services/monitoring_preferences.py +154 -0
  241. gucmail-1.1.0/src/gucmail/services/notification_configuration.py +2206 -0
  242. gucmail-1.1.0/src/gucmail/services/notification_rule_editing.py +88 -0
  243. gucmail-1.1.0/src/gucmail/services/notification_simulation.py +84 -0
  244. gucmail-1.1.0/src/gucmail/services/notifications.py +787 -0
  245. gucmail-1.1.0/src/gucmail/services/ocr.py +550 -0
  246. gucmail-1.1.0/src/gucmail/services/pim.py +166 -0
  247. gucmail-1.1.0/src/gucmail/services/pim_preferences.py +236 -0
  248. gucmail-1.1.0/src/gucmail/services/profiled_notifications.py +683 -0
  249. gucmail-1.1.0/src/gucmail/services/quota.py +1050 -0
  250. gucmail-1.1.0/src/gucmail/services/recipient_assistance.py +141 -0
  251. gucmail-1.1.0/src/gucmail/services/recurrence.py +1776 -0
  252. gucmail-1.1.0/src/gucmail/services/recurring.py +642 -0
  253. gucmail-1.1.0/src/gucmail/services/restore_journal.py +247 -0
  254. gucmail-1.1.0/src/gucmail/services/scheduler.py +1513 -0
  255. gucmail-1.1.0/src/gucmail/services/search.py +1386 -0
  256. gucmail-1.1.0/src/gucmail/services/semantic.py +568 -0
  257. gucmail-1.1.0/src/gucmail/services/semantic_model.py +370 -0
  258. gucmail-1.1.0/src/gucmail/services/semantic_search.py +157 -0
  259. gucmail-1.1.0/src/gucmail/services/send_attempts.py +138 -0
  260. gucmail-1.1.0/src/gucmail/services/shell_preferences.py +69 -0
  261. gucmail-1.1.0/src/gucmail/services/shortcuts.py +141 -0
  262. gucmail-1.1.0/src/gucmail/services/startup_runtime.py +408 -0
  263. gucmail-1.1.0/src/gucmail/services/task_history.py +276 -0
  264. gucmail-1.1.0/src/gucmail/services/task_recurrence.py +122 -0
  265. gucmail-1.1.0/src/gucmail/services/tasks.py +791 -0
  266. gucmail-1.1.0/src/gucmail/services/tasks_display.py +171 -0
  267. gucmail-1.1.0/src/gucmail/services/ui_session.py +138 -0
  268. gucmail-1.1.0/src/gucmail/services/unanswered.py +235 -0
  269. gucmail-1.1.0/src/gucmail/services/watcher_runtime.py +103 -0
  270. gucmail-1.1.0/src/gucmail/services/webhooks.py +1064 -0
  271. gucmail-1.1.0/src/gucmail/services/windows_desktop.py +503 -0
  272. gucmail-1.1.0/src/gucmail/settings.py +4054 -0
  273. gucmail-1.1.0/src/gucmail/startup.py +884 -0
  274. gucmail-1.1.0/src/gucmail/state.py +4190 -0
  275. gucmail-1.1.0/src/gucmail/state_health.py +362 -0
  276. gucmail-1.1.0/src/gucmail/toast_entry.py +91 -0
  277. gucmail-1.1.0/src/gucmail/tui/__init__.py +10 -0
  278. gucmail-1.1.0/src/gucmail/tui/activity_screen.py +955 -0
  279. gucmail-1.1.0/src/gucmail/tui/app.py +13098 -0
  280. gucmail-1.1.0/src/gucmail/tui/appearance_screen.py +1447 -0
  281. gucmail-1.1.0/src/gucmail/tui/area_backends.py +3705 -0
  282. gucmail-1.1.0/src/gucmail/tui/area_common.py +685 -0
  283. gucmail-1.1.0/src/gucmail/tui/automatic_replies_screen.py +224 -0
  284. gucmail-1.1.0/src/gucmail/tui/backup_screen.py +2460 -0
  285. gucmail-1.1.0/src/gucmail/tui/branding.py +1414 -0
  286. gucmail-1.1.0/src/gucmail/tui/branding_screen.py +750 -0
  287. gucmail-1.1.0/src/gucmail/tui/composer_submission.py +373 -0
  288. gucmail-1.1.0/src/gucmail/tui/contact_fields.py +103 -0
  289. gucmail-1.1.0/src/gucmail/tui/contact_groups_screen.py +360 -0
  290. gucmail-1.1.0/src/gucmail/tui/contact_history_screen.py +130 -0
  291. gucmail-1.1.0/src/gucmail/tui/delegates_screen.py +137 -0
  292. gucmail-1.1.0/src/gucmail/tui/desktop_setup_screen.py +133 -0
  293. gucmail-1.1.0/src/gucmail/tui/diagnostics_screen.py +711 -0
  294. gucmail-1.1.0/src/gucmail/tui/drafts_attachments_backend.py +1148 -0
  295. gucmail-1.1.0/src/gucmail/tui/drafts_attachments_screen.py +1241 -0
  296. gucmail-1.1.0/src/gucmail/tui/inbox_rules_screen.py +285 -0
  297. gucmail-1.1.0/src/gucmail/tui/keyboard_bindings.py +44 -0
  298. gucmail-1.1.0/src/gucmail/tui/keyboard_editor.py +476 -0
  299. gucmail-1.1.0/src/gucmail/tui/layout_presets_screen.py +205 -0
  300. gucmail-1.1.0/src/gucmail/tui/literal_select.py +23 -0
  301. gucmail-1.1.0/src/gucmail/tui/literal_table.py +79 -0
  302. gucmail-1.1.0/src/gucmail/tui/local_search_screen.py +562 -0
  303. gucmail-1.1.0/src/gucmail/tui/message_columns_preview.py +91 -0
  304. gucmail-1.1.0/src/gucmail/tui/message_columns_screen.py +193 -0
  305. gucmail-1.1.0/src/gucmail/tui/notification_reader.py +105 -0
  306. gucmail-1.1.0/src/gucmail/tui/notification_rule_builder.py +474 -0
  307. gucmail-1.1.0/src/gucmail/tui/notification_settings_screen.py +4255 -0
  308. gucmail-1.1.0/src/gucmail/tui/ocr_screen.py +236 -0
  309. gucmail-1.1.0/src/gucmail/tui/offline_pim_screen.py +345 -0
  310. gucmail-1.1.0/src/gucmail/tui/palette_routes.py +2078 -0
  311. gucmail-1.1.0/src/gucmail/tui/pim_screens.py +6363 -0
  312. gucmail-1.1.0/src/gucmail/tui/pim_submission.py +235 -0
  313. gucmail-1.1.0/src/gucmail/tui/recipient_suggester.py +15 -0
  314. gucmail-1.1.0/src/gucmail/tui/runtime.py +92 -0
  315. gucmail-1.1.0/src/gucmail/tui/saved_search_screen.py +948 -0
  316. gucmail-1.1.0/src/gucmail/tui/scheduled_screen.py +1216 -0
  317. gucmail-1.1.0/src/gucmail/tui/semantic_screen.py +298 -0
  318. gucmail-1.1.0/src/gucmail/tui/settings_form.py +152 -0
  319. gucmail-1.1.0/src/gucmail/tui/settings_screen.py +2163 -0
  320. gucmail-1.1.0/src/gucmail/tui/shortcuts_screen.py +453 -0
  321. gucmail-1.1.0/src/gucmail/tui/stable_footer.py +58 -0
  322. gucmail-1.1.0/src/gucmail/tui/startup_screen.py +194 -0
  323. gucmail-1.1.0/src/gucmail/tui/storage_screen.py +1082 -0
  324. gucmail-1.1.0/src/gucmail/tui/task_delete_screen.py +122 -0
  325. gucmail-1.1.0/src/gucmail/tui/theme_repository.py +502 -0
  326. gucmail-1.1.0/src/gucmail/tui/themes.py +2482 -0
  327. gucmail-1.1.0/src/gucmail/tui/tutorial_screen.py +256 -0
  328. gucmail-1.1.0/src/gucmail/tui/unanswered_screen.py +188 -0
  329. gucmail-1.1.0/src/gucmail/tui/visual_language.py +187 -0
  330. gucmail-1.1.0/src/gucmail/tui/write_coordinator.py +165 -0
  331. gucmail-1.1.0/src/gucmail/watcher_entry.py +42 -0
  332. gucmail-1.1.0/src/gucmail/windows_identity.py +78 -0
  333. gucmail-1.1.0/tests/attachment_worker_fixtures.py +15 -0
  334. gucmail-1.1.0/tests/fixtures/guc-logo-source.png +0 -0
  335. gucmail-1.1.0/tests/fixtures/semantic-local-lsa-v1-provenance.json +19 -0
  336. gucmail-1.1.0/tests/fixtures/semantic-local-lsa-v1.json +1 -0
  337. gucmail-1.1.0/tests/test_acceptance_ews_regressions.py +798 -0
  338. gucmail-1.1.0/tests/test_activity_operation_recovery.py +90 -0
  339. gucmail-1.1.0/tests/test_advanced_search_prompt.py +87 -0
  340. gucmail-1.1.0/tests/test_appearance_browsers.py +476 -0
  341. gucmail-1.1.0/tests/test_appearance_settings_refresh.py +85 -0
  342. gucmail-1.1.0/tests/test_attachment_index_controls.py +335 -0
  343. gucmail-1.1.0/tests/test_attachment_index_producer.py +265 -0
  344. gucmail-1.1.0/tests/test_attachment_index_tui.py +200 -0
  345. gucmail-1.1.0/tests/test_attachment_preferences.py +513 -0
  346. gucmail-1.1.0/tests/test_automatic_replies.py +300 -0
  347. gucmail-1.1.0/tests/test_backup.py +538 -0
  348. gucmail-1.1.0/tests/test_backup_pim_boundary.py +151 -0
  349. gucmail-1.1.0/tests/test_backup_scope.py +266 -0
  350. gucmail-1.1.0/tests/test_bootstrap.py +114 -0
  351. gucmail-1.1.0/tests/test_branding_browser_io.py +305 -0
  352. gucmail-1.1.0/tests/test_branding_secondpass.py +177 -0
  353. gucmail-1.1.0/tests/test_builtin_theme_catalogue.py +99 -0
  354. gucmail-1.1.0/tests/test_calendar_continuation.py +199 -0
  355. gucmail-1.1.0/tests/test_calendar_display_preferences.py +406 -0
  356. gucmail-1.1.0/tests/test_calendar_history.py +343 -0
  357. gucmail-1.1.0/tests/test_calendar_operations.py +497 -0
  358. gucmail-1.1.0/tests/test_calendar_scope_safety.py +323 -0
  359. gucmail-1.1.0/tests/test_calendar_secondpass.py +553 -0
  360. gucmail-1.1.0/tests/test_calendar_working_time.py +491 -0
  361. gucmail-1.1.0/tests/test_cleanup_operation_recovery.py +221 -0
  362. gucmail-1.1.0/tests/test_cleanup_tui_secondpass.py +220 -0
  363. gucmail-1.1.0/tests/test_cli.py +380 -0
  364. gucmail-1.1.0/tests/test_cli_core_mail_output.py +160 -0
  365. gucmail-1.1.0/tests/test_command_registry_contract.py +448 -0
  366. gucmail-1.1.0/tests/test_compose_preferences.py +611 -0
  367. gucmail-1.1.0/tests/test_composer_handoffs.py +128 -0
  368. gucmail-1.1.0/tests/test_composer_status_isolation.py +432 -0
  369. gucmail-1.1.0/tests/test_composer_submission_recovery.py +321 -0
  370. gucmail-1.1.0/tests/test_config_atomic_snapshots.py +269 -0
  371. gucmail-1.1.0/tests/test_contact_groups.py +431 -0
  372. gucmail-1.1.0/tests/test_contact_operations.py +690 -0
  373. gucmail-1.1.0/tests/test_contacts_detail_keyboard.py +51 -0
  374. gucmail-1.1.0/tests/test_contacts_display_preferences.py +407 -0
  375. gucmail-1.1.0/tests/test_contacts_secondpass.py +376 -0
  376. gucmail-1.1.0/tests/test_delegates.py +447 -0
  377. gucmail-1.1.0/tests/test_diagnostics_tui_secondpass.py +349 -0
  378. gucmail-1.1.0/tests/test_display_and_capability_settings.py +59 -0
  379. gucmail-1.1.0/tests/test_documentation.py +115 -0
  380. gucmail-1.1.0/tests/test_draft_delete_review.py +128 -0
  381. gucmail-1.1.0/tests/test_draft_paging.py +286 -0
  382. gucmail-1.1.0/tests/test_drafts.py +164 -0
  383. gucmail-1.1.0/tests/test_editor_secondpass.py +72 -0
  384. gucmail-1.1.0/tests/test_ews_adapter.py +1010 -0
  385. gucmail-1.1.0/tests/test_ews_adapter_core_regressions.py +232 -0
  386. gucmail-1.1.0/tests/test_expert_request_boundaries.py +100 -0
  387. gucmail-1.1.0/tests/test_explicit_folder_reference_nlp.py +40 -0
  388. gucmail-1.1.0/tests/test_explicit_search_scope.py +50 -0
  389. gucmail-1.1.0/tests/test_file_completion.py +89 -0
  390. gucmail-1.1.0/tests/test_folder_path_roundtrip.py +75 -0
  391. gucmail-1.1.0/tests/test_folder_properties_layout.py +68 -0
  392. gucmail-1.1.0/tests/test_folder_reference_paths.py +413 -0
  393. gucmail-1.1.0/tests/test_folder_reference_recovery.py +187 -0
  394. gucmail-1.1.0/tests/test_folder_role_search_scope.py +119 -0
  395. gucmail-1.1.0/tests/test_folder_selection_race.py +101 -0
  396. gucmail-1.1.0/tests/test_folder_tree_secondpass.py +703 -0
  397. gucmail-1.1.0/tests/test_foundations.py +304 -0
  398. gucmail-1.1.0/tests/test_frontend_overhaul.py +70 -0
  399. gucmail-1.1.0/tests/test_general_keyboard_bindings.py +819 -0
  400. gucmail-1.1.0/tests/test_headless_startup.py +676 -0
  401. gucmail-1.1.0/tests/test_help.py +235 -0
  402. gucmail-1.1.0/tests/test_help_cli_syntax.py +325 -0
  403. gucmail-1.1.0/tests/test_help_completion.py +278 -0
  404. gucmail-1.1.0/tests/test_help_integrity.py +192 -0
  405. gucmail-1.1.0/tests/test_inbox_rules.py +407 -0
  406. gucmail-1.1.0/tests/test_index.py +82 -0
  407. gucmail-1.1.0/tests/test_index_batches_and_streaming.py +125 -0
  408. gucmail-1.1.0/tests/test_index_metadata_ranking.py +241 -0
  409. gucmail-1.1.0/tests/test_index_rebuild_atomicity.py +369 -0
  410. gucmail-1.1.0/tests/test_index_rebuild_tui.py +121 -0
  411. gucmail-1.1.0/tests/test_inline_mail_header.py +32 -0
  412. gucmail-1.1.0/tests/test_layout_presets.py +241 -0
  413. gucmail-1.1.0/tests/test_literal_choices_and_folders.py +88 -0
  414. gucmail-1.1.0/tests/test_literal_tables.py +107 -0
  415. gucmail-1.1.0/tests/test_live_readonly_guard.py +143 -0
  416. gucmail-1.1.0/tests/test_local_features.py +43 -0
  417. gucmail-1.1.0/tests/test_local_ocr.py +340 -0
  418. gucmail-1.1.0/tests/test_local_ocr_cli.py +72 -0
  419. gucmail-1.1.0/tests/test_local_ocr_tui.py +178 -0
  420. gucmail-1.1.0/tests/test_local_ocr_worker.py +119 -0
  421. gucmail-1.1.0/tests/test_local_search_secondpass.py +294 -0
  422. gucmail-1.1.0/tests/test_mail_deletion_grouping_preferences.py +496 -0
  423. gucmail-1.1.0/tests/test_mail_preferences.py +204 -0
  424. gucmail-1.1.0/tests/test_mail_response_preferences.py +572 -0
  425. gucmail-1.1.0/tests/test_mail_search_heading.py +120 -0
  426. gucmail-1.1.0/tests/test_mail_search_prompt.py +89 -0
  427. gucmail-1.1.0/tests/test_mail_search_scope_session.py +237 -0
  428. gucmail-1.1.0/tests/test_mail_services.py +464 -0
  429. gucmail-1.1.0/tests/test_mail_shell_polish.py +84 -0
  430. gucmail-1.1.0/tests/test_mail_startup_and_write_feedback.py +298 -0
  431. gucmail-1.1.0/tests/test_mail_viewport_fill.py +189 -0
  432. gucmail-1.1.0/tests/test_mailbox_search_cli.py +81 -0
  433. gucmail-1.1.0/tests/test_mailbox_search_library_boundaries.py +202 -0
  434. gucmail-1.1.0/tests/test_mailbox_search_scope.py +250 -0
  435. gucmail-1.1.0/tests/test_mark_read_timing.py +349 -0
  436. gucmail-1.1.0/tests/test_message_columns.py +318 -0
  437. gucmail-1.1.0/tests/test_message_export_secondpass.py +63 -0
  438. gucmail-1.1.0/tests/test_message_mutation_campaign.py +146 -0
  439. gucmail-1.1.0/tests/test_message_operation_outcomes.py +158 -0
  440. gucmail-1.1.0/tests/test_monitoring.py +255 -0
  441. gucmail-1.1.0/tests/test_monitoring_foundation.py +456 -0
  442. gucmail-1.1.0/tests/test_monitoring_preferences.py +149 -0
  443. gucmail-1.1.0/tests/test_monochrome_theme_fidelity.py +83 -0
  444. gucmail-1.1.0/tests/test_native_item_backup.py +820 -0
  445. gucmail-1.1.0/tests/test_native_sync.py +267 -0
  446. gucmail-1.1.0/tests/test_nlp_contract.py +120 -0
  447. gucmail-1.1.0/tests/test_nlp_person_candidates.py +84 -0
  448. gucmail-1.1.0/tests/test_nlp_secondpass.py +690 -0
  449. gucmail-1.1.0/tests/test_notification_cli_secondpass.py +142 -0
  450. gucmail-1.1.0/tests/test_notification_configuration_secondpass.py +526 -0
  451. gucmail-1.1.0/tests/test_notification_guided_workflows.py +251 -0
  452. gucmail-1.1.0/tests/test_notification_loading_responsiveness.py +372 -0
  453. gucmail-1.1.0/tests/test_notification_profile_refresh.py +84 -0
  454. gucmail-1.1.0/tests/test_notification_provider_filter.py +260 -0
  455. gucmail-1.1.0/tests/test_notification_providers_secondpass.py +791 -0
  456. gucmail-1.1.0/tests/test_notification_rules_secondpass.py +393 -0
  457. gucmail-1.1.0/tests/test_notification_runtime_preview.py +441 -0
  458. gucmail-1.1.0/tests/test_notification_settings_screen_secondpass.py +933 -0
  459. gucmail-1.1.0/tests/test_notification_write_responsiveness.py +291 -0
  460. gucmail-1.1.0/tests/test_notifications.py +756 -0
  461. gucmail-1.1.0/tests/test_offline_guard_aggregation.py +28 -0
  462. gucmail-1.1.0/tests/test_offline_pim.py +170 -0
  463. gucmail-1.1.0/tests/test_operational_screens_secondpass.py +669 -0
  464. gucmail-1.1.0/tests/test_original_guc_mark.py +134 -0
  465. gucmail-1.1.0/tests/test_package_artifacts.py +434 -0
  466. gucmail-1.1.0/tests/test_palette.py +42 -0
  467. gucmail-1.1.0/tests/test_palette_action_clarity.py +206 -0
  468. gucmail-1.1.0/tests/test_palette_routes.py +438 -0
  469. gucmail-1.1.0/tests/test_palette_runtime.py +63 -0
  470. gucmail-1.1.0/tests/test_persistence_security_hardening.py +441 -0
  471. gucmail-1.1.0/tests/test_pim.py +569 -0
  472. gucmail-1.1.0/tests/test_pim_cli_regressions.py +319 -0
  473. gucmail-1.1.0/tests/test_pim_creation_preferences.py +645 -0
  474. gucmail-1.1.0/tests/test_pim_editor_visibility.py +53 -0
  475. gucmail-1.1.0/tests/test_pim_initial_geometry.py +50 -0
  476. gucmail-1.1.0/tests/test_pim_pagination.py +266 -0
  477. gucmail-1.1.0/tests/test_pim_safety.py +336 -0
  478. gucmail-1.1.0/tests/test_pim_save_recovery.py +222 -0
  479. gucmail-1.1.0/tests/test_profiled_notifications.py +439 -0
  480. gucmail-1.1.0/tests/test_quota_fallback_experience.py +193 -0
  481. gucmail-1.1.0/tests/test_quota_secondpass.py +618 -0
  482. gucmail-1.1.0/tests/test_recipient_assistance.py +524 -0
  483. gucmail-1.1.0/tests/test_recurrence.py +511 -0
  484. gucmail-1.1.0/tests/test_recurrence_ews_boundary.py +72 -0
  485. gucmail-1.1.0/tests/test_release_boundaries.py +230 -0
  486. gucmail-1.1.0/tests/test_release_tui.py +164 -0
  487. gucmail-1.1.0/tests/test_restore_cancellation.py +379 -0
  488. gucmail-1.1.0/tests/test_restore_cli_recovery.py +97 -0
  489. gucmail-1.1.0/tests/test_restore_deadlines.py +386 -0
  490. gucmail-1.1.0/tests/test_restore_journal.py +155 -0
  491. gucmail-1.1.0/tests/test_restore_migration.py +133 -0
  492. gucmail-1.1.0/tests/test_restore_outcomes.py +524 -0
  493. gucmail-1.1.0/tests/test_restore_planning_cancel_ui.py +212 -0
  494. gucmail-1.1.0/tests/test_restore_planning_cancellation.py +356 -0
  495. gucmail-1.1.0/tests/test_restore_recovery.py +197 -0
  496. gucmail-1.1.0/tests/test_restore_ui_recovery.py +292 -0
  497. gucmail-1.1.0/tests/test_saved_search_tui_secondpass.py +246 -0
  498. gucmail-1.1.0/tests/test_scheduled_screen.py +218 -0
  499. gucmail-1.1.0/tests/test_scheduler.py +283 -0
  500. gucmail-1.1.0/tests/test_scheduler_encoding.py +32 -0
  501. gucmail-1.1.0/tests/test_search.py +270 -0
  502. gucmail-1.1.0/tests/test_search_planner_secondpass.py +386 -0
  503. gucmail-1.1.0/tests/test_search_request_lifecycle.py +266 -0
  504. gucmail-1.1.0/tests/test_semantic_cli.py +130 -0
  505. gucmail-1.1.0/tests/test_semantic_search.py +293 -0
  506. gucmail-1.1.0/tests/test_semantic_tui.py +192 -0
  507. gucmail-1.1.0/tests/test_send_attempts.py +343 -0
  508. gucmail-1.1.0/tests/test_send_entrypoints.py +261 -0
  509. gucmail-1.1.0/tests/test_settings_focus_handoffs.py +127 -0
  510. gucmail-1.1.0/tests/test_settings_secondpass.py +263 -0
  511. gucmail-1.1.0/tests/test_settings_theme_integration.py +221 -0
  512. gucmail-1.1.0/tests/test_settings_visual_layout.py +157 -0
  513. gucmail-1.1.0/tests/test_shell_preferences.py +190 -0
  514. gucmail-1.1.0/tests/test_shortcut_preferences.py +455 -0
  515. gucmail-1.1.0/tests/test_soap.py +205 -0
  516. gucmail-1.1.0/tests/test_stable_footer.py +237 -0
  517. gucmail-1.1.0/tests/test_startup_errors.py +506 -0
  518. gucmail-1.1.0/tests/test_startup_runtime.py +271 -0
  519. gucmail-1.1.0/tests/test_state.py +399 -0
  520. gucmail-1.1.0/tests/test_styles_cache_runtime.py +56 -0
  521. gucmail-1.1.0/tests/test_table_selection.py +58 -0
  522. gucmail-1.1.0/tests/test_task_deletion_scope.py +528 -0
  523. gucmail-1.1.0/tests/test_task_editor_focus.py +85 -0
  524. gucmail-1.1.0/tests/test_task_history.py +489 -0
  525. gucmail-1.1.0/tests/test_task_regeneration.py +448 -0
  526. gucmail-1.1.0/tests/test_task_repeat_preferences.py +429 -0
  527. gucmail-1.1.0/tests/test_task_workflows.py +472 -0
  528. gucmail-1.1.0/tests/test_tasks_display_preferences.py +477 -0
  529. gucmail-1.1.0/tests/test_tasks_secondpass.py +179 -0
  530. gucmail-1.1.0/tests/test_theme_browser_io.py +318 -0
  531. gucmail-1.1.0/tests/test_theme_palette_io.py +103 -0
  532. gucmail-1.1.0/tests/test_theme_repository.py +150 -0
  533. gucmail-1.1.0/tests/test_tui.py +6532 -0
  534. gucmail-1.1.0/tests/test_tui_beta_qa_regressions.py +187 -0
  535. gucmail-1.1.0/tests/test_tui_visual_regressions.py +1438 -0
  536. gucmail-1.1.0/tests/test_tutorials.py +286 -0
  537. gucmail-1.1.0/tests/test_ui_session.py +353 -0
  538. gucmail-1.1.0/tests/test_unanswered.py +266 -0
  539. gucmail-1.1.0/tests/test_windows_desktop.py +1227 -0
  540. gucmail-1.1.0/tests/test_windows_identity.py +78 -0
  541. gucmail-1.1.0/tests/test_windows_textual_timer.py +88 -0
  542. gucmail-1.1.0/tests/test_write_coordinator.py +496 -0
@@ -0,0 +1,52 @@
1
+ # Credentials and local overrides — never commit
2
+ creds.env
3
+ *.credentials.env
4
+ .env
5
+ .env.*
6
+ !.env.example
7
+ *.pem
8
+ *.key
9
+
10
+ # Python / tooling
11
+ __pycache__/
12
+ *.py[cod]
13
+ *.pyd
14
+ *.egg-info/
15
+ .pytest_cache/
16
+ .mypy_cache/
17
+ .ruff_cache/
18
+ .coverage
19
+ .coverage.*
20
+ coverage.xml
21
+ junit*.xml
22
+ htmlcov/
23
+ dist/
24
+ build/
25
+ .venv/
26
+ venv/
27
+ .tmp-*/
28
+
29
+ # GUC Mail runtime/private state (may contain mailbox data)
30
+ *.db
31
+ *.db-shm
32
+ *.db-wal
33
+ *.sqlite
34
+ *.sqlite3
35
+ *.sqlite-wal
36
+ *.sqlite-shm
37
+ *.log
38
+ .gucmail/
39
+ gucmail-data/
40
+ backups/
41
+ downloads/
42
+ recovery/
43
+ diagnostic-bundles/
44
+ gucmail-diagnostics*.json
45
+ notifications*.ndjson
46
+ gucmail-events*.ndjson
47
+
48
+ # Editors and operating systems
49
+ .idea/
50
+ .vscode/
51
+ .DS_Store
52
+ Thumbs.db
gucmail-1.1.0/PKG-INFO ADDED
@@ -0,0 +1,227 @@
1
+ Metadata-Version: 2.5
2
+ Name: gucmail
3
+ Version: 1.1.0
4
+ Summary: An independent, security-focused terminal client for GUC Exchange mailboxes
5
+ Author: GUC Mail CLI contributors
6
+ License-Expression: MIT
7
+ Keywords: email,ews,exchange,guc,terminal
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Environment :: Console
10
+ Classifier: Operating System :: MacOS
11
+ Classifier: Operating System :: Microsoft :: Windows
12
+ Classifier: Operating System :: POSIX :: Linux
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Topic :: Communications :: Email :: Email Clients (MUA)
18
+ Requires-Python: <3.15,>=3.11
19
+ Requires-Dist: beautifulsoup4<5,>=4.12
20
+ Requires-Dist: cryptography<51,>=43
21
+ Requires-Dist: exchangelib==5.6.0
22
+ Requires-Dist: httpx<1,>=0.27
23
+ Requires-Dist: keyring<27,>=25
24
+ Requires-Dist: lxml<7,>=5
25
+ Requires-Dist: platformdirs<5,>=4.3
26
+ Requires-Dist: pyfiglet<2,>=1.0.2
27
+ Requires-Dist: python-dateutil<3,>=2.9
28
+ Requires-Dist: rapidfuzz<4,>=3.10
29
+ Requires-Dist: rich<15,>=13.9
30
+ Requires-Dist: textual<8,>=7.5
31
+ Requires-Dist: typer<1,>=0.15
32
+ Provides-Extra: attachments
33
+ Requires-Dist: openpyxl<4,>=3.1; extra == 'attachments'
34
+ Requires-Dist: pypdf<7,>=6.16.1; extra == 'attachments'
35
+ Requires-Dist: python-docx<2,>=1.1; extra == 'attachments'
36
+ Requires-Dist: python-pptx<2,>=1.0; extra == 'attachments'
37
+ Provides-Extra: desktop
38
+ Requires-Dist: plyer<3,>=2.1; extra == 'desktop'
39
+ Requires-Dist: windows-toasts==1.3.1; (sys_platform == 'win32') and extra == 'desktop'
40
+ Provides-Extra: dev
41
+ Requires-Dist: build<2,>=1.2; extra == 'dev'
42
+ Requires-Dist: hatchling<2,>=1.27; extra == 'dev'
43
+ Requires-Dist: mypy<2,>=1.14; extra == 'dev'
44
+ Requires-Dist: pytest-asyncio<2,>=0.25; extra == 'dev'
45
+ Requires-Dist: pytest-cov<8,>=6; extra == 'dev'
46
+ Requires-Dist: pytest<10,>=8.3; extra == 'dev'
47
+ Requires-Dist: ruff<1,>=0.9; extra == 'dev'
48
+ Requires-Dist: types-python-dateutil>=2.9; extra == 'dev'
49
+ Provides-Extra: semantic
50
+ Requires-Dist: numpy==2.3.5; extra == 'semantic'
51
+ Description-Content-Type: text/markdown
52
+
53
+ # gucmail
54
+
55
+ Your GUC mailbox, in a terminal. Read, write, search, schedule and back up your mail without
56
+ opening Outlook on the web. Calendar, contacts and tasks come along too. Everything works from
57
+ the keyboard, and everything is scriptable.
58
+
59
+ ![The Mail workspace: folders, inbox and an open message](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/mail.png)
60
+
61
+ It talks directly to the GUC Exchange server (EWS), so there's nothing to set up on the server
62
+ and no third-party cloud in between. Your password stays in Windows Credential Manager, and
63
+ your mail stays on your machine.
64
+
65
+ *An independent project. Not affiliated with the German University in Cairo or Microsoft.*
66
+
67
+ ## Install
68
+
69
+ You need Python 3.11 or newer.
70
+
71
+ ```powershell
72
+ pip install "gucmail[desktop]"
73
+ gucmail login # asks for your GUC password, stores it in Windows Credential Manager
74
+ gucmail tui # opens the full-screen interface
75
+ ```
76
+
77
+ Prefer an isolated install? `pipx install "gucmail[desktop]"`. Leave out `[desktop]` if you
78
+ don't want Windows notifications.
79
+
80
+ ## Get around
81
+
82
+ ![Arrowing through the inbox and opening messages](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/mail-browse-demo.gif)
83
+
84
+ Arrows move. **Enter** opens. **Tab** jumps between panes. **c** composes, **r** replies,
85
+ **/** searches and **?** shows every shortcut. Mouse and scroll wheel work too.
86
+
87
+ **Ctrl+K** opens the command palette. Type what you want in plain words:
88
+
89
+ ![Typing "schedule this for tomorrow 9am" into the palette](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/palette-demo.gif)
90
+
91
+ It shows exactly what it understood (*Schedule current draft · tomorrow at 9:00*) and asks
92
+ before it does anything. It never guesses at deleting.
93
+
94
+ ## Write
95
+
96
+ ![The composer with recipients and an attachment](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/compose.png)
97
+
98
+ Reply, reply-all and forward. Cc and Bcc, attachments, signatures and importance. Recipients
99
+ autocomplete from your contacts and recent mail. It warns you about an empty subject, a missing
100
+ attachment you mentioned ("see attached…") or a typo in an address.
101
+
102
+ Drafts save themselves, and if your laptop dies mid-sentence, the draft is waiting next time.
103
+ **Undo Send** holds a message for a few seconds before it leaves.
104
+
105
+ ## Send later
106
+
107
+ ![The scheduled-mail queue](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/scheduled.png)
108
+
109
+ ```powershell
110
+ gucmail send --to ta@example.edu --subject "Lab 6" --body-file report.txt --at "Monday 8:30"
111
+ gucmail send --to me@example.edu --subject "Reminder" --body "Submit thesis" --in "2 hours"
112
+ gucmail scheduled list
113
+ ```
114
+
115
+ It always shows the exact time and time zone before queuing, refuses ambiguous dates like
116
+ `03/04`, and never sends anything twice. It handles Cairo's daylight-saving switch. Messages
117
+ go out from your PC, so it needs to be on. A Windows task can take care of that
118
+ ([how](https://github.com/aynader/gucmail/blob/main/docs/scheduling/windows-task-scheduler.md)).
119
+
120
+ ## Calendar, contacts, tasks
121
+
122
+ ![The calendar week view](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/calendar.png)
123
+
124
+ Day, week, month and agenda views. Create events, accept or decline meetings, find a free
125
+ slot, catch clashes, and import or export `.ics` files.
126
+
127
+ | Contacts | Tasks |
128
+ |---|---|
129
+ | ![Contacts](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/contacts.png) | ![Tasks](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/tasks.png) |
130
+
131
+ Contacts find duplicates and merge them, and import and export vCards. Tasks have due dates,
132
+ progress and repeats.
133
+
134
+ ## Search
135
+
136
+ ```powershell
137
+ gucmail search --sender "dr. mona" --after 2026-10-01 --has-attachments
138
+ gucmail search "rubric" --all-folders
139
+ gucmail index build --include-bodies # build a local full-text index once…
140
+ gucmail search --local --fuzzy "gradng rubrik" # …then search it offline, typos and all
141
+ ```
142
+
143
+ Saved searches, per-folder or whole-mailbox scope, and a search box in every view.
144
+
145
+ ## Notifications, even with the terminal closed
146
+
147
+ ```powershell
148
+ gucmail notifications profiles create primary --name "Inbox" --enabled --activate
149
+ gucmail startup enable --profile primary --apply # a Windows task that starts at sign-in
150
+ ```
151
+
152
+ A small background watcher checks your Inbox and shows a Windows toast for new mail. Clicking
153
+ the toast opens the message. Quiet hours, rules ("only mail from @guc.edu.eg with
154
+ 'exam' in the subject") and signed webhooks are optional.
155
+ [Details](https://github.com/aynader/gucmail/blob/main/docs/monitoring/headless-deployment.md).
156
+
157
+ ## Backups you can read without a connection
158
+
159
+ ![The Backup Center](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/backups.png)
160
+
161
+ ```powershell
162
+ gucmail backup create --encrypt # full backup, password-protected
163
+ gucmail backup incremental # just what changed since
164
+ gucmail backup browse <id> # read it offline, even with Wi-Fi off
165
+ gucmail tui --offline # or browse cached mail in the interface
166
+ ```
167
+
168
+ Backups never mark anything read and never change the server. Restores are planned first,
169
+ with exact counts, and you confirm before anything is written.
170
+
171
+ ## Make it yours
172
+
173
+ ![The theme picker](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/themes.png)
174
+
175
+ More than 600 themes with live preview, and your own colours or logo. Choose your columns,
176
+ layouts and keyboard shortcuts in Settings, which you can search.
177
+
178
+ ![Settings](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/settings.png)
179
+
180
+ ## Scripts and automation
181
+
182
+ Every command has `--json` (one envelope) or `--ndjson` (one record per line), stable exit
183
+ codes, `--yes` for confirmations and `--dry-run` for anything that changes mail.
184
+
185
+ ```powershell
186
+ gucmail --json messages list --folder inbox --limit 5
187
+ gucmail --ndjson search --unread | ConvertFrom-Json | ? type -eq item | % { $_.data.subject }
188
+ gucmail --yes messages move msg_12 msg_13 --to "Courses/Distributed Systems"
189
+ gucmail quota # how full your mailbox is
190
+ gucmail doctor # checks everything, offline unless you ask
191
+ ```
192
+
193
+ There's more under `gucmail --help`: rules, automatic replies, insights ("who fills my
194
+ mailbox?"), cleanup plans, clustering and an EWS capability browser.
195
+
196
+ ## Good to know
197
+
198
+ - Some features depend on what GUC lets your account do: the directory, free/busy, rules,
199
+ delegates and quota limits. When the server says no, gucmail tells you so and never
200
+ invents a value.
201
+ - It's tested on Windows 11. Linux and macOS should work but aren't tested yet.
202
+ - More: [user guide](https://github.com/aynader/gucmail/blob/main/docs/user-guide/index.md) ·
203
+ [all commands](https://github.com/aynader/gucmail/blob/main/docs/command-reference/index.md) ·
204
+ [troubleshooting](https://github.com/aynader/gucmail/blob/main/docs/troubleshooting/index.md) ·
205
+ [privacy & security](https://github.com/aynader/gucmail/blob/main/docs/privacy-and-security/index.md) ·
206
+ [known limits](https://github.com/aynader/gucmail/blob/main/docs/STATUS.md)
207
+
208
+ ## Licence
209
+
210
+ MIT License
211
+
212
+ Copyright (c) 2026 gucmail contributors
213
+
214
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
215
+ and associated documentation files (the "Software"), to deal in the Software without
216
+ restriction, including without limitation the rights to use, copy, modify, merge, publish,
217
+ distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
218
+ Software is furnished to do so, subject to the following conditions:
219
+
220
+ The above copyright notice and this permission notice shall be included in all copies or
221
+ substantial portions of the Software.
222
+
223
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
224
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
225
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
226
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
227
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,175 @@
1
+ # gucmail
2
+
3
+ Your GUC mailbox, in a terminal. Read, write, search, schedule and back up your mail without
4
+ opening Outlook on the web. Calendar, contacts and tasks come along too. Everything works from
5
+ the keyboard, and everything is scriptable.
6
+
7
+ ![The Mail workspace: folders, inbox and an open message](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/mail.png)
8
+
9
+ It talks directly to the GUC Exchange server (EWS), so there's nothing to set up on the server
10
+ and no third-party cloud in between. Your password stays in Windows Credential Manager, and
11
+ your mail stays on your machine.
12
+
13
+ *An independent project. Not affiliated with the German University in Cairo or Microsoft.*
14
+
15
+ ## Install
16
+
17
+ You need Python 3.11 or newer.
18
+
19
+ ```powershell
20
+ pip install "gucmail[desktop]"
21
+ gucmail login # asks for your GUC password, stores it in Windows Credential Manager
22
+ gucmail tui # opens the full-screen interface
23
+ ```
24
+
25
+ Prefer an isolated install? `pipx install "gucmail[desktop]"`. Leave out `[desktop]` if you
26
+ don't want Windows notifications.
27
+
28
+ ## Get around
29
+
30
+ ![Arrowing through the inbox and opening messages](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/mail-browse-demo.gif)
31
+
32
+ Arrows move. **Enter** opens. **Tab** jumps between panes. **c** composes, **r** replies,
33
+ **/** searches and **?** shows every shortcut. Mouse and scroll wheel work too.
34
+
35
+ **Ctrl+K** opens the command palette. Type what you want in plain words:
36
+
37
+ ![Typing "schedule this for tomorrow 9am" into the palette](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/palette-demo.gif)
38
+
39
+ It shows exactly what it understood (*Schedule current draft · tomorrow at 9:00*) and asks
40
+ before it does anything. It never guesses at deleting.
41
+
42
+ ## Write
43
+
44
+ ![The composer with recipients and an attachment](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/compose.png)
45
+
46
+ Reply, reply-all and forward. Cc and Bcc, attachments, signatures and importance. Recipients
47
+ autocomplete from your contacts and recent mail. It warns you about an empty subject, a missing
48
+ attachment you mentioned ("see attached…") or a typo in an address.
49
+
50
+ Drafts save themselves, and if your laptop dies mid-sentence, the draft is waiting next time.
51
+ **Undo Send** holds a message for a few seconds before it leaves.
52
+
53
+ ## Send later
54
+
55
+ ![The scheduled-mail queue](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/scheduled.png)
56
+
57
+ ```powershell
58
+ gucmail send --to ta@example.edu --subject "Lab 6" --body-file report.txt --at "Monday 8:30"
59
+ gucmail send --to me@example.edu --subject "Reminder" --body "Submit thesis" --in "2 hours"
60
+ gucmail scheduled list
61
+ ```
62
+
63
+ It always shows the exact time and time zone before queuing, refuses ambiguous dates like
64
+ `03/04`, and never sends anything twice. It handles Cairo's daylight-saving switch. Messages
65
+ go out from your PC, so it needs to be on. A Windows task can take care of that
66
+ ([how](https://github.com/aynader/gucmail/blob/main/docs/scheduling/windows-task-scheduler.md)).
67
+
68
+ ## Calendar, contacts, tasks
69
+
70
+ ![The calendar week view](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/calendar.png)
71
+
72
+ Day, week, month and agenda views. Create events, accept or decline meetings, find a free
73
+ slot, catch clashes, and import or export `.ics` files.
74
+
75
+ | Contacts | Tasks |
76
+ |---|---|
77
+ | ![Contacts](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/contacts.png) | ![Tasks](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/tasks.png) |
78
+
79
+ Contacts find duplicates and merge them, and import and export vCards. Tasks have due dates,
80
+ progress and repeats.
81
+
82
+ ## Search
83
+
84
+ ```powershell
85
+ gucmail search --sender "dr. mona" --after 2026-10-01 --has-attachments
86
+ gucmail search "rubric" --all-folders
87
+ gucmail index build --include-bodies # build a local full-text index once…
88
+ gucmail search --local --fuzzy "gradng rubrik" # …then search it offline, typos and all
89
+ ```
90
+
91
+ Saved searches, per-folder or whole-mailbox scope, and a search box in every view.
92
+
93
+ ## Notifications, even with the terminal closed
94
+
95
+ ```powershell
96
+ gucmail notifications profiles create primary --name "Inbox" --enabled --activate
97
+ gucmail startup enable --profile primary --apply # a Windows task that starts at sign-in
98
+ ```
99
+
100
+ A small background watcher checks your Inbox and shows a Windows toast for new mail. Clicking
101
+ the toast opens the message. Quiet hours, rules ("only mail from @guc.edu.eg with
102
+ 'exam' in the subject") and signed webhooks are optional.
103
+ [Details](https://github.com/aynader/gucmail/blob/main/docs/monitoring/headless-deployment.md).
104
+
105
+ ## Backups you can read without a connection
106
+
107
+ ![The Backup Center](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/backups.png)
108
+
109
+ ```powershell
110
+ gucmail backup create --encrypt # full backup, password-protected
111
+ gucmail backup incremental # just what changed since
112
+ gucmail backup browse <id> # read it offline, even with Wi-Fi off
113
+ gucmail tui --offline # or browse cached mail in the interface
114
+ ```
115
+
116
+ Backups never mark anything read and never change the server. Restores are planned first,
117
+ with exact counts, and you confirm before anything is written.
118
+
119
+ ## Make it yours
120
+
121
+ ![The theme picker](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/themes.png)
122
+
123
+ More than 600 themes with live preview, and your own colours or logo. Choose your columns,
124
+ layouts and keyboard shortcuts in Settings, which you can search.
125
+
126
+ ![Settings](https://raw.githubusercontent.com/aynader/gucmail/main/docs/img/settings.png)
127
+
128
+ ## Scripts and automation
129
+
130
+ Every command has `--json` (one envelope) or `--ndjson` (one record per line), stable exit
131
+ codes, `--yes` for confirmations and `--dry-run` for anything that changes mail.
132
+
133
+ ```powershell
134
+ gucmail --json messages list --folder inbox --limit 5
135
+ gucmail --ndjson search --unread | ConvertFrom-Json | ? type -eq item | % { $_.data.subject }
136
+ gucmail --yes messages move msg_12 msg_13 --to "Courses/Distributed Systems"
137
+ gucmail quota # how full your mailbox is
138
+ gucmail doctor # checks everything, offline unless you ask
139
+ ```
140
+
141
+ There's more under `gucmail --help`: rules, automatic replies, insights ("who fills my
142
+ mailbox?"), cleanup plans, clustering and an EWS capability browser.
143
+
144
+ ## Good to know
145
+
146
+ - Some features depend on what GUC lets your account do: the directory, free/busy, rules,
147
+ delegates and quota limits. When the server says no, gucmail tells you so and never
148
+ invents a value.
149
+ - It's tested on Windows 11. Linux and macOS should work but aren't tested yet.
150
+ - More: [user guide](https://github.com/aynader/gucmail/blob/main/docs/user-guide/index.md) ·
151
+ [all commands](https://github.com/aynader/gucmail/blob/main/docs/command-reference/index.md) ·
152
+ [troubleshooting](https://github.com/aynader/gucmail/blob/main/docs/troubleshooting/index.md) ·
153
+ [privacy & security](https://github.com/aynader/gucmail/blob/main/docs/privacy-and-security/index.md) ·
154
+ [known limits](https://github.com/aynader/gucmail/blob/main/docs/STATUS.md)
155
+
156
+ ## Licence
157
+
158
+ MIT License
159
+
160
+ Copyright (c) 2026 gucmail contributors
161
+
162
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software
163
+ and associated documentation files (the "Software"), to deal in the Software without
164
+ restriction, including without limitation the rights to use, copy, modify, merge, publish,
165
+ distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
166
+ Software is furnished to do so, subject to the following conditions:
167
+
168
+ The above copyright notice and this permission notice shall be included in all copies or
169
+ substantial portions of the Software.
170
+
171
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
172
+ BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
173
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
174
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
175
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ # Status and known limits
2
+
3
+ GUCmail works for daily mail on Windows. Some areas have only been checked against a
4
+ synthetic test mailbox, not the real GUC server. Please report problems along with
5
+ the exact command and the message you saw. Never include your password.
6
+
7
+ ## What has been checked
8
+
9
+ | Area | State |
10
+ |---|---|
11
+ | Install from wheel, `gucmail` and `python -m gucmail` launchers | Checked locally (Windows 11, Python 3.11) |
12
+ | Mail: list, read, search, move, copy, delete, restore, flags, categories, export | Checked on a synthetic mailbox; core mail was also live-verified earlier |
13
+ | Compose, reply, reply-all, forward, drafts, attachments | Checked on a synthetic mailbox; real sending is part of the live walkthrough |
14
+ | Scheduled send, Undo Send, recurring messages, local scheduler | Checked with a synthetic backend; duplicate-send protection checked |
15
+ | Calendar, contacts, tasks | Checked on a synthetic mailbox, including the Cairo daylight-saving change |
16
+ | Backups (full, incremental, encrypted, verify, browse, restore plan) | Checked locally |
17
+ | Local index, search, insights, cleanup previews | Checked on a synthetic mailbox |
18
+ | Full-screen interface: every workspace, all palette routes, Settings, themes | Checked in Textual's built-in test mode at several sizes (not yet in a real Windows terminal) |
19
+
20
+ ## Known limits
21
+
22
+ - **Server-dependent features.** These depend on what the GUC server and your account allow:
23
+ directory search, free/busy, inbox rules, automatic replies, delegates and quota thresholds.
24
+ If the server refuses one, GUCmail tells you so. It never shows made-up values.
25
+ - **Scheduled sending is local.** It needs this computer and either `gucmail scheduled run`
26
+ or Windows Task Scheduler (see [Scheduling](scheduling/index.md)). If the computer is off,
27
+ messages are sent the next time the scheduler runs.
28
+ - **Recurring messages** don't support end dates or specific-weekday rules yet.
29
+ - **Startup speed.** Starting the full-screen interface can take 2–4 seconds on large mailboxes.
30
+ - **Webhooks** accept only public HTTPS addresses, so local test servers are refused.
31
+ - **Re-importing** the same `.ics` file creates duplicate events.
32
+ - **Optional extras** (desktop notifications, attachment text extraction, semantic search,
33
+ Windows OCR) must be installed separately and have had limited testing.
34
+ - **Platforms.** Linux and macOS should work but have not been tested yet.
@@ -0,0 +1,50 @@
1
+ # Advanced workflows
2
+
3
+ Advanced mode is a presentation choice; it does not expand Exchange permissions or change mailbox
4
+ semantics.
5
+
6
+ For every core TOML field, path override, type, default, and environment variable, use the
7
+ [configuration reference](../configuration/index.md).
8
+
9
+ ## Search and analysis
10
+
11
+ `gucmail search` performs a bounded server search. `gucmail index build` creates a disposable local
12
+ FTS5 index; `index update`, `verify`, `optimize`, `rebuild`, and `clear` manage it. Fuzzy ranking and
13
+ clustering are local and bounded. Optional semantic search uses the local `local-lsa-v1` model
14
+ with TF-IDF and truncated SVD. Check `gucmail semantic status`, explicitly enable it, and review
15
+ `semantic build` before applying a model build to an existing local index. It needs an available
16
+ local NumPy runtime; it does not download a model or send mailbox text to a remote service.
17
+ Use `semantic update` after index changes, and `semantic clear` or `disable` to remove the model
18
+ or stop using it. Ordinary indexed text search remains available without semantic search.
19
+
20
+ ## Automation
21
+
22
+ Use `gucmail --json` or `--ndjson`, stable exit codes, and `--non-interactive`. Scheduled sends live
23
+ in the durable local state database. `gucmail scheduler run-once` is the supervisor-safe entry
24
+ point. See [Scheduling](../scheduling/index.md) and [Monitoring](../monitoring/index.md).
25
+
26
+ ## EWS diagnostics
27
+
28
+ Use `gucmail ews operations`, `describe`, `support-matrix`, and `diagnostics`. Registry status is
29
+ static until a safe live probe occurs. `not_probed` does not mean supported or unsupported.
30
+ Privileged and destructive operation families are registry-only unless a typed, safety-classified
31
+ adapter exists.
32
+
33
+ There is no arbitrary raw-SOAP execution command in this release. `ews request-preview` classifies
34
+ an operation without constructing XML or sending a request. This is intentional: an unvalidated
35
+ XML escape hatch would bypass typed serialization, request bounds, and mutation confirmation.
36
+ The legacy raw-execution preference is shown as unavailable and cannot be enabled in Settings;
37
+ Expert mode does not create an XML executor. The internal request loader rejects DTD declarations
38
+ after parsing document metadata as well as checking bytes, including encoded UTF-16 input.
39
+
40
+ ## Local data boundaries
41
+
42
+ Cache is disposable, the FTS index is rebuildable, scheduler/draft state is durable application
43
+ state, and a backup is an independently verifiable archive. They are not interchangeable. See
44
+ [Local data and retention](../privacy-and-security/local-data-locations-and-retention.md).
45
+
46
+ ## Mailbox delegates
47
+
48
+ `gucmail ews delegates` reads the configured mailbox's delegate identities, six reported folder permission levels, meeting-copy preference and private-item access. In the TUI, use the Advanced palette command **Show Mailbox Delegates**. Refresh performs one read; Previous and Next navigate the loaded collection locally. No permissions are changed, and delegate creation, modification and deletion remain unavailable.
49
+
50
+ EWS GetDelegate does not provide server pagination: `--limit` (default 100) and `--offset` slice one response locally, with a 1000-delegate safety cap. Missing permission fields are shown as **Not reported**, distinct from the explicit **None** permission level. This view does not enumerate every shared folder, effective access permission, Send As grant or delegated mailbox. Server version eligibility and this account's access remain unprobed; a permission error is not a claim that GUC never supports delegation.
@@ -0,0 +1,19 @@
1
+ # Internal API guide
2
+
3
+ The supported user API is the `gucmail` executable. Python modules are internal and may evolve, but
4
+ the main extension boundaries are intentionally narrow:
5
+
6
+ - mailbox gateway protocols in service modules;
7
+ - `EWSGateway` for provider translation;
8
+ - `BackupSource` and `RestoreTarget` for streamed backup/restore;
9
+ - notification providers and webhook delivery abstractions;
10
+ - domain dataclasses in `gucmail.models`;
11
+ - the versioned `gucmail.output/v1` JSON envelope.
12
+
13
+ Application services accept domain values and return immutable plans/results. A mutation should be
14
+ split into `plan_*` and execution when users need to preview scope. Update plans must contain an
15
+ explicit nonempty field list; unrestricted saves of partially fetched EWS objects are forbidden.
16
+
17
+ The raw state database and backup object layout are not a general-purpose public API. Use service
18
+ methods so migrations, locking, verification, redaction, and confirmation invariants remain intact.
19
+