@rei-standard/amsg-server 2.6.0-next.13 → 2.6.0-next.15

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 (35) hide show
  1. package/dist/adapters/d1.d.ts +106 -0
  2. package/dist/adapters/interface.d.ts +50 -0
  3. package/dist/adapters/neon.d.ts +10 -58
  4. package/dist/adapters/pg-shared.d.ts +114 -0
  5. package/dist/adapters/pg.d.ts +10 -58
  6. package/dist/adapters/schema.d.ts +1 -1
  7. package/dist/adapters/schema.sqlite.d.ts +3 -1
  8. package/dist/{chunk-B2FDV7YK.mjs → chunk-34I2YSWE.mjs} +10 -0
  9. package/dist/{chunk-TV7N3RTH.mjs → chunk-D3DQF647.mjs} +1086 -348
  10. package/dist/{chunk-V2SDWGUB.cjs → chunk-OUPM4HAV.cjs} +10 -0
  11. package/dist/{chunk-5IOYCCFD.cjs → chunk-TCKPLM3P.cjs} +1086 -348
  12. package/dist/chunk-TFFBMYA2.cjs +95 -0
  13. package/dist/chunk-UYROU4L3.mjs +95 -0
  14. package/dist/cloudflare/single-user-worker.d.ts +2 -0
  15. package/dist/cloudflare.cjs +3 -2
  16. package/dist/cloudflare.mjs +2 -1
  17. package/dist/handlers/outbox.d.ts +7 -0
  18. package/dist/index.cjs +64 -36
  19. package/dist/index.d.cts +4 -2
  20. package/dist/index.d.ts +4 -2
  21. package/dist/index.mjs +45 -17
  22. package/dist/lib/client-state-store.d.ts +18 -3
  23. package/dist/lib/errors.d.ts +50 -0
  24. package/dist/lib/message-processor.d.ts +8 -2
  25. package/dist/lib/outbox-store.d.ts +33 -0
  26. package/dist/lib/push-subscription-store.d.ts +10 -2
  27. package/dist/lib/request.d.ts +36 -0
  28. package/dist/lib/run-tick.d.ts +28 -0
  29. package/dist/lib/validation.d.ts +1 -7
  30. package/dist/{neon-CUIGAB2T.mjs → neon-XLWK27RL.mjs} +29 -104
  31. package/dist/{neon-3ASBLLCM.cjs → neon-ZWA2U7IZ.cjs} +37 -112
  32. package/dist/{pg-IEZTAR43.cjs → pg-Q4VU6D75.cjs} +35 -112
  33. package/dist/{pg-KMJPL6QV.mjs → pg-X63HFEV7.mjs} +27 -104
  34. package/dist/single-user.d.ts +4 -0
  35. package/package.json +2 -2
@@ -0,0 +1,95 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/server/adapters/pg-shared.js
2
+ async function claimTask(query, taskId, expectedNextSendAt, leaseUntil, serializeGroup = null) {
3
+ const grouped = typeof serializeGroup === "string" && serializeGroup.length > 0;
4
+ const params = [leaseUntil, taskId, expectedNextSendAt];
5
+ let setClause = "lease_until = $1, updated_at = NOW()";
6
+ let groupGuard = "";
7
+ if (grouped) {
8
+ params.push(serializeGroup);
9
+ setClause = "lease_until = $1, serialize_group = $4, updated_at = NOW()";
10
+ groupGuard = `
11
+ AND NOT EXISTS (
12
+ SELECT 1 FROM scheduled_messages busy
13
+ WHERE busy.serialize_group = $4 AND busy.id <> $2
14
+ AND busy.status = 'pending' AND busy.lease_until > NOW()
15
+ )`;
16
+ }
17
+ const rows = await query(
18
+ `UPDATE scheduled_messages
19
+ SET ${setClause}
20
+ WHERE id = $2 AND status = 'pending'
21
+ AND date_trunc('milliseconds', next_send_at)
22
+ = date_trunc('milliseconds', $3::timestamptz)
23
+ AND (lease_until IS NULL OR lease_until <= NOW())${groupGuard}
24
+ RETURNING id`,
25
+ params
26
+ );
27
+ if (rows.length === 0) return false;
28
+ if (!grouped) return true;
29
+ const conflict = await query(
30
+ `SELECT 1 FROM scheduled_messages busy
31
+ WHERE busy.serialize_group = $1 AND busy.id <> $2
32
+ AND busy.status = 'pending' AND busy.lease_until > NOW()
33
+ LIMIT 1`,
34
+ [serializeGroup, taskId]
35
+ );
36
+ if (conflict.length === 0) return true;
37
+ await query(
38
+ "UPDATE scheduled_messages SET lease_until = NULL, updated_at = NOW() WHERE id = $1",
39
+ [taskId]
40
+ );
41
+ return false;
42
+ }
43
+ async function renewTaskLease(query, taskId, leaseUntil) {
44
+ const rows = await query(
45
+ `UPDATE scheduled_messages SET lease_until = $1
46
+ WHERE id = $2 AND status = 'pending' AND lease_until IS NOT NULL
47
+ RETURNING id`,
48
+ [leaseUntil, taskId]
49
+ );
50
+ return rows.length > 0;
51
+ }
52
+ async function getTaskStatusInfo(query, uuid, userId) {
53
+ const rows = await query(
54
+ "SELECT status, last_error FROM scheduled_messages WHERE uuid = $1 AND user_id = $2 LIMIT 1",
55
+ [uuid, userId]
56
+ );
57
+ if (rows.length === 0) return null;
58
+ return { status: rows[0].status, last_error: _nullishCoalesce(rows[0].last_error, () => ( null)) };
59
+ }
60
+ async function getPushSubscription(query, userId) {
61
+ const rows = await query(
62
+ "SELECT subscription, updated_at FROM push_subscriptions WHERE user_id = $1 LIMIT 1",
63
+ [userId]
64
+ );
65
+ if (rows.length === 0) return null;
66
+ return { subscription: rows[0].subscription, updated_at: Number(rows[0].updated_at) };
67
+ }
68
+ async function upsertPushSubscription(query, userId, encryptedSubscription, updatedAt) {
69
+ const rows = await query(
70
+ `INSERT INTO push_subscriptions (user_id, subscription, updated_at)
71
+ VALUES ($1, $2, $3)
72
+ ON CONFLICT (user_id) DO UPDATE SET
73
+ subscription = EXCLUDED.subscription,
74
+ updated_at = EXCLUDED.updated_at
75
+ RETURNING user_id`,
76
+ [userId, encryptedSubscription, updatedAt]
77
+ );
78
+ return rows.length > 0;
79
+ }
80
+ async function deletePushSubscription(query, userId) {
81
+ const rows = await query(
82
+ "DELETE FROM push_subscriptions WHERE user_id = $1 RETURNING user_id",
83
+ [userId]
84
+ );
85
+ return rows.length > 0;
86
+ }
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+ exports.claimTask = claimTask; exports.renewTaskLease = renewTaskLease; exports.getTaskStatusInfo = getTaskStatusInfo; exports.getPushSubscription = getPushSubscription; exports.upsertPushSubscription = upsertPushSubscription; exports.deletePushSubscription = deletePushSubscription;
@@ -0,0 +1,95 @@
1
+ // src/server/adapters/pg-shared.js
2
+ async function claimTask(query, taskId, expectedNextSendAt, leaseUntil, serializeGroup = null) {
3
+ const grouped = typeof serializeGroup === "string" && serializeGroup.length > 0;
4
+ const params = [leaseUntil, taskId, expectedNextSendAt];
5
+ let setClause = "lease_until = $1, updated_at = NOW()";
6
+ let groupGuard = "";
7
+ if (grouped) {
8
+ params.push(serializeGroup);
9
+ setClause = "lease_until = $1, serialize_group = $4, updated_at = NOW()";
10
+ groupGuard = `
11
+ AND NOT EXISTS (
12
+ SELECT 1 FROM scheduled_messages busy
13
+ WHERE busy.serialize_group = $4 AND busy.id <> $2
14
+ AND busy.status = 'pending' AND busy.lease_until > NOW()
15
+ )`;
16
+ }
17
+ const rows = await query(
18
+ `UPDATE scheduled_messages
19
+ SET ${setClause}
20
+ WHERE id = $2 AND status = 'pending'
21
+ AND date_trunc('milliseconds', next_send_at)
22
+ = date_trunc('milliseconds', $3::timestamptz)
23
+ AND (lease_until IS NULL OR lease_until <= NOW())${groupGuard}
24
+ RETURNING id`,
25
+ params
26
+ );
27
+ if (rows.length === 0) return false;
28
+ if (!grouped) return true;
29
+ const conflict = await query(
30
+ `SELECT 1 FROM scheduled_messages busy
31
+ WHERE busy.serialize_group = $1 AND busy.id <> $2
32
+ AND busy.status = 'pending' AND busy.lease_until > NOW()
33
+ LIMIT 1`,
34
+ [serializeGroup, taskId]
35
+ );
36
+ if (conflict.length === 0) return true;
37
+ await query(
38
+ "UPDATE scheduled_messages SET lease_until = NULL, updated_at = NOW() WHERE id = $1",
39
+ [taskId]
40
+ );
41
+ return false;
42
+ }
43
+ async function renewTaskLease(query, taskId, leaseUntil) {
44
+ const rows = await query(
45
+ `UPDATE scheduled_messages SET lease_until = $1
46
+ WHERE id = $2 AND status = 'pending' AND lease_until IS NOT NULL
47
+ RETURNING id`,
48
+ [leaseUntil, taskId]
49
+ );
50
+ return rows.length > 0;
51
+ }
52
+ async function getTaskStatusInfo(query, uuid, userId) {
53
+ const rows = await query(
54
+ "SELECT status, last_error FROM scheduled_messages WHERE uuid = $1 AND user_id = $2 LIMIT 1",
55
+ [uuid, userId]
56
+ );
57
+ if (rows.length === 0) return null;
58
+ return { status: rows[0].status, last_error: rows[0].last_error ?? null };
59
+ }
60
+ async function getPushSubscription(query, userId) {
61
+ const rows = await query(
62
+ "SELECT subscription, updated_at FROM push_subscriptions WHERE user_id = $1 LIMIT 1",
63
+ [userId]
64
+ );
65
+ if (rows.length === 0) return null;
66
+ return { subscription: rows[0].subscription, updated_at: Number(rows[0].updated_at) };
67
+ }
68
+ async function upsertPushSubscription(query, userId, encryptedSubscription, updatedAt) {
69
+ const rows = await query(
70
+ `INSERT INTO push_subscriptions (user_id, subscription, updated_at)
71
+ VALUES ($1, $2, $3)
72
+ ON CONFLICT (user_id) DO UPDATE SET
73
+ subscription = EXCLUDED.subscription,
74
+ updated_at = EXCLUDED.updated_at
75
+ RETURNING user_id`,
76
+ [userId, encryptedSubscription, updatedAt]
77
+ );
78
+ return rows.length > 0;
79
+ }
80
+ async function deletePushSubscription(query, userId) {
81
+ const rows = await query(
82
+ "DELETE FROM push_subscriptions WHERE user_id = $1 RETURNING user_id",
83
+ [userId]
84
+ );
85
+ return rows.length > 0;
86
+ }
87
+
88
+ export {
89
+ claimTask,
90
+ renewTaskLease,
91
+ getTaskStatusInfo,
92
+ getPushSubscription,
93
+ upsertPushSubscription,
94
+ deletePushSubscription
95
+ };
@@ -2,3 +2,5 @@ export function createSingleUserCloudflareWorker(buildConfig: any): {
2
2
  fetch: (request: any, env: any) => Promise<Response>;
3
3
  scheduled: (event: any, env: any) => Promise<void>;
4
4
  };
5
+ export const CORS_ALLOW_HEADERS: "Content-Type, X-User-Id, X-Payload-Encrypted, X-Encryption-Version, X-Response-Encrypted, X-Client-Token";
6
+ export const CORS_ALLOW_METHODS: "GET, POST, PUT, DELETE, OPTIONS";
@@ -17,7 +17,8 @@
17
17
 
18
18
 
19
19
 
20
- var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
20
+ var _chunkTCKPLM3Pcjs = require('./chunk-TCKPLM3P.cjs');
21
+ require('./chunk-OUPM4HAV.cjs');
21
22
 
22
23
 
23
24
 
@@ -37,4 +38,4 @@ var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
37
38
 
38
39
 
39
40
 
40
- exports.MAX_PUSH_PAYLOAD_BYTES = _chunk5IOYCCFDcjs.MAX_PUSH_PAYLOAD_BYTES; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunk5IOYCCFDcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunk5IOYCCFDcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunk5IOYCCFDcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunk5IOYCCFDcjs.advanceOccurrence; exports.createD1Adapter = _chunk5IOYCCFDcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunk5IOYCCFDcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunk5IOYCCFDcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunk5IOYCCFDcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunk5IOYCCFDcjs.decryptFromStorage; exports.decryptPayload = _chunk5IOYCCFDcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunk5IOYCCFDcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunk5IOYCCFDcjs.encryptForStorage; exports.isValidTimeZoneId = _chunk5IOYCCFDcjs.isValidTimeZoneId; exports.measurePushPayload = _chunk5IOYCCFDcjs.measurePushPayload; exports.nextFutureOccurrence = _chunk5IOYCCFDcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunk5IOYCCFDcjs.planNextOccurrence; exports.runScheduledTick = _chunk5IOYCCFDcjs.runScheduledTick;
41
+ exports.MAX_PUSH_PAYLOAD_BYTES = _chunkTCKPLM3Pcjs.MAX_PUSH_PAYLOAD_BYTES; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkTCKPLM3Pcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkTCKPLM3Pcjs.advanceOccurrence; exports.createD1Adapter = _chunkTCKPLM3Pcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkTCKPLM3Pcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkTCKPLM3Pcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkTCKPLM3Pcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkTCKPLM3Pcjs.decryptFromStorage; exports.decryptPayload = _chunkTCKPLM3Pcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkTCKPLM3Pcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkTCKPLM3Pcjs.encryptForStorage; exports.isValidTimeZoneId = _chunkTCKPLM3Pcjs.isValidTimeZoneId; exports.measurePushPayload = _chunkTCKPLM3Pcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkTCKPLM3Pcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkTCKPLM3Pcjs.planNextOccurrence; exports.runScheduledTick = _chunkTCKPLM3Pcjs.runScheduledTick;
@@ -17,7 +17,8 @@ import {
17
17
  nextFutureOccurrence,
18
18
  planNextOccurrence,
19
19
  runScheduledTick
20
- } from "./chunk-TV7N3RTH.mjs";
20
+ } from "./chunk-D3DQF647.mjs";
21
+ import "./chunk-34I2YSWE.mjs";
21
22
  export {
22
23
  MAX_PUSH_PAYLOAD_BYTES,
23
24
  PUSH_ENVELOPE_RESERVED_BYTES,
@@ -0,0 +1,7 @@
1
+ export function createOutboxHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ POST: (headers: any, body: any) => Promise<any>;
4
+ };
5
+ export const MAX_OUTBOX_PAGE_SIZE: 100;
6
+ export const DEFAULT_OUTBOX_PAGE_SIZE: 50;
7
+ export const MAX_OUTBOX_ACK_IDS: 200;
package/dist/index.cjs CHANGED
@@ -39,7 +39,21 @@
39
39
 
40
40
 
41
41
 
42
- var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ var _chunkTCKPLM3Pcjs = require('./chunk-TCKPLM3P.cjs');
56
+ require('./chunk-OUPM4HAV.cjs');
43
57
 
44
58
  // src/server/adapters/factory.js
45
59
  async function createAdapter(config) {
@@ -55,11 +69,11 @@ async function createAdapter(config) {
55
69
  }
56
70
  switch (config.driver) {
57
71
  case "neon": {
58
- const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-3ASBLLCM.cjs")));
72
+ const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-ZWA2U7IZ.cjs")));
59
73
  return new NeonAdapter(config.connectionString);
60
74
  }
61
75
  case "pg": {
62
- const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-IEZTAR43.cjs")));
76
+ const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-Q4VU6D75.cjs")));
63
77
  return new PgAdapter(config.connectionString);
64
78
  }
65
79
  default:
@@ -72,7 +86,7 @@ async function createAdapter(config) {
72
86
  // src/server/handlers/init-tenant.js
73
87
  function createInitTenantHandler(ctx) {
74
88
  async function POST(headers, body) {
75
- const initSecret = _chunk5IOYCCFDcjs.getHeader.call(void 0, headers, "x-init-secret");
89
+ const initSecret = _chunkTCKPLM3Pcjs.getHeader.call(void 0, headers, "x-init-secret");
76
90
  if (ctx.tenant.initSecret && initSecret !== ctx.tenant.initSecret) {
77
91
  return {
78
92
  status: 401,
@@ -85,7 +99,7 @@ function createInitTenantHandler(ctx) {
85
99
  }
86
100
  };
87
101
  }
88
- const parsed = _chunk5IOYCCFDcjs.parseJsonBody.call(void 0, body);
102
+ const parsed = _chunkTCKPLM3Pcjs.parseJsonBody.call(void 0, body);
89
103
  if (!parsed.ok) {
90
104
  return {
91
105
  status: 400,
@@ -99,7 +113,7 @@ function createInitTenantHandler(ctx) {
99
113
  const tenantId = payload.tenantId || void 0;
100
114
  const driver = payload.driver;
101
115
  const databaseUrl = payload.databaseUrl || payload.connectionString;
102
- if (tenantId && !_chunk5IOYCCFDcjs.isValidUUIDv4.call(void 0, tenantId)) {
116
+ if (tenantId && !_chunkTCKPLM3Pcjs.isValidUUIDv4.call(void 0, tenantId)) {
103
117
  return {
104
118
  status: 400,
105
119
  body: {
@@ -219,7 +233,7 @@ function createSendNotificationsHandler(ctx) {
219
233
  }
220
234
  };
221
235
  }
222
- const data = await _chunk5IOYCCFDcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
236
+ const data = await _chunkTCKPLM3Pcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
223
237
  return { status: 200, body: { success: true, data } };
224
238
  }
225
239
  return { POST };
@@ -228,14 +242,6 @@ function createSendNotificationsHandler(ctx) {
228
242
  // src/server/tenant/blob-store.js
229
243
  var _crypto = require('crypto');
230
244
  var inMemoryNamespaces = /* @__PURE__ */ new Map();
231
- function base64UrlEncode(input) {
232
- return Buffer.from(input).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
233
- }
234
- function base64UrlDecode(input) {
235
- const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
236
- const padLength = (4 - normalized.length % 4) % 4;
237
- return Buffer.from(normalized + "=".repeat(padLength), "base64");
238
- }
239
245
  function getKekBuffer(kek) {
240
246
  const value = String(kek || "").trim();
241
247
  if (!value) {
@@ -249,16 +255,16 @@ function encryptConfig(config, kekBuffer) {
249
255
  const plaintext = Buffer.from(JSON.stringify(config), "utf8");
250
256
  const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
251
257
  const authTag = cipher.getAuthTag();
252
- return `v1.${base64UrlEncode(iv)}.${base64UrlEncode(authTag)}.${base64UrlEncode(ciphertext)}`;
258
+ return `v1.${_chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, iv)}.${_chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, authTag)}.${_chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, ciphertext)}`;
253
259
  }
254
260
  function decryptConfig(encrypted, kekBuffer) {
255
261
  const parts = String(encrypted || "").split(".");
256
262
  if (parts.length !== 4 || parts[0] !== "v1") {
257
263
  throw new Error("INVALID_TENANT_CONFIG");
258
264
  }
259
- const iv = base64UrlDecode(parts[1]);
260
- const authTag = base64UrlDecode(parts[2]);
261
- const ciphertext = base64UrlDecode(parts[3]);
265
+ const iv = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, parts[1]);
266
+ const authTag = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, parts[2]);
267
+ const ciphertext = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, parts[3]);
262
268
  const decipher = _crypto.createDecipheriv.call(void 0, "aes-256-gcm", kekBuffer, iv);
263
269
  decipher.setAuthTag(authTag);
264
270
  const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
@@ -326,7 +332,7 @@ function createTenantBlobStore(options) {
326
332
  // src/server/tenant/token.js
327
333
 
328
334
  function sign(input, secret) {
329
- return _chunk5IOYCCFDcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
335
+ return _chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
330
336
  }
331
337
  function nowEpochSeconds() {
332
338
  return Math.floor(Date.now() / 1e3);
@@ -342,8 +348,8 @@ function createTenantToken(params, secret) {
342
348
  v: 1
343
349
  };
344
350
  const header = { alg: "HS256", typ: "JWT" };
345
- const encodedHeader = _chunk5IOYCCFDcjs.bytesToBase64Url.call(void 0, _chunk5IOYCCFDcjs.utf8.call(void 0, JSON.stringify(header)));
346
- const encodedPayload = _chunk5IOYCCFDcjs.bytesToBase64Url.call(void 0, _chunk5IOYCCFDcjs.utf8.call(void 0, JSON.stringify(payload)));
351
+ const encodedHeader = _chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, _chunkTCKPLM3Pcjs.utf8.call(void 0, JSON.stringify(header)));
352
+ const encodedPayload = _chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, _chunkTCKPLM3Pcjs.utf8.call(void 0, JSON.stringify(payload)));
347
353
  const signingInput = `${encodedHeader}.${encodedPayload}`;
348
354
  const signature = sign(signingInput, secret);
349
355
  return `${signingInput}.${signature}`;
@@ -362,17 +368,17 @@ function verifyTenantToken(token, secret, options = {}) {
362
368
  let receivedBytes;
363
369
  let expectedBytes;
364
370
  try {
365
- receivedBytes = _chunk5IOYCCFDcjs.base64UrlToBytes.call(void 0, receivedSignature);
366
- expectedBytes = _chunk5IOYCCFDcjs.base64UrlToBytes.call(void 0, expectedSignature);
371
+ receivedBytes = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, receivedSignature);
372
+ expectedBytes = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, expectedSignature);
367
373
  } catch (e) {
368
374
  throw new Error("INVALID_TENANT_AUTH");
369
375
  }
370
- if (!_chunk5IOYCCFDcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
376
+ if (!_chunkTCKPLM3Pcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
371
377
  throw new Error("INVALID_TENANT_AUTH");
372
378
  }
373
379
  let payload;
374
380
  try {
375
- payload = JSON.parse(_chunk5IOYCCFDcjs.utf8Decode.call(void 0, _chunk5IOYCCFDcjs.base64UrlToBytes.call(void 0, encodedPayload)));
381
+ payload = JSON.parse(_chunkTCKPLM3Pcjs.utf8Decode.call(void 0, _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, encodedPayload)));
376
382
  } catch (e2) {
377
383
  throw new Error("INVALID_TENANT_AUTH");
378
384
  }
@@ -446,8 +452,17 @@ function createTenantContextManager(options) {
446
452
  async function getOrCreateAdapter(dbConfig) {
447
453
  const cacheKey = `${dbConfig.driver}:${dbConfig.connectionString}`;
448
454
  if (!adapterCache.has(cacheKey)) {
449
- const adapter = await adapterFactory(dbConfig);
450
- adapterCache.set(cacheKey, adapter);
455
+ const created = (async () => {
456
+ const adapter = await adapterFactory(dbConfig);
457
+ if (typeof adapter.initSchema === "function") {
458
+ await adapter.initSchema();
459
+ }
460
+ return adapter;
461
+ })().catch((error) => {
462
+ adapterCache.delete(cacheKey);
463
+ throw error;
464
+ });
465
+ adapterCache.set(cacheKey, created);
451
466
  }
452
467
  return adapterCache.get(cacheKey);
453
468
  }
@@ -583,14 +598,14 @@ async function createReiServer(config) {
583
598
  return {
584
599
  handlers: {
585
600
  initTenant: createInitTenantHandler(ctx),
586
- getUserKey: _chunk5IOYCCFDcjs.createGetUserKeyHandler.call(void 0, ctx),
587
- scheduleMessage: _chunk5IOYCCFDcjs.createScheduleMessageHandler.call(void 0, ctx),
601
+ getUserKey: _chunkTCKPLM3Pcjs.createGetUserKeyHandler.call(void 0, ctx),
602
+ scheduleMessage: _chunkTCKPLM3Pcjs.createScheduleMessageHandler.call(void 0, ctx),
588
603
  sendNotifications: createSendNotificationsHandler(ctx),
589
- updateMessage: _chunk5IOYCCFDcjs.createUpdateMessageHandler.call(void 0, ctx),
590
- cancelMessage: _chunk5IOYCCFDcjs.createCancelMessageHandler.call(void 0, ctx),
591
- messages: _chunk5IOYCCFDcjs.createMessagesHandler.call(void 0, ctx),
592
- getMessage: _chunk5IOYCCFDcjs.createGetMessageHandler.call(void 0, ctx),
593
- pushSubscription: _chunk5IOYCCFDcjs.createPushSubscriptionHandler.call(void 0, ctx)
604
+ updateMessage: _chunkTCKPLM3Pcjs.createUpdateMessageHandler.call(void 0, ctx),
605
+ cancelMessage: _chunkTCKPLM3Pcjs.createCancelMessageHandler.call(void 0, ctx),
606
+ messages: _chunkTCKPLM3Pcjs.createMessagesHandler.call(void 0, ctx),
607
+ getMessage: _chunkTCKPLM3Pcjs.createGetMessageHandler.call(void 0, ctx),
608
+ pushSubscription: _chunkTCKPLM3Pcjs.createPushSubscriptionHandler.call(void 0, ctx)
594
609
  }
595
610
  };
596
611
  }
@@ -625,4 +640,17 @@ async function createReiServer(config) {
625
640
 
626
641
 
627
642
 
628
- exports.MAX_PUSH_PAYLOAD_BYTES = _chunk5IOYCCFDcjs.MAX_PUSH_PAYLOAD_BYTES; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunk5IOYCCFDcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunk5IOYCCFDcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunk5IOYCCFDcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunk5IOYCCFDcjs.advanceOccurrence; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunk5IOYCCFDcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunk5IOYCCFDcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunk5IOYCCFDcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunk5IOYCCFDcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunk5IOYCCFDcjs.decryptFromStorage; exports.decryptPayload = _chunk5IOYCCFDcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunk5IOYCCFDcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunk5IOYCCFDcjs.encryptForStorage; exports.isValidISO8601 = _chunk5IOYCCFDcjs.isValidISO8601; exports.isValidTimeZoneId = _chunk5IOYCCFDcjs.isValidTimeZoneId; exports.isValidUUID = _chunk5IOYCCFDcjs.isValidUUID; exports.isValidUUIDv4 = _chunk5IOYCCFDcjs.isValidUUIDv4; exports.isValidUrl = _chunk5IOYCCFDcjs.isValidUrl; exports.measurePushPayload = _chunk5IOYCCFDcjs.measurePushPayload; exports.nextFutureOccurrence = _chunk5IOYCCFDcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunk5IOYCCFDcjs.planNextOccurrence; exports.runScheduledTick = _chunk5IOYCCFDcjs.runScheduledTick; exports.validateAvatarUrl = _chunk5IOYCCFDcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunk5IOYCCFDcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunk5IOYCCFDcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunk5IOYCCFDcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;
643
+
644
+
645
+
646
+
647
+
648
+
649
+
650
+
651
+
652
+
653
+
654
+
655
+
656
+ exports.CORS_ALLOW_HEADERS = _chunkTCKPLM3Pcjs.CORS_ALLOW_HEADERS; exports.CORS_ALLOW_METHODS = _chunkTCKPLM3Pcjs.CORS_ALLOW_METHODS; exports.DEFAULT_CLAIM_LEASE_MS = _chunkTCKPLM3Pcjs.DEFAULT_CLAIM_LEASE_MS; exports.DEFAULT_HEARTBEAT_LEASE_TTL_MS = _chunkTCKPLM3Pcjs.DEFAULT_HEARTBEAT_LEASE_TTL_MS; exports.DEFAULT_LEASE_HEARTBEAT_MS = _chunkTCKPLM3Pcjs.DEFAULT_LEASE_HEARTBEAT_MS; exports.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE = _chunkTCKPLM3Pcjs.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE; exports.DEFAULT_MAX_TOOL_ITERATIONS = _chunkTCKPLM3Pcjs.DEFAULT_MAX_TOOL_ITERATIONS; exports.DEFAULT_TOTAL_TIMEOUT_MS = _chunkTCKPLM3Pcjs.DEFAULT_TOTAL_TIMEOUT_MS; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkTCKPLM3Pcjs.MAX_PUSH_PAYLOAD_BYTES; exports.MIN_SCHEDULE_LEAD_MS = _chunkTCKPLM3Pcjs.MIN_SCHEDULE_LEAD_MS; exports.NonRetryableError = _chunkTCKPLM3Pcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkTCKPLM3Pcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkTCKPLM3Pcjs.advanceOccurrence; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkTCKPLM3Pcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkTCKPLM3Pcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkTCKPLM3Pcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkTCKPLM3Pcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkTCKPLM3Pcjs.decryptFromStorage; exports.decryptPayload = _chunkTCKPLM3Pcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkTCKPLM3Pcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkTCKPLM3Pcjs.encryptForStorage; exports.isNonRetryableError = _chunkTCKPLM3Pcjs.isNonRetryableError; exports.isValidISO8601 = _chunkTCKPLM3Pcjs.isValidISO8601; exports.isValidTimeZoneId = _chunkTCKPLM3Pcjs.isValidTimeZoneId; exports.isValidUUID = _chunkTCKPLM3Pcjs.isValidUUID; exports.isValidUUIDv4 = _chunkTCKPLM3Pcjs.isValidUUIDv4; exports.isValidUrl = _chunkTCKPLM3Pcjs.isValidUrl; exports.measurePushPayload = _chunkTCKPLM3Pcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkTCKPLM3Pcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkTCKPLM3Pcjs.planNextOccurrence; exports.runScheduledTick = _chunkTCKPLM3Pcjs.runScheduledTick; exports.runTask = _chunkTCKPLM3Pcjs.runTask; exports.sanitizeErrorSummary = _chunkTCKPLM3Pcjs.sanitizeErrorSummary; exports.validateAvatarUrl = _chunkTCKPLM3Pcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunkTCKPLM3Pcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkTCKPLM3Pcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkTCKPLM3Pcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;
package/dist/index.d.cts CHANGED
@@ -45,8 +45,6 @@ export function createReiServer(config: ReiServerConfig): Promise<ReiServer>;
45
45
  export { createAdapter } from "./adapters/factory.js";
46
46
  export { createD1Adapter } from "./adapters/d1.js";
47
47
  export { createSingleUserServer } from "./single-user.js";
48
- export { runScheduledTick } from "./lib/run-tick.js";
49
- export { createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
50
48
  export type VapidConfig = {
51
49
  /**
52
50
  * - VAPID contact email (e.g. mailto:…).
@@ -137,6 +135,10 @@ export type ReiServer = {
137
135
  */
138
136
  handlers: ReiHandlers;
139
137
  };
138
+ export { runScheduledTick, runTask, DEFAULT_CLAIM_LEASE_MS, DEFAULT_LEASE_HEARTBEAT_MS, DEFAULT_HEARTBEAT_LEASE_TTL_MS, sanitizeErrorSummary } from "./lib/run-tick.js";
139
+ export { NonRetryableError, isNonRetryableError } from "./lib/errors.js";
140
+ export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
141
+ export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
140
142
  export { createWebCryptoWebPush, measurePushPayload, MAX_PUSH_PAYLOAD_BYTES, PUSH_ENVELOPE_RESERVED_BYTES, WEB_PUSH_MAX_BODY_BYTES, WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES } from "./lib/webpush-webcrypto.js";
141
143
  export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
142
144
  export { validateScheduleMessagePayload, validateLlmMessagesArray, validateSplitPattern, validateAvatarUrl, isValidISO8601, isValidUrl, isValidUUID, isValidUUIDv4, isValidTimeZoneId } from "./lib/validation.js";
package/dist/index.d.ts CHANGED
@@ -45,8 +45,6 @@ export function createReiServer(config: ReiServerConfig): Promise<ReiServer>;
45
45
  export { createAdapter } from "./adapters/factory.js";
46
46
  export { createD1Adapter } from "./adapters/d1.js";
47
47
  export { createSingleUserServer } from "./single-user.js";
48
- export { runScheduledTick } from "./lib/run-tick.js";
49
- export { createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
50
48
  export type VapidConfig = {
51
49
  /**
52
50
  * - VAPID contact email (e.g. mailto:…).
@@ -137,6 +135,10 @@ export type ReiServer = {
137
135
  */
138
136
  handlers: ReiHandlers;
139
137
  };
138
+ export { runScheduledTick, runTask, DEFAULT_CLAIM_LEASE_MS, DEFAULT_LEASE_HEARTBEAT_MS, DEFAULT_HEARTBEAT_LEASE_TTL_MS, sanitizeErrorSummary } from "./lib/run-tick.js";
139
+ export { NonRetryableError, isNonRetryableError } from "./lib/errors.js";
140
+ export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
141
+ export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
140
142
  export { createWebCryptoWebPush, measurePushPayload, MAX_PUSH_PAYLOAD_BYTES, PUSH_ENVELOPE_RESERVED_BYTES, WEB_PUSH_MAX_BODY_BYTES, WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES } from "./lib/webpush-webcrypto.js";
141
143
  export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
142
144
  export { validateScheduleMessagePayload, validateLlmMessagesArray, validateSplitPattern, validateAvatarUrl, isValidISO8601, isValidUrl, isValidUUID, isValidUUIDv4, isValidTimeZoneId } from "./lib/validation.js";
package/dist/index.mjs CHANGED
@@ -1,5 +1,15 @@
1
1
  import {
2
+ CORS_ALLOW_HEADERS,
3
+ CORS_ALLOW_METHODS,
4
+ DEFAULT_CLAIM_LEASE_MS,
5
+ DEFAULT_HEARTBEAT_LEASE_TTL_MS,
6
+ DEFAULT_LEASE_HEARTBEAT_MS,
7
+ DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE,
8
+ DEFAULT_MAX_TOOL_ITERATIONS,
9
+ DEFAULT_TOTAL_TIMEOUT_MS,
2
10
  MAX_PUSH_PAYLOAD_BYTES,
11
+ MIN_SCHEDULE_LEAD_MS,
12
+ NonRetryableError,
3
13
  PUSH_ENVELOPE_RESERVED_BYTES,
4
14
  WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
5
15
  WEB_PUSH_MAX_BODY_BYTES,
@@ -22,6 +32,7 @@ import {
22
32
  deriveUserEncryptionKey,
23
33
  encryptForStorage,
24
34
  getHeader,
35
+ isNonRetryableError,
25
36
  isValidISO8601,
26
37
  isValidTimeZoneId,
27
38
  isValidUUID,
@@ -32,6 +43,8 @@ import {
32
43
  parseJsonBody,
33
44
  planNextOccurrence,
34
45
  runScheduledTick,
46
+ runTask,
47
+ sanitizeErrorSummary,
35
48
  timingSafeEqualBytes,
36
49
  utf8,
37
50
  utf8Decode,
@@ -39,7 +52,8 @@ import {
39
52
  validateLlmMessagesArray,
40
53
  validateScheduleMessagePayload,
41
54
  validateSplitPattern
42
- } from "./chunk-TV7N3RTH.mjs";
55
+ } from "./chunk-D3DQF647.mjs";
56
+ import "./chunk-34I2YSWE.mjs";
43
57
 
44
58
  // src/server/adapters/factory.js
45
59
  async function createAdapter(config) {
@@ -55,11 +69,11 @@ async function createAdapter(config) {
55
69
  }
56
70
  switch (config.driver) {
57
71
  case "neon": {
58
- const { NeonAdapter } = await import("./neon-CUIGAB2T.mjs");
72
+ const { NeonAdapter } = await import("./neon-XLWK27RL.mjs");
59
73
  return new NeonAdapter(config.connectionString);
60
74
  }
61
75
  case "pg": {
62
- const { PgAdapter } = await import("./pg-KMJPL6QV.mjs");
76
+ const { PgAdapter } = await import("./pg-X63HFEV7.mjs");
63
77
  return new PgAdapter(config.connectionString);
64
78
  }
65
79
  default:
@@ -228,14 +242,6 @@ function createSendNotificationsHandler(ctx) {
228
242
  // src/server/tenant/blob-store.js
229
243
  import { createCipheriv, createDecipheriv, createHash, randomBytes } from "crypto";
230
244
  var inMemoryNamespaces = /* @__PURE__ */ new Map();
231
- function base64UrlEncode(input) {
232
- return Buffer.from(input).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
233
- }
234
- function base64UrlDecode(input) {
235
- const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
236
- const padLength = (4 - normalized.length % 4) % 4;
237
- return Buffer.from(normalized + "=".repeat(padLength), "base64");
238
- }
239
245
  function getKekBuffer(kek) {
240
246
  const value = String(kek || "").trim();
241
247
  if (!value) {
@@ -249,16 +255,16 @@ function encryptConfig(config, kekBuffer) {
249
255
  const plaintext = Buffer.from(JSON.stringify(config), "utf8");
250
256
  const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
251
257
  const authTag = cipher.getAuthTag();
252
- return `v1.${base64UrlEncode(iv)}.${base64UrlEncode(authTag)}.${base64UrlEncode(ciphertext)}`;
258
+ return `v1.${bytesToBase64Url(iv)}.${bytesToBase64Url(authTag)}.${bytesToBase64Url(ciphertext)}`;
253
259
  }
254
260
  function decryptConfig(encrypted, kekBuffer) {
255
261
  const parts = String(encrypted || "").split(".");
256
262
  if (parts.length !== 4 || parts[0] !== "v1") {
257
263
  throw new Error("INVALID_TENANT_CONFIG");
258
264
  }
259
- const iv = base64UrlDecode(parts[1]);
260
- const authTag = base64UrlDecode(parts[2]);
261
- const ciphertext = base64UrlDecode(parts[3]);
265
+ const iv = base64UrlToBytes(parts[1]);
266
+ const authTag = base64UrlToBytes(parts[2]);
267
+ const ciphertext = base64UrlToBytes(parts[3]);
262
268
  const decipher = createDecipheriv("aes-256-gcm", kekBuffer, iv);
263
269
  decipher.setAuthTag(authTag);
264
270
  const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
@@ -446,8 +452,17 @@ function createTenantContextManager(options) {
446
452
  async function getOrCreateAdapter(dbConfig) {
447
453
  const cacheKey = `${dbConfig.driver}:${dbConfig.connectionString}`;
448
454
  if (!adapterCache.has(cacheKey)) {
449
- const adapter = await adapterFactory(dbConfig);
450
- adapterCache.set(cacheKey, adapter);
455
+ const created = (async () => {
456
+ const adapter = await adapterFactory(dbConfig);
457
+ if (typeof adapter.initSchema === "function") {
458
+ await adapter.initSchema();
459
+ }
460
+ return adapter;
461
+ })().catch((error) => {
462
+ adapterCache.delete(cacheKey);
463
+ throw error;
464
+ });
465
+ adapterCache.set(cacheKey, created);
451
466
  }
452
467
  return adapterCache.get(cacheKey);
453
468
  }
@@ -595,7 +610,17 @@ async function createReiServer(config) {
595
610
  };
596
611
  }
597
612
  export {
613
+ CORS_ALLOW_HEADERS,
614
+ CORS_ALLOW_METHODS,
615
+ DEFAULT_CLAIM_LEASE_MS,
616
+ DEFAULT_HEARTBEAT_LEASE_TTL_MS,
617
+ DEFAULT_LEASE_HEARTBEAT_MS,
618
+ DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE,
619
+ DEFAULT_MAX_TOOL_ITERATIONS,
620
+ DEFAULT_TOTAL_TIMEOUT_MS,
598
621
  MAX_PUSH_PAYLOAD_BYTES,
622
+ MIN_SCHEDULE_LEAD_MS,
623
+ NonRetryableError,
599
624
  PUSH_ENVELOPE_RESERVED_BYTES,
600
625
  WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
601
626
  WEB_PUSH_MAX_BODY_BYTES,
@@ -611,6 +636,7 @@ export {
611
636
  decryptPayload,
612
637
  deriveUserEncryptionKey,
613
638
  encryptForStorage,
639
+ isNonRetryableError,
614
640
  isValidISO8601,
615
641
  isValidTimeZoneId,
616
642
  isValidUUID,
@@ -620,6 +646,8 @@ export {
620
646
  nextFutureOccurrence,
621
647
  planNextOccurrence,
622
648
  runScheduledTick,
649
+ runTask,
650
+ sanitizeErrorSummary,
623
651
  validateAvatarUrl,
624
652
  validateLlmMessagesArray,
625
653
  validateScheduleMessagePayload,