PSA/ee/docs/plans/imap-inbound-email-features.json
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

839 lines
23 KiB
JSON

[
{
"description": "Allow inbound email provider type 'imap' in shared inbound email interfaces",
"implemented": true
},
{
"description": "Allow inbound email provider type 'imap' in server email interfaces",
"implemented": true
},
{
"description": "Expose IMAP provider type in provider type validation for inbound email actions",
"implemented": true
},
{
"description": "Persist IMAP provider records in email_providers with provider_type='imap'",
"implemented": true
},
{
"description": "Create imap_email_provider_config table with tenant + provider composite primary key",
"implemented": true
},
{
"description": "Store IMAP host in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP port in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP TLS/SSL boolean in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP STARTTLS preference in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP authentication type (password|oauth2) in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP username in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP folder_filters (json array) in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP auto_process_emails flag in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP max_emails_per_sync in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP last_uid per provider in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP uid_validity per provider in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP last_seen_at timestamp per provider in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP last_sync_at timestamp per provider in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP last_error message per provider in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP OAuth access token in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP OAuth refresh token in imap_email_provider_config",
"implemented": true
},
{
"description": "Store IMAP OAuth token expiry in imap_email_provider_config",
"implemented": true
},
{
"description": "Create index on imap_email_provider_config (tenant)",
"implemented": true
},
{
"description": "Create index on imap_email_provider_config (tenant, email_provider_id)",
"implemented": true
},
{
"description": "Distribute imap_email_provider_config by tenant for Citus deployments",
"implemented": true
},
{
"description": "Extend EmailProviderService.getProviders to load IMAP vendor config",
"implemented": true
},
{
"description": "Extend EmailProviderService.getProvider to load IMAP vendor config",
"implemented": true
},
{
"description": "Extend EmailProviderService.createProvider to persist IMAP vendor config",
"implemented": true
},
{
"description": "Extend EmailProviderService.updateProvider to update IMAP vendor config",
"implemented": true
},
{
"description": "Extend EmailProviderService.deleteProvider to delete IMAP vendor config",
"implemented": true
},
{
"description": "Expose IMAP provider config in emailProviderActions create/update payloads",
"implemented": true
},
{
"description": "Add IMAP provider config to EmailProviderConfiguration types",
"implemented": true
},
{
"description": "Add IMAP provider in EmailProviderSelector UI",
"implemented": true
},
{
"description": "Add IMAP provider card styling and copy in selector UI",
"implemented": true
},
{
"description": "Add IMAP provider form for OSS bundle",
"implemented": true
},
{
"description": "Add IMAP provider form for EE bundle",
"implemented": true
},
{
"description": "Collect IMAP mailbox address in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP host in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP port in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP TLS/SSL option in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP STARTTLS option in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP authentication type in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP username in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP password/app-password in IMAP provider form",
"implemented": true
},
{
"description": "Collect IMAP OAuth authorize URL input when auth_type=oauth2",
"implemented": true
},
{
"description": "Collect IMAP OAuth token URL input when auth_type=oauth2",
"implemented": true
},
{
"description": "Collect IMAP OAuth client_id input when auth_type=oauth2",
"implemented": true
},
{
"description": "Collect IMAP OAuth client_secret input when auth_type=oauth2",
"implemented": true
},
{
"description": "Collect IMAP OAuth scopes input when auth_type=oauth2",
"implemented": true
},
{
"description": "Collect IMAP folder filters in IMAP provider form",
"implemented": true
},
{
"description": "Do not expose IMAP auto_process_emails in provider UI; always on (processing gated by provider Active flag)",
"implemented": true
},
{
"description": "Do not expose IMAP max_emails_per_sync in provider UI; enforce via env/default (default 5)",
"implemented": true
},
{
"description": "Collect inbound ticket defaults in IMAP provider form",
"implemented": true
},
{
"description": "Persist inbound ticket defaults for IMAP providers",
"implemented": true
},
{
"description": "Validate IMAP host is non-empty in server-side validator",
"implemented": true
},
{
"description": "Validate IMAP port is within valid range in server-side validator",
"implemented": true
},
{
"description": "Validate IMAP mailbox is a valid email in server-side validator",
"implemented": true
},
{
"description": "Validate IMAP auth_type is supported in server-side validator",
"implemented": true
},
{
"description": "Require IMAP username/password when auth_type=password",
"implemented": true
},
{
"description": "Require IMAP OAuth settings when auth_type=oauth2",
"implemented": true
},
{
"description": "Persist IMAP password via tenant secret provider",
"implemented": true
},
{
"description": "Persist IMAP OAuth client_secret via tenant secret provider",
"implemented": true
},
{
"description": "Persist IMAP OAuth refresh_token via tenant secret provider",
"implemented": true
},
{
"description": "Support IMAP OAuth2 authorization flow to obtain refresh token",
"implemented": true
},
{
"description": "Support IMAP OAuth2 token refresh flow",
"implemented": true
},
{
"description": "Store IMAP OAuth access token in vendor config after refresh",
"implemented": true
},
{
"description": "Store IMAP OAuth expires_at in vendor config after refresh",
"implemented": true
},
{
"description": "Add server API to initiate IMAP OAuth flow",
"implemented": true
},
{
"description": "Add server API callback endpoint for IMAP OAuth",
"implemented": true
},
{
"description": "Record IMAP OAuth connection status on provider after callback",
"implemented": true
},
{
"description": "Add IMAP provider in ProviderSetupWizardDialog flow",
"implemented": true
},
{
"description": "Show IMAP provider status in EmailProviderCard",
"implemented": true
},
{
"description": "Show IMAP connection error in EmailProviderCard",
"implemented": true
},
{
"description": "Enable Test Connection action for IMAP providers",
"implemented": true
},
{
"description": "Implement IMAP Test Connection on server via IMAP service or adapter",
"implemented": true
},
{
"description": "Update EmailProviderList to handle IMAP test/refresh actions",
"implemented": true
},
{
"description": "Add IMAP provider to any provider type filters or enums in UI",
"implemented": true
},
{
"description": "Create new service package services/email-service",
"implemented": true
},
{
"description": "Add services/email-service package.json with dependencies",
"implemented": true
},
{
"description": "Add services/email-service tsconfig",
"implemented": true
},
{
"description": "Add services/email-service entrypoint to start worker",
"implemented": true
},
{
"description": "Add Dockerfile for services/email-service",
"implemented": true
},
{
"description": "Add docker-compose service definition for email-service (dev)",
"implemented": true
},
{
"description": "Add docker-compose service definition for email-service (prod)",
"implemented": true
},
{
"description": "Add environment variable wiring for email-service",
"implemented": true
},
{
"description": "Add /health HTTP endpoint to email-service for Kubernetes probes",
"implemented": true
},
{
"description": "Add Helm chart ee/helm/email-service for Kubernetes deployment",
"implemented": true
},
{
"description": "Add nm-kube-config values files for email-service deployments",
"implemented": true
},
{
"description": "Add Argo workflow template to build and deploy email-service",
"implemented": true
},
{
"description": "Implement IMAP connection manager per provider",
"implemented": true
},
{
"description": "Implement IMAP connection pool or per-provider connection tracking",
"implemented": true
},
{
"description": "Load active IMAP providers from DB on service startup",
"implemented": true
},
{
"description": "Refresh IMAP provider list on interval (configurable)",
"implemented": true
},
{
"description": "Connect IMAP providers marked active only",
"implemented": true
},
{
"description": "Skip IMAP providers with status=error until re-enabled",
"implemented": true
},
{
"description": "Support multiple folder subscriptions per IMAP provider",
"implemented": true
},
{
"description": "Resolve folder names against IMAP mailbox hierarchy",
"implemented": true
},
{
"description": "Fallback to INBOX when folder_filters empty",
"implemented": true
},
{
"description": "Implement IMAP IDLE listener for new mail",
"implemented": true
},
{
"description": "Implement automatic re-IDLE after server idle timeout",
"implemented": true
},
{
"description": "Detect IMAP connection drops and reconnect with backoff",
"implemented": true
},
{
"description": "Use exponential backoff with jitter for IMAP reconnect",
"implemented": true
},
{
"description": "Add jitter to IMAP timers (refresh/poll/idle-noop/heartbeat) to avoid thundering herd",
"implemented": true
},
{
"description": "Stagger IMAP folder listener startup to avoid connection spikes on service restart",
"implemented": true
},
{
"description": "Cap IMAP reconnect backoff to configurable max",
"implemented": true
},
{
"description": "Mark provider status=disconnected on IMAP disconnect",
"implemented": true
},
{
"description": "Mark provider status=connected on successful IMAP login",
"implemented": true
},
{
"description": "Persist last_error when IMAP connection fails",
"implemented": true
},
{
"description": "Persist last_seen_at on successful IMAP polling/idle",
"implemented": true
},
{
"description": "Use UIDVALIDITY to detect mailbox reset",
"implemented": true
},
{
"description": "On UIDVALIDITY change, reset last_uid and resync",
"implemented": true
},
{
"description": "Track last_uid per provider folder in state",
"implemented": true
},
{
"description": "Persist last_uid to imap_email_provider_config",
"implemented": true
},
{
"description": "Fetch new message UIDs when EXISTS event fires",
"implemented": true
},
{
"description": "Support IMAP SEARCH to find unseen/new messages",
"implemented": true
},
{
"description": "Support IMAP FETCH of full message body without marking seen",
"implemented": true
},
{
"description": "Enforce read-only mode by using BODY.PEEK",
"implemented": true
},
{
"description": "Parse raw RFC822 message into EmailMessageDetails",
"implemented": true
},
{
"description": "Extract subject from MIME headers",
"implemented": true
},
{
"description": "Extract from address from MIME headers",
"implemented": true
},
{
"description": "Extract to addresses from MIME headers",
"implemented": true
},
{
"description": "Extract cc addresses from MIME headers",
"implemented": true
},
{
"description": "Extract date/receivedAt from MIME headers",
"implemented": true
},
{
"description": "Extract text body from MIME parts",
"implemented": true
},
{
"description": "Extract html body from MIME parts",
"implemented": true
},
{
"description": "Extract attachments metadata from MIME parts",
"implemented": true
},
{
"description": "Include attachment contentId when present in MIME parts",
"implemented": true
},
{
"description": "Capture Message-ID header for threading",
"implemented": true
},
{
"description": "Capture In-Reply-To header for threading",
"implemented": true
},
{
"description": "Capture References header for threading",
"implemented": true
},
{
"description": "Populate emailData.headers map with raw headers",
"implemented": true
},
{
"description": "Set provider field to 'imap' in EmailMessageDetails",
"implemented": true
},
{
"description": "Set providerId and tenant in EmailMessageDetails",
"implemented": true
},
{
"description": "Publish INBOUND_EMAIL_RECEIVED for each new IMAP message",
"implemented": true
},
{
"description": "Publish events through shared/events/publisher.ts",
"implemented": true
},
{
"description": "Include tenantId and tenant in published payload",
"implemented": true
},
{
"description": "Dedupe IMAP messages by Message-ID per provider",
"implemented": true
},
{
"description": "Dedupe IMAP messages by UID per folder",
"implemented": true
},
{
"description": "Persist dedupe state to avoid reprocessing after restart",
"implemented": true
},
{
"description": "Skip already processed IMAP messages on reconnect",
"implemented": true
},
{
"description": "Support initial backfill of recent messages up to max_emails_per_sync",
"implemented": true
},
{
"description": "Support manual resync trigger for IMAP providers",
"implemented": true
},
{
"description": "Throttle IMAP fetch rate per provider to avoid overload",
"implemented": true
},
{
"description": "Handle IMAP servers without IDLE by falling back to polling",
"implemented": true
},
{
"description": "Configurable polling interval for non-IDLE servers",
"implemented": true
},
{
"description": "Graceful shutdown of IMAP service with logout per connection",
"implemented": true
},
{
"description": "Health check endpoint or log heartbeat for IMAP service",
"implemented": true
},
{
"description": "Update email_providers.last_sync_at after IMAP event publish",
"implemented": true
},
{
"description": "Update email_providers.status=error when IMAP auth fails",
"implemented": true
},
{
"description": "Expose IMAP connection error message in settings UI",
"implemented": true
},
{
"description": "Allow toggling IMAP provider active/inactive in UI",
"implemented": true
},
{
"description": "Stop IMAP listener when provider is deactivated",
"implemented": true
},
{
"description": "Restart IMAP listener when provider is reactivated",
"implemented": true
},
{
"description": "Support per-provider folder filter changes without restart",
"implemented": true
},
{
"description": "Support per-provider auth changes without restart",
"implemented": true
},
{
"description": "Surface IMAP OAuth connection status in provider form",
"implemented": true
},
{
"description": "Support OAuth re-auth flow from provider edit screen",
"implemented": true
},
{
"description": "Use IMAP OAuth2 SASL XOAUTH2 for authentication",
"implemented": true
},
{
"description": "Refresh IMAP OAuth2 access token before expiry",
"implemented": true
},
{
"description": "Handle IMAP OAuth2 invalid_grant by marking provider error",
"implemented": true
},
{
"description": "Provide IMAP provider card action to retry OAuth",
"implemented": true
},
{
"description": "Support multiple IMAP providers per tenant",
"implemented": true
},
{
"description": "Isolate IMAP event publishing by tenant channel if configured",
"implemented": true
},
{
"description": "Respect inbound ticket defaults on IMAP events",
"implemented": true
},
{
"description": "Support custom folder names with hierarchy delimiters",
"implemented": true
},
{
"description": "Normalize folder names to server-reported case",
"implemented": true
},
{
"description": "Support IMAP servers with separate Sent/Trash folders (ignore by default)",
"implemented": true
},
{
"description": "Skip processing messages with empty From header",
"implemented": true
},
{
"description": "Skip processing messages lacking Message-ID but with duplicate hash",
"implemented": true
},
{
"description": "Compute hash-based fallback dedupe for IMAP messages",
"implemented": true
},
{
"description": "Limit attachment size fetched by IMAP service (configurable)",
"implemented": true
},
{
"description": "Expose IMAP attachment size limit in server env config",
"implemented": true
},
{
"description": "Log structured IMAP events per provider (connect, idle, fetch, publish)",
"implemented": true
},
{
"description": "Add IMAP provider to any admin reporting of inbound email status",
"implemented": true
},
{
"description": "Add IMAP provider to inbound email settings page copy",
"implemented": true
},
{
"description": "Add IMAP provider to provider list filtering and search",
"implemented": true
},
{
"description": "Display IMAP provider folder filters in provider detail view",
"implemented": true
},
{
"description": "Support per-folder UID tracking for IMAP providers",
"implemented": true
},
{
"description": "Persist per-folder UID tracking state in vendor config",
"implemented": true
},
{
"description": "Handle IMAP EXPUNGE events gracefully without resync",
"implemented": true
},
{
"description": "Handle IMAP server unsolicited BYE with reconnect",
"implemented": true
},
{
"description": "Ensure IMAP service uses shared DB connection helpers",
"implemented": true
},
{
"description": "Ensure IMAP service uses shared secrets provider helpers",
"implemented": true
},
{
"description": "Ensure IMAP service uses shared event publisher helpers",
"implemented": true
},
{
"description": "Add IMAP provider to any server-side provider-type enums",
"implemented": true
},
{
"description": "Add IMAP provider to any client-side provider-type enums",
"implemented": true
},
{
"description": "Add IMAP provider to inbound email docs list in settings help",
"implemented": true
},
{
"description": "Configure IMAP connection timeout via env/default (default 10s; not in UI)",
"implemented": true
},
{
"description": "Enable IMAP TCP socket keepalive by default (env override; not in UI)",
"implemented": true
},
{
"description": "Support IMAP servers requiring LOGIN or PLAIN auth",
"implemented": true
},
{
"description": "Support IMAP servers requiring OAUTHBEARER auth (optional)",
"implemented": true
},
{
"description": "Support IMAP servers requiring STARTTLS upgrade",
"implemented": true
},
{
"description": "Fallback to polling when IDLE fails repeatedly",
"implemented": true
},
{
"description": "Expose IMAP service instance metrics per provider in logs",
"implemented": true
},
{
"description": "Record IMAP last_processed_message_id in vendor config",
"implemented": true
},
{
"description": "Store IMAP server greeting/capabilities for diagnostics",
"implemented": true
},
{
"description": "Handle RFC822 headers encoding (UTF-8/quoted-printable)",
"implemented": true
},
{
"description": "Handle large multipart/mixed messages in MIME parsing",
"implemented": true
},
{
"description": "Handle inline images referenced by CID in HTML body",
"implemented": true
},
{
"description": "Map inline attachments with contentId in EmailMessageDetails",
"implemented": true
},
{
"description": "Preserve thread headers in emailData.headers for workflow threading",
"implemented": true
},
{
"description": "Maintain per-tenant concurrency limits for IMAP connections",
"implemented": true
},
{
"description": "Prevent multiple IMAP service instances from double-processing same provider",
"implemented": true
},
{
"description": "Implement IMAP provider lease/lock using Redis or DB",
"implemented": true
},
{
"description": "Release IMAP provider lease on graceful shutdown",
"implemented": true
},
{
"description": "Add admin-only endpoint to force IMAP provider reconnect",
"implemented": true
},
{
"description": "Add admin-only endpoint to force IMAP provider resync",
"implemented": true
},
{
"description": "Add IMAP provider audit log entries for auth changes",
"implemented": true
},
{
"description": "Add IMAP provider audit log entries for folder changes",
"implemented": true
}
]