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.
- gucmail-1.1.0/.gitignore +52 -0
- gucmail-1.1.0/PKG-INFO +227 -0
- gucmail-1.1.0/README.md +175 -0
- gucmail-1.1.0/docs/STATUS.md +34 -0
- gucmail-1.1.0/docs/advanced/index.md +50 -0
- gucmail-1.1.0/docs/api/index.md +19 -0
- gucmail-1.1.0/docs/architecture/index.md +191 -0
- gucmail-1.1.0/docs/backup/index.md +169 -0
- gucmail-1.1.0/docs/calendar/index.md +195 -0
- gucmail-1.1.0/docs/command-reference/index.md +245 -0
- gucmail-1.1.0/docs/configuration/index.md +508 -0
- gucmail-1.1.0/docs/contacts/groups.md +52 -0
- gucmail-1.1.0/docs/contacts/index.md +169 -0
- gucmail-1.1.0/docs/development/index.md +43 -0
- gucmail-1.1.0/docs/development/live-readonly-smoke.md +57 -0
- gucmail-1.1.0/docs/ews/index.md +38 -0
- gucmail-1.1.0/docs/ews/known-server-limitations.md +30 -0
- gucmail-1.1.0/docs/ews/operation-matrix.md +101 -0
- gucmail-1.1.0/docs/examples/backup-layout.example.txt +9 -0
- gucmail-1.1.0/docs/examples/config.example.toml +34 -0
- gucmail-1.1.0/docs/examples/ndjson-events.example.ndjson +2 -0
- gucmail-1.1.0/docs/examples/scheduled-timeline.example.txt +5 -0
- gucmail-1.1.0/docs/examples/webhook-event.example.json +18 -0
- gucmail-1.1.0/docs/features/index.md +108 -0
- gucmail-1.1.0/docs/features/storage-and-quota.md +65 -0
- gucmail-1.1.0/docs/features/support-status.md +81 -0
- gucmail-1.1.0/docs/getting-started/index.md +424 -0
- gucmail-1.1.0/docs/glossary/index.md +71 -0
- gucmail-1.1.0/docs/img/backups.png +0 -0
- gucmail-1.1.0/docs/img/calendar.png +0 -0
- gucmail-1.1.0/docs/img/compose.png +0 -0
- gucmail-1.1.0/docs/img/contacts.png +0 -0
- gucmail-1.1.0/docs/img/mail-browse-demo.gif +0 -0
- gucmail-1.1.0/docs/img/mail.png +0 -0
- gucmail-1.1.0/docs/img/palette-demo.gif +0 -0
- gucmail-1.1.0/docs/img/palette.png +0 -0
- gucmail-1.1.0/docs/img/scheduled.png +0 -0
- gucmail-1.1.0/docs/img/settings.png +0 -0
- gucmail-1.1.0/docs/img/tasks.png +0 -0
- gucmail-1.1.0/docs/img/themes.png +0 -0
- gucmail-1.1.0/docs/index.md +61 -0
- gucmail-1.1.0/docs/integrations/automatic-replies.md +31 -0
- gucmail-1.1.0/docs/integrations/discord.md +64 -0
- gucmail-1.1.0/docs/integrations/inbox-rules.md +50 -0
- gucmail-1.1.0/docs/integrations/index.md +38 -0
- gucmail-1.1.0/docs/integrations/windows-desktop.md +108 -0
- gucmail-1.1.0/docs/monitoring/headless-deployment.md +95 -0
- gucmail-1.1.0/docs/monitoring/index.md +119 -0
- gucmail-1.1.0/docs/privacy-and-security/index.md +109 -0
- gucmail-1.1.0/docs/privacy-and-security/local-data-locations-and-retention.md +25 -0
- gucmail-1.1.0/docs/scheduling/index.md +214 -0
- gucmail-1.1.0/docs/scheduling/windows-task-scheduler.md +80 -0
- gucmail-1.1.0/docs/search/index.md +398 -0
- gucmail-1.1.0/docs/tasks/index.md +202 -0
- gucmail-1.1.0/docs/troubleshooting/index.md +113 -0
- gucmail-1.1.0/docs/user-guide/index.md +87 -0
- gucmail-1.1.0/pyproject.toml +163 -0
- gucmail-1.1.0/requirements.lock +79 -0
- gucmail-1.1.0/scripts/build_theme_catalogue.py +42 -0
- gucmail-1.1.0/scripts/capture_continuation_workflows.py +525 -0
- gucmail-1.1.0/scripts/generate_ews_operation_matrix.py +71 -0
- gucmail-1.1.0/scripts/generate_shortcut_catalog.py +138 -0
- gucmail-1.1.0/scripts/live_readonly_smoke.py +360 -0
- gucmail-1.1.0/scripts/offline_audit/__init__.py +1 -0
- gucmail-1.1.0/scripts/offline_audit/benchmark.py +101 -0
- gucmail-1.1.0/scripts/offline_audit/children.py +16 -0
- gucmail-1.1.0/scripts/offline_audit/datasets.py +217 -0
- gucmail-1.1.0/scripts/offline_audit/guard.py +462 -0
- gucmail-1.1.0/scripts/offline_audit/install.py +45 -0
- gucmail-1.1.0/scripts/offline_audit/mailbox.py +458 -0
- gucmail-1.1.0/scripts/offline_audit/preflight.py +99 -0
- gucmail-1.1.0/scripts/offline_audit/run.py +143 -0
- gucmail-1.1.0/scripts/offline_audit/workflows.py +179 -0
- gucmail-1.1.0/scripts/readiness_mail.py +437 -0
- gucmail-1.1.0/scripts/readiness_restore_replay_probe.py +126 -0
- gucmail-1.1.0/scripts/readiness_restore_ui_probe.py +148 -0
- gucmail-1.1.0/scripts/readiness_startup.py +243 -0
- gucmail-1.1.0/src/gucmail/__init__.py +7 -0
- gucmail-1.1.0/src/gucmail/__main__.py +6 -0
- gucmail-1.1.0/src/gucmail/actions.py +200 -0
- gucmail-1.1.0/src/gucmail/backup_format.py +740 -0
- gucmail-1.1.0/src/gucmail/bootstrap.py +157 -0
- gucmail-1.1.0/src/gucmail/cli.py +9024 -0
- gucmail-1.1.0/src/gucmail/command_catalog.py +2464 -0
- gucmail-1.1.0/src/gucmail/commands.py +1181 -0
- gucmail-1.1.0/src/gucmail/config.py +1323 -0
- gucmail-1.1.0/src/gucmail/constants.py +20 -0
- gucmail-1.1.0/src/gucmail/credentials.py +309 -0
- gucmail-1.1.0/src/gucmail/data/__init__.py +1 -0
- gucmail-1.1.0/src/gucmail/data/builtin-themes.json.gz +0 -0
- gucmail-1.1.0/src/gucmail/data/command_corpus.json +993 -0
- gucmail-1.1.0/src/gucmail/data/shortcut_catalog.json +2952 -0
- gucmail-1.1.0/src/gucmail/dates.py +235 -0
- gucmail-1.1.0/src/gucmail/doctor.py +155 -0
- gucmail-1.1.0/src/gucmail/errors.py +196 -0
- gucmail-1.1.0/src/gucmail/ews/__init__.py +5 -0
- gucmail-1.1.0/src/gucmail/ews/adapter.py +5601 -0
- gucmail-1.1.0/src/gucmail/ews/capabilities.py +711 -0
- gucmail-1.1.0/src/gucmail/ews/delegates.py +115 -0
- gucmail-1.1.0/src/gucmail/ews/inbox_rules.py +225 -0
- gucmail-1.1.0/src/gucmail/ews/mapping.py +940 -0
- gucmail-1.1.0/src/gucmail/ews/native_items.py +166 -0
- gucmail-1.1.0/src/gucmail/ews/soap.py +267 -0
- gucmail-1.1.0/src/gucmail/ews/sync.py +101 -0
- gucmail-1.1.0/src/gucmail/file_completion.py +58 -0
- gucmail-1.1.0/src/gucmail/formatting.py +183 -0
- gucmail-1.1.0/src/gucmail/headless.py +1050 -0
- gucmail-1.1.0/src/gucmail/help/__init__.py +62 -0
- gucmail-1.1.0/src/gucmail/help/catalog.toml +889 -0
- gucmail-1.1.0/src/gucmail/help/cli_syntax.py +183 -0
- gucmail-1.1.0/src/gucmail/help/history.py +159 -0
- gucmail-1.1.0/src/gucmail/help/links.py +93 -0
- gucmail-1.1.0/src/gucmail/help/models.py +234 -0
- gucmail-1.1.0/src/gucmail/help/pages/advanced/ews.md +19 -0
- gucmail-1.1.0/src/gucmail/help/pages/appearance/branding.md +15 -0
- gucmail-1.1.0/src/gucmail/help/pages/appearance/layout.md +41 -0
- gucmail-1.1.0/src/gucmail/help/pages/appearance/themes.md +11 -0
- gucmail-1.1.0/src/gucmail/help/pages/attachments/safety.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/backup/offline.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/backup/overview.md +49 -0
- gucmail-1.1.0/src/gucmail/help/pages/diagnostics/doctor.md +11 -0
- gucmail-1.1.0/src/gucmail/help/pages/faq/common.md +52 -0
- gucmail-1.1.0/src/gucmail/help/pages/faq/pc-on.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/integrations/discord.md +38 -0
- gucmail-1.1.0/src/gucmail/help/pages/integrations/providers.md +40 -0
- gucmail-1.1.0/src/gucmail/help/pages/integrations/webhooks.md +34 -0
- gucmail-1.1.0/src/gucmail/help/pages/mail/compose.md +53 -0
- gucmail-1.1.0/src/gucmail/help/pages/mail/deleted-items.md +14 -0
- gucmail-1.1.0/src/gucmail/help/pages/mail/drafts.md +43 -0
- gucmail-1.1.0/src/gucmail/help/pages/mail/folders.md +43 -0
- gucmail-1.1.0/src/gucmail/help/pages/mail/reading.md +62 -0
- gucmail-1.1.0/src/gucmail/help/pages/mail/scheduled.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/notifications/monitoring.md +17 -0
- gucmail-1.1.0/src/gucmail/help/pages/notifications/rules.md +75 -0
- gucmail-1.1.0/src/gucmail/help/pages/notifications/windows-startup.md +64 -0
- gucmail-1.1.0/src/gucmail/help/pages/notifications/windows.md +59 -0
- gucmail-1.1.0/src/gucmail/help/pages/palette/overview.md +21 -0
- gucmail-1.1.0/src/gucmail/help/pages/pim/calendar.md +105 -0
- gucmail-1.1.0/src/gucmail/help/pages/pim/contacts.md +95 -0
- gucmail-1.1.0/src/gucmail/help/pages/pim/tasks.md +113 -0
- gucmail-1.1.0/src/gucmail/help/pages/privacy/credentials.md +11 -0
- gucmail-1.1.0/src/gucmail/help/pages/privacy/local-data.md +19 -0
- gucmail-1.1.0/src/gucmail/help/pages/reference/commands.md +11 -0
- gucmail-1.1.0/src/gucmail/help/pages/reference/glossary.md +127 -0
- gucmail-1.1.0/src/gucmail/help/pages/reference/shortcuts.md +47 -0
- gucmail-1.1.0/src/gucmail/help/pages/search/local.md +93 -0
- gucmail-1.1.0/src/gucmail/help/pages/search/overview.md +56 -0
- gucmail-1.1.0/src/gucmail/help/pages/server/headless.md +70 -0
- gucmail-1.1.0/src/gucmail/help/pages/settings/overview.md +25 -0
- gucmail-1.1.0/src/gucmail/help/pages/start/first-launch.md +47 -0
- gucmail-1.1.0/src/gucmail/help/pages/start/interface.md +43 -0
- gucmail-1.1.0/src/gucmail/help/pages/start/login.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/start/overview.md +20 -0
- gucmail-1.1.0/src/gucmail/help/pages/start/using-help.md +46 -0
- gucmail-1.1.0/src/gucmail/help/pages/storage/cleanup.md +11 -0
- gucmail-1.1.0/src/gucmail/help/pages/storage/quota.md +50 -0
- gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/backup-search.md +47 -0
- gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/connection.md +32 -0
- gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/database.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/notifications.md +35 -0
- gucmail-1.1.0/src/gucmail/help/pages/troubleshooting/sending.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/tutorials/backup.md +18 -0
- gucmail-1.1.0/src/gucmail/help/pages/tutorials/first-message.md +16 -0
- gucmail-1.1.0/src/gucmail/help/pages/tutorials/notifications.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/tutorials/palette.md +13 -0
- gucmail-1.1.0/src/gucmail/help/pages/tutorials/scheduling.md +16 -0
- gucmail-1.1.0/src/gucmail/help/reference.py +371 -0
- gucmail-1.1.0/src/gucmail/help/repository.py +475 -0
- gucmail-1.1.0/src/gucmail/help/search.py +392 -0
- gucmail-1.1.0/src/gucmail/help/structure.py +139 -0
- gucmail-1.1.0/src/gucmail/help/tutorials.py +374 -0
- gucmail-1.1.0/src/gucmail/help/validation.py +379 -0
- gucmail-1.1.0/src/gucmail/logging_config.py +47 -0
- gucmail-1.1.0/src/gucmail/models.py +767 -0
- gucmail-1.1.0/src/gucmail/nlp.py +3057 -0
- gucmail-1.1.0/src/gucmail/notification_events.py +386 -0
- gucmail-1.1.0/src/gucmail/notification_history.py +459 -0
- gucmail-1.1.0/src/gucmail/notification_policies.py +1239 -0
- gucmail-1.1.0/src/gucmail/notification_providers/__init__.py +163 -0
- gucmail-1.1.0/src/gucmail/notification_providers/compat.py +283 -0
- gucmail-1.1.0/src/gucmail/notification_providers/core.py +712 -0
- gucmail-1.1.0/src/gucmail/notification_providers/reliability.py +373 -0
- gucmail-1.1.0/src/gucmail/notification_providers/webhook_payloads.py +734 -0
- gucmail-1.1.0/src/gucmail/notification_providers/windows.py +493 -0
- gucmail-1.1.0/src/gucmail/notification_rules.py +1217 -0
- gucmail-1.1.0/src/gucmail/onboarding.py +122 -0
- gucmail-1.1.0/src/gucmail/output.py +157 -0
- gucmail-1.1.0/src/gucmail/palette.py +639 -0
- gucmail-1.1.0/src/gucmail/platform_scheduler.py +403 -0
- gucmail-1.1.0/src/gucmail/py.typed +1 -0
- gucmail-1.1.0/src/gucmail/scheduler_entry.py +23 -0
- gucmail-1.1.0/src/gucmail/secret_store.py +263 -0
- gucmail-1.1.0/src/gucmail/security.py +222 -0
- gucmail-1.1.0/src/gucmail/services/__init__.py +100 -0
- gucmail-1.1.0/src/gucmail/services/_base.py +169 -0
- gucmail-1.1.0/src/gucmail/services/attachment_indexing.py +395 -0
- gucmail-1.1.0/src/gucmail/services/attachment_preferences.py +20 -0
- gucmail-1.1.0/src/gucmail/services/attachment_uploads.py +40 -0
- gucmail-1.1.0/src/gucmail/services/attachments.py +454 -0
- gucmail-1.1.0/src/gucmail/services/automatic_replies.py +158 -0
- gucmail-1.1.0/src/gucmail/services/backup.py +3005 -0
- gucmail-1.1.0/src/gucmail/services/calendar.py +1151 -0
- gucmail-1.1.0/src/gucmail/services/calendar_display.py +151 -0
- gucmail-1.1.0/src/gucmail/services/calendar_history.py +92 -0
- gucmail-1.1.0/src/gucmail/services/calendar_paging.py +186 -0
- gucmail-1.1.0/src/gucmail/services/calendar_preferences.py +88 -0
- gucmail-1.1.0/src/gucmail/services/calendar_working_time.py +211 -0
- gucmail-1.1.0/src/gucmail/services/cleanup.py +465 -0
- gucmail-1.1.0/src/gucmail/services/clusters.py +1048 -0
- gucmail-1.1.0/src/gucmail/services/compose.py +896 -0
- gucmail-1.1.0/src/gucmail/services/compose_preferences.py +115 -0
- gucmail-1.1.0/src/gucmail/services/contact_groups.py +250 -0
- gucmail-1.1.0/src/gucmail/services/contact_history.py +165 -0
- gucmail-1.1.0/src/gucmail/services/contact_preferences.py +70 -0
- gucmail-1.1.0/src/gucmail/services/contacts.py +1265 -0
- gucmail-1.1.0/src/gucmail/services/contacts_display.py +124 -0
- gucmail-1.1.0/src/gucmail/services/delegates.py +98 -0
- gucmail-1.1.0/src/gucmail/services/drafts.py +1601 -0
- gucmail-1.1.0/src/gucmail/services/editor.py +231 -0
- gucmail-1.1.0/src/gucmail/services/exchange_values.py +164 -0
- gucmail-1.1.0/src/gucmail/services/extractors.py +1081 -0
- gucmail-1.1.0/src/gucmail/services/folders.py +408 -0
- gucmail-1.1.0/src/gucmail/services/gateway.py +16 -0
- gucmail-1.1.0/src/gucmail/services/inbox_rules.py +172 -0
- gucmail-1.1.0/src/gucmail/services/index.py +1134 -0
- gucmail-1.1.0/src/gucmail/services/insights.py +764 -0
- gucmail-1.1.0/src/gucmail/services/interchange.py +878 -0
- gucmail-1.1.0/src/gucmail/services/keyboard_bindings.py +144 -0
- gucmail-1.1.0/src/gucmail/services/keyboard_preferences.py +165 -0
- gucmail-1.1.0/src/gucmail/services/layout_presets.py +164 -0
- gucmail-1.1.0/src/gucmail/services/local_features.py +295 -0
- gucmail-1.1.0/src/gucmail/services/local_search.py +571 -0
- gucmail-1.1.0/src/gucmail/services/mail_preferences.py +159 -0
- gucmail-1.1.0/src/gucmail/services/message_columns.py +99 -0
- gucmail-1.1.0/src/gucmail/services/message_export.py +146 -0
- gucmail-1.1.0/src/gucmail/services/message_scan.py +47 -0
- gucmail-1.1.0/src/gucmail/services/messages.py +521 -0
- gucmail-1.1.0/src/gucmail/services/monitoring.py +1209 -0
- gucmail-1.1.0/src/gucmail/services/monitoring_outbox.py +729 -0
- gucmail-1.1.0/src/gucmail/services/monitoring_preferences.py +154 -0
- gucmail-1.1.0/src/gucmail/services/notification_configuration.py +2206 -0
- gucmail-1.1.0/src/gucmail/services/notification_rule_editing.py +88 -0
- gucmail-1.1.0/src/gucmail/services/notification_simulation.py +84 -0
- gucmail-1.1.0/src/gucmail/services/notifications.py +787 -0
- gucmail-1.1.0/src/gucmail/services/ocr.py +550 -0
- gucmail-1.1.0/src/gucmail/services/pim.py +166 -0
- gucmail-1.1.0/src/gucmail/services/pim_preferences.py +236 -0
- gucmail-1.1.0/src/gucmail/services/profiled_notifications.py +683 -0
- gucmail-1.1.0/src/gucmail/services/quota.py +1050 -0
- gucmail-1.1.0/src/gucmail/services/recipient_assistance.py +141 -0
- gucmail-1.1.0/src/gucmail/services/recurrence.py +1776 -0
- gucmail-1.1.0/src/gucmail/services/recurring.py +642 -0
- gucmail-1.1.0/src/gucmail/services/restore_journal.py +247 -0
- gucmail-1.1.0/src/gucmail/services/scheduler.py +1513 -0
- gucmail-1.1.0/src/gucmail/services/search.py +1386 -0
- gucmail-1.1.0/src/gucmail/services/semantic.py +568 -0
- gucmail-1.1.0/src/gucmail/services/semantic_model.py +370 -0
- gucmail-1.1.0/src/gucmail/services/semantic_search.py +157 -0
- gucmail-1.1.0/src/gucmail/services/send_attempts.py +138 -0
- gucmail-1.1.0/src/gucmail/services/shell_preferences.py +69 -0
- gucmail-1.1.0/src/gucmail/services/shortcuts.py +141 -0
- gucmail-1.1.0/src/gucmail/services/startup_runtime.py +408 -0
- gucmail-1.1.0/src/gucmail/services/task_history.py +276 -0
- gucmail-1.1.0/src/gucmail/services/task_recurrence.py +122 -0
- gucmail-1.1.0/src/gucmail/services/tasks.py +791 -0
- gucmail-1.1.0/src/gucmail/services/tasks_display.py +171 -0
- gucmail-1.1.0/src/gucmail/services/ui_session.py +138 -0
- gucmail-1.1.0/src/gucmail/services/unanswered.py +235 -0
- gucmail-1.1.0/src/gucmail/services/watcher_runtime.py +103 -0
- gucmail-1.1.0/src/gucmail/services/webhooks.py +1064 -0
- gucmail-1.1.0/src/gucmail/services/windows_desktop.py +503 -0
- gucmail-1.1.0/src/gucmail/settings.py +4054 -0
- gucmail-1.1.0/src/gucmail/startup.py +884 -0
- gucmail-1.1.0/src/gucmail/state.py +4190 -0
- gucmail-1.1.0/src/gucmail/state_health.py +362 -0
- gucmail-1.1.0/src/gucmail/toast_entry.py +91 -0
- gucmail-1.1.0/src/gucmail/tui/__init__.py +10 -0
- gucmail-1.1.0/src/gucmail/tui/activity_screen.py +955 -0
- gucmail-1.1.0/src/gucmail/tui/app.py +13098 -0
- gucmail-1.1.0/src/gucmail/tui/appearance_screen.py +1447 -0
- gucmail-1.1.0/src/gucmail/tui/area_backends.py +3705 -0
- gucmail-1.1.0/src/gucmail/tui/area_common.py +685 -0
- gucmail-1.1.0/src/gucmail/tui/automatic_replies_screen.py +224 -0
- gucmail-1.1.0/src/gucmail/tui/backup_screen.py +2460 -0
- gucmail-1.1.0/src/gucmail/tui/branding.py +1414 -0
- gucmail-1.1.0/src/gucmail/tui/branding_screen.py +750 -0
- gucmail-1.1.0/src/gucmail/tui/composer_submission.py +373 -0
- gucmail-1.1.0/src/gucmail/tui/contact_fields.py +103 -0
- gucmail-1.1.0/src/gucmail/tui/contact_groups_screen.py +360 -0
- gucmail-1.1.0/src/gucmail/tui/contact_history_screen.py +130 -0
- gucmail-1.1.0/src/gucmail/tui/delegates_screen.py +137 -0
- gucmail-1.1.0/src/gucmail/tui/desktop_setup_screen.py +133 -0
- gucmail-1.1.0/src/gucmail/tui/diagnostics_screen.py +711 -0
- gucmail-1.1.0/src/gucmail/tui/drafts_attachments_backend.py +1148 -0
- gucmail-1.1.0/src/gucmail/tui/drafts_attachments_screen.py +1241 -0
- gucmail-1.1.0/src/gucmail/tui/inbox_rules_screen.py +285 -0
- gucmail-1.1.0/src/gucmail/tui/keyboard_bindings.py +44 -0
- gucmail-1.1.0/src/gucmail/tui/keyboard_editor.py +476 -0
- gucmail-1.1.0/src/gucmail/tui/layout_presets_screen.py +205 -0
- gucmail-1.1.0/src/gucmail/tui/literal_select.py +23 -0
- gucmail-1.1.0/src/gucmail/tui/literal_table.py +79 -0
- gucmail-1.1.0/src/gucmail/tui/local_search_screen.py +562 -0
- gucmail-1.1.0/src/gucmail/tui/message_columns_preview.py +91 -0
- gucmail-1.1.0/src/gucmail/tui/message_columns_screen.py +193 -0
- gucmail-1.1.0/src/gucmail/tui/notification_reader.py +105 -0
- gucmail-1.1.0/src/gucmail/tui/notification_rule_builder.py +474 -0
- gucmail-1.1.0/src/gucmail/tui/notification_settings_screen.py +4255 -0
- gucmail-1.1.0/src/gucmail/tui/ocr_screen.py +236 -0
- gucmail-1.1.0/src/gucmail/tui/offline_pim_screen.py +345 -0
- gucmail-1.1.0/src/gucmail/tui/palette_routes.py +2078 -0
- gucmail-1.1.0/src/gucmail/tui/pim_screens.py +6363 -0
- gucmail-1.1.0/src/gucmail/tui/pim_submission.py +235 -0
- gucmail-1.1.0/src/gucmail/tui/recipient_suggester.py +15 -0
- gucmail-1.1.0/src/gucmail/tui/runtime.py +92 -0
- gucmail-1.1.0/src/gucmail/tui/saved_search_screen.py +948 -0
- gucmail-1.1.0/src/gucmail/tui/scheduled_screen.py +1216 -0
- gucmail-1.1.0/src/gucmail/tui/semantic_screen.py +298 -0
- gucmail-1.1.0/src/gucmail/tui/settings_form.py +152 -0
- gucmail-1.1.0/src/gucmail/tui/settings_screen.py +2163 -0
- gucmail-1.1.0/src/gucmail/tui/shortcuts_screen.py +453 -0
- gucmail-1.1.0/src/gucmail/tui/stable_footer.py +58 -0
- gucmail-1.1.0/src/gucmail/tui/startup_screen.py +194 -0
- gucmail-1.1.0/src/gucmail/tui/storage_screen.py +1082 -0
- gucmail-1.1.0/src/gucmail/tui/task_delete_screen.py +122 -0
- gucmail-1.1.0/src/gucmail/tui/theme_repository.py +502 -0
- gucmail-1.1.0/src/gucmail/tui/themes.py +2482 -0
- gucmail-1.1.0/src/gucmail/tui/tutorial_screen.py +256 -0
- gucmail-1.1.0/src/gucmail/tui/unanswered_screen.py +188 -0
- gucmail-1.1.0/src/gucmail/tui/visual_language.py +187 -0
- gucmail-1.1.0/src/gucmail/tui/write_coordinator.py +165 -0
- gucmail-1.1.0/src/gucmail/watcher_entry.py +42 -0
- gucmail-1.1.0/src/gucmail/windows_identity.py +78 -0
- gucmail-1.1.0/tests/attachment_worker_fixtures.py +15 -0
- gucmail-1.1.0/tests/fixtures/guc-logo-source.png +0 -0
- gucmail-1.1.0/tests/fixtures/semantic-local-lsa-v1-provenance.json +19 -0
- gucmail-1.1.0/tests/fixtures/semantic-local-lsa-v1.json +1 -0
- gucmail-1.1.0/tests/test_acceptance_ews_regressions.py +798 -0
- gucmail-1.1.0/tests/test_activity_operation_recovery.py +90 -0
- gucmail-1.1.0/tests/test_advanced_search_prompt.py +87 -0
- gucmail-1.1.0/tests/test_appearance_browsers.py +476 -0
- gucmail-1.1.0/tests/test_appearance_settings_refresh.py +85 -0
- gucmail-1.1.0/tests/test_attachment_index_controls.py +335 -0
- gucmail-1.1.0/tests/test_attachment_index_producer.py +265 -0
- gucmail-1.1.0/tests/test_attachment_index_tui.py +200 -0
- gucmail-1.1.0/tests/test_attachment_preferences.py +513 -0
- gucmail-1.1.0/tests/test_automatic_replies.py +300 -0
- gucmail-1.1.0/tests/test_backup.py +538 -0
- gucmail-1.1.0/tests/test_backup_pim_boundary.py +151 -0
- gucmail-1.1.0/tests/test_backup_scope.py +266 -0
- gucmail-1.1.0/tests/test_bootstrap.py +114 -0
- gucmail-1.1.0/tests/test_branding_browser_io.py +305 -0
- gucmail-1.1.0/tests/test_branding_secondpass.py +177 -0
- gucmail-1.1.0/tests/test_builtin_theme_catalogue.py +99 -0
- gucmail-1.1.0/tests/test_calendar_continuation.py +199 -0
- gucmail-1.1.0/tests/test_calendar_display_preferences.py +406 -0
- gucmail-1.1.0/tests/test_calendar_history.py +343 -0
- gucmail-1.1.0/tests/test_calendar_operations.py +497 -0
- gucmail-1.1.0/tests/test_calendar_scope_safety.py +323 -0
- gucmail-1.1.0/tests/test_calendar_secondpass.py +553 -0
- gucmail-1.1.0/tests/test_calendar_working_time.py +491 -0
- gucmail-1.1.0/tests/test_cleanup_operation_recovery.py +221 -0
- gucmail-1.1.0/tests/test_cleanup_tui_secondpass.py +220 -0
- gucmail-1.1.0/tests/test_cli.py +380 -0
- gucmail-1.1.0/tests/test_cli_core_mail_output.py +160 -0
- gucmail-1.1.0/tests/test_command_registry_contract.py +448 -0
- gucmail-1.1.0/tests/test_compose_preferences.py +611 -0
- gucmail-1.1.0/tests/test_composer_handoffs.py +128 -0
- gucmail-1.1.0/tests/test_composer_status_isolation.py +432 -0
- gucmail-1.1.0/tests/test_composer_submission_recovery.py +321 -0
- gucmail-1.1.0/tests/test_config_atomic_snapshots.py +269 -0
- gucmail-1.1.0/tests/test_contact_groups.py +431 -0
- gucmail-1.1.0/tests/test_contact_operations.py +690 -0
- gucmail-1.1.0/tests/test_contacts_detail_keyboard.py +51 -0
- gucmail-1.1.0/tests/test_contacts_display_preferences.py +407 -0
- gucmail-1.1.0/tests/test_contacts_secondpass.py +376 -0
- gucmail-1.1.0/tests/test_delegates.py +447 -0
- gucmail-1.1.0/tests/test_diagnostics_tui_secondpass.py +349 -0
- gucmail-1.1.0/tests/test_display_and_capability_settings.py +59 -0
- gucmail-1.1.0/tests/test_documentation.py +115 -0
- gucmail-1.1.0/tests/test_draft_delete_review.py +128 -0
- gucmail-1.1.0/tests/test_draft_paging.py +286 -0
- gucmail-1.1.0/tests/test_drafts.py +164 -0
- gucmail-1.1.0/tests/test_editor_secondpass.py +72 -0
- gucmail-1.1.0/tests/test_ews_adapter.py +1010 -0
- gucmail-1.1.0/tests/test_ews_adapter_core_regressions.py +232 -0
- gucmail-1.1.0/tests/test_expert_request_boundaries.py +100 -0
- gucmail-1.1.0/tests/test_explicit_folder_reference_nlp.py +40 -0
- gucmail-1.1.0/tests/test_explicit_search_scope.py +50 -0
- gucmail-1.1.0/tests/test_file_completion.py +89 -0
- gucmail-1.1.0/tests/test_folder_path_roundtrip.py +75 -0
- gucmail-1.1.0/tests/test_folder_properties_layout.py +68 -0
- gucmail-1.1.0/tests/test_folder_reference_paths.py +413 -0
- gucmail-1.1.0/tests/test_folder_reference_recovery.py +187 -0
- gucmail-1.1.0/tests/test_folder_role_search_scope.py +119 -0
- gucmail-1.1.0/tests/test_folder_selection_race.py +101 -0
- gucmail-1.1.0/tests/test_folder_tree_secondpass.py +703 -0
- gucmail-1.1.0/tests/test_foundations.py +304 -0
- gucmail-1.1.0/tests/test_frontend_overhaul.py +70 -0
- gucmail-1.1.0/tests/test_general_keyboard_bindings.py +819 -0
- gucmail-1.1.0/tests/test_headless_startup.py +676 -0
- gucmail-1.1.0/tests/test_help.py +235 -0
- gucmail-1.1.0/tests/test_help_cli_syntax.py +325 -0
- gucmail-1.1.0/tests/test_help_completion.py +278 -0
- gucmail-1.1.0/tests/test_help_integrity.py +192 -0
- gucmail-1.1.0/tests/test_inbox_rules.py +407 -0
- gucmail-1.1.0/tests/test_index.py +82 -0
- gucmail-1.1.0/tests/test_index_batches_and_streaming.py +125 -0
- gucmail-1.1.0/tests/test_index_metadata_ranking.py +241 -0
- gucmail-1.1.0/tests/test_index_rebuild_atomicity.py +369 -0
- gucmail-1.1.0/tests/test_index_rebuild_tui.py +121 -0
- gucmail-1.1.0/tests/test_inline_mail_header.py +32 -0
- gucmail-1.1.0/tests/test_layout_presets.py +241 -0
- gucmail-1.1.0/tests/test_literal_choices_and_folders.py +88 -0
- gucmail-1.1.0/tests/test_literal_tables.py +107 -0
- gucmail-1.1.0/tests/test_live_readonly_guard.py +143 -0
- gucmail-1.1.0/tests/test_local_features.py +43 -0
- gucmail-1.1.0/tests/test_local_ocr.py +340 -0
- gucmail-1.1.0/tests/test_local_ocr_cli.py +72 -0
- gucmail-1.1.0/tests/test_local_ocr_tui.py +178 -0
- gucmail-1.1.0/tests/test_local_ocr_worker.py +119 -0
- gucmail-1.1.0/tests/test_local_search_secondpass.py +294 -0
- gucmail-1.1.0/tests/test_mail_deletion_grouping_preferences.py +496 -0
- gucmail-1.1.0/tests/test_mail_preferences.py +204 -0
- gucmail-1.1.0/tests/test_mail_response_preferences.py +572 -0
- gucmail-1.1.0/tests/test_mail_search_heading.py +120 -0
- gucmail-1.1.0/tests/test_mail_search_prompt.py +89 -0
- gucmail-1.1.0/tests/test_mail_search_scope_session.py +237 -0
- gucmail-1.1.0/tests/test_mail_services.py +464 -0
- gucmail-1.1.0/tests/test_mail_shell_polish.py +84 -0
- gucmail-1.1.0/tests/test_mail_startup_and_write_feedback.py +298 -0
- gucmail-1.1.0/tests/test_mail_viewport_fill.py +189 -0
- gucmail-1.1.0/tests/test_mailbox_search_cli.py +81 -0
- gucmail-1.1.0/tests/test_mailbox_search_library_boundaries.py +202 -0
- gucmail-1.1.0/tests/test_mailbox_search_scope.py +250 -0
- gucmail-1.1.0/tests/test_mark_read_timing.py +349 -0
- gucmail-1.1.0/tests/test_message_columns.py +318 -0
- gucmail-1.1.0/tests/test_message_export_secondpass.py +63 -0
- gucmail-1.1.0/tests/test_message_mutation_campaign.py +146 -0
- gucmail-1.1.0/tests/test_message_operation_outcomes.py +158 -0
- gucmail-1.1.0/tests/test_monitoring.py +255 -0
- gucmail-1.1.0/tests/test_monitoring_foundation.py +456 -0
- gucmail-1.1.0/tests/test_monitoring_preferences.py +149 -0
- gucmail-1.1.0/tests/test_monochrome_theme_fidelity.py +83 -0
- gucmail-1.1.0/tests/test_native_item_backup.py +820 -0
- gucmail-1.1.0/tests/test_native_sync.py +267 -0
- gucmail-1.1.0/tests/test_nlp_contract.py +120 -0
- gucmail-1.1.0/tests/test_nlp_person_candidates.py +84 -0
- gucmail-1.1.0/tests/test_nlp_secondpass.py +690 -0
- gucmail-1.1.0/tests/test_notification_cli_secondpass.py +142 -0
- gucmail-1.1.0/tests/test_notification_configuration_secondpass.py +526 -0
- gucmail-1.1.0/tests/test_notification_guided_workflows.py +251 -0
- gucmail-1.1.0/tests/test_notification_loading_responsiveness.py +372 -0
- gucmail-1.1.0/tests/test_notification_profile_refresh.py +84 -0
- gucmail-1.1.0/tests/test_notification_provider_filter.py +260 -0
- gucmail-1.1.0/tests/test_notification_providers_secondpass.py +791 -0
- gucmail-1.1.0/tests/test_notification_rules_secondpass.py +393 -0
- gucmail-1.1.0/tests/test_notification_runtime_preview.py +441 -0
- gucmail-1.1.0/tests/test_notification_settings_screen_secondpass.py +933 -0
- gucmail-1.1.0/tests/test_notification_write_responsiveness.py +291 -0
- gucmail-1.1.0/tests/test_notifications.py +756 -0
- gucmail-1.1.0/tests/test_offline_guard_aggregation.py +28 -0
- gucmail-1.1.0/tests/test_offline_pim.py +170 -0
- gucmail-1.1.0/tests/test_operational_screens_secondpass.py +669 -0
- gucmail-1.1.0/tests/test_original_guc_mark.py +134 -0
- gucmail-1.1.0/tests/test_package_artifacts.py +434 -0
- gucmail-1.1.0/tests/test_palette.py +42 -0
- gucmail-1.1.0/tests/test_palette_action_clarity.py +206 -0
- gucmail-1.1.0/tests/test_palette_routes.py +438 -0
- gucmail-1.1.0/tests/test_palette_runtime.py +63 -0
- gucmail-1.1.0/tests/test_persistence_security_hardening.py +441 -0
- gucmail-1.1.0/tests/test_pim.py +569 -0
- gucmail-1.1.0/tests/test_pim_cli_regressions.py +319 -0
- gucmail-1.1.0/tests/test_pim_creation_preferences.py +645 -0
- gucmail-1.1.0/tests/test_pim_editor_visibility.py +53 -0
- gucmail-1.1.0/tests/test_pim_initial_geometry.py +50 -0
- gucmail-1.1.0/tests/test_pim_pagination.py +266 -0
- gucmail-1.1.0/tests/test_pim_safety.py +336 -0
- gucmail-1.1.0/tests/test_pim_save_recovery.py +222 -0
- gucmail-1.1.0/tests/test_profiled_notifications.py +439 -0
- gucmail-1.1.0/tests/test_quota_fallback_experience.py +193 -0
- gucmail-1.1.0/tests/test_quota_secondpass.py +618 -0
- gucmail-1.1.0/tests/test_recipient_assistance.py +524 -0
- gucmail-1.1.0/tests/test_recurrence.py +511 -0
- gucmail-1.1.0/tests/test_recurrence_ews_boundary.py +72 -0
- gucmail-1.1.0/tests/test_release_boundaries.py +230 -0
- gucmail-1.1.0/tests/test_release_tui.py +164 -0
- gucmail-1.1.0/tests/test_restore_cancellation.py +379 -0
- gucmail-1.1.0/tests/test_restore_cli_recovery.py +97 -0
- gucmail-1.1.0/tests/test_restore_deadlines.py +386 -0
- gucmail-1.1.0/tests/test_restore_journal.py +155 -0
- gucmail-1.1.0/tests/test_restore_migration.py +133 -0
- gucmail-1.1.0/tests/test_restore_outcomes.py +524 -0
- gucmail-1.1.0/tests/test_restore_planning_cancel_ui.py +212 -0
- gucmail-1.1.0/tests/test_restore_planning_cancellation.py +356 -0
- gucmail-1.1.0/tests/test_restore_recovery.py +197 -0
- gucmail-1.1.0/tests/test_restore_ui_recovery.py +292 -0
- gucmail-1.1.0/tests/test_saved_search_tui_secondpass.py +246 -0
- gucmail-1.1.0/tests/test_scheduled_screen.py +218 -0
- gucmail-1.1.0/tests/test_scheduler.py +283 -0
- gucmail-1.1.0/tests/test_scheduler_encoding.py +32 -0
- gucmail-1.1.0/tests/test_search.py +270 -0
- gucmail-1.1.0/tests/test_search_planner_secondpass.py +386 -0
- gucmail-1.1.0/tests/test_search_request_lifecycle.py +266 -0
- gucmail-1.1.0/tests/test_semantic_cli.py +130 -0
- gucmail-1.1.0/tests/test_semantic_search.py +293 -0
- gucmail-1.1.0/tests/test_semantic_tui.py +192 -0
- gucmail-1.1.0/tests/test_send_attempts.py +343 -0
- gucmail-1.1.0/tests/test_send_entrypoints.py +261 -0
- gucmail-1.1.0/tests/test_settings_focus_handoffs.py +127 -0
- gucmail-1.1.0/tests/test_settings_secondpass.py +263 -0
- gucmail-1.1.0/tests/test_settings_theme_integration.py +221 -0
- gucmail-1.1.0/tests/test_settings_visual_layout.py +157 -0
- gucmail-1.1.0/tests/test_shell_preferences.py +190 -0
- gucmail-1.1.0/tests/test_shortcut_preferences.py +455 -0
- gucmail-1.1.0/tests/test_soap.py +205 -0
- gucmail-1.1.0/tests/test_stable_footer.py +237 -0
- gucmail-1.1.0/tests/test_startup_errors.py +506 -0
- gucmail-1.1.0/tests/test_startup_runtime.py +271 -0
- gucmail-1.1.0/tests/test_state.py +399 -0
- gucmail-1.1.0/tests/test_styles_cache_runtime.py +56 -0
- gucmail-1.1.0/tests/test_table_selection.py +58 -0
- gucmail-1.1.0/tests/test_task_deletion_scope.py +528 -0
- gucmail-1.1.0/tests/test_task_editor_focus.py +85 -0
- gucmail-1.1.0/tests/test_task_history.py +489 -0
- gucmail-1.1.0/tests/test_task_regeneration.py +448 -0
- gucmail-1.1.0/tests/test_task_repeat_preferences.py +429 -0
- gucmail-1.1.0/tests/test_task_workflows.py +472 -0
- gucmail-1.1.0/tests/test_tasks_display_preferences.py +477 -0
- gucmail-1.1.0/tests/test_tasks_secondpass.py +179 -0
- gucmail-1.1.0/tests/test_theme_browser_io.py +318 -0
- gucmail-1.1.0/tests/test_theme_palette_io.py +103 -0
- gucmail-1.1.0/tests/test_theme_repository.py +150 -0
- gucmail-1.1.0/tests/test_tui.py +6532 -0
- gucmail-1.1.0/tests/test_tui_beta_qa_regressions.py +187 -0
- gucmail-1.1.0/tests/test_tui_visual_regressions.py +1438 -0
- gucmail-1.1.0/tests/test_tutorials.py +286 -0
- gucmail-1.1.0/tests/test_ui_session.py +353 -0
- gucmail-1.1.0/tests/test_unanswered.py +266 -0
- gucmail-1.1.0/tests/test_windows_desktop.py +1227 -0
- gucmail-1.1.0/tests/test_windows_identity.py +78 -0
- gucmail-1.1.0/tests/test_windows_textual_timer.py +88 -0
- gucmail-1.1.0/tests/test_write_coordinator.py +496 -0
gucmail-1.1.0/.gitignore
ADDED
|
@@ -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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+
|  |  |
|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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.
|
gucmail-1.1.0/README.md
ADDED
|
@@ -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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+
|  |  |
|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+
|