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

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 (38) hide show
  1. package/README.md +109 -1
  2. package/dist/adapters/d1.d.ts +130 -0
  3. package/dist/adapters/interface.d.ts +67 -0
  4. package/dist/adapters/neon.d.ts +20 -58
  5. package/dist/adapters/pg-shared.d.ts +114 -0
  6. package/dist/adapters/pg.d.ts +20 -58
  7. package/dist/adapters/schema.d.ts +1 -1
  8. package/dist/adapters/schema.sqlite.d.ts +15 -1
  9. package/dist/{chunk-B2FDV7YK.mjs → chunk-34I2YSWE.mjs} +10 -0
  10. package/dist/{chunk-5IOYCCFD.cjs → chunk-H4V7OXHE.cjs} +1326 -384
  11. package/dist/{chunk-TV7N3RTH.mjs → chunk-KVHR3RCU.mjs} +1324 -382
  12. package/dist/{chunk-V2SDWGUB.cjs → chunk-OUPM4HAV.cjs} +10 -0
  13. package/dist/chunk-TFFBMYA2.cjs +95 -0
  14. package/dist/chunk-UYROU4L3.mjs +95 -0
  15. package/dist/cloudflare/single-user-worker.d.ts +35 -2
  16. package/dist/cloudflare.cjs +17 -2
  17. package/dist/cloudflare.d.ts +3 -1
  18. package/dist/cloudflare.mjs +18 -3
  19. package/dist/handlers/outbox.d.ts +7 -0
  20. package/dist/index.cjs +72 -36
  21. package/dist/index.d.cts +5 -2
  22. package/dist/index.d.ts +5 -2
  23. package/dist/index.mjs +53 -17
  24. package/dist/lib/client-state-store.d.ts +18 -3
  25. package/dist/lib/errors.d.ts +93 -0
  26. package/dist/lib/message-processor.d.ts +8 -2
  27. package/dist/lib/outbox-store.d.ts +33 -0
  28. package/dist/lib/push-subscription-store.d.ts +10 -2
  29. package/dist/lib/request.d.ts +36 -0
  30. package/dist/lib/run-tick.d.ts +38 -0
  31. package/dist/lib/schema-version.d.ts +50 -0
  32. package/dist/lib/validation.d.ts +1 -7
  33. package/dist/{neon-3ASBLLCM.cjs → neon-G3G4TDAY.cjs} +52 -112
  34. package/dist/{neon-CUIGAB2T.mjs → neon-GBUF4G76.mjs} +44 -104
  35. package/dist/{pg-IEZTAR43.cjs → pg-C3JZKBUM.cjs} +49 -112
  36. package/dist/{pg-KMJPL6QV.mjs → pg-MRXP5MHJ.mjs} +41 -104
  37. package/dist/single-user.d.ts +4 -0
  38. package/package.json +2 -2
@@ -12,6 +12,7 @@ var TABLE_SQL = `
12
12
  serialize_group VARCHAR(64),
13
13
  status VARCHAR(50) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'failed')),
14
14
  retry_count INTEGER DEFAULT 0,
15
+ last_error TEXT,
15
16
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
16
17
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
17
18
  )
@@ -31,6 +32,14 @@ var MIGRATIONS = [
31
32
  name: "add_serialize_group",
32
33
  sql: "ALTER TABLE scheduled_messages ADD COLUMN IF NOT EXISTS serialize_group VARCHAR(64)",
33
34
  description: "Serialization group for runScheduledTick serializeBy (2.6.0)"
35
+ },
36
+ {
37
+ name: "add_last_error",
38
+ // 上一次投递失败的脱敏摘要(JSON:{ at, occurrence, reason })。payload 里
39
+ // 的 lastError 是密文里的完整记录,这一列是它的明文出口——payload 本身
40
+ // 解密失败时也写得进去,GET /message 对已失败的行也读得出来。
41
+ sql: "ALTER TABLE scheduled_messages ADD COLUMN IF NOT EXISTS last_error TEXT",
42
+ description: "Sanitized last delivery-failure summary (2.6.0)"
34
43
  }
35
44
  ];
36
45
  var INDEXES = [
@@ -108,6 +117,7 @@ var UPDATABLE_COLUMNS = /* @__PURE__ */ new Set([
108
117
  "serialize_group",
109
118
  "status",
110
119
  "retry_count",
120
+ "last_error",
111
121
  "created_at",
112
122
  "updated_at"
113
123
  ]);
@@ -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
+ };
@@ -1,4 +1,37 @@
1
- export function createSingleUserCloudflareWorker(buildConfig: any): {
1
+ /**
2
+ * @param {(env: Object) => Object|Promise<Object>} buildConfig
3
+ * @param {{ onError?: (info: { stage: 'config'|'request'|'tick', error: unknown, cause: import('../lib/errors.js').ErrorCause, path: string|null }) => void|Promise<void> }} [options]
4
+ * `onError` 在 fetch 或 cron 出错时调一次(best-effort,自身抛错只记日志)。
5
+ * cron 那条路上没有调用方能看到错误响应,这个 hook 是宿主唯一的出口。
6
+ */
7
+ export function createSingleUserCloudflareWorker(buildConfig: (env: any) => any | Promise<any>, options?: {
8
+ onError?: (info: {
9
+ stage: "config" | "request" | "tick";
10
+ error: unknown;
11
+ cause: import("../lib/errors.js").ErrorCause;
12
+ path: string | null;
13
+ }) => void | Promise<void>;
14
+ }): {
2
15
  fetch: (request: any, env: any) => Promise<Response>;
3
- scheduled: (event: any, env: any) => Promise<void>;
16
+ scheduled: (event: any, env: any) => Promise<{
17
+ ok: true;
18
+ summary: any;
19
+ } | {
20
+ ok: false;
21
+ cause: import("../lib/errors.js").ErrorCause;
22
+ }>;
23
+ runTask: (uuid: string, env: any) => Promise<{
24
+ ran: false;
25
+ reason: "not_configured" | "not_found" | "already_settled" | "not_due" | "retry_pending";
26
+ status?: string;
27
+ nextSendAt?: string;
28
+ retryAfter?: string;
29
+ } | {
30
+ ran: true;
31
+ summary: any;
32
+ }>;
33
+ getSchemaVersion: (env: any) => Promise<import("../lib/schema-version.js").SchemaVersionResult>;
34
+ ensureSchema: (env: any) => Promise<import("../lib/schema-version.js").EnsureSchemaResult>;
4
35
  };
36
+ export const CORS_ALLOW_HEADERS: "Content-Type, X-User-Id, X-Payload-Encrypted, X-Encryption-Version, X-Response-Encrypted, X-Client-Token";
37
+ export const CORS_ALLOW_METHODS: "GET, POST, PUT, DELETE, OPTIONS";
@@ -17,7 +17,6 @@
17
17
 
18
18
 
19
19
 
20
- var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
21
20
 
22
21
 
23
22
 
@@ -25,6 +24,8 @@ var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
25
24
 
26
25
 
27
26
 
27
+ var _chunkH4V7OXHEcjs = require('./chunk-H4V7OXHE.cjs');
28
+ require('./chunk-OUPM4HAV.cjs');
28
29
 
29
30
 
30
31
 
@@ -37,4 +38,18 @@ 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
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ exports.MAX_PUSH_PAYLOAD_BYTES = _chunkH4V7OXHEcjs.MAX_PUSH_PAYLOAD_BYTES; exports.NonRetryableError = _chunkH4V7OXHEcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkH4V7OXHEcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkH4V7OXHEcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkH4V7OXHEcjs.advanceOccurrence; exports.createD1Adapter = _chunkH4V7OXHEcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkH4V7OXHEcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkH4V7OXHEcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkH4V7OXHEcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkH4V7OXHEcjs.decryptFromStorage; exports.decryptPayload = _chunkH4V7OXHEcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkH4V7OXHEcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkH4V7OXHEcjs.encryptForStorage; exports.ensureSchema = _chunkH4V7OXHEcjs.ensureSchema; exports.getSchemaVersion = _chunkH4V7OXHEcjs.getSchemaVersion; exports.isNonRetryableError = _chunkH4V7OXHEcjs.isNonRetryableError; exports.isValidTimeZoneId = _chunkH4V7OXHEcjs.isValidTimeZoneId; exports.measurePushPayload = _chunkH4V7OXHEcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkH4V7OXHEcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkH4V7OXHEcjs.planNextOccurrence; exports.runScheduledTick = _chunkH4V7OXHEcjs.runScheduledTick; exports.runTask = _chunkH4V7OXHEcjs.runTask; exports.summarizeErrorCause = _chunkH4V7OXHEcjs.summarizeErrorCause;
@@ -1,7 +1,9 @@
1
1
  export { createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
2
2
  export { createSingleUserServer } from "./single-user.js";
3
3
  export { createD1Adapter } from "./adapters/d1.js";
4
- export { runScheduledTick } from "./lib/run-tick.js";
5
4
  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";
5
+ export { runScheduledTick, runTask } from "./lib/run-tick.js";
6
+ export { getSchemaVersion, ensureSchema, SCHEMA_VERSION } from "./lib/schema-version.js";
7
+ export { summarizeErrorCause, NonRetryableError, isNonRetryableError } from "./lib/errors.js";
6
8
  export { isValidTimeZoneId, advanceOccurrence, nextFutureOccurrence, planNextOccurrence } from "./lib/recurrence.js";
7
9
  export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  MAX_PUSH_PAYLOAD_BYTES,
3
+ NonRetryableError,
3
4
  PUSH_ENVELOPE_RESERVED_BYTES,
5
+ SCHEMA_VERSION,
4
6
  WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
5
7
  WEB_PUSH_MAX_BODY_BYTES,
6
8
  advanceOccurrence,
@@ -12,15 +14,23 @@ import {
12
14
  decryptPayload,
13
15
  deriveUserEncryptionKey,
14
16
  encryptForStorage,
17
+ ensureSchema,
18
+ getSchemaVersion,
19
+ isNonRetryableError,
15
20
  isValidTimeZoneId,
16
21
  measurePushPayload,
17
22
  nextFutureOccurrence,
18
23
  planNextOccurrence,
19
- runScheduledTick
20
- } from "./chunk-TV7N3RTH.mjs";
24
+ runScheduledTick,
25
+ runTask,
26
+ summarizeErrorCause
27
+ } from "./chunk-KVHR3RCU.mjs";
28
+ import "./chunk-34I2YSWE.mjs";
21
29
  export {
22
30
  MAX_PUSH_PAYLOAD_BYTES,
31
+ NonRetryableError,
23
32
  PUSH_ENVELOPE_RESERVED_BYTES,
33
+ SCHEMA_VERSION,
24
34
  WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
25
35
  WEB_PUSH_MAX_BODY_BYTES,
26
36
  advanceOccurrence,
@@ -32,9 +42,14 @@ export {
32
42
  decryptPayload,
33
43
  deriveUserEncryptionKey,
34
44
  encryptForStorage,
45
+ ensureSchema,
46
+ getSchemaVersion,
47
+ isNonRetryableError,
35
48
  isValidTimeZoneId,
36
49
  measurePushPayload,
37
50
  nextFutureOccurrence,
38
51
  planNextOccurrence,
39
- runScheduledTick
52
+ runScheduledTick,
53
+ runTask,
54
+ summarizeErrorCause
40
55
  };
@@ -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,25 @@
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
+
56
+
57
+
58
+
59
+ var _chunkH4V7OXHEcjs = require('./chunk-H4V7OXHE.cjs');
60
+ require('./chunk-OUPM4HAV.cjs');
43
61
 
44
62
  // src/server/adapters/factory.js
45
63
  async function createAdapter(config) {
@@ -55,11 +73,11 @@ async function createAdapter(config) {
55
73
  }
56
74
  switch (config.driver) {
57
75
  case "neon": {
58
- const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-3ASBLLCM.cjs")));
76
+ const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-G3G4TDAY.cjs")));
59
77
  return new NeonAdapter(config.connectionString);
60
78
  }
61
79
  case "pg": {
62
- const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-IEZTAR43.cjs")));
80
+ const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-C3JZKBUM.cjs")));
63
81
  return new PgAdapter(config.connectionString);
64
82
  }
65
83
  default:
@@ -72,7 +90,7 @@ async function createAdapter(config) {
72
90
  // src/server/handlers/init-tenant.js
73
91
  function createInitTenantHandler(ctx) {
74
92
  async function POST(headers, body) {
75
- const initSecret = _chunk5IOYCCFDcjs.getHeader.call(void 0, headers, "x-init-secret");
93
+ const initSecret = _chunkH4V7OXHEcjs.getHeader.call(void 0, headers, "x-init-secret");
76
94
  if (ctx.tenant.initSecret && initSecret !== ctx.tenant.initSecret) {
77
95
  return {
78
96
  status: 401,
@@ -85,7 +103,7 @@ function createInitTenantHandler(ctx) {
85
103
  }
86
104
  };
87
105
  }
88
- const parsed = _chunk5IOYCCFDcjs.parseJsonBody.call(void 0, body);
106
+ const parsed = _chunkH4V7OXHEcjs.parseJsonBody.call(void 0, body);
89
107
  if (!parsed.ok) {
90
108
  return {
91
109
  status: 400,
@@ -99,7 +117,7 @@ function createInitTenantHandler(ctx) {
99
117
  const tenantId = payload.tenantId || void 0;
100
118
  const driver = payload.driver;
101
119
  const databaseUrl = payload.databaseUrl || payload.connectionString;
102
- if (tenantId && !_chunk5IOYCCFDcjs.isValidUUIDv4.call(void 0, tenantId)) {
120
+ if (tenantId && !_chunkH4V7OXHEcjs.isValidUUIDv4.call(void 0, tenantId)) {
103
121
  return {
104
122
  status: 400,
105
123
  body: {
@@ -219,7 +237,7 @@ function createSendNotificationsHandler(ctx) {
219
237
  }
220
238
  };
221
239
  }
222
- const data = await _chunk5IOYCCFDcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
240
+ const data = await _chunkH4V7OXHEcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
223
241
  return { status: 200, body: { success: true, data } };
224
242
  }
225
243
  return { POST };
@@ -228,14 +246,6 @@ function createSendNotificationsHandler(ctx) {
228
246
  // src/server/tenant/blob-store.js
229
247
  var _crypto = require('crypto');
230
248
  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
249
  function getKekBuffer(kek) {
240
250
  const value = String(kek || "").trim();
241
251
  if (!value) {
@@ -249,16 +259,16 @@ function encryptConfig(config, kekBuffer) {
249
259
  const plaintext = Buffer.from(JSON.stringify(config), "utf8");
250
260
  const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
251
261
  const authTag = cipher.getAuthTag();
252
- return `v1.${base64UrlEncode(iv)}.${base64UrlEncode(authTag)}.${base64UrlEncode(ciphertext)}`;
262
+ return `v1.${_chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, iv)}.${_chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, authTag)}.${_chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, ciphertext)}`;
253
263
  }
254
264
  function decryptConfig(encrypted, kekBuffer) {
255
265
  const parts = String(encrypted || "").split(".");
256
266
  if (parts.length !== 4 || parts[0] !== "v1") {
257
267
  throw new Error("INVALID_TENANT_CONFIG");
258
268
  }
259
- const iv = base64UrlDecode(parts[1]);
260
- const authTag = base64UrlDecode(parts[2]);
261
- const ciphertext = base64UrlDecode(parts[3]);
269
+ const iv = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, parts[1]);
270
+ const authTag = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, parts[2]);
271
+ const ciphertext = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, parts[3]);
262
272
  const decipher = _crypto.createDecipheriv.call(void 0, "aes-256-gcm", kekBuffer, iv);
263
273
  decipher.setAuthTag(authTag);
264
274
  const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
@@ -326,7 +336,7 @@ function createTenantBlobStore(options) {
326
336
  // src/server/tenant/token.js
327
337
 
328
338
  function sign(input, secret) {
329
- return _chunk5IOYCCFDcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
339
+ return _chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
330
340
  }
331
341
  function nowEpochSeconds() {
332
342
  return Math.floor(Date.now() / 1e3);
@@ -342,8 +352,8 @@ function createTenantToken(params, secret) {
342
352
  v: 1
343
353
  };
344
354
  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)));
355
+ const encodedHeader = _chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, _chunkH4V7OXHEcjs.utf8.call(void 0, JSON.stringify(header)));
356
+ const encodedPayload = _chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, _chunkH4V7OXHEcjs.utf8.call(void 0, JSON.stringify(payload)));
347
357
  const signingInput = `${encodedHeader}.${encodedPayload}`;
348
358
  const signature = sign(signingInput, secret);
349
359
  return `${signingInput}.${signature}`;
@@ -362,17 +372,17 @@ function verifyTenantToken(token, secret, options = {}) {
362
372
  let receivedBytes;
363
373
  let expectedBytes;
364
374
  try {
365
- receivedBytes = _chunk5IOYCCFDcjs.base64UrlToBytes.call(void 0, receivedSignature);
366
- expectedBytes = _chunk5IOYCCFDcjs.base64UrlToBytes.call(void 0, expectedSignature);
375
+ receivedBytes = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, receivedSignature);
376
+ expectedBytes = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, expectedSignature);
367
377
  } catch (e) {
368
378
  throw new Error("INVALID_TENANT_AUTH");
369
379
  }
370
- if (!_chunk5IOYCCFDcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
380
+ if (!_chunkH4V7OXHEcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
371
381
  throw new Error("INVALID_TENANT_AUTH");
372
382
  }
373
383
  let payload;
374
384
  try {
375
- payload = JSON.parse(_chunk5IOYCCFDcjs.utf8Decode.call(void 0, _chunk5IOYCCFDcjs.base64UrlToBytes.call(void 0, encodedPayload)));
385
+ payload = JSON.parse(_chunkH4V7OXHEcjs.utf8Decode.call(void 0, _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, encodedPayload)));
376
386
  } catch (e2) {
377
387
  throw new Error("INVALID_TENANT_AUTH");
378
388
  }
@@ -446,8 +456,17 @@ function createTenantContextManager(options) {
446
456
  async function getOrCreateAdapter(dbConfig) {
447
457
  const cacheKey = `${dbConfig.driver}:${dbConfig.connectionString}`;
448
458
  if (!adapterCache.has(cacheKey)) {
449
- const adapter = await adapterFactory(dbConfig);
450
- adapterCache.set(cacheKey, adapter);
459
+ const created = (async () => {
460
+ const adapter = await adapterFactory(dbConfig);
461
+ if (typeof adapter.initSchema === "function") {
462
+ await adapter.initSchema();
463
+ }
464
+ return adapter;
465
+ })().catch((error) => {
466
+ adapterCache.delete(cacheKey);
467
+ throw error;
468
+ });
469
+ adapterCache.set(cacheKey, created);
451
470
  }
452
471
  return adapterCache.get(cacheKey);
453
472
  }
@@ -583,14 +602,14 @@ async function createReiServer(config) {
583
602
  return {
584
603
  handlers: {
585
604
  initTenant: createInitTenantHandler(ctx),
586
- getUserKey: _chunk5IOYCCFDcjs.createGetUserKeyHandler.call(void 0, ctx),
587
- scheduleMessage: _chunk5IOYCCFDcjs.createScheduleMessageHandler.call(void 0, ctx),
605
+ getUserKey: _chunkH4V7OXHEcjs.createGetUserKeyHandler.call(void 0, ctx),
606
+ scheduleMessage: _chunkH4V7OXHEcjs.createScheduleMessageHandler.call(void 0, ctx),
588
607
  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)
608
+ updateMessage: _chunkH4V7OXHEcjs.createUpdateMessageHandler.call(void 0, ctx),
609
+ cancelMessage: _chunkH4V7OXHEcjs.createCancelMessageHandler.call(void 0, ctx),
610
+ messages: _chunkH4V7OXHEcjs.createMessagesHandler.call(void 0, ctx),
611
+ getMessage: _chunkH4V7OXHEcjs.createGetMessageHandler.call(void 0, ctx),
612
+ pushSubscription: _chunkH4V7OXHEcjs.createPushSubscriptionHandler.call(void 0, ctx)
594
613
  }
595
614
  };
596
615
  }
@@ -625,4 +644,21 @@ async function createReiServer(config) {
625
644
 
626
645
 
627
646
 
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;
647
+
648
+
649
+
650
+
651
+
652
+
653
+
654
+
655
+
656
+
657
+
658
+
659
+
660
+
661
+
662
+
663
+
664
+ exports.CORS_ALLOW_HEADERS = _chunkH4V7OXHEcjs.CORS_ALLOW_HEADERS; exports.CORS_ALLOW_METHODS = _chunkH4V7OXHEcjs.CORS_ALLOW_METHODS; exports.DEFAULT_CLAIM_LEASE_MS = _chunkH4V7OXHEcjs.DEFAULT_CLAIM_LEASE_MS; exports.DEFAULT_HEARTBEAT_LEASE_TTL_MS = _chunkH4V7OXHEcjs.DEFAULT_HEARTBEAT_LEASE_TTL_MS; exports.DEFAULT_LEASE_HEARTBEAT_MS = _chunkH4V7OXHEcjs.DEFAULT_LEASE_HEARTBEAT_MS; exports.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE = _chunkH4V7OXHEcjs.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE; exports.DEFAULT_MAX_TOOL_ITERATIONS = _chunkH4V7OXHEcjs.DEFAULT_MAX_TOOL_ITERATIONS; exports.DEFAULT_TOTAL_TIMEOUT_MS = _chunkH4V7OXHEcjs.DEFAULT_TOTAL_TIMEOUT_MS; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkH4V7OXHEcjs.MAX_PUSH_PAYLOAD_BYTES; exports.MIN_SCHEDULE_LEAD_MS = _chunkH4V7OXHEcjs.MIN_SCHEDULE_LEAD_MS; exports.NonRetryableError = _chunkH4V7OXHEcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkH4V7OXHEcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkH4V7OXHEcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkH4V7OXHEcjs.advanceOccurrence; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkH4V7OXHEcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkH4V7OXHEcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkH4V7OXHEcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkH4V7OXHEcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkH4V7OXHEcjs.decryptFromStorage; exports.decryptPayload = _chunkH4V7OXHEcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkH4V7OXHEcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkH4V7OXHEcjs.encryptForStorage; exports.ensureSchema = _chunkH4V7OXHEcjs.ensureSchema; exports.getSchemaVersion = _chunkH4V7OXHEcjs.getSchemaVersion; exports.isNonRetryableError = _chunkH4V7OXHEcjs.isNonRetryableError; exports.isValidISO8601 = _chunkH4V7OXHEcjs.isValidISO8601; exports.isValidTimeZoneId = _chunkH4V7OXHEcjs.isValidTimeZoneId; exports.isValidUUID = _chunkH4V7OXHEcjs.isValidUUID; exports.isValidUUIDv4 = _chunkH4V7OXHEcjs.isValidUUIDv4; exports.isValidUrl = _chunkH4V7OXHEcjs.isValidUrl; exports.measurePushPayload = _chunkH4V7OXHEcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkH4V7OXHEcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkH4V7OXHEcjs.planNextOccurrence; exports.runScheduledTick = _chunkH4V7OXHEcjs.runScheduledTick; exports.runTask = _chunkH4V7OXHEcjs.runTask; exports.sanitizeErrorSummary = _chunkH4V7OXHEcjs.sanitizeErrorSummary; exports.summarizeErrorCause = _chunkH4V7OXHEcjs.summarizeErrorCause; exports.validateAvatarUrl = _chunkH4V7OXHEcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunkH4V7OXHEcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkH4V7OXHEcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkH4V7OXHEcjs.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,11 @@ 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, summarizeErrorCause } from "./lib/errors.js";
140
+ export { getSchemaVersion, ensureSchema, SCHEMA_VERSION } from "./lib/schema-version.js";
141
+ export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
142
+ export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
140
143
  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
144
  export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
142
145
  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,11 @@ 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, summarizeErrorCause } from "./lib/errors.js";
140
+ export { getSchemaVersion, ensureSchema, SCHEMA_VERSION } from "./lib/schema-version.js";
141
+ export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
142
+ export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
140
143
  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
144
  export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
142
145
  export { validateScheduleMessagePayload, validateLlmMessagesArray, validateSplitPattern, validateAvatarUrl, isValidISO8601, isValidUrl, isValidUUID, isValidUUIDv4, isValidTimeZoneId } from "./lib/validation.js";