Commit Graph
3 Commits
Author SHA1 Message Date
Juan DenisandClaude Opus 4.8 dcde6ab64a fix(extensions): gate GPU auto-install on a present GPU; purge em dashes from manifests
Move serverkit-gpu from CONVERTED_BUILTIN_SLUGS into GATED_BUILTIN_SLUGS behind
a _gpu_present() predicate (shutil.which('nvidia-smi')), mirroring the email
gate: fresh installs stay marketplace-only, upgraded panels without a GPU no
longer get it, upgraded panels with a GPU keep it (D3 continuity). Rewrite the
12 builtin + baked extension descriptions that used em dashes into plain
sentences, keeping every pair in sync. New test_extension_manifests.py walks
both manifest trees to assert no em/en dashes and per-slug description parity.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 23:12:48 -04:00
Juan DenisandClaude Opus 4.8 f428ac10e3 fix(mail): correct lifecycle manifest keys and status version probe
- plugin.json: lifecycle hooks were keyed on_install/on_uninstall, but the
  loader reads lifecycle.get('install')/('uninstall') — the hooks (notify-event
  registration, container teardown) would have silently never fired. The
  manifest validator only vets the values, not the keys, so this slipped past.
- stalwart_service.get_status: read the engine version from a dedicated
  read-only /status endpoint instead of GET-ing the /reload endpoint.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 00:27:25 -04:00
Juan DenisandClaude Opus 4.8 2f36fa4c92 feat(mail): serverkit-mail extension backend (Stalwart engine)
New opt-in builtin mail-hosting extension driven by a Stalwart mail-server
container via its HTTP admin API. Mirrors the serverkit-dns-server shape
(Docker + API choke-points, Linux/Docker best-effort gating).

- models.py: ext_serverkit_mail_* tables (domains, mailboxes, forwarders,
  autoresponders, preflight) via models:register; mailbox passwords never stored
- stalwart_service.py: engine — _docker/_api choke-points, install/status/
  uninstall/control, best-effort account/domain/queue reconcile
- mail_service.py: DB<->Stalwart orchestration; sending activation blocked
  until preflight passes (force override is audit-logged)
- preflight_service.py: blocking PTR / port-25 egress / RBL / listening-port
  checks; Windows/dev returns skipped, never raises
- dns_mail_service.py: DKIM RSA-2048 keygen + SPF/DMARC/MX/A push via
  DNSProviderService (source='mail') + LE cert best-effort
- mail_jail_service.py: fail2ban serverkit-mail-* auth jail
- mail_backup.py: registers maildir as a BackupPolicy files-target
- jobs.py/lifecycle.py: daily preflight re-check + notify events
- mail.py: /api/v1/mail blueprint (viewer/admin RBAC, {'error':msg} JSON)

Verified: production import path OK, manifest passes validator, 5 tables
create, 18 route rules register, DKIM/SPF/DMARC/MX/A record-building correct,
Windows-gating clean. No core files touched; not added to FLAGSHIP_SLUGS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 23:56:46 -04:00