Eliminate dynamic imports on execution hot paths and module startup:
- Import drizzle-orm sql statically in delivery worker
- Import node:crypto and transport registry statically in API handlers
- Import provider SDKs statically in Twilio and FCM packages
- Replace root barrel imports in config and db with direct submodules to prevent circular evaluation
- Update workflow tests to preserve redis mock exports via importOriginal
- Support latencyMs in ConsoleTransportOptions as a fixed number or range string (e.g. '60-150')\n- Apply randomized jitter between bounds to simulate real-world vendor network response times
- Upgrade firebase-admin from ^12.0.0 to ^14.0.0 in provider-fcm
- Refresh package-lock.json resolving dependency security advisories
- Include src in provider-fcm published files
- Embed sources in JS maps via inlineSources: true in tsconfig.base.json
- Add src to package files array across root and packages for declaration map resolution
- Move baseUrl and path aliases from shared base into root tsconfig.json to prevent TS6059 errors
- Align packages/provider-console/tsconfig.json with workspace base
Delivers via Meta's WhatsApp Cloud API. notifkit has no native "whatsapp"
channel — the enum is fixed across schemas and the DB layer — so this
registers under channel: "sms" and sends to the recipient's existing
phone field instead, same pattern as the other first-party transports.
Free tier: Meta's Cloud API is free for roughly the first 1,000
business-initiated conversations/month per WABA.
Note: free-form text only works inside a 24h customer-service session
window. Cold/business-initiated sends need an approved message template,
which isn't built here since it needs template name + component params
per message — documented in the package README as a known limitation.