hazo_notify 4.0.2 → 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.
@@ -1,19 +1,19 @@
1
1
  /**
2
- * Inbox connection holder. Mirrors template_manager's pattern: caller
3
- * provides a hazo_connect factory at boot via `initInbox()`; subsequent
4
- * storage calls read the resolved instance from this module.
5
- *
6
- * @packageDocumentation
2
+ * Inbox connection holder. Stash the resolved adapter on globalThis so it
3
+ * survives Next.js dev-mode module duplication (each route bundle re-imports
4
+ * this file separately; the global reference unifies them).
7
5
  */
8
- import type { HazoConnectInstance } from "../template_manager/types.js";
6
+ import type { HazoConnectAdapter } from "hazo_connect/server";
9
7
  export interface InitInboxOptions {
10
- /** Factory returning (or resolving to) a hazo_connect instance. */
11
- hazo_connect_factory: () => Promise<HazoConnectInstance> | HazoConnectInstance;
8
+ /** Either an adapter directly... */
9
+ adapter?: HazoConnectAdapter;
10
+ /** ...or a (possibly async) factory that produces one. */
11
+ adapter_factory?: () => HazoConnectAdapter | Promise<HazoConnectAdapter>;
12
12
  }
13
- /** Boot-time init. Must be called before any dispatch() / worker call. */
14
- export declare function initInbox(opts: InitInboxOptions): Promise<HazoConnectInstance>;
15
- /** Internal: get the resolved instance. Throws if not initialised. */
16
- export declare function getInboxConnection(): HazoConnectInstance;
13
+ /** Boot-time init. Must be called before any storage / worker call. */
14
+ export declare function initInbox(opts: InitInboxOptions): Promise<HazoConnectAdapter>;
15
+ /** Internal: get the resolved adapter. Throws if not initialised. */
16
+ export declare function getInboxConnection(): HazoConnectAdapter;
17
17
  /** Test-only: reset the holder. */
18
18
  export declare function __resetInboxConnection(): void;
19
19
  //# sourceMappingURL=connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAUxE,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,oBAAoB,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;CAChF;AAED,0EAA0E;AAC1E,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CASpF;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,IAAI,mBAAmB,CAMxD;AAED,mCAAmC;AACnC,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC1E;AAUD,uEAAuE;AACvE,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAanF;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,kBAAkB,CAIvD;AAED,mCAAmC;AACnC,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -1,31 +1,34 @@
1
- /**
2
- * Inbox connection holder. Mirrors template_manager's pattern: caller
3
- * provides a hazo_connect factory at boot via `initInbox()`; subsequent
4
- * storage calls read the resolved instance from this module.
5
- *
6
- * @packageDocumentation
7
- */
8
- // Stash on globalThis so the resolved connection survives Next.js dev-mode
9
- // module duplication. Each route bundle imports this file separately; the
10
- // global reference unifies them.
11
1
  const CONN_KEY = "__hazo_notify_inbox_connection__";
12
2
  const g = globalThis;
13
- /** Boot-time init. Must be called before any dispatch() / worker call. */
3
+ function looksLikeAdapter(a) {
4
+ if (typeof a !== "object" || a === null)
5
+ return false;
6
+ const obj = a;
7
+ return typeof obj.query === "function"
8
+ && typeof obj.claimRows === "function"
9
+ && typeof obj.getConfig === "function";
10
+ }
11
+ /** Boot-time init. Must be called before any storage / worker call. */
14
12
  export async function initInbox(opts) {
15
- const conn = await opts.hazo_connect_factory();
16
- if (!conn.raw) {
17
- throw new Error("initInbox: hazo_connect_factory must return an instance supporting raw SQL");
13
+ let adapter = opts.adapter;
14
+ if (!adapter && opts.adapter_factory) {
15
+ adapter = await opts.adapter_factory();
16
+ }
17
+ if (!adapter) {
18
+ throw new Error("initInbox: must provide adapter or adapter_factory");
18
19
  }
19
- g[CONN_KEY] = conn;
20
- return conn;
20
+ if (!looksLikeAdapter(adapter)) {
21
+ throw new Error("initInbox: argument must be a HazoConnectAdapter (with query, claimRows, getConfig)");
22
+ }
23
+ g[CONN_KEY] = adapter;
24
+ return adapter;
21
25
  }
22
- /** Internal: get the resolved instance. Throws if not initialised. */
26
+ /** Internal: get the resolved adapter. Throws if not initialised. */
23
27
  export function getInboxConnection() {
24
- const conn = g[CONN_KEY];
25
- if (!conn) {
28
+ const a = g[CONN_KEY];
29
+ if (!a)
26
30
  throw new Error("inbox: initInbox() must be called before storage access");
27
- }
28
- return conn;
31
+ return a;
29
32
  }
30
33
  /** Test-only: reset the holder. */
31
34
  export function __resetInboxConnection() {
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,2EAA2E;AAC3E,0EAA0E;AAC1E,iCAAiC;AACjC,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AACpD,MAAM,CAAC,GAAG,UAET,CAAC;AAOF,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IACD,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,sBAAsB;IACpC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/lib/inbox/connection.ts"],"names":[],"mappings":"AAOA,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AACpD,MAAM,CAAC,GAAG,UAAkE,CAAC;AAS7E,SAAS,gBAAgB,CAAC,CAAU;IAClC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,CAA4B,CAAC;IACzC,OAAO,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU;WAC/B,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU;WACnC,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,CAAC;AAC7C,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,IAAI,OAAO,GAAmC,IAAI,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IACD,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,kBAAkB;IAChC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACnF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,sBAAsB;IACpC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AACrB,CAAC"}
@@ -1,21 +1,142 @@
1
- import type { UpsertInboxRowInput, UpsertInboxRowResult, UpsertDeliveryInput, UpsertDeliveryResult, ClaimedDelivery } from "./dialects/types.js";
2
- import type { InboxRow } from "./types.js";
1
+ import type { UpsertInboxRowInput, UpsertInboxRowResult, UpsertDeliveryInput, UpsertDeliveryResult, ClaimedDelivery, InboxRow } from "./types.js";
2
+ /**
3
+ * Upsert an inbox row using a claim-first strategy:
4
+ *
5
+ * 1. Try to increment an existing open batch that matches `batch_key` and
6
+ * `batch_closed_at`. This preserves the increment-on-conflict semantics of
7
+ * the original Postgres `ON CONFLICT (batch_key) WHERE batch_closed_at IS NULL`
8
+ * partial-index upsert.
9
+ * 2. If no open batch found, insert a fresh row.
10
+ *
11
+ * Race-condition trade-off: if two workers concurrently find no open batch and
12
+ * both insert, both succeed (no unique index guards the SQLite/adapter path).
13
+ * The original Postgres SQL used a partial unique index for true atomicity.
14
+ * For Hazodocs (single-worker), this race window is acceptable; adding retry
15
+ * logic would require error-code parsing not available in hazo_connect.
16
+ *
17
+ * SQLite NULL caveat: the clause-builder emits `col = ?` which SQLite's `=`
18
+ * operator does not use to match NULL (needs IS NULL). In production (Postgres),
19
+ * the behaviour is correct because Postgres's `=` also doesn't match NULL — the
20
+ * partial index `WHERE batch_closed_at IS NULL` handles the constraint there.
21
+ * In SQLite-backed tests use empty string instead of null for batch_closed_at.
22
+ */
3
23
  export declare function upsertInboxRow(i: UpsertInboxRowInput): Promise<UpsertInboxRowResult>;
24
+ /**
25
+ * Upsert a channel delivery row using a two-claim strategy that preserves the
26
+ * original Postgres CASE-WHEN semantic for `flush_after`:
27
+ *
28
+ * 1. Claim an **existing fresh row** (attempt_count = 0) — update both `payload`
29
+ * and `flush_after` (the delivery hasn't been tried yet, so rescheduling is safe).
30
+ * 2. Claim an **existing in-flight row** (attempt_count > 0) — update `payload`
31
+ * only; preserve `flush_after` to avoid resetting an active retry schedule.
32
+ * 3. If neither claim succeeds, no row exists — insert a new one.
33
+ *
34
+ * The two claims are mutually exclusive so at most one succeeds per call.
35
+ */
4
36
  export declare function upsertDelivery(i: UpsertDeliveryInput): Promise<UpsertDeliveryResult>;
5
37
  export declare function claimDueDeliveries(channel_id: string, batch_size: number): Promise<ClaimedDelivery[]>;
38
+ /**
39
+ * Task 2.7 — markDeliverySent via CrudService.updateById
40
+ *
41
+ * Sets status=sent, records the provider message_id, and stamps finalized_at.
42
+ * updateById returns T[] — ignored here (fire-and-forget).
43
+ */
6
44
  export declare function markDeliverySent(id: string, message_id: string): Promise<void>;
45
+ /**
46
+ * Task 2.8 — markDeliveryFailed via CrudService.updateById
47
+ *
48
+ * Sets status=failed, stores the error (truncated to 1000 chars), and stamps finalized_at.
49
+ * updateById returns T[] — ignored here (fire-and-forget).
50
+ */
7
51
  export declare function markDeliveryFailed(id: string, error: string): Promise<void>;
52
+ /**
53
+ * Task 2.9 — rescheduleDelivery via CrudService.updateById
54
+ *
55
+ * Updates flush_after and last_error for the next retry. Status stays 'pending'.
56
+ * updateById returns T[] — ignored here (fire-and-forget).
57
+ */
8
58
  export declare function rescheduleDelivery(id: string, flush_after: string, error: string): Promise<void>;
59
+ /**
60
+ * Task 2.10 — closeStaleBatches via adapter.claimRows
61
+ *
62
+ * Closes inbox rows whose batch_closed_at is empty string (open) and whose
63
+ * created_at is older than (now - window_ms).
64
+ *
65
+ * NULL caveat: SQLite's claimRows WHERE emits `col = ?` which does not match
66
+ * SQL NULL. Empty string '' is used as the sentinel for "open batch" in both
67
+ * SQLite tests and production (see upsertInboxRow). In production (Postgres),
68
+ * rows inserted via this adapter path use '' not NULL, so the '' sentinel is
69
+ * consistent end-to-end.
70
+ *
71
+ * Returns the number of batches closed.
72
+ */
9
73
  export declare function closeStaleBatches(window_ms: number): Promise<number>;
74
+ /**
75
+ * Task 2.11a — purgeReadInbox via QueryBuilder DELETE
76
+ *
77
+ * Deletes inbox rows that have been read and whose read_at is older than
78
+ * `older_than`. Returns the number of rows deleted.
79
+ *
80
+ * QueryBuilder 'neq' with null → IS NOT NULL (via translateWhereCondition).
81
+ * QueryBuilder 'lt' → read_at < older_than.
82
+ */
10
83
  export declare function purgeReadInbox(older_than: string): Promise<number>;
84
+ /**
85
+ * Task 2.11b — purgeFinalizedDeliveries via QueryBuilder DELETE
86
+ *
87
+ * Deletes delivery rows that have been finalized (sent or failed) and whose
88
+ * finalized_at is older than `older_than`. Returns the number of rows deleted.
89
+ */
11
90
  export declare function purgeFinalizedDeliveries(older_than: string): Promise<number>;
12
91
  export interface ListOptions {
13
92
  limit?: number;
14
93
  cursor?: string;
15
94
  surface?: "in_app" | "banner";
16
95
  }
96
+ /**
97
+ * Task 2.12a — listUnreadForUser via QueryBuilder
98
+ *
99
+ * Returns unread inbox rows for the given user/scope, ordered by created_at
100
+ * descending with optional cursor (created_at < cursor) and limit.
101
+ *
102
+ * Surface filtering (in_app / banner) requires dialect-specific JSONB or
103
+ * json_extract access. Rather than branching on adapter type at this layer,
104
+ * callers filter in-memory when surface filtering is needed. This keeps the
105
+ * storage layer adapter-agnostic.
106
+ *
107
+ * QueryBuilder 'is' with null → IS NULL (via translateWhereCondition).
108
+ */
17
109
  export declare function listUnreadForUser(user_id: string, scope_id: string, opts?: ListOptions): Promise<InboxRow[]>;
110
+ /**
111
+ * Task 2.12b — unreadCount via QueryBuilder
112
+ *
113
+ * Counts unread inbox rows for the given user/scope.
114
+ * QueryBuilder 'is' with null → IS NULL.
115
+ */
18
116
  export declare function unreadCount(user_id: string, scope_id: string): Promise<number>;
117
+ /**
118
+ * Task 2.13a — markRead via claimRows (idempotent)
119
+ *
120
+ * Sets read_at = now() for the given inbox row, scoped by user_id to prevent
121
+ * cross-user reads.
122
+ *
123
+ * Idempotency trade-off: the `read_at: null` condition is omitted from the
124
+ * claimRows WHERE because the clause-builder emits `col = ?` which SQLite's
125
+ * `=` operator does not use to match NULL. Dropping the condition makes the
126
+ * operation idempotent — re-marking an already-read row re-sets read_at = now(),
127
+ * which is harmless for UI-driven calls.
128
+ */
19
129
  export declare function markRead(id: string, user_id: string): Promise<boolean>;
130
+ /**
131
+ * Task 2.13b — markAllRead via claimRows (idempotent)
132
+ *
133
+ * Sets read_at = now() for every inbox row belonging to the given user/scope.
134
+ *
135
+ * Idempotency trade-off: same as markRead — the `read_at: null` condition is
136
+ * omitted to avoid the SQLite NULL-matching issue. Already-read rows will have
137
+ * their read_at re-stamped, which is acceptable for bulk UI acknowledgment.
138
+ *
139
+ * Returns the count of rows updated (includes any already-read rows).
140
+ */
20
141
  export declare function markAllRead(user_id: string, scope_id: string): Promise<number>;
21
142
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAO3C,wBAAsB,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAG1F;AAED,wBAAsB,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAG1F;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAG3G;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAGpE;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAGjE;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAGtF;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1E;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxE;AAED,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlF;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoBrB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpF;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5E;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0C1F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2C1F;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwD3G;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASjF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1E;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQxE;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF"}
@@ -1,94 +1,345 @@
1
+ import { QueryBuilder, createCrudService } from "hazo_connect/server";
1
2
  import { getInboxConnection } from "./connection.js";
2
- import { pickDialect } from "./dialects/index.js";
3
- function d() {
4
- const conn = getInboxConnection();
5
- return { conn, dialect: pickDialect(conn) };
6
- }
3
+ /**
4
+ * Upsert an inbox row using a claim-first strategy:
5
+ *
6
+ * 1. Try to increment an existing open batch that matches `batch_key` and
7
+ * `batch_closed_at`. This preserves the increment-on-conflict semantics of
8
+ * the original Postgres `ON CONFLICT (batch_key) WHERE batch_closed_at IS NULL`
9
+ * partial-index upsert.
10
+ * 2. If no open batch found, insert a fresh row.
11
+ *
12
+ * Race-condition trade-off: if two workers concurrently find no open batch and
13
+ * both insert, both succeed (no unique index guards the SQLite/adapter path).
14
+ * The original Postgres SQL used a partial unique index for true atomicity.
15
+ * For Hazodocs (single-worker), this race window is acceptable; adding retry
16
+ * logic would require error-code parsing not available in hazo_connect.
17
+ *
18
+ * SQLite NULL caveat: the clause-builder emits `col = ?` which SQLite's `=`
19
+ * operator does not use to match NULL (needs IS NULL). In production (Postgres),
20
+ * the behaviour is correct because Postgres's `=` also doesn't match NULL — the
21
+ * partial index `WHERE batch_closed_at IS NULL` handles the constraint there.
22
+ * In SQLite-backed tests use empty string instead of null for batch_closed_at.
23
+ */
7
24
  export async function upsertInboxRow(i) {
8
- const { conn, dialect } = d();
9
- return dialect.upsertInboxRow(conn, i);
25
+ const adapter = getInboxConnection();
26
+ // Try to increment an existing open batch first.
27
+ const claimed = await adapter.claimRows({
28
+ table: "hazo_notify_inbox",
29
+ where: { batch_key: i.batch_key, batch_closed_at: i.batch_closed_at ?? "" },
30
+ set: {
31
+ aggregate_count: { increment: 1 },
32
+ in_app_text: i.in_app_text,
33
+ payload: JSON.stringify(i.payload),
34
+ updated_at: { $now: true },
35
+ },
36
+ returning: ["id"],
37
+ limit: 1,
38
+ });
39
+ if (claimed.length > 0) {
40
+ return { id: claimed[0].id, inserted: false };
41
+ }
42
+ // No open batch — insert a new row.
43
+ const rows = await adapter.query(new QueryBuilder()
44
+ .from("hazo_notify_inbox")
45
+ .returning("id"), "POST", {
46
+ scope_id: i.scope_id,
47
+ user_id: i.user_id,
48
+ event_type: i.event_type,
49
+ subject_id: i.subject_id,
50
+ batch_key: i.batch_key,
51
+ in_app_text: i.in_app_text,
52
+ deep_link: i.deep_link,
53
+ payload: JSON.stringify(i.payload),
54
+ surfaces: JSON.stringify(i.surfaces),
55
+ batch_closed_at: i.batch_closed_at,
56
+ });
57
+ return { id: rows[0].id, inserted: true };
10
58
  }
59
+ /**
60
+ * Upsert a channel delivery row using a two-claim strategy that preserves the
61
+ * original Postgres CASE-WHEN semantic for `flush_after`:
62
+ *
63
+ * 1. Claim an **existing fresh row** (attempt_count = 0) — update both `payload`
64
+ * and `flush_after` (the delivery hasn't been tried yet, so rescheduling is safe).
65
+ * 2. Claim an **existing in-flight row** (attempt_count > 0) — update `payload`
66
+ * only; preserve `flush_after` to avoid resetting an active retry schedule.
67
+ * 3. If neither claim succeeds, no row exists — insert a new one.
68
+ *
69
+ * The two claims are mutually exclusive so at most one succeeds per call.
70
+ */
11
71
  export async function upsertDelivery(i) {
12
- const { conn, dialect } = d();
13
- return dialect.upsertDelivery(conn, i);
72
+ const adapter = getInboxConnection();
73
+ // Step 1: claim a fresh (not-yet-attempted) row — update payload + flush_after.
74
+ const claimedFresh = await adapter.claimRows({
75
+ table: "hazo_notify_channel_deliveries",
76
+ where: { inbox_id: i.inbox_id, channel_id: i.channel_id, attempt_count: 0 },
77
+ set: { payload: JSON.stringify(i.payload), flush_after: i.flush_after, updated_at: { $now: true } },
78
+ returning: ["id"],
79
+ limit: 1,
80
+ });
81
+ if (claimedFresh.length > 0) {
82
+ return { id: claimedFresh[0].id, inserted: false, attempt_in_flight: false };
83
+ }
84
+ // Step 2: claim an in-flight row (attempt_count > 0) — update payload only,
85
+ // preserve flush_after so the retry schedule is not reset.
86
+ const claimedInFlight = await adapter.claimRows({
87
+ table: "hazo_notify_channel_deliveries",
88
+ where: { inbox_id: i.inbox_id, channel_id: i.channel_id, attempt_count: { gt: 0 } },
89
+ set: { payload: JSON.stringify(i.payload), updated_at: { $now: true } },
90
+ returning: ["id"],
91
+ limit: 1,
92
+ });
93
+ if (claimedInFlight.length > 0) {
94
+ return { id: claimedInFlight[0].id, inserted: false, attempt_in_flight: true };
95
+ }
96
+ // Step 3: no existing row — insert a new delivery.
97
+ const rows = await adapter.query(new QueryBuilder()
98
+ .from("hazo_notify_channel_deliveries")
99
+ .returning("id"), "POST", {
100
+ inbox_id: i.inbox_id,
101
+ channel_id: i.channel_id,
102
+ payload: JSON.stringify(i.payload),
103
+ flush_after: i.flush_after,
104
+ });
105
+ return { id: rows[0].id, inserted: true, attempt_in_flight: false };
14
106
  }
15
107
  export async function claimDueDeliveries(channel_id, batch_size) {
16
- const { conn, dialect } = d();
17
- return dialect.claimDueDeliveries(conn, channel_id, batch_size);
108
+ const adapter = getInboxConnection();
109
+ // THE KEY CHANGE (Task 2.6): delegates to adapter.claimRows instead of a
110
+ // dialect-bound raw SQL query (SELECT … FOR UPDATE SKIP LOCKED on Postgres).
111
+ // Strong atomicity on PgAdapter; CAS-optimistic on PostgrestAdapter;
112
+ // serialised transaction on SqliteAdapter. All adapters are supported.
113
+ const claimed = await adapter.claimRows({
114
+ table: "hazo_notify_channel_deliveries",
115
+ where: {
116
+ channel_id,
117
+ status: "pending",
118
+ flush_after: { lte: { $now: true } },
119
+ },
120
+ set: {
121
+ attempt_count: { increment: 1 },
122
+ updated_at: { $now: true },
123
+ },
124
+ returning: ["id", "inbox_id", "channel_id", "payload", "attempt_count"],
125
+ limit: batch_size,
126
+ orderBy: { column: "flush_after", direction: "asc" },
127
+ });
128
+ // Enrich each claimed row with user_id + scope_id from the originating inbox
129
+ // row. N+1 is acceptable: batch sizes are small (~10) and per-call latency
130
+ // dominates. Map `id` → `delivery_id` to match the ClaimedDelivery contract
131
+ // that callers (flush worker) expect.
132
+ return Promise.all(claimed.map(async (r) => {
133
+ const inboxRows = await adapter.query(new QueryBuilder()
134
+ .from("hazo_notify_inbox")
135
+ .select("user_id, scope_id")
136
+ .where("id", "eq", r.inbox_id), "GET");
137
+ const payload = typeof r.payload === "string"
138
+ ? JSON.parse(r.payload)
139
+ : r.payload;
140
+ return {
141
+ delivery_id: r.id,
142
+ inbox_id: r.inbox_id,
143
+ channel_id: r.channel_id,
144
+ payload,
145
+ attempt_count: r.attempt_count,
146
+ user_id: inboxRows[0]?.user_id ?? "",
147
+ scope_id: inboxRows[0]?.scope_id ?? "",
148
+ };
149
+ }));
18
150
  }
151
+ /**
152
+ * Task 2.7 — markDeliverySent via CrudService.updateById
153
+ *
154
+ * Sets status=sent, records the provider message_id, and stamps finalized_at.
155
+ * updateById returns T[] — ignored here (fire-and-forget).
156
+ */
19
157
  export async function markDeliverySent(id, message_id) {
20
- const { conn, dialect } = d();
21
- return dialect.markDeliverySent(conn, id, message_id);
158
+ const adapter = getInboxConnection();
159
+ const crud = createCrudService(adapter, "hazo_notify_channel_deliveries");
160
+ await crud.updateById(id, {
161
+ status: "sent",
162
+ message_id,
163
+ finalized_at: new Date().toISOString(),
164
+ updated_at: new Date().toISOString(),
165
+ });
22
166
  }
167
+ /**
168
+ * Task 2.8 — markDeliveryFailed via CrudService.updateById
169
+ *
170
+ * Sets status=failed, stores the error (truncated to 1000 chars), and stamps finalized_at.
171
+ * updateById returns T[] — ignored here (fire-and-forget).
172
+ */
23
173
  export async function markDeliveryFailed(id, error) {
24
- const { conn, dialect } = d();
25
- return dialect.markDeliveryFailed(conn, id, error);
174
+ const adapter = getInboxConnection();
175
+ const crud = createCrudService(adapter, "hazo_notify_channel_deliveries");
176
+ await crud.updateById(id, {
177
+ status: "failed",
178
+ last_error: error.slice(0, 1000),
179
+ finalized_at: new Date().toISOString(),
180
+ updated_at: new Date().toISOString(),
181
+ });
26
182
  }
183
+ /**
184
+ * Task 2.9 — rescheduleDelivery via CrudService.updateById
185
+ *
186
+ * Updates flush_after and last_error for the next retry. Status stays 'pending'.
187
+ * updateById returns T[] — ignored here (fire-and-forget).
188
+ */
27
189
  export async function rescheduleDelivery(id, flush_after, error) {
28
- const { conn, dialect } = d();
29
- return dialect.rescheduleDelivery(conn, id, flush_after, error);
190
+ const adapter = getInboxConnection();
191
+ const crud = createCrudService(adapter, "hazo_notify_channel_deliveries");
192
+ await crud.updateById(id, {
193
+ flush_after,
194
+ last_error: error,
195
+ updated_at: new Date().toISOString(),
196
+ });
30
197
  }
198
+ /**
199
+ * Task 2.10 — closeStaleBatches via adapter.claimRows
200
+ *
201
+ * Closes inbox rows whose batch_closed_at is empty string (open) and whose
202
+ * created_at is older than (now - window_ms).
203
+ *
204
+ * NULL caveat: SQLite's claimRows WHERE emits `col = ?` which does not match
205
+ * SQL NULL. Empty string '' is used as the sentinel for "open batch" in both
206
+ * SQLite tests and production (see upsertInboxRow). In production (Postgres),
207
+ * rows inserted via this adapter path use '' not NULL, so the '' sentinel is
208
+ * consistent end-to-end.
209
+ *
210
+ * Returns the number of batches closed.
211
+ */
31
212
  export async function closeStaleBatches(window_ms) {
32
- const { conn, dialect } = d();
33
- return dialect.closeStaleBatches(conn, window_ms);
213
+ const adapter = getInboxConnection();
214
+ const cutoff = new Date(Date.now() - window_ms).toISOString();
215
+ const rows = await adapter.claimRows({
216
+ table: "hazo_notify_inbox",
217
+ where: { batch_closed_at: "", created_at: { lte: cutoff } },
218
+ set: { batch_closed_at: { $now: true } },
219
+ returning: ["id"],
220
+ limit: 10000,
221
+ });
222
+ return rows.length;
34
223
  }
224
+ /**
225
+ * Task 2.11a — purgeReadInbox via QueryBuilder DELETE
226
+ *
227
+ * Deletes inbox rows that have been read and whose read_at is older than
228
+ * `older_than`. Returns the number of rows deleted.
229
+ *
230
+ * QueryBuilder 'neq' with null → IS NOT NULL (via translateWhereCondition).
231
+ * QueryBuilder 'lt' → read_at < older_than.
232
+ */
35
233
  export async function purgeReadInbox(older_than) {
36
- const { conn, dialect } = d();
37
- return dialect.purgeReadInbox(conn, older_than);
234
+ const adapter = getInboxConnection();
235
+ const builder = new QueryBuilder()
236
+ .from("hazo_notify_inbox")
237
+ .where("read_at", "neq", null)
238
+ .where("read_at", "lt", older_than);
239
+ const rows = await adapter.query(builder, "DELETE");
240
+ return rows.length;
38
241
  }
242
+ /**
243
+ * Task 2.11b — purgeFinalizedDeliveries via QueryBuilder DELETE
244
+ *
245
+ * Deletes delivery rows that have been finalized (sent or failed) and whose
246
+ * finalized_at is older than `older_than`. Returns the number of rows deleted.
247
+ */
39
248
  export async function purgeFinalizedDeliveries(older_than) {
40
- const { conn, dialect } = d();
41
- return dialect.purgeFinalizedDeliveries(conn, older_than);
249
+ const adapter = getInboxConnection();
250
+ const builder = new QueryBuilder()
251
+ .from("hazo_notify_channel_deliveries")
252
+ .where("finalized_at", "neq", null)
253
+ .where("finalized_at", "lt", older_than);
254
+ const rows = await adapter.query(builder, "DELETE");
255
+ return rows.length;
42
256
  }
257
+ /**
258
+ * Task 2.12a — listUnreadForUser via QueryBuilder
259
+ *
260
+ * Returns unread inbox rows for the given user/scope, ordered by created_at
261
+ * descending with optional cursor (created_at < cursor) and limit.
262
+ *
263
+ * Surface filtering (in_app / banner) requires dialect-specific JSONB or
264
+ * json_extract access. Rather than branching on adapter type at this layer,
265
+ * callers filter in-memory when surface filtering is needed. This keeps the
266
+ * storage layer adapter-agnostic.
267
+ *
268
+ * QueryBuilder 'is' with null → IS NULL (via translateWhereCondition).
269
+ */
43
270
  export async function listUnreadForUser(user_id, scope_id, opts = {}) {
44
- const conn = getInboxConnection();
45
- const limit = Math.min(opts.limit ?? 20, 100);
46
- const isSqlite = conn.type === "sqlite";
47
- const ph = (n) => (isSqlite ? "?" : `$${n}`);
48
- const where = [`user_id = ${ph(1)}`, `scope_id = ${ph(2)}`, "read_at IS NULL"];
49
- const params = [user_id, scope_id];
50
- let i = 3;
271
+ const adapter = getInboxConnection();
272
+ let builder = new QueryBuilder()
273
+ .from("hazo_notify_inbox")
274
+ .where("user_id", "eq", user_id)
275
+ .where("scope_id", "eq", scope_id)
276
+ .where("read_at", "is", null)
277
+ .order("created_at", "desc")
278
+ .limit(Math.min(opts.limit ?? 20, 100));
51
279
  if (opts.cursor) {
52
- where.push(`created_at < ${ph(i)}`);
53
- params.push(opts.cursor);
54
- i++;
280
+ builder = builder.where("created_at", "lt", opts.cursor);
55
281
  }
56
- if (opts.surface) {
57
- where.push(isSqlite
58
- ? `json_extract(surfaces, '$.${opts.surface}') = 1`
59
- : `(surfaces->>'${opts.surface}')::boolean = true`);
60
- }
61
- params.push(limit);
62
- return await conn.raw(`SELECT * FROM hazo_notify_inbox WHERE ${where.join(" AND ")}
63
- ORDER BY created_at DESC LIMIT ${ph(i)}`, params);
282
+ return await adapter.query(builder, "GET");
64
283
  }
284
+ /**
285
+ * Task 2.12b — unreadCount via QueryBuilder
286
+ *
287
+ * Counts unread inbox rows for the given user/scope.
288
+ * QueryBuilder 'is' with null → IS NULL.
289
+ */
65
290
  export async function unreadCount(user_id, scope_id) {
66
- const conn = getInboxConnection();
67
- const isSqlite = conn.type === "sqlite";
68
- const rows = await conn.raw(`SELECT count(*) AS n FROM hazo_notify_inbox
69
- WHERE user_id = ${isSqlite ? "?" : "$1"} AND scope_id = ${isSqlite ? "?" : "$2"} AND read_at IS NULL`, [user_id, scope_id]);
70
- return Number(rows[0]?.n ?? 0);
291
+ const adapter = getInboxConnection();
292
+ const builder = new QueryBuilder()
293
+ .from("hazo_notify_inbox")
294
+ .where("user_id", "eq", user_id)
295
+ .where("scope_id", "eq", scope_id)
296
+ .where("read_at", "is", null);
297
+ const rows = await adapter.query(builder, "GET");
298
+ return rows.length;
71
299
  }
300
+ /**
301
+ * Task 2.13a — markRead via claimRows (idempotent)
302
+ *
303
+ * Sets read_at = now() for the given inbox row, scoped by user_id to prevent
304
+ * cross-user reads.
305
+ *
306
+ * Idempotency trade-off: the `read_at: null` condition is omitted from the
307
+ * claimRows WHERE because the clause-builder emits `col = ?` which SQLite's
308
+ * `=` operator does not use to match NULL. Dropping the condition makes the
309
+ * operation idempotent — re-marking an already-read row re-sets read_at = now(),
310
+ * which is harmless for UI-driven calls.
311
+ */
72
312
  export async function markRead(id, user_id) {
73
- const conn = getInboxConnection();
74
- const isSqlite = conn.type === "sqlite";
75
- const sql = isSqlite
76
- ? `UPDATE hazo_notify_inbox SET read_at=datetime('now')
77
- WHERE id=? AND user_id=? AND read_at IS NULL RETURNING id`
78
- : `UPDATE hazo_notify_inbox SET read_at=now()
79
- WHERE id=$1 AND user_id=$2 AND read_at IS NULL RETURNING id`;
80
- const rows = await conn.raw(sql, [id, user_id]);
313
+ const adapter = getInboxConnection();
314
+ const rows = await adapter.claimRows({
315
+ table: "hazo_notify_inbox",
316
+ where: { id, user_id },
317
+ set: { read_at: { $now: true } },
318
+ returning: ["id"],
319
+ limit: 1,
320
+ });
81
321
  return rows.length > 0;
82
322
  }
323
+ /**
324
+ * Task 2.13b — markAllRead via claimRows (idempotent)
325
+ *
326
+ * Sets read_at = now() for every inbox row belonging to the given user/scope.
327
+ *
328
+ * Idempotency trade-off: same as markRead — the `read_at: null` condition is
329
+ * omitted to avoid the SQLite NULL-matching issue. Already-read rows will have
330
+ * their read_at re-stamped, which is acceptable for bulk UI acknowledgment.
331
+ *
332
+ * Returns the count of rows updated (includes any already-read rows).
333
+ */
83
334
  export async function markAllRead(user_id, scope_id) {
84
- const conn = getInboxConnection();
85
- const isSqlite = conn.type === "sqlite";
86
- const sql = isSqlite
87
- ? `UPDATE hazo_notify_inbox SET read_at=datetime('now')
88
- WHERE user_id=? AND scope_id=? AND read_at IS NULL RETURNING id`
89
- : `UPDATE hazo_notify_inbox SET read_at=now()
90
- WHERE user_id=$1 AND scope_id=$2 AND read_at IS NULL RETURNING id`;
91
- const rows = await conn.raw(sql, [user_id, scope_id]);
335
+ const adapter = getInboxConnection();
336
+ const rows = await adapter.claimRows({
337
+ table: "hazo_notify_inbox",
338
+ where: { user_id, scope_id },
339
+ set: { read_at: { $now: true } },
340
+ returning: ["id"],
341
+ limit: 10000,
342
+ });
92
343
  return rows.length;
93
344
  }
94
345
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/lib/inbox/storage.ts"],"names":[],"mappings":"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"}
@@ -54,4 +54,41 @@ export interface DispatchResult {
54
54
  deliveries_refreshed: number;
55
55
  channels_dispatched: string[];
56
56
  }
57
+ export interface UpsertInboxRowInput {
58
+ scope_id: string;
59
+ user_id: string;
60
+ event_type: string;
61
+ subject_id: string | null;
62
+ batch_key: string;
63
+ in_app_text: string;
64
+ deep_link: string;
65
+ payload: Record<string, unknown>;
66
+ surfaces: NotificationSurfaces;
67
+ batch_closed_at: string | null;
68
+ }
69
+ export interface UpsertInboxRowResult {
70
+ id: string;
71
+ inserted: boolean;
72
+ }
73
+ export interface UpsertDeliveryInput {
74
+ inbox_id: string;
75
+ channel_id: string;
76
+ payload: Record<string, unknown>;
77
+ flush_after: string;
78
+ }
79
+ export interface UpsertDeliveryResult {
80
+ id: string;
81
+ inserted: boolean;
82
+ /** True if the worker has already started attempts on this row. */
83
+ attempt_in_flight: boolean;
84
+ }
85
+ export interface ClaimedDelivery {
86
+ delivery_id: string;
87
+ inbox_id: string;
88
+ channel_id: string;
89
+ payload: Record<string, unknown>;
90
+ attempt_count: number;
91
+ user_id: string;
92
+ scope_id: string;
93
+ }
57
94
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/inbox/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC1D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BjC"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAmB9D;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC1D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BjC"}
@@ -7,9 +7,25 @@
7
7
  *
8
8
  * @packageDocumentation
9
9
  */
10
+ import { QueryBuilder } from "hazo_connect/server";
10
11
  import { get_template_by_name } from "../../template_manager/db/index.js";
11
12
  import { render_handlebars_string } from "../../template_manager/engine/index.js";
12
13
  import { getInboxConnection } from "../connection.js";
14
+ // Bridge inbox's HazoConnectAdapter to template_manager's HazoConnectInstance facade.
15
+ // template_manager only calls .query()/.list() on this; other facade methods are unused
16
+ // in this path. The HazoConnectInstance contract is preserved as an internal facade
17
+ // for template_manager (see template_manager/types.ts JSDoc).
18
+ function asTemplateManagerInstance(adapter) {
19
+ return {
20
+ query: () => new QueryBuilder(),
21
+ list: async (qb) => (await adapter.query(qb, "GET")),
22
+ findById: async () => { throw new Error("asTemplateManagerInstance: findById not implemented"); },
23
+ findBy: async () => { throw new Error("asTemplateManagerInstance: findBy not implemented"); },
24
+ insert: async () => { throw new Error("asTemplateManagerInstance: insert not implemented"); },
25
+ updateById: async () => { throw new Error("asTemplateManagerInstance: updateById not implemented"); },
26
+ deleteById: async () => { throw new Error("asTemplateManagerInstance: deleteById not implemented"); },
27
+ };
28
+ }
13
29
  /**
14
30
  * Render template bodies for a claimed delivery row.
15
31
  *
@@ -22,7 +38,7 @@ export async function renderForChannel(adapter, row) {
22
38
  const payload = row.payload;
23
39
  if (!payload.template_name)
24
40
  return {};
25
- const conn = getInboxConnection();
41
+ const conn = asTemplateManagerInstance(getInboxConnection());
26
42
  const scope_chain = row.scope_id ? [row.scope_id] : [];
27
43
  const result = await get_template_by_name(conn, scope_chain, payload.template_name);
28
44
  const template = result.data;
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAuB,EACvB,GAA2D;IAE3D,MAAM,OAAO,GAAG,GAAG,CAAC,OAGnB,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAI,MAA+C,CAAC,IAAI,CAAC;IACvE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE/E,MAAM,UAAU,GAAI,QAAgD,CAAC,MAAM,IAAI,EAAE,CAAC;IAClF,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAA4B,CAAC;IACtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAA8B,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAItD,sFAAsF;AACtF,wFAAwF;AACxF,oFAAoF;AACpF,8DAA8D;AAC9D,SAAS,yBAAyB,CAAC,OAA2B;IAC5D,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAyD;QACtF,IAAI,EAAE,KAAK,EAAK,EAAW,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAkB,EAAE,KAAK,CAAC,CAAQ;QACvF,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC;QAC7F,UAAU,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC,CAAC;QACrG,UAAU,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC,CAAC;KACtG,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAuB,EACvB,GAA2D;IAE3D,MAAM,OAAO,GAAG,GAAG,CAAC,OAGnB,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,yBAAyB,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAI,MAA+C,CAAC,IAAI,CAAC;IACvE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE/E,MAAM,UAAU,GAAI,QAAgD,CAAC,MAAM,IAAI,EAAE,CAAC;IAClF,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAA4B,CAAC;IACtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAA8B,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -108,6 +108,14 @@ export interface EmailTemplateUpdate {
108
108
  bodies?: Record<string, string>;
109
109
  is_modified?: boolean;
110
110
  }
111
+ /**
112
+ * Internal query-builder facade used by template_manager's repository layer.
113
+ * This is a narrow subset of hazo_connect's QueryBuilder, shaped for the
114
+ * CrudService-style API that template_manager repositories depend on.
115
+ *
116
+ * **Inbox subsystem** does NOT use this type. Inbox imports
117
+ * HazoConnectAdapter directly from hazo_connect/server (5.0+).
118
+ */
111
119
  export interface HazoConnectQueryBuilder {
112
120
  from(table: string): this;
113
121
  select(columns: string | string[]): this;
@@ -117,6 +125,22 @@ export interface HazoConnectQueryBuilder {
117
125
  limit(n: number): this;
118
126
  offset(n: number): this;
119
127
  }
128
+ /**
129
+ * Internal facade used by template_manager's repository layer. Provides
130
+ * a higher-level CRUD shape than hazo_connect's HazoConnectAdapter.
131
+ *
132
+ * **Inbox subsystem** does NOT use this type. Inbox imports
133
+ * HazoConnectAdapter directly from hazo_connect/server (5.0+).
134
+ *
135
+ * Consumers wiring the template_manager pass a small adapter object
136
+ * matching this shape (Hazodocs has one in lib/notifications/).
137
+ *
138
+ * Note: HazoConnectAdapter (hazo_connect/server) has a completely different
139
+ * method surface (rawQuery/getConfig/claimRows/query(builder, method?, body?))
140
+ * and cannot be substituted here without rewriting all template_manager
141
+ * repositories to use CrudService — that refactor is out of scope for
142
+ * the inbox-worker-fix plan.
143
+ */
120
144
  export interface HazoConnectInstance {
121
145
  list<T>(query: HazoConnectQueryBuilder): Promise<T[]>;
122
146
  findById<T>(table: string, id: string): Promise<T | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/template_manager/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/template_manager/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAMzD,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,0BAA0B,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,MAAM,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAMD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,0BAA0B,EAAE,CAAC;CACzC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,0BAA0B,EAAE,CAAC;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sDAAsD;IACtD,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,sDAAsD;IACtD,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACvD,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,KAAK,IAAI,uBAAuB,CAAC;IACjC,iDAAiD;IACjD,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACxD;AAMD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB,CAAC,CAAC,GAAG,OAAO;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,WAAW,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,YAAY,EAAE,MAAM,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hazo_notify",
3
- "version": "4.0.2",
3
+ "version": "5.0.0",
4
4
  "type": "module",
5
5
  "description": "Email notification system with scope-aware template management",
6
6
  "main": "./dist/lib/index.js",
@@ -118,10 +118,10 @@
118
118
  "tailwind-merge": "^3.5.0"
119
119
  },
120
120
  "peerDependencies": {
121
- "hazo_connect": "^2.6.0",
121
+ "hazo_connect": "^2.7.0",
122
+ "hazo_jobs": "^0.7.0",
122
123
  "hazo_logs": "^1.0.13",
123
- "hazo_ui": "^2.8.0",
124
- "hazo_jobs": "^0.7.0"
124
+ "hazo_ui": "^2.8.0"
125
125
  },
126
126
  "peerDependenciesMeta": {
127
127
  "hazo_connect": {
@@ -190,6 +190,7 @@
190
190
  "clsx": "^2.1.1",
191
191
  "cmdk": "^1.1.1",
192
192
  "hazo_auth": "^5.2.0",
193
+ "hazo_connect": "^2.7.0",
193
194
  "hazo_ui": "^2.8.0",
194
195
  "jest": "^30.2.0",
195
196
  "jest-environment-jsdom": "^30.4.1",