notiformer 1.0.7 → 1.0.9

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.
package/README.md CHANGED
@@ -19,21 +19,21 @@ npm install notiformer
19
19
  ## Quick start
20
20
 
21
21
  ```ts
22
- import { Notiformer } from 'notiformer';
22
+ import { Notiformer } from "notiformer";
23
23
 
24
24
  const n = new Notiformer({
25
- apiKey: 'ntf_live_...', // from app.notiformer.com/projects
25
+ apiKey: "ntf_live_...", // from app.notiformer.com/projects
26
26
  });
27
27
 
28
28
  await n.event({
29
- channel: 'payments', // groups related events — auto-created on first use
30
- event: 'payment_success', // machine-readable event name
31
- description: '$49.00 — john@example.com', // optional human-readable detail
32
- icon: '💳', // optional emoji shown in the feed and notification
33
- tags: { userId: 'usr_123', plan: 'pro' }, // optional key-value metadata
34
- value: '$49.00', // optional value highlighted in the feed
35
- notify: true, // true → push notification | false → silent log only
36
- recipients: ['you@company.com'], // optional — notify specific people only (see below)
29
+ channel: "payments", // groups related events — auto-created on first use
30
+ event: "payment_success", // machine-readable event name
31
+ description: "$49.00 — john@example.com", // optional human-readable detail
32
+ icon: "💳", // optional emoji shown in the feed and notification
33
+ tags: { userId: "usr_123", plan: "pro" }, // optional key-value metadata
34
+ value: "$49.00", // optional value highlighted in the feed
35
+ notify: true, // true → push notification | false → silent log only
36
+ recipients: ["you@company.com"], // optional — notify specific people only (see below)
37
37
  });
38
38
  ```
39
39
 
@@ -54,24 +54,24 @@ await n.event({
54
54
 
55
55
  ```ts
56
56
  await n.event({
57
- channel: 'payments', // required — string, lowercase, a-z 0-9 - _
58
- event: 'payment_success', // required — machine-readable event name
59
-
60
- description: '$49.00 — john@example.com', // optional
61
- icon: '💳', // optional — emoji
62
- tags: { plan: 'pro', userId: '123' }, // optional — displayed in the event feed
63
- value: '$49.00', // optional — highlighted value in the feed
64
- notify: true, // optional — default: true
65
- recipients: ['alice@company.com'], // optional — see "Targeting specific people"
57
+ channel: "payments", // required — string, lowercase, a-z 0-9 - _
58
+ event: "payment_success", // required — machine-readable event name
59
+
60
+ description: "$49.00 — john@example.com", // optional
61
+ icon: "💳", // optional — emoji
62
+ tags: { plan: "pro", userId: "123" }, // optional — displayed in the event feed
63
+ value: "$49.00", // optional — highlighted value in the feed
64
+ notify: true, // optional — default: true
65
+ recipients: ["alice@company.com"], // optional — see "Targeting specific people"
66
66
  });
67
67
  ```
68
68
 
69
69
  ### `notify`
70
70
 
71
- | Value | Behaviour |
72
- |---|---|
73
- | `true` (default) | Sends push notification to subscribed members |
74
- | `false` | Stores the event silently for analytics — no notification sent |
71
+ | Value | Behaviour |
72
+ | ---------------- | -------------------------------------------------------------- |
73
+ | `true` (default) | Sends push notification to subscribed members |
74
+ | `false` | Stores the event silently for analytics — no notification sent |
75
75
 
76
76
  ### Return value
77
77
 
@@ -93,27 +93,28 @@ You can override this and target specific people by email:
93
93
 
94
94
  ```ts
95
95
  await n.event({
96
- channel: 'payments',
97
- event: 'large_order',
98
- description: '$2,400 — enterprise@client.com',
99
- notify: true,
100
- recipients: ['cto@company.com', 'billing@company.com'], // only these two are notified
96
+ channel: "payments",
97
+ event: "large_order",
98
+ description: "$2,400 — enterprise@client.com",
99
+ notify: true,
100
+ recipients: ["cto@company.com", "billing@company.com"], // only these two are notified
101
101
  });
102
102
  ```
103
103
 
104
104
  **How it works:**
105
+
105
106
  - If a recipient has a Notiformer account linked to that email and has installed the app, they receive a **push notification**
106
107
  - Email notifications are **coming soon** — recipients will receive emails once this feature launches
107
108
  - If you don't specify `recipients`, all project members subscribed to the channel are notified
108
109
 
109
110
  **Plan limits for `recipients`:**
110
111
 
111
- | Plan | Max recipients per event |
112
- |---|---|
113
- | Free | 1 |
114
- | Starter | 3 |
115
- | Pro | 10 |
116
- | Business | 30 |
112
+ | Plan | Max recipients per event |
113
+ | -------- | ------------------------ |
114
+ | Free | 1 |
115
+ | Starter | 3 |
116
+ | Pro | 10 |
117
+ | Business | 30 |
117
118
 
118
119
  > Members are managed from the project dashboard at [app.notiformer.com](https://app.notiformer.com/projects).
119
120
 
@@ -124,7 +125,7 @@ await n.event({
124
125
  Toggle features in your code remotely from the Notiformer dashboard — no redeploy needed.
125
126
 
126
127
  ```ts
127
- const isEnabled = await n.gate('new-checkout-flow');
128
+ const isEnabled = await n.gate("new-checkout-flow");
128
129
 
129
130
  if (isEnabled) {
130
131
  // new behaviour
@@ -138,24 +139,24 @@ Gates are **cached locally for 30 seconds** by default to avoid hammering the AP
138
139
  ### Options
139
140
 
140
141
  ```ts
141
- const isEnabled = await n.gate('my-gate', {
142
- fallback: false, // optional — returned if the gate can't be fetched (default: false)
143
- cacheTtl: 60, // optional — cache duration in seconds (default: 30)
142
+ const isEnabled = await n.gate("my-gate", {
143
+ fallback: false, // optional — returned if the gate can't be fetched (default: false)
144
+ cacheTtl: 60, // optional — cache duration in seconds (default: 30)
144
145
  });
145
146
  ```
146
147
 
147
148
  ### Full gate result
148
149
 
149
150
  ```ts
150
- const result = await n.gateDetails('my-gate');
151
+ const result = await n.gateDetails("my-gate");
151
152
  // { key: 'my-gate', enabled: true, cached: false, fetchedAt: '2025-...' }
152
153
  ```
153
154
 
154
155
  ### Clear the cache
155
156
 
156
157
  ```ts
157
- n.clearGateCache('my-gate'); // clear a specific gate
158
- n.clearGateCache(); // clear all gates
158
+ n.clearGateCache("my-gate"); // clear a specific gate
159
+ n.clearGateCache(); // clear all gates
159
160
  ```
160
161
 
161
162
  ---
@@ -164,10 +165,11 @@ n.clearGateCache(); // clear all gates
164
165
 
165
166
  ```ts
166
167
  const n = new Notiformer({
167
- apiKey: 'ntf_live_...', // required — from app.notiformer.com/projects
168
- silent: false, // optional — true = no API calls (great for local dev)
169
- throwOnError: false, // optional — true = throws instead of returning null
170
- onError: (err) => { // optional — called when any call fails
168
+ apiKey: "ntf_live_...", // required — from app.notiformer.com/projects
169
+ silent: false, // optional — true = no API calls (great for local dev)
170
+ throwOnError: false, // optional — true = throws instead of returning null
171
+ onError: (err) => {
172
+ // optional — called when any call fails
171
173
  Sentry.captureException(err);
172
174
  },
173
175
  });
@@ -178,7 +180,7 @@ const n = new Notiformer({
178
180
  ```ts
179
181
  const n = new Notiformer({
180
182
  apiKey: process.env.NOTIFORMER_API_KEY!,
181
- silent: process.env.NODE_ENV !== 'production', // no calls in dev/test
183
+ silent: process.env.NODE_ENV !== "production", // no calls in dev/test
182
184
  });
183
185
  ```
184
186
 
@@ -186,13 +188,13 @@ const n = new Notiformer({
186
188
 
187
189
  ## Rate limits & quotas
188
190
 
189
- | Limit | Value |
190
- |---|---|
191
- | Events per minute (per project) | 60 |
192
- | Events per month (Free plan) | 500 |
193
- | Events per month (Starter) | 20,000 |
194
- | Events per month (Pro) | 75,000 |
195
- | Events per month (Business) | 300,000 |
191
+ | Limit | Value |
192
+ | ------------------------------- | ------- |
193
+ | Events per minute (per project) | 60 |
194
+ | Events per month (Free plan) | 100 |
195
+ | Events per month (Starter) | 5,000 |
196
+ | Events per month (Pro) | 75,000 |
197
+ | Events per month (Business) | 300,000 |
196
198
 
197
199
  If you exceed **60 events/minute**: the event is stored and visible in your feed, but no notification is sent. The API response includes `rateLimited: true`.
198
200
 
@@ -206,12 +208,12 @@ If you exceed your **monthly quota**: the event is rejected with HTTP 429. Upgra
206
208
 
207
209
  ```ts
208
210
  await n.event({
209
- channel: 'payments',
210
- event: 'payment_success',
211
+ channel: "payments",
212
+ event: "payment_success",
211
213
  description: `${amount} — ${user.email}`,
212
- icon: '💳',
213
- value: amount,
214
- notify: true,
214
+ icon: "💳",
215
+ value: amount,
216
+ notify: true,
215
217
  });
216
218
  ```
217
219
 
@@ -221,14 +223,14 @@ await n.event({
221
223
  // Express error middleware
222
224
  app.use(async (err, req, res, next) => {
223
225
  await n.event({
224
- channel: 'errors',
225
- event: 'unhandled_error',
226
+ channel: "errors",
227
+ event: "unhandled_error",
226
228
  description: err.message,
227
- icon: '🔴',
228
- tags: { path: req.path, method: req.method },
229
- notify: true,
229
+ icon: "🔴",
230
+ tags: { path: req.path, method: req.method },
231
+ notify: true,
230
232
  });
231
- res.status(500).json({ error: 'Internal server error' });
233
+ res.status(500).json({ error: "Internal server error" });
232
234
  });
233
235
  ```
234
236
 
@@ -236,10 +238,10 @@ app.use(async (err, req, res, next) => {
236
238
 
237
239
  ```ts
238
240
  await n.event({
239
- channel: 'analytics',
240
- event: 'page_view',
241
- tags: { path: req.path, userId: session.userId },
242
- notify: false, // stored in feed, no push notification sent
241
+ channel: "analytics",
242
+ event: "page_view",
243
+ tags: { path: req.path, userId: session.userId },
244
+ notify: false, // stored in feed, no push notification sent
243
245
  });
244
246
  ```
245
247
 
@@ -248,7 +250,7 @@ await n.event({
248
250
  ```ts
249
251
  // Next.js API route
250
252
  export async function POST(req: Request) {
251
- const useNewFlow = await n.gate('new-checkout-flow');
253
+ const useNewFlow = await n.gate("new-checkout-flow");
252
254
 
253
255
  if (useNewFlow) {
254
256
  return newCheckoutHandler(req);
@@ -262,13 +264,13 @@ export async function POST(req: Request) {
262
264
  ```ts
263
265
  // Only notify the CTO for large orders
264
266
  await n.event({
265
- channel: 'sales',
266
- event: 'enterprise_signup',
267
+ channel: "sales",
268
+ event: "enterprise_signup",
267
269
  description: `${company} — ${mrr}/mo`,
268
- icon: '🏢',
269
- value: mrr,
270
- notify: true,
271
- recipients: ['cto@yourcompany.com'], // only they get the push
270
+ icon: "🏢",
271
+ value: mrr,
272
+ notify: true,
273
+ recipients: ["cto@yourcompany.com"], // only they get the push
272
274
  });
273
275
  ```
274
276
 
@@ -329,10 +331,11 @@ Content-Type: application/json
329
331
  ```
330
332
 
331
333
  Response:
334
+
332
335
  ```json
333
336
  {
334
- "id": "evt_abc123",
335
- "createdAt": "2025-01-15T10:30:00.000Z",
337
+ "id": "evt_abc123",
338
+ "createdAt": "2025-01-15T10:30:00.000Z",
336
339
  "rateLimited": false
337
340
  }
338
341
  ```
package/dist/index.d.ts CHANGED
@@ -19,8 +19,8 @@
19
19
  * recipients: ['admin@company.com', 'billing@company.com'],
20
20
  * });
21
21
  */
22
- import type { NotiformerConfig, EventPayload, EventResponse, GateOptions, GateResult } from "./types";
23
- export type { NotiformerConfig, EventPayload, EventResponse, GateOptions, GateResult, };
22
+ import type { NotiformerConfig, EventPayload, EventResponse, GateOptions, GateResult, AskPayload, AskResult } from "./types";
23
+ export type { NotiformerConfig, EventPayload, EventResponse, GateOptions, GateResult, AskPayload, AskResult, };
24
24
  export declare class Notiformer {
25
25
  private readonly apiKey;
26
26
  private readonly baseUrl;
@@ -51,6 +51,26 @@ export declare class Notiformer {
51
51
  gate(key: string, options?: GateOptions): Promise<boolean>;
52
52
  gateDetails(key: string, options?: GateOptions): Promise<GateResult>;
53
53
  clearGateCache(key?: string): void;
54
+ /**
55
+ * Pause execution and wait for a human to approve or deny from the Notiformer app.
56
+ *
57
+ * Your agent stops here. A push notification is sent to your phone with
58
+ * Approve and Deny buttons. The method resolves when you respond,
59
+ * or when the timeout expires.
60
+ *
61
+ * Never throws by default — returns { approved: false, timedOut: false } on error.
62
+ *
63
+ * @example
64
+ * const { approved } = await n.ask({
65
+ * message: `Send campaign to ${count} users?`,
66
+ * timeout: 300,
67
+ * });
68
+ * if (approved) await sendEmails();
69
+ */
70
+ ask(payload: AskPayload): Promise<AskResult>;
71
+ private pollAsk;
72
+ private sleep;
73
+ private failAsk;
54
74
  private post;
55
75
  private get;
56
76
  private request;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACX,MAAM,SAAS,CAAC;AAIjB,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,GACX,CAAC;AAOF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;gBAE5B,MAAM,EAAE,gBAAgB;IAoCpC;;;;;;;;;OASG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAiDjE;;;;OAIG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB9D,WAAW,CACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAKtB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;YAIpB,IAAI;YAIJ,GAAG;YAIH,OAAO;IAmBrB,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,oBAAoB;CAmB7B;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACV,MAAM,SAAS,CAAC;AAIjB,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,GACV,CAAC;AAOF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;gBAE5B,MAAM,EAAE,gBAAgB;IAoCpC;;;;;;;;;OASG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAiDjE;;;;OAIG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB9D,WAAW,CACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IAKtB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlC;;;;;;;;;;;;;;;OAeG;IACG,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;YA+CpC,OAAO;IAiDrB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,OAAO;YAOD,IAAI;YAIJ,GAAG;YAIH,OAAO;IAmBrB,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,oBAAoB;CAmB7B;AAED,eAAe,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -147,6 +147,102 @@ class Notiformer {
147
147
  clearGateCache(key) {
148
148
  key ? this.gateCache.delete(key) : this.gateCache.clear();
149
149
  }
150
+ /**
151
+ * Pause execution and wait for a human to approve or deny from the Notiformer app.
152
+ *
153
+ * Your agent stops here. A push notification is sent to your phone with
154
+ * Approve and Deny buttons. The method resolves when you respond,
155
+ * or when the timeout expires.
156
+ *
157
+ * Never throws by default — returns { approved: false, timedOut: false } on error.
158
+ *
159
+ * @example
160
+ * const { approved } = await n.ask({
161
+ * message: `Send campaign to ${count} users?`,
162
+ * timeout: 300,
163
+ * });
164
+ * if (approved) await sendEmails();
165
+ */
166
+ async ask(payload) {
167
+ var _a, _b, _c;
168
+ if (!payload.message)
169
+ throw new Error("[notiformer] ask.message is required.");
170
+ if (this.isPlaceholder) {
171
+ console.warn('[notiformer] ask() not sent — using example key "ntf_live_test".\n' +
172
+ "→ Replace it with your real key from https://app.notiformer.com/projects");
173
+ return { approved: false, timedOut: false, respondedAt: null };
174
+ }
175
+ if (this.silent)
176
+ return { approved: false, timedOut: false, respondedAt: null };
177
+ const body = {
178
+ message: payload.message,
179
+ timeout: (_a = payload.timeout) !== null && _a !== void 0 ? _a : 300,
180
+ fallback: (_b = payload.fallback) !== null && _b !== void 0 ? _b : "deny",
181
+ };
182
+ if (payload.context !== undefined)
183
+ body.context = payload.context;
184
+ let createRes;
185
+ try {
186
+ createRes = await this.post("/v1/ask", body);
187
+ }
188
+ catch (err) {
189
+ return this.failAsk(this.friendlyNetworkError(err));
190
+ }
191
+ if (!createRes.ok) {
192
+ const data = await createRes
193
+ .json()
194
+ .catch(() => ({ error: `HTTP ${createRes.status}` }));
195
+ return this.failAsk(new Error(`[notiformer] ${(_c = data.error) !== null && _c !== void 0 ? _c : createRes.statusText}`));
196
+ }
197
+ const created = (await createRes.json());
198
+ return this.pollAsk(created.id, new Date(created.expiresAt).getTime());
199
+ }
200
+ async pollAsk(askId, expiresAtMs) {
201
+ var _a, _b;
202
+ const POLL_INTERVAL_MS = 2000;
203
+ while (true) {
204
+ await this.sleep(POLL_INTERVAL_MS);
205
+ if (Date.now() >= expiresAtMs) {
206
+ return { approved: false, timedOut: true, respondedAt: null };
207
+ }
208
+ try {
209
+ const res = await this.get(`/v1/ask/${encodeURIComponent(askId)}`);
210
+ if (!res.ok) {
211
+ if (res.status >= 400 && res.status < 500) {
212
+ const data = await res
213
+ .json()
214
+ .catch(() => ({ error: `HTTP ${res.status}` }));
215
+ return this.failAsk(new Error(`[notiformer] ${(_a = data.error) !== null && _a !== void 0 ? _a : res.statusText}`));
216
+ }
217
+ // 5xx — server error, retry on next interval
218
+ continue;
219
+ }
220
+ const data = (await res.json());
221
+ if (data.status === "pending")
222
+ continue;
223
+ return {
224
+ approved: data.status === "approved",
225
+ timedOut: data.status === "timed_out",
226
+ respondedAt: (_b = data.respondedAt) !== null && _b !== void 0 ? _b : null,
227
+ };
228
+ }
229
+ catch (_c) {
230
+ // Network error during a single poll — retry until expiry
231
+ continue;
232
+ }
233
+ }
234
+ }
235
+ sleep(ms) {
236
+ return new Promise((resolve) => setTimeout(resolve, ms));
237
+ }
238
+ failAsk(error) {
239
+ var _a;
240
+ this.logger.error(error.message);
241
+ (_a = this.onError) === null || _a === void 0 ? void 0 : _a.call(this, error);
242
+ if (this.throwOnError)
243
+ throw error;
244
+ return { approved: false, timedOut: false, respondedAt: null };
245
+ }
150
246
  async post(path, body) {
151
247
  return this.request(path, { method: "POST", body: JSON.stringify(body) });
152
248
  }
@@ -164,7 +260,7 @@ class Notiformer {
164
260
  headers: {
165
261
  "Content-Type": "application/json",
166
262
  Authorization: `Bearer ${this.apiKey}`,
167
- "X-SDK-Version": "1.0.7",
263
+ "X-SDK-Version": "1.0.9",
168
264
  ...((_a = init.headers) !== null && _a !== void 0 ? _a : {}),
169
265
  },
170
266
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -50,5 +50,30 @@ export interface GateResult {
50
50
  cached: boolean;
51
51
  fetchedAt: string;
52
52
  }
53
+ export interface AskPayload {
54
+ /** The question shown in the push notification title. */
55
+ message: string;
56
+ /** Optional extra detail shown in the notification body. */
57
+ context?: string;
58
+ /**
59
+ * Seconds to wait for a response before applying the fallback.
60
+ * Default: 300 (5 min). Maximum depends on your plan:
61
+ * Starter=300s, Pro=900s, Business=3600s.
62
+ */
63
+ timeout?: number;
64
+ /**
65
+ * What to return if nobody responds before the timeout.
66
+ * Default: 'deny' (safe — approved will be false).
67
+ */
68
+ fallback?: "deny" | "approve";
69
+ }
70
+ export interface AskResult {
71
+ /** true if the user tapped Approve, false if they tapped Deny or it timed out. */
72
+ approved: boolean;
73
+ /** true if nobody responded before the timeout expired. */
74
+ timedOut: boolean;
75
+ /** ISO timestamp of when the user responded. null if timed out. */
76
+ respondedAt: string | null;
77
+ }
53
78
  export type LogLevel = "debug" | "info" | "warn" | "error" | "none" | "silent";
54
79
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,kFAAkF;IAClF,QAAQ,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "notiformer",
3
- "version": "1.0.7",
4
- "description": "Real-time alerts, notifications and feature gates for your backend code",
3
+ "version": "1.0.9",
4
+ "description": "Human-in-the-loop approval gates and real-time push notifications for AI agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
@@ -13,13 +13,17 @@
13
13
  "prepublishOnly": "npm run build"
14
14
  },
15
15
  "keywords": [
16
+ "human-in-the-loop",
17
+ "ai-agent",
18
+ "ai-agent-approval",
19
+ "approval-gate",
16
20
  "notifications",
17
21
  "alerts",
18
22
  "monitoring",
19
23
  "feature-flags",
20
24
  "feature-gates",
21
25
  "events",
22
- "saas",
26
+ "push-notifications",
23
27
  "developer-tools"
24
28
  ],
25
29
  "author": "Notiformer",