hazo_notify 3.1.0 → 5.0.0

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 (244) hide show
  1. package/README.md +122 -17
  2. package/config/hazo_notify_config.ini +37 -0
  3. package/dist/components/notification_banner/index.d.ts +27 -0
  4. package/dist/components/notification_banner/index.d.ts.map +1 -0
  5. package/dist/components/notification_banner/index.js +42 -0
  6. package/dist/components/notification_banner/index.js.map +1 -0
  7. package/dist/components/notification_bell/index.d.ts +56 -0
  8. package/dist/components/notification_bell/index.d.ts.map +1 -0
  9. package/dist/components/notification_bell/index.js +73 -0
  10. package/dist/components/notification_bell/index.js.map +1 -0
  11. package/dist/components/template_manager/template_editor.js +3 -3
  12. package/dist/components/template_manager/template_editor.js.map +1 -1
  13. package/dist/components/template_manager/template_manager_admin.d.ts.map +1 -1
  14. package/dist/components/template_manager/template_manager_admin.js +3 -4
  15. package/dist/components/template_manager/template_manager_admin.js.map +1 -1
  16. package/dist/lib/adapters/email/adapter.d.ts +49 -0
  17. package/dist/lib/adapters/email/adapter.d.ts.map +1 -0
  18. package/dist/lib/adapters/email/adapter.js +87 -0
  19. package/dist/lib/adapters/email/adapter.js.map +1 -0
  20. package/dist/lib/adapters/email/config.d.ts +15 -0
  21. package/dist/lib/adapters/email/config.d.ts.map +1 -0
  22. package/dist/lib/{emailer/emailer.js → adapters/email/config.js} +7 -113
  23. package/dist/lib/adapters/email/config.js.map +1 -0
  24. package/dist/lib/adapters/email/envelope.d.ts +29 -0
  25. package/dist/lib/adapters/email/envelope.d.ts.map +1 -0
  26. package/dist/lib/adapters/email/envelope.js +46 -0
  27. package/dist/lib/adapters/email/envelope.js.map +1 -0
  28. package/dist/lib/adapters/email/index.d.ts +12 -0
  29. package/dist/lib/adapters/email/index.d.ts.map +1 -0
  30. package/dist/lib/adapters/email/index.js +11 -0
  31. package/dist/lib/adapters/email/index.js.map +1 -0
  32. package/dist/lib/adapters/email/providers/index.d.ts.map +1 -0
  33. package/dist/lib/adapters/email/providers/index.js.map +1 -0
  34. package/dist/lib/adapters/email/providers/pop3_provider.d.ts.map +1 -0
  35. package/dist/lib/adapters/email/providers/pop3_provider.js.map +1 -0
  36. package/dist/lib/adapters/email/providers/smtp_provider.d.ts.map +1 -0
  37. package/dist/lib/adapters/email/providers/smtp_provider.js.map +1 -0
  38. package/dist/lib/adapters/email/providers/zeptomail_provider.d.ts.map +1 -0
  39. package/dist/lib/adapters/email/providers/zeptomail_provider.js.map +1 -0
  40. package/dist/lib/{emailer/emailer.d.ts → adapters/email/send_email.d.ts} +9 -10
  41. package/dist/lib/adapters/email/send_email.d.ts.map +1 -0
  42. package/dist/lib/adapters/email/send_email.js +122 -0
  43. package/dist/lib/adapters/email/send_email.js.map +1 -0
  44. package/dist/lib/adapters/email/types.d.ts.map +1 -0
  45. package/dist/lib/adapters/email/types.js.map +1 -0
  46. package/dist/lib/adapters/email/utils/constants.d.ts.map +1 -0
  47. package/dist/lib/adapters/email/utils/constants.js.map +1 -0
  48. package/dist/lib/adapters/email/utils/index.d.ts.map +1 -0
  49. package/dist/lib/adapters/email/utils/index.js.map +1 -0
  50. package/dist/lib/adapters/email/utils/logger.d.ts.map +1 -0
  51. package/dist/lib/adapters/email/utils/logger.js.map +1 -0
  52. package/dist/lib/adapters/email/utils/validation.d.ts.map +1 -0
  53. package/dist/lib/adapters/email/utils/validation.js.map +1 -0
  54. package/dist/lib/adapters/telegram/adapter.d.ts +25 -0
  55. package/dist/lib/adapters/telegram/adapter.d.ts.map +1 -0
  56. package/dist/lib/adapters/telegram/adapter.js +75 -0
  57. package/dist/lib/adapters/telegram/adapter.js.map +1 -0
  58. package/dist/lib/adapters/telegram/config.d.ts +22 -0
  59. package/dist/lib/adapters/telegram/config.d.ts.map +1 -0
  60. package/dist/lib/adapters/telegram/config.js +60 -0
  61. package/dist/lib/adapters/telegram/config.js.map +1 -0
  62. package/dist/lib/adapters/telegram/index.d.ts +8 -0
  63. package/dist/lib/adapters/telegram/index.d.ts.map +1 -0
  64. package/dist/lib/adapters/telegram/index.js +5 -0
  65. package/dist/lib/adapters/telegram/index.js.map +1 -0
  66. package/dist/lib/adapters/telegram/splitter.d.ts +7 -0
  67. package/dist/lib/adapters/telegram/splitter.d.ts.map +1 -0
  68. package/dist/lib/adapters/telegram/splitter.js +47 -0
  69. package/dist/lib/adapters/telegram/splitter.js.map +1 -0
  70. package/dist/lib/adapters/telegram/transport.d.ts +31 -0
  71. package/dist/lib/adapters/telegram/transport.d.ts.map +1 -0
  72. package/dist/lib/adapters/telegram/transport.js +112 -0
  73. package/dist/lib/adapters/telegram/transport.js.map +1 -0
  74. package/dist/lib/api/banner.d.ts +41 -0
  75. package/dist/lib/api/banner.d.ts.map +1 -0
  76. package/dist/lib/api/banner.js +53 -0
  77. package/dist/lib/api/banner.js.map +1 -0
  78. package/dist/lib/api/inbox.d.ts +33 -0
  79. package/dist/lib/api/inbox.d.ts.map +1 -0
  80. package/dist/lib/api/inbox.js +52 -0
  81. package/dist/lib/api/inbox.js.map +1 -0
  82. package/dist/lib/channels/index.d.ts +3 -0
  83. package/dist/lib/channels/index.d.ts.map +1 -0
  84. package/dist/lib/channels/index.js +3 -0
  85. package/dist/lib/channels/index.js.map +1 -0
  86. package/dist/lib/channels/registry.d.ts +7 -0
  87. package/dist/lib/channels/registry.d.ts.map +1 -0
  88. package/dist/lib/channels/registry.js +24 -0
  89. package/dist/lib/channels/registry.js.map +1 -0
  90. package/dist/lib/channels/types.d.ts +82 -0
  91. package/dist/lib/channels/types.d.ts.map +1 -0
  92. package/dist/lib/channels/types.js +8 -0
  93. package/dist/lib/channels/types.js.map +1 -0
  94. package/dist/lib/dispatcher/batch-key.d.ts +15 -0
  95. package/dist/lib/dispatcher/batch-key.d.ts.map +1 -0
  96. package/dist/lib/dispatcher/batch-key.js +19 -0
  97. package/dist/lib/dispatcher/batch-key.js.map +1 -0
  98. package/dist/lib/dispatcher/index.d.ts +4 -0
  99. package/dist/lib/dispatcher/index.d.ts.map +1 -0
  100. package/dist/lib/dispatcher/index.js +73 -0
  101. package/dist/lib/dispatcher/index.js.map +1 -0
  102. package/dist/lib/inbox/connection.d.ts +19 -0
  103. package/dist/lib/inbox/connection.d.ts.map +1 -0
  104. package/dist/lib/inbox/connection.js +37 -0
  105. package/dist/lib/inbox/connection.js.map +1 -0
  106. package/dist/lib/inbox/dialects/index.d.ts +10 -0
  107. package/dist/lib/inbox/dialects/index.d.ts.map +1 -0
  108. package/dist/lib/inbox/dialects/index.js +13 -0
  109. package/dist/lib/inbox/dialects/index.js.map +1 -0
  110. package/dist/lib/inbox/dialects/postgres.d.ts +3 -0
  111. package/dist/lib/inbox/dialects/postgres.d.ts.map +1 -0
  112. package/dist/lib/inbox/dialects/postgres.js +110 -0
  113. package/dist/lib/inbox/dialects/postgres.js.map +1 -0
  114. package/dist/lib/inbox/dialects/sqlite.d.ts +3 -0
  115. package/dist/lib/inbox/dialects/sqlite.d.ts.map +1 -0
  116. package/dist/lib/inbox/dialects/sqlite.js +120 -0
  117. package/dist/lib/inbox/dialects/sqlite.js.map +1 -0
  118. package/dist/lib/inbox/dialects/types.d.ts +53 -0
  119. package/dist/lib/inbox/dialects/types.d.ts.map +1 -0
  120. package/dist/lib/inbox/dialects/types.js +2 -0
  121. package/dist/lib/inbox/dialects/types.js.map +1 -0
  122. package/dist/lib/inbox/index.d.ts +9 -0
  123. package/dist/lib/inbox/index.d.ts.map +1 -0
  124. package/dist/lib/inbox/index.js +6 -0
  125. package/dist/lib/inbox/index.js.map +1 -0
  126. package/dist/lib/inbox/storage.d.ts +142 -0
  127. package/dist/lib/inbox/storage.d.ts.map +1 -0
  128. package/dist/lib/inbox/storage.js +345 -0
  129. package/dist/lib/inbox/storage.js.map +1 -0
  130. package/dist/lib/inbox/types.d.ts +94 -0
  131. package/dist/lib/inbox/types.d.ts.map +1 -0
  132. package/dist/lib/inbox/types.js +2 -0
  133. package/dist/lib/inbox/types.js.map +1 -0
  134. package/dist/lib/inbox/worker/cleanup.d.ts +14 -0
  135. package/dist/lib/inbox/worker/cleanup.d.ts.map +1 -0
  136. package/dist/lib/inbox/worker/cleanup.js +37 -0
  137. package/dist/lib/inbox/worker/cleanup.js.map +1 -0
  138. package/dist/lib/inbox/worker/flush.d.ts +31 -0
  139. package/dist/lib/inbox/worker/flush.d.ts.map +1 -0
  140. package/dist/lib/inbox/worker/flush.js +97 -0
  141. package/dist/lib/inbox/worker/flush.js.map +1 -0
  142. package/dist/lib/inbox/worker/render.d.ts +23 -0
  143. package/dist/lib/inbox/worker/render.d.ts.map +1 -0
  144. package/dist/lib/inbox/worker/render.js +58 -0
  145. package/dist/lib/inbox/worker/render.js.map +1 -0
  146. package/dist/lib/inbox/worker/start.d.ts +29 -0
  147. package/dist/lib/inbox/worker/start.d.ts.map +1 -0
  148. package/dist/lib/inbox/worker/start.js +100 -0
  149. package/dist/lib/inbox/worker/start.js.map +1 -0
  150. package/dist/lib/index.d.ts +1 -6
  151. package/dist/lib/index.d.ts.map +1 -1
  152. package/dist/lib/index.js +4 -6
  153. package/dist/lib/index.js.map +1 -1
  154. package/dist/lib/jobs/handler.d.ts +25 -0
  155. package/dist/lib/jobs/handler.d.ts.map +1 -0
  156. package/dist/lib/jobs/handler.js +36 -0
  157. package/dist/lib/jobs/handler.js.map +1 -0
  158. package/dist/lib/jobs/index.d.ts +16 -0
  159. package/dist/lib/jobs/index.d.ts.map +1 -0
  160. package/dist/lib/jobs/index.js +13 -0
  161. package/dist/lib/jobs/index.js.map +1 -0
  162. package/dist/lib/jobs/submit.d.ts +20 -0
  163. package/dist/lib/jobs/submit.d.ts.map +1 -0
  164. package/dist/lib/jobs/submit.js +25 -0
  165. package/dist/lib/jobs/submit.js.map +1 -0
  166. package/dist/lib/jobs/types.d.ts +42 -0
  167. package/dist/lib/jobs/types.d.ts.map +1 -0
  168. package/dist/lib/jobs/types.js +12 -0
  169. package/dist/lib/jobs/types.js.map +1 -0
  170. package/dist/lib/template_manager/db/template_repository.d.ts.map +1 -1
  171. package/dist/lib/template_manager/db/template_repository.js +16 -31
  172. package/dist/lib/template_manager/db/template_repository.js.map +1 -1
  173. package/dist/lib/template_manager/engine/variable_resolver.js +4 -4
  174. package/dist/lib/template_manager/engine/variable_resolver.js.map +1 -1
  175. package/dist/lib/template_manager/handlers/index.d.ts.map +1 -1
  176. package/dist/lib/template_manager/handlers/index.js +2 -4
  177. package/dist/lib/template_manager/handlers/index.js.map +1 -1
  178. package/dist/lib/template_manager/seed/sync.d.ts.map +1 -1
  179. package/dist/lib/template_manager/seed/sync.js +20 -4
  180. package/dist/lib/template_manager/seed/sync.js.map +1 -1
  181. package/dist/lib/template_manager/template_manager.d.ts.map +1 -1
  182. package/dist/lib/template_manager/template_manager.js +67 -26
  183. package/dist/lib/template_manager/template_manager.js.map +1 -1
  184. package/dist/lib/template_manager/types.d.ts +59 -9
  185. package/dist/lib/template_manager/types.d.ts.map +1 -1
  186. package/dist/lib/template_manager/utils/index.d.ts +1 -1
  187. package/dist/lib/template_manager/utils/index.d.ts.map +1 -1
  188. package/dist/lib/template_manager/utils/index.js +1 -1
  189. package/dist/lib/template_manager/utils/index.js.map +1 -1
  190. package/dist/lib/template_manager/utils/validation.d.ts +12 -11
  191. package/dist/lib/template_manager/utils/validation.d.ts.map +1 -1
  192. package/dist/lib/template_manager/utils/validation.js +15 -22
  193. package/dist/lib/template_manager/utils/validation.js.map +1 -1
  194. package/migrations/003_create_notifications_table.sql +48 -0
  195. package/migrations/004_inbox_upsert_rpc.sql +63 -0
  196. package/migrations/005_inbox_v4_refactor.pg.sql +53 -0
  197. package/migrations/005_inbox_v4_refactor.sqlite.sql +30 -0
  198. package/migrations/006_channel_deliveries.pg.sql +61 -0
  199. package/migrations/006_channel_deliveries.sqlite.sql +26 -0
  200. package/migrations/007_templates_bodies_jsonb.pg.sql +17 -0
  201. package/migrations/007_templates_bodies_jsonb.sqlite.sql +18 -0
  202. package/package.json +55 -13
  203. package/dist/lib/emailer/emailer.d.ts.map +0 -1
  204. package/dist/lib/emailer/emailer.js.map +0 -1
  205. package/dist/lib/emailer/index.d.ts +0 -12
  206. package/dist/lib/emailer/index.d.ts.map +0 -1
  207. package/dist/lib/emailer/index.js +0 -13
  208. package/dist/lib/emailer/index.js.map +0 -1
  209. package/dist/lib/emailer/providers/index.d.ts.map +0 -1
  210. package/dist/lib/emailer/providers/index.js.map +0 -1
  211. package/dist/lib/emailer/providers/pop3_provider.d.ts.map +0 -1
  212. package/dist/lib/emailer/providers/pop3_provider.js.map +0 -1
  213. package/dist/lib/emailer/providers/smtp_provider.d.ts.map +0 -1
  214. package/dist/lib/emailer/providers/smtp_provider.js.map +0 -1
  215. package/dist/lib/emailer/providers/zeptomail_provider.d.ts.map +0 -1
  216. package/dist/lib/emailer/providers/zeptomail_provider.js.map +0 -1
  217. package/dist/lib/emailer/types.d.ts.map +0 -1
  218. package/dist/lib/emailer/types.js.map +0 -1
  219. package/dist/lib/emailer/utils/constants.d.ts.map +0 -1
  220. package/dist/lib/emailer/utils/constants.js.map +0 -1
  221. package/dist/lib/emailer/utils/index.d.ts.map +0 -1
  222. package/dist/lib/emailer/utils/index.js.map +0 -1
  223. package/dist/lib/emailer/utils/logger.d.ts.map +0 -1
  224. package/dist/lib/emailer/utils/logger.js.map +0 -1
  225. package/dist/lib/emailer/utils/validation.d.ts.map +0 -1
  226. package/dist/lib/emailer/utils/validation.js.map +0 -1
  227. /package/dist/lib/{emailer → adapters/email}/providers/index.d.ts +0 -0
  228. /package/dist/lib/{emailer → adapters/email}/providers/index.js +0 -0
  229. /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.d.ts +0 -0
  230. /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.js +0 -0
  231. /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.d.ts +0 -0
  232. /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.js +0 -0
  233. /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.d.ts +0 -0
  234. /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.js +0 -0
  235. /package/dist/lib/{emailer → adapters/email}/types.d.ts +0 -0
  236. /package/dist/lib/{emailer → adapters/email}/types.js +0 -0
  237. /package/dist/lib/{emailer → adapters/email}/utils/constants.d.ts +0 -0
  238. /package/dist/lib/{emailer → adapters/email}/utils/constants.js +0 -0
  239. /package/dist/lib/{emailer → adapters/email}/utils/index.d.ts +0 -0
  240. /package/dist/lib/{emailer → adapters/email}/utils/index.js +0 -0
  241. /package/dist/lib/{emailer → adapters/email}/utils/logger.d.ts +0 -0
  242. /package/dist/lib/{emailer → adapters/email}/utils/logger.js +0 -0
  243. /package/dist/lib/{emailer → adapters/email}/utils/validation.d.ts +0 -0
  244. /package/dist/lib/{emailer → adapters/email}/utils/validation.js +0 -0
package/README.md CHANGED
@@ -2,7 +2,15 @@
2
2
 
3
3
  A reusable component library for sending email notifications with scope-aware template management. Implements Zeptomail API integration with support for text and HTML emails, Handlebars-based email templates with multi-tenant resolution, multiple attachments, and comprehensive security features.
4
4
 
5
- **Version**: 3.0.0
5
+ **Version**: 4.0.2
6
+
7
+ > **⚠ Readers on v4:** Many examples below still show the v3.x API surface (`send_email`, `hazo_notify/emailer`, `channels: { in_app, email, banner }`, direct `template_html` / `template_text` access). **v4.0.0 introduced a channel-pluggable architecture** — outbound sends go through `dispatch()` → inbox row + per-channel delivery row → `EmailChannel`/`TelegramChannel` adapter, with a multi-channel worker fleet. For the current v4 API see:
8
+ >
9
+ > - [`TECHDOC.md`](./TECHDOC.md) — v4 architecture and API reference (channel registry, dispatch flow, worker fleet, adapters, schema)
10
+ > - [`SETUP_CHECKLIST.md`](./SETUP_CHECKLIST.md) §"v4.0.0 Migration" — migrations 005/006/007, dispatch rewrite, boot changes
11
+ > - [`CHANGE_LOG.md`](./CHANGE_LOG.md) — full breaking-change manifest for v4.0.0
12
+ >
13
+ > A full v4-aware rewrite of this README is tracked for v4.0.2. The examples that follow remain accurate for v3.x consumers; v4 consumers should read the docs above.
6
14
 
7
15
  ## Features
8
16
 
@@ -22,7 +30,8 @@ A reusable component library for sending email notifications with scope-aware te
22
30
  - **Caching**: Template compilation caching for performance
23
31
 
24
32
  ### General
25
- - **Test UI**: Optional test UI at `/hazo_notify/emailer_test` and `/hazo_notify/template_manager`
33
+ - **Test app** (v4.0.2+): Self-contained Next.js demo at `test-app/` mirroring the layout of `hazo_jobs/test-app/`. Runs on port 3020 (`npm run dev:test-app`) and covers every shipping surface — emailer, telegram, dispatch, templates, inbox/bell/banner, worker, jobs admin. Excluded from the published tarball.
34
+ - **hazo_jobs integration** (v4.0.2+): New `hazo_notify/jobs` subpath exporting `createInboxFlushHandler` and `submitInboxFlushJobs` so consumers can drive the inbox-flush worker from their own [`hazo_jobs`](https://www.npmjs.com/package/hazo_jobs) queue. `hazo_jobs` is an optional peer dep.
26
35
  - **TypeScript**: Fully typed with TypeScript
27
36
  - **Testing**: Test coverage with Jest
28
37
 
@@ -46,7 +55,7 @@ v2.0.0 introduces scope-aware template management, which requires a database mig
46
55
  4. **Initialize template manager**: Call `init_template_manager(...)` in your `instrumentation.ts` or app bootstrap.
47
56
  5. **Update Tailwind config** (if using admin UI): Add `@source "../node_modules/hazo_notify/dist";` to your Tailwind CSS entry.
48
57
 
49
- The `send_email()` API is fully backward-compatible; no changes required for existing code.
58
+ The `send_email()` API is fully backward-compatible **through v3.x**. v4.0.0 removed the top-level `send_email()` export — see [`SETUP_CHECKLIST.md`](./SETUP_CHECKLIST.md) §"v4.0.0 Migration" for the `dispatch()` / `EmailChannel#send()` replacement pattern.
50
59
 
51
60
  ### Optional: Enhanced Logging with hazo_logs
52
61
 
@@ -214,6 +223,61 @@ CREATE INDEX IF NOT EXISTS idx_notify_templates_name
214
223
  }
215
224
  ```
216
225
 
226
+ ## v4 multi-channel quick start
227
+
228
+ ```typescript
229
+ import { initInbox, startInboxWorker } from "hazo_notify/inbox";
230
+ import { registerChannel } from "hazo_notify/channels";
231
+ import { EmailChannel } from "hazo_notify/adapters/email";
232
+ import { TelegramChannel } from "hazo_notify/adapters/telegram";
233
+ import { dispatch } from "hazo_notify/dispatcher";
234
+
235
+ // 1. Initialize the inbox connection
236
+ await initInbox({ hazo_connect_factory: () => createHazoConnect(...) });
237
+
238
+ // 2. Register channels (explicit, no auto-discovery)
239
+ registerChannel(new EmailChannel());
240
+ registerChannel(new TelegramChannel());
241
+
242
+ // 3. Start the worker fleet
243
+ startInboxWorker({
244
+ resolveRecipient: async (user_id, scope_id, channel_id) => {
245
+ if (channel_id === "email") return (await users.get(user_id))?.email ?? null;
246
+ if (channel_id === "telegram") return process.env.TELEGRAM_CHAT_ID ?? null;
247
+ return null;
248
+ },
249
+ });
250
+
251
+ // 4. Dispatch
252
+ await dispatch({
253
+ event_type: "site.run_failed",
254
+ subject_id: site_id,
255
+ scope_id, recipient_user_ids: [user_id],
256
+ in_app_text: "Run failed",
257
+ deep_link: `/runs/${run_id}`,
258
+ surfaces: { in_app: true, banner: false },
259
+ channels: { email: true, telegram: true },
260
+ channel_payloads: {
261
+ email: { subject: "Run failed", body_text: "...", template_name: "run-failure", template_vars: {/* ... */} },
262
+ telegram: { text: "Run failed", parse_mode: "HTML", template_name: "run-failure", template_vars: {/* ... */} },
263
+ },
264
+ batch_window_ms: 0,
265
+ });
266
+ ```
267
+
268
+ See [`CHANGE_LOG.md`](./CHANGE_LOG.md) for the v3 → v4 migration guide.
269
+
270
+ ### Live e2e tests (opt-in)
271
+
272
+ ```bash
273
+ RUN_LIVE_TESTS=1 \
274
+ TELEGRAM_TEST_BOT_TOKEN=… \
275
+ TELEGRAM_TEST_CHAT_ID=… \
276
+ npm test -- __tests__/e2e
277
+ ```
278
+
279
+ Skipped by default in CI.
280
+
217
281
  ## Configuration
218
282
 
219
283
  ### Step 1: Create Environment Variables File
@@ -956,26 +1020,67 @@ import {
956
1020
 
957
1021
  All CRUD functions take a `hazo_connect` instance as their first argument.
958
1022
 
959
- ## Test UI
1023
+ ## Test app (v4.0.2+)
1024
+
1025
+ The Next.js test UI that lived under `src/app/` in v3.x and v4.0.x has moved to
1026
+ a dedicated `test-app/` sibling directory (mirroring `hazo_jobs/test-app/`).
1027
+ The library itself no longer depends on Next.js at runtime.
1028
+
1029
+ ```bash
1030
+ # from the package root
1031
+ npm run dev:test-app # build lib + boot Next dev on http://localhost:3020
1032
+ npm run worker:test-app # in a second terminal — drains inbox-flush jobs
1033
+ ```
960
1034
 
961
- To enable the UI component and all routes, set `enable_ui=true` in the `[ui]` section of `config/hazo_notify_config.ini`. The test UI will be available at `/hazo_notify/emailer_test`.
1035
+ The test-app provides one route per shipping surface:
962
1036
 
963
- ### Test UI Features
1037
+ | Route | What it exercises |
1038
+ |---|---|
1039
+ | `/` | Overview dashboard with pending/unread/queued counts |
1040
+ | `/emailer` | Direct `EmailChannel.send` via `/api/notify/send/email` |
1041
+ | `/telegram` | Direct `TelegramChannel.send` via `/api/notify/send/telegram` |
1042
+ | `/dispatch` | `dispatch()` + `submitInboxFlushJobs()` (auto-queues a worker job per channel) |
1043
+ | `/templates` | Mounted `<TemplateManagerAdmin>` |
1044
+ | `/inbox` | `<NotificationBell>` + `<NotificationBanner>` + raw inbox API view |
1045
+ | `/worker` | Last-10 `hazo_notify.inbox_flush` job table from `hazo_jobs` |
1046
+ | `/admin` | Mounted `<JobsAdminPanel>` from `hazo_jobs/ui` |
964
1047
 
965
- - **Form Interface**: Easy-to-use form for testing email functionality
966
- - **Text and HTML Support**: Test both plain text and HTML emails
967
- - **Newline Conversion**: HTML input automatically converts newlines to `<br>` tags
968
- - **Raw Request Display**: View the exact request payload that will be sent
969
- - **Response Display**: View the complete response from the email provider
970
- - **Error Handling**: Clear error messages for validation and API errors
1048
+ The test-app is excluded from the published npm tarball.
971
1049
 
972
- ### Accessing the Test UI
1050
+ ### hazo_jobs integration (`hazo_notify/jobs`)
973
1051
 
974
- 1. Set `enable_ui=true` in `config/hazo_notify_config.ini`
975
- 2. Start your Next.js development server: `npm run dev`
976
- 3. Navigate to: `http://localhost:3000/hazo_notify/emailer_test`
1052
+ v4.0.2 ships a new subpath export for projects that want to drive the inbox
1053
+ flush worker through their own [`hazo_jobs`](https://www.npmjs.com/package/hazo_jobs)
1054
+ queue rather than running the bundled `startInboxWorker`:
1055
+
1056
+ ```ts
1057
+ import {
1058
+ INBOX_FLUSH_JOB_TYPE,
1059
+ createInboxFlushHandler,
1060
+ submitInboxFlushJobs,
1061
+ } from "hazo_notify/jobs";
1062
+
1063
+ // In your hazo_jobs worker process:
1064
+ const proc = createWorkerProcess({
1065
+ adapter,
1066
+ dialect: "sqlite",
1067
+ types: [INBOX_FLUSH_JOB_TYPE],
1068
+ handlers: {
1069
+ [INBOX_FLUSH_JOB_TYPE]: createInboxFlushHandler({
1070
+ resolveRecipient, // (user_id, scope_id, channel_id) => Promise<string | null>
1071
+ batch_size: 50,
1072
+ concurrency: 4,
1073
+ }),
1074
+ },
1075
+ });
1076
+
1077
+ // Immediately after dispatch(), enqueue one flush per enabled channel:
1078
+ await submitInboxFlushJobs(jobsClient, { channels: ["email", "telegram"] });
1079
+ ```
977
1080
 
978
- **Note:** When `enable_ui=false`, both the UI and API routes are disabled for security.
1081
+ `hazo_jobs` is an **optional** peer dependency the package only declares the
1082
+ structural types it needs and never imports `hazo_jobs` at runtime. See
1083
+ `test-app/worker.ts` for a full worker example.
979
1084
 
980
1085
  ## Security Features
981
1086
 
@@ -190,3 +190,40 @@ enable_ui=true
190
190
  # - year: Current year (e.g., 2024)
191
191
  # - month_name: Current month name (e.g., January)
192
192
  # - day_of_week: Current day of week (e.g., Monday)
193
+
194
+ [telegram]
195
+ # Required: Telegram bot HTTP token from @BotFather.
196
+ # For security, prefer setting HAZO_NOTIFY_TELEGRAM_BOT_TOKEN in .env.local.
197
+ # bot_token =
198
+
199
+ # Required when DispatchInput omits chat_id (single-chat deployments).
200
+ # Or set HAZO_NOTIFY_TELEGRAM_DEFAULT_CHAT_ID.
201
+ # default_chat_id =
202
+
203
+ # Optional. HTML | Markdown | MarkdownV2. Default: HTML.
204
+ # parse_mode = HTML
205
+
206
+ # Optional. Default: true.
207
+ # disable_web_page_preview = true
208
+
209
+ # Optional. direct | browser-tab | auto. Default: direct.
210
+ # - direct: fetch() to api.telegram.org
211
+ # - browser-tab: host registers a callback via setTelegramBrowserTransport()
212
+ # - auto: direct first, fallback to browser-tab on network error
213
+ # transport = direct
214
+
215
+ # Optional. Default: 10000.
216
+ # request_timeout_ms = 10000
217
+
218
+ # Optional. Override for proxies or test fixtures. Default: https://api.telegram.org
219
+ # api_base_url = https://api.telegram.org
220
+
221
+ [inbox]
222
+ # Aggregation window for dispatch() when batch_window_ms not supplied per-call.
223
+ # default_batch_window_ms = 300000
224
+
225
+ # How long to keep read inbox rows before purge (milliseconds).
226
+ # read_retention_ms = 2592000000 # 30 days
227
+
228
+ # How long to keep finalized (sent/failed) delivery rows before purge (milliseconds).
229
+ # failed_delivery_retention_ms = 2592000000 # 30 days
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Banner component for the client portal.
3
+ *
4
+ * Mounts in the client layout; polls /summary every 60s while visible.
5
+ * Renders a sticky strip when unread > 0; dismiss is session-local.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ export interface BannerSummary {
10
+ unread_count: number;
11
+ latest: {
12
+ id: string;
13
+ in_app_text: string;
14
+ deep_link: string;
15
+ created_at: string;
16
+ } | null;
17
+ }
18
+ export interface NotificationBannerProps {
19
+ apiBasePath: string;
20
+ code: string;
21
+ pollIntervalMs?: number;
22
+ onView?: (summary: BannerSummary) => void;
23
+ fallbackInboxHref?: string;
24
+ className?: string;
25
+ }
26
+ export declare function NotificationBanner({ apiBasePath, code, pollIntervalMs, onView, fallbackInboxHref, className, }: NotificationBannerProps): import("react/jsx-runtime").JSX.Element | null;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/notification_banner/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3F;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,IAAI,EACJ,cAAgC,EAChC,MAAM,EACN,iBAAiB,EACjB,SAAS,GACV,EAAE,uBAAuB,kDA4CzB"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Banner component for the client portal.
4
+ *
5
+ * Mounts in the client layout; polls /summary every 60s while visible.
6
+ * Renders a sticky strip when unread > 0; dismiss is session-local.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { useEffect, useState, useCallback } from "react";
11
+ const DEFAULT_POLL_MS = 60000;
12
+ export function NotificationBanner({ apiBasePath, code, pollIntervalMs = DEFAULT_POLL_MS, onView, fallbackInboxHref, className, }) {
13
+ const [summary, setSummary] = useState(null);
14
+ const [dismissed, setDismissed] = useState(false);
15
+ const fetchSummary = useCallback(async () => {
16
+ try {
17
+ const r = await fetch(`${apiBasePath}/${code}/summary`, { credentials: "include" });
18
+ if (!r.ok)
19
+ return;
20
+ setSummary(await r.json());
21
+ }
22
+ catch { /* ignore */ }
23
+ }, [apiBasePath, code]);
24
+ useEffect(() => {
25
+ fetchSummary();
26
+ const t = setInterval(() => {
27
+ if (typeof document !== "undefined" && document.visibilityState === "visible")
28
+ fetchSummary();
29
+ }, pollIntervalMs);
30
+ return () => clearInterval(t);
31
+ }, [fetchSummary, pollIntervalMs]);
32
+ if (dismissed)
33
+ return null;
34
+ if (!summary || summary.unread_count === 0)
35
+ return null;
36
+ const count = summary.unread_count;
37
+ const target = count === 1 && summary.latest ? summary.latest.deep_link : fallbackInboxHref ?? "#";
38
+ return (_jsxs("div", { role: "status", className: className ?? "client-theme bg-orange-50 border-l-4 border-orange-500 px-4 py-3 flex items-center justify-between", style: { position: "sticky", top: 0, zIndex: 40 }, children: [_jsx("span", { children: count === 1
39
+ ? "You have 1 new item from your tax agent."
40
+ : `You have ${count} new items from your tax agent.` }), _jsxs("span", { children: [_jsx("a", { href: target, onClick: () => onView?.(summary), children: "View" }), " · ", _jsx("button", { onClick: () => setDismissed(true), "aria-label": "Dismiss", children: "\u2715" })] })] }));
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/notification_banner/index.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAC;AAEzE,MAAM,eAAe,GAAG,KAAM,CAAC;AAgB/B,MAAM,UAAU,kBAAkB,CAAC,EACjC,WAAW,EACX,IAAI,EACJ,cAAc,GAAG,eAAe,EAChC,MAAM,EACN,iBAAiB,EACjB,SAAS,GACe;IACxB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,IAAI,IAAI,UAAU,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,OAAO;YAClB,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC,CAAA,YAAY,CAAA,CAAC;IACxB,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IAExB,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE;YACzB,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;gBAAE,YAAY,EAAE,CAAC;QAChG,CAAC,EAAE,cAAc,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAEnC,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,IAAI,GAAG,CAAC;IAEnG,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,SAAS,IAAI,oGAAoG,EAC5H,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,aAEjD,yBACG,KAAK,KAAK,CAAC;oBACV,CAAC,CAAC,0CAA0C;oBAC5C,CAAC,CAAC,YAAY,KAAK,iCAAiC,GACjD,EACP,2BACE,YAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,qBAAU,EAC1D,KAAK,EACN,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAa,SAAS,uBAAW,IACrE,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Bell component for the office portal.
3
+ *
4
+ * Polls `unread-count` on interval; lazily fetches list on dropdown open.
5
+ * Shadcn primitives injected via `components` prop — package free of UI deps.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { type ComponentType, type ReactNode } from "react";
10
+ export interface InboxItem {
11
+ id: string;
12
+ event_type: string;
13
+ in_app_text: string;
14
+ deep_link: string;
15
+ aggregate_count: number;
16
+ read_at: string | null;
17
+ created_at: string;
18
+ }
19
+ export interface NotificationBellComponents {
20
+ Button: ComponentType<{
21
+ children?: ReactNode;
22
+ onClick?: () => void;
23
+ [k: string]: unknown;
24
+ }>;
25
+ DropdownMenu: ComponentType<{
26
+ children?: ReactNode;
27
+ open?: boolean;
28
+ onOpenChange?: (o: boolean) => void;
29
+ }>;
30
+ DropdownMenuTrigger: ComponentType<{
31
+ children?: ReactNode;
32
+ asChild?: boolean;
33
+ }>;
34
+ DropdownMenuContent: ComponentType<{
35
+ children?: ReactNode;
36
+ align?: string;
37
+ className?: string;
38
+ }>;
39
+ DropdownMenuItem: ComponentType<{
40
+ children?: ReactNode;
41
+ onClick?: () => void;
42
+ }>;
43
+ Badge: ComponentType<{
44
+ children?: ReactNode;
45
+ variant?: string;
46
+ }>;
47
+ }
48
+ export interface NotificationBellProps {
49
+ apiBasePath?: string;
50
+ pollIntervalMs?: number;
51
+ components: NotificationBellComponents;
52
+ onItemClick?: (item: InboxItem) => void;
53
+ bellIcon?: ReactNode;
54
+ }
55
+ export declare function NotificationBell({ apiBasePath, pollIntervalMs, components: C, onItemClick, bellIcon, }: NotificationBellProps): import("react/jsx-runtime").JSX.Element;
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/notification_bell/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAoC,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI7F,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5F,YAAY,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAC,CAAC;IAC3G,mBAAmB,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChF,mBAAmB,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjG,gBAAgB,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;IAChF,KAAK,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,0BAA0B,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,WAAkC,EAClC,cAAgC,EAChC,UAAU,EAAE,CAAC,EACb,WAAW,EACX,QAAQ,GACT,EAAE,qBAAqB,2CAiFvB"}
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Bell component for the office portal.
4
+ *
5
+ * Polls `unread-count` on interval; lazily fetches list on dropdown open.
6
+ * Shadcn primitives injected via `components` prop — package free of UI deps.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { useEffect, useState, useCallback } from "react";
11
+ const DEFAULT_POLL_MS = 30000;
12
+ export function NotificationBell({ apiBasePath = "/api/notifications", pollIntervalMs = DEFAULT_POLL_MS, components: C, onItemClick, bellIcon, }) {
13
+ const [unread, setUnread] = useState(0);
14
+ const [open, setOpen] = useState(false);
15
+ const [items, setItems] = useState([]);
16
+ const [loading, setLoading] = useState(false);
17
+ const fetchCount = useCallback(async () => {
18
+ try {
19
+ const r = await fetch(`${apiBasePath}/unread-count`, { credentials: "include" });
20
+ if (!r.ok)
21
+ return;
22
+ const b = await r.json();
23
+ setUnread(b.unread_count ?? 0);
24
+ }
25
+ catch { /* ignore */ }
26
+ }, [apiBasePath]);
27
+ const fetchList = useCallback(async () => {
28
+ setLoading(true);
29
+ try {
30
+ const r = await fetch(`${apiBasePath}?limit=20`, { credentials: "include" });
31
+ if (!r.ok)
32
+ return;
33
+ const b = await r.json();
34
+ setItems(b.items ?? []);
35
+ setUnread(b.unread_count ?? 0);
36
+ }
37
+ finally {
38
+ setLoading(false);
39
+ }
40
+ }, [apiBasePath]);
41
+ useEffect(() => {
42
+ fetchCount();
43
+ const tick = setInterval(() => {
44
+ if (typeof document !== "undefined" && document.visibilityState === "visible")
45
+ fetchCount();
46
+ }, pollIntervalMs);
47
+ const onVis = () => { if (document.visibilityState === "visible")
48
+ fetchCount(); };
49
+ if (typeof document !== "undefined")
50
+ document.addEventListener("visibilitychange", onVis);
51
+ return () => {
52
+ clearInterval(tick);
53
+ if (typeof document !== "undefined")
54
+ document.removeEventListener("visibilitychange", onVis);
55
+ };
56
+ }, [fetchCount, pollIntervalMs]);
57
+ useEffect(() => { if (open)
58
+ fetchList(); }, [open, fetchList]);
59
+ const handleItem = async (item) => {
60
+ await fetch(`${apiBasePath}/${item.id}/read`, { method: "POST", credentials: "include" });
61
+ setUnread((n) => Math.max(0, n - 1));
62
+ setOpen(false);
63
+ onItemClick?.(item);
64
+ };
65
+ const handleMarkAll = async () => {
66
+ await fetch(`${apiBasePath}/read-all`, { method: "POST", credentials: "include" });
67
+ setUnread(0);
68
+ setItems((prev) => prev.map((i) => ({ ...i, read_at: new Date().toISOString() })));
69
+ };
70
+ return (_jsxs(C.DropdownMenu, { open: open, onOpenChange: setOpen, children: [_jsx(C.DropdownMenuTrigger, { asChild: true, children: _jsxs(C.Button, { onClick: () => setOpen((o) => !o), children: [bellIcon ?? "🔔", unread > 0 && _jsx(C.Badge, { children: unread > 99 ? "99+" : String(unread) })] }) }), _jsxs(C.DropdownMenuContent, { align: "end", className: "w-80", children: [loading && _jsx(C.DropdownMenuItem, { children: "Loading\u2026" }), !loading && items.length === 0 && (_jsx(C.DropdownMenuItem, { children: "No notifications" })), !loading &&
71
+ items.map((it) => (_jsx(C.DropdownMenuItem, { onClick: () => handleItem(it), children: it.in_app_text }, it.id))), items.length > 0 && (_jsx(C.DropdownMenuItem, { onClick: handleMarkAll, children: "Mark all as read" }))] })] }));
72
+ }
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/notification_bell/index.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAsC,MAAM,OAAO,CAAC;AAE7F,MAAM,eAAe,GAAG,KAAM,CAAC;AA6B/B,MAAM,UAAU,gBAAgB,CAAC,EAC/B,WAAW,GAAG,oBAAoB,EAClC,cAAc,GAAG,eAAe,EAChC,UAAU,EAAE,CAAC,EACb,WAAW,EACX,QAAQ,GACc;IACtB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,eAAe,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,OAAO;YAClB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACzB,SAAS,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC,CAAA,YAAY,CAAA,CAAC;IACxB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,OAAO;YAClB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACzB,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;gBAAE,UAAU,EAAE,CAAC;QAC9F,CAAC,EAAE,cAAc,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS;YAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC1F,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,OAAO,QAAQ,KAAK,WAAW;gBAAE,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC/F,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAEjC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI;QAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/D,MAAM,UAAU,GAAG,KAAK,EAAE,IAAe,EAAE,EAAE;QAC3C,MAAM,KAAK,CAAC,GAAG,WAAW,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1F,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,MAAM,KAAK,CAAC,GAAG,WAAW,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QACnF,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,CAAC,CAAC,YAAY,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aAC/C,KAAC,CAAC,CAAC,mBAAmB,IAAC,OAAO,kBAC5B,MAAC,CAAC,CAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aACxC,QAAQ,IAAI,IAAI,EAChB,MAAM,GAAG,CAAC,IAAI,KAAC,CAAC,CAAC,KAAK,cAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAW,IAC/D,GACW,EACxB,MAAC,CAAC,CAAC,mBAAmB,IAAC,KAAK,EAAC,KAAK,EAAC,SAAS,EAAC,MAAM,aAChD,OAAO,IAAI,KAAC,CAAC,CAAC,gBAAgB,gCAA8B,EAC5D,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CACjC,KAAC,CAAC,CAAC,gBAAgB,mCAAsC,CAC1D,EACA,CAAC,OAAO;wBACP,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAChB,KAAC,CAAC,CAAC,gBAAgB,IAAa,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAC1D,EAAE,CAAC,WAAW,IADQ,EAAE,CAAC,EAAE,CAET,CACtB,CAAC,EACH,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACnB,KAAC,CAAC,CAAC,gBAAgB,IAAC,OAAO,EAAE,aAAa,iCAAuC,CAClF,IACqB,IACT,CAClB,CAAC;AACJ,CAAC"}
@@ -18,11 +18,11 @@ export function TemplateEditor({ template, template_types, on_save, on_delete, o
18
18
  // Load template content when template changes
19
19
  useEffect(() => {
20
20
  if (template) {
21
- set_html_content(template.template_html);
22
- set_text_content(template.template_text);
21
+ set_html_content(template.bodies.html ?? '');
22
+ set_text_content(template.bodies.text ?? '');
23
23
  set_is_modified(false);
24
24
  }
25
- }, [template?.id, template?.template_html, template?.template_text]);
25
+ }, [template?.id, template?.bodies]);
26
26
  // Get variables for this template type
27
27
  const template_type = template_types.find((t) => t.template_name === template?.template_name);
28
28
  const user_variables = template_type?.variables || [];
@@ -1 +1 @@
1
- {"version":3,"file":"template_editor.js","sourceRoot":"","sources":["../../../src/components/template_manager/template_editor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template_editor.js","sourceRoot":"","sources":["../../../src/components/template_manager/template_editor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"template_manager_admin.d.ts","sourceRoot":"","sources":["../../../src/components/template_manager/template_manager_admin.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,qCAAqC,CAAC;AAW7C,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;;;;;;;;;;;;;;;;;;iCAqE9F,MAAM;uCA8BF,gBAAgB;4CA4BX,MAAM;iCAqCf,MAAM,QAAQ,MAAM;;2BAsDO,MAAM,QAAQ,MAAM;EAkC/D;AAMD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,EAAE,yBAAyB,2CA4F3B;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"template_manager_admin.d.ts","sourceRoot":"","sources":["../../../src/components/template_manager/template_manager_admin.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,qCAAqC,CAAC;AAW7C,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;;;;;;;;;;;;;;;;;;iCAqE9F,MAAM;uCA8BF,gBAAgB;4CA4BX,MAAM;iCAoCf,MAAM,QAAQ,MAAM;;2BAsDO,MAAM,QAAQ,MAAM;EAkC/D;AAMD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,EAAE,yBAAyB,2CA4F3B;AAED,eAAe,oBAAoB,CAAC"}
@@ -134,8 +134,7 @@ export function use_template_manager(api_base, view_global, on_error) {
134
134
  body: JSON.stringify({
135
135
  template_name,
136
136
  template_category_id: active_category.id,
137
- template_html: '',
138
- template_text: '',
137
+ bodies: { html: '', text: '' },
139
138
  }),
140
139
  }).then((r) => r.json());
141
140
  if (!res.success)
@@ -164,7 +163,7 @@ export function use_template_manager(api_base, view_global, on_error) {
164
163
  const res = await fetch(`${api_base}/templates/${selected_template.id}${qs}`, {
165
164
  method: 'PUT',
166
165
  headers: { 'Content-Type': 'application/json' },
167
- body: JSON.stringify({ template_html: html, template_text: text }),
166
+ body: JSON.stringify({ bodies: { html, text } }),
168
167
  }).then((r) => r.json());
169
168
  if (!res.success)
170
169
  throw new Error(res.error || 'Failed to save template');
@@ -173,7 +172,7 @@ export function use_template_manager(api_base, view_global, on_error) {
173
172
  set_selected_template(res.data);
174
173
  }
175
174
  else {
176
- set_selected_template((prev) => prev ? { ...prev, template_html: html, template_text: text } : prev);
175
+ set_selected_template((prev) => prev ? { ...prev, bodies: { ...prev.bodies, html, text } } : prev);
177
176
  }
178
177
  await load_data();
179
178
  }
@@ -1 +1 @@
1
- {"version":3,"file":"template_manager_admin.js","sourceRoot":"","sources":["../../../src/components/template_manager/template_manager_admin.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template_manager_admin.js","sourceRoot":"","sources":["../../../src/components/template_manager/template_manager_admin.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * EmailChannel — implements ChannelAdapter<EmailPayload> for v4.0.0
3
+ * channel-pluggable architecture.
4
+ *
5
+ * Also exports classifyEmailError (retryable vs permanent error detection)
6
+ * and EmailPayload (the payload contract for dispatch).
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { ChannelAdapter, ChannelCapabilities, ChannelSendContext, ChannelSendResult, ChannelValidationResult } from "../../channels/types.js";
11
+ import type { EmailerConfig, EmailSendResponse, EmailAttachment } from "./types.js";
12
+ /** Payload shape for the email channel. */
13
+ export interface EmailPayload {
14
+ subject: string;
15
+ body_text?: string;
16
+ body_html?: string;
17
+ template_name?: string;
18
+ template_vars?: Record<string, unknown>;
19
+ attachments?: EmailAttachment[];
20
+ reply_to?: string;
21
+ cc?: string | string[];
22
+ bcc?: string | string[];
23
+ }
24
+ /**
25
+ * Returns true if the send failure is retryable (transient), false if permanent.
26
+ *
27
+ * Rules:
28
+ * - No raw_response (network/timeout) → retryable
29
+ * - HTTP 5xx → retryable
30
+ * - HTTP 429 (rate limit) → retryable
31
+ * - HTTP 4xx (auth/validation) → permanent
32
+ */
33
+ export declare function classifyEmailError(r: EmailSendResponse): boolean;
34
+ /** Adapter that sends via the configured email provider. */
35
+ export declare class EmailChannel implements ChannelAdapter<EmailPayload> {
36
+ private readonly opts;
37
+ readonly capabilities: ChannelCapabilities;
38
+ constructor(opts?: {
39
+ config?: EmailerConfig;
40
+ });
41
+ validate(p: EmailPayload): ChannelValidationResult;
42
+ send(p: EmailPayload, ctx: ChannelSendContext): Promise<ChannelSendResult>;
43
+ }
44
+ declare module "../../channels/types.js" {
45
+ interface ChannelPayloadMap {
46
+ email: EmailPayload;
47
+ }
48
+ }
49
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/email/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMpF,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAOhE;AAED,4DAA4D;AAC5D,qBAAa,YAAa,YAAW,cAAc,CAAC,YAAY,CAAC;IAgBnD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAfjC,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAaxC;gBAE2B,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,aAAa,CAAA;KAAO;IAElE,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,uBAAuB;IAW5C,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAgCjF;AAID,OAAO,QAAQ,yBAAyB,CAAC;IACvC,UAAU,iBAAiB;QACzB,KAAK,EAAE,YAAY,CAAC;KACrB;CACF"}