@rei-standard/amsg-server 2.6.0-next.7 → 2.6.0-next.8

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.
@@ -443,6 +443,12 @@ function buildAiRequestBody(payload) {
443
443
  } else if (!Array.isArray(payload.messages)) {
444
444
  requestBody.temperature = 0.8;
445
445
  }
446
+ if (Array.isArray(payload.tools) && payload.tools.length > 0) {
447
+ requestBody.tools = payload.tools;
448
+ if (payload.toolChoice !== void 0 && payload.toolChoice !== null) {
449
+ requestBody.tool_choice = payload.toolChoice;
450
+ }
451
+ }
446
452
  if (payload.maxTokens === void 0 || payload.maxTokens === null) {
447
453
  return requestBody;
448
454
  }
@@ -667,11 +673,13 @@ function normalizeBeforeFireResult(result) {
667
673
  return {
668
674
  messages: result.messages,
669
675
  maxToolIterations: result.maxToolIterations,
670
- totalTimeoutMs: result.totalTimeoutMs
676
+ totalTimeoutMs: result.totalTimeoutMs,
677
+ tools: Array.isArray(result.tools) && result.tools.length > 0 ? result.tools : void 0,
678
+ toolChoice: result.toolChoice
671
679
  };
672
680
  }
673
681
  throw new TypeError(
674
- "AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs? } | { skip: true } | null"
682
+ "AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs?, tools?, toolChoice? } | { skip: true } | null"
675
683
  );
676
684
  }
677
685
  function firstPositiveInt(values, fallback) {
@@ -789,7 +797,11 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
789
797
  }
790
798
  const roundTimeoutMs = Math.max(1, Math.min(3e5, deadline - nowFn()));
791
799
  const { response: llmResponse } = await callLlm(
792
- { ...decryptedPayload, messages },
800
+ {
801
+ ...decryptedPayload,
802
+ messages,
803
+ ...normalized.tools ? { tools: normalized.tools, toolChoice: normalized.toolChoice } : {}
804
+ },
793
805
  { requireContent: false, timeoutMs: roundTimeoutMs }
794
806
  );
795
807
  const assistantMessage = _amsgshared.extractAssistantMessage.call(void 0, llmResponse);
@@ -845,7 +857,10 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
845
857
  content: `Tool execution failed: ${_nullishCoalesce(_optionalChain([error, 'optionalAccess', _6 => _6.message]), () => ( String(error)))}`
846
858
  }));
847
859
  }
848
- const assistantWithTools = Array.isArray(assistantMessage.tool_calls) && assistantMessage.tool_calls.length > 0 ? assistantMessage : { ...assistantMessage, tool_calls: toolCalls };
860
+ const nativeCalls = Array.isArray(assistantMessage.tool_calls) ? assistantMessage.tool_calls : [];
861
+ const nativeIds = new Set(nativeCalls.map((tc) => tc && tc.id));
862
+ const synthesized = toolCalls.filter((tc) => !nativeIds.has(tc && tc.id));
863
+ const assistantWithTools = synthesized.length === 0 ? assistantMessage : { ...assistantMessage, tool_calls: [...nativeCalls, ...synthesized] };
849
864
  messages = [...messages.slice(0, -1), assistantWithTools, ...toolResults];
850
865
  }
851
866
  throw new Error(`AGENTIC_LOOP_EXCEEDED: no finish/skip-push decision within ${maxToolIterations} LLM round(s)`);
@@ -2262,7 +2277,7 @@ function createClientStateHandler(ctx) {
2262
2277
  }
2263
2278
 
2264
2279
  // src/server/lib/version.js
2265
- var SERVER_VERSION = true ? "2.6.0-next.7" : "0.0.0-dev";
2280
+ var SERVER_VERSION = true ? "2.6.0-next.8" : "0.0.0-dev";
2266
2281
 
2267
2282
  // src/server/handlers/capabilities.js
2268
2283
  var SERVER_FEATURES = Object.freeze([
@@ -2272,6 +2287,7 @@ var SERVER_FEATURES = Object.freeze([
2272
2287
  "agentic-hooks",
2273
2288
  "agentic-scratch",
2274
2289
  "agentic-write-state",
2290
+ "agentic-fire-tools",
2275
2291
  "vapid-public-key"
2276
2292
  ]);
2277
2293
  function createCapabilitiesHandler(ctx) {
@@ -443,6 +443,12 @@ function buildAiRequestBody(payload) {
443
443
  } else if (!Array.isArray(payload.messages)) {
444
444
  requestBody.temperature = 0.8;
445
445
  }
446
+ if (Array.isArray(payload.tools) && payload.tools.length > 0) {
447
+ requestBody.tools = payload.tools;
448
+ if (payload.toolChoice !== void 0 && payload.toolChoice !== null) {
449
+ requestBody.tool_choice = payload.toolChoice;
450
+ }
451
+ }
446
452
  if (payload.maxTokens === void 0 || payload.maxTokens === null) {
447
453
  return requestBody;
448
454
  }
@@ -667,11 +673,13 @@ function normalizeBeforeFireResult(result) {
667
673
  return {
668
674
  messages: result.messages,
669
675
  maxToolIterations: result.maxToolIterations,
670
- totalTimeoutMs: result.totalTimeoutMs
676
+ totalTimeoutMs: result.totalTimeoutMs,
677
+ tools: Array.isArray(result.tools) && result.tools.length > 0 ? result.tools : void 0,
678
+ toolChoice: result.toolChoice
671
679
  };
672
680
  }
673
681
  throw new TypeError(
674
- "AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs? } | { skip: true } | null"
682
+ "AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs?, tools?, toolChoice? } | { skip: true } | null"
675
683
  );
676
684
  }
677
685
  function firstPositiveInt(values, fallback) {
@@ -789,7 +797,11 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
789
797
  }
790
798
  const roundTimeoutMs = Math.max(1, Math.min(3e5, deadline - nowFn()));
791
799
  const { response: llmResponse } = await callLlm(
792
- { ...decryptedPayload, messages },
800
+ {
801
+ ...decryptedPayload,
802
+ messages,
803
+ ...normalized.tools ? { tools: normalized.tools, toolChoice: normalized.toolChoice } : {}
804
+ },
793
805
  { requireContent: false, timeoutMs: roundTimeoutMs }
794
806
  );
795
807
  const assistantMessage = extractAssistantMessage(llmResponse);
@@ -845,7 +857,10 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
845
857
  content: `Tool execution failed: ${error?.message ?? String(error)}`
846
858
  }));
847
859
  }
848
- const assistantWithTools = Array.isArray(assistantMessage.tool_calls) && assistantMessage.tool_calls.length > 0 ? assistantMessage : { ...assistantMessage, tool_calls: toolCalls };
860
+ const nativeCalls = Array.isArray(assistantMessage.tool_calls) ? assistantMessage.tool_calls : [];
861
+ const nativeIds = new Set(nativeCalls.map((tc) => tc && tc.id));
862
+ const synthesized = toolCalls.filter((tc) => !nativeIds.has(tc && tc.id));
863
+ const assistantWithTools = synthesized.length === 0 ? assistantMessage : { ...assistantMessage, tool_calls: [...nativeCalls, ...synthesized] };
849
864
  messages = [...messages.slice(0, -1), assistantWithTools, ...toolResults];
850
865
  }
851
866
  throw new Error(`AGENTIC_LOOP_EXCEEDED: no finish/skip-push decision within ${maxToolIterations} LLM round(s)`);
@@ -2262,7 +2277,7 @@ function createClientStateHandler(ctx) {
2262
2277
  }
2263
2278
 
2264
2279
  // src/server/lib/version.js
2265
- var SERVER_VERSION = true ? "2.6.0-next.7" : "0.0.0-dev";
2280
+ var SERVER_VERSION = true ? "2.6.0-next.8" : "0.0.0-dev";
2266
2281
 
2267
2282
  // src/server/handlers/capabilities.js
2268
2283
  var SERVER_FEATURES = Object.freeze([
@@ -2272,6 +2287,7 @@ var SERVER_FEATURES = Object.freeze([
2272
2287
  "agentic-hooks",
2273
2288
  "agentic-scratch",
2274
2289
  "agentic-write-state",
2290
+ "agentic-fire-tools",
2275
2291
  "vapid-public-key"
2276
2292
  ]);
2277
2293
  function createCapabilitiesHandler(ctx) {
@@ -777,6 +777,9 @@ async function callLlm(payload, options = {}) {
777
777
  * - include it only when payload.maxTokens is provided
778
778
  * - omit it when payload.maxTokens is undefined / null
779
779
  *
780
+ * `tools` / `tool_choice` are optional as well: forwarded only when the
781
+ * caller passes a non-empty payload.tools.
782
+ *
780
783
  * @param {Object} payload
781
784
  * @returns {Object}
782
785
  */
@@ -804,6 +807,18 @@ function buildAiRequestBody(payload) {
804
807
  requestBody.temperature = 0.8;
805
808
  }
806
809
 
810
+ // tools mode (added in v2.6.0): forward the caller's OpenAI tools array
811
+ // verbatim — same philosophy as messages mode above. The agentic loop
812
+ // already appends assistant tool_calls + role:'tool' results; this is
813
+ // the request-side half of the same protocol. An empty array is treated
814
+ // as "no tools" because some OpenAI-compatible relays reject `tools: []`.
815
+ if (Array.isArray(payload.tools) && payload.tools.length > 0) {
816
+ requestBody.tools = payload.tools;
817
+ if (payload.toolChoice !== undefined && payload.toolChoice !== null) {
818
+ requestBody.tool_choice = payload.toolChoice;
819
+ }
820
+ }
821
+
807
822
  if (payload.maxTokens === undefined || payload.maxTokens === null) {
808
823
  return requestBody;
809
824
  }
@@ -1163,6 +1178,11 @@ async function writeClientStateEntries({ db, userId, userKey, entries }) {
1163
1178
  * 不用再自己维护 Map<sessionId, state>。fire 结束(finish / skip-push /
1164
1179
  * 抛错 / 轮数超限)后随调用栈丢弃;库不读不写、不落库、不打日志。
1165
1180
  *
1181
+ * 工具声明:onBeforeFire 的返回值里可以带 `tools`(OpenAI 的 tools 数组,
1182
+ * 另有可选的 `toolChoice`),本次 fire 的每一轮 LLM 请求都原样带上它们——
1183
+ * 补完那轮模型仍可能再发起调用。库不看 tools 的内容,执行照旧是
1184
+ * executeToolCalls 的事。
1185
+ *
1166
1186
  * Budget guards, both factory-level (ctx.maxToolIterations /
1167
1187
  * ctx.totalTimeoutMs) and per-fire (onBeforeFire may return
1168
1188
  * { messages, maxToolIterations?, totalTimeoutMs? } to override for one
@@ -1231,10 +1251,12 @@ function normalizeBeforeFireResult(result) {
1231
1251
  messages: result.messages,
1232
1252
  maxToolIterations: result.maxToolIterations,
1233
1253
  totalTimeoutMs: result.totalTimeoutMs,
1254
+ tools: Array.isArray(result.tools) && result.tools.length > 0 ? result.tools : undefined,
1255
+ toolChoice: result.toolChoice,
1234
1256
  };
1235
1257
  }
1236
1258
  throw new TypeError(
1237
- 'AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs? } | { skip: true } | null'
1259
+ 'AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs?, tools?, toolChoice? } | { skip: true } | null'
1238
1260
  );
1239
1261
  }
1240
1262
 
@@ -1430,7 +1452,11 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
1430
1452
  // must not outlive totalTimeoutMs waiting for its own 300s abort.
1431
1453
  const roundTimeoutMs = Math.max(1, Math.min(300_000, deadline - nowFn()));
1432
1454
  const { response: llmResponse } = await callLlm(
1433
- { ...decryptedPayload, messages },
1455
+ {
1456
+ ...decryptedPayload,
1457
+ messages,
1458
+ ...(normalized.tools ? { tools: normalized.tools, toolChoice: normalized.toolChoice } : {}),
1459
+ },
1434
1460
  { requireContent: false, timeoutMs: roundTimeoutMs }
1435
1461
  );
1436
1462
 
@@ -1505,10 +1531,17 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
1505
1531
 
1506
1532
  // Text-protocol classifiers synthesize toolCalls the raw assistant
1507
1533
  // message doesn't carry; stamp them on so the appended role:'tool'
1508
- // results stay valid for OpenAI-compatible APIs.
1509
- const assistantWithTools = Array.isArray(assistantMessage.tool_calls) && assistantMessage.tool_calls.length > 0
1534
+ // results stay valid for OpenAI-compatible APIs. Merge rather than pick
1535
+ // one side: when a native tool_call and a synthesized one land in the
1536
+ // same round, both need their id on the assistant turn, or the half
1537
+ // that's missing leaves an orphan role:'tool' and a strict relay
1538
+ // rejects the next round.
1539
+ const nativeCalls = Array.isArray(assistantMessage.tool_calls) ? assistantMessage.tool_calls : [];
1540
+ const nativeIds = new Set(nativeCalls.map((tc) => tc && tc.id));
1541
+ const synthesized = toolCalls.filter((tc) => !nativeIds.has(tc && tc.id));
1542
+ const assistantWithTools = synthesized.length === 0
1510
1543
  ? assistantMessage
1511
- : { ...assistantMessage, tool_calls: toolCalls };
1544
+ : { ...assistantMessage, tool_calls: [...nativeCalls, ...synthesized] };
1512
1545
  messages = [...messages.slice(0, -1), assistantWithTools, ...toolResults];
1513
1546
  }
1514
1547
 
@@ -3539,6 +3572,7 @@ const SERVER_FEATURES = Object.freeze([
3539
3572
  'agentic-hooks',
3540
3573
  'agentic-scratch',
3541
3574
  'agentic-write-state',
3575
+ 'agentic-fire-tools',
3542
3576
  'vapid-public-key',
3543
3577
  ]);
3544
3578
 
@@ -777,6 +777,9 @@ async function callLlm(payload, options = {}) {
777
777
  * - include it only when payload.maxTokens is provided
778
778
  * - omit it when payload.maxTokens is undefined / null
779
779
  *
780
+ * `tools` / `tool_choice` are optional as well: forwarded only when the
781
+ * caller passes a non-empty payload.tools.
782
+ *
780
783
  * @param {Object} payload
781
784
  * @returns {Object}
782
785
  */
@@ -804,6 +807,18 @@ function buildAiRequestBody(payload) {
804
807
  requestBody.temperature = 0.8;
805
808
  }
806
809
 
810
+ // tools mode (added in v2.6.0): forward the caller's OpenAI tools array
811
+ // verbatim — same philosophy as messages mode above. The agentic loop
812
+ // already appends assistant tool_calls + role:'tool' results; this is
813
+ // the request-side half of the same protocol. An empty array is treated
814
+ // as "no tools" because some OpenAI-compatible relays reject `tools: []`.
815
+ if (Array.isArray(payload.tools) && payload.tools.length > 0) {
816
+ requestBody.tools = payload.tools;
817
+ if (payload.toolChoice !== undefined && payload.toolChoice !== null) {
818
+ requestBody.tool_choice = payload.toolChoice;
819
+ }
820
+ }
821
+
807
822
  if (payload.maxTokens === undefined || payload.maxTokens === null) {
808
823
  return requestBody;
809
824
  }
@@ -1163,6 +1178,11 @@ async function writeClientStateEntries({ db, userId, userKey, entries }) {
1163
1178
  * 不用再自己维护 Map<sessionId, state>。fire 结束(finish / skip-push /
1164
1179
  * 抛错 / 轮数超限)后随调用栈丢弃;库不读不写、不落库、不打日志。
1165
1180
  *
1181
+ * 工具声明:onBeforeFire 的返回值里可以带 `tools`(OpenAI 的 tools 数组,
1182
+ * 另有可选的 `toolChoice`),本次 fire 的每一轮 LLM 请求都原样带上它们——
1183
+ * 补完那轮模型仍可能再发起调用。库不看 tools 的内容,执行照旧是
1184
+ * executeToolCalls 的事。
1185
+ *
1166
1186
  * Budget guards, both factory-level (ctx.maxToolIterations /
1167
1187
  * ctx.totalTimeoutMs) and per-fire (onBeforeFire may return
1168
1188
  * { messages, maxToolIterations?, totalTimeoutMs? } to override for one
@@ -1231,10 +1251,12 @@ function normalizeBeforeFireResult(result) {
1231
1251
  messages: result.messages,
1232
1252
  maxToolIterations: result.maxToolIterations,
1233
1253
  totalTimeoutMs: result.totalTimeoutMs,
1254
+ tools: Array.isArray(result.tools) && result.tools.length > 0 ? result.tools : undefined,
1255
+ toolChoice: result.toolChoice,
1234
1256
  };
1235
1257
  }
1236
1258
  throw new TypeError(
1237
- 'AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs? } | { skip: true } | null'
1259
+ 'AGENTIC_BAD_BEFORE_FIRE: onBeforeFire must return ChatMessage[] | { messages, maxToolIterations?, totalTimeoutMs?, tools?, toolChoice? } | { skip: true } | null'
1238
1260
  );
1239
1261
  }
1240
1262
 
@@ -1430,7 +1452,11 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
1430
1452
  // must not outlive totalTimeoutMs waiting for its own 300s abort.
1431
1453
  const roundTimeoutMs = Math.max(1, Math.min(300_000, deadline - nowFn()));
1432
1454
  const { response: llmResponse } = await callLlm(
1433
- { ...decryptedPayload, messages },
1455
+ {
1456
+ ...decryptedPayload,
1457
+ messages,
1458
+ ...(normalized.tools ? { tools: normalized.tools, toolChoice: normalized.toolChoice } : {}),
1459
+ },
1434
1460
  { requireContent: false, timeoutMs: roundTimeoutMs }
1435
1461
  );
1436
1462
 
@@ -1505,10 +1531,17 @@ async function runAgenticFire({ task, decryptedPayload, userKey, ctx }) {
1505
1531
 
1506
1532
  // Text-protocol classifiers synthesize toolCalls the raw assistant
1507
1533
  // message doesn't carry; stamp them on so the appended role:'tool'
1508
- // results stay valid for OpenAI-compatible APIs.
1509
- const assistantWithTools = Array.isArray(assistantMessage.tool_calls) && assistantMessage.tool_calls.length > 0
1534
+ // results stay valid for OpenAI-compatible APIs. Merge rather than pick
1535
+ // one side: when a native tool_call and a synthesized one land in the
1536
+ // same round, both need their id on the assistant turn, or the half
1537
+ // that's missing leaves an orphan role:'tool' and a strict relay
1538
+ // rejects the next round.
1539
+ const nativeCalls = Array.isArray(assistantMessage.tool_calls) ? assistantMessage.tool_calls : [];
1540
+ const nativeIds = new Set(nativeCalls.map((tc) => tc && tc.id));
1541
+ const synthesized = toolCalls.filter((tc) => !nativeIds.has(tc && tc.id));
1542
+ const assistantWithTools = synthesized.length === 0
1510
1543
  ? assistantMessage
1511
- : { ...assistantMessage, tool_calls: toolCalls };
1544
+ : { ...assistantMessage, tool_calls: [...nativeCalls, ...synthesized] };
1512
1545
  messages = [...messages.slice(0, -1), assistantWithTools, ...toolResults];
1513
1546
  }
1514
1547
 
@@ -3539,6 +3572,7 @@ const SERVER_FEATURES = Object.freeze([
3539
3572
  'agentic-hooks',
3540
3573
  'agentic-scratch',
3541
3574
  'agentic-write-state',
3575
+ 'agentic-fire-tools',
3542
3576
  'vapid-public-key',
3543
3577
  ]);
3544
3578
 
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- var _chunkYQPWXPINcjs = require('./chunk-YQPWXPIN.cjs');
15
+ var _chunkHQHRXSQAcjs = require('./chunk-HQHRXSQA.cjs');
16
16
 
17
17
 
18
18
 
@@ -27,4 +27,4 @@ var _chunkYQPWXPINcjs = require('./chunk-YQPWXPIN.cjs');
27
27
 
28
28
 
29
29
 
30
- exports.MAX_PUSH_PAYLOAD_BYTES = _chunkYQPWXPINcjs.MAX_PUSH_PAYLOAD_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkYQPWXPINcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkYQPWXPINcjs.WEB_PUSH_MAX_BODY_BYTES; exports.createD1Adapter = _chunkYQPWXPINcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkYQPWXPINcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkYQPWXPINcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkYQPWXPINcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkYQPWXPINcjs.decryptFromStorage; exports.decryptPayload = _chunkYQPWXPINcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkYQPWXPINcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkYQPWXPINcjs.encryptForStorage; exports.measurePushPayload = _chunkYQPWXPINcjs.measurePushPayload; exports.runScheduledTick = _chunkYQPWXPINcjs.runScheduledTick;
30
+ exports.MAX_PUSH_PAYLOAD_BYTES = _chunkHQHRXSQAcjs.MAX_PUSH_PAYLOAD_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_MAX_BODY_BYTES; exports.createD1Adapter = _chunkHQHRXSQAcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkHQHRXSQAcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkHQHRXSQAcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkHQHRXSQAcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkHQHRXSQAcjs.decryptFromStorage; exports.decryptPayload = _chunkHQHRXSQAcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkHQHRXSQAcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkHQHRXSQAcjs.encryptForStorage; exports.measurePushPayload = _chunkHQHRXSQAcjs.measurePushPayload; exports.runScheduledTick = _chunkHQHRXSQAcjs.runScheduledTick;
@@ -1,2 +1,2 @@
1
- export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, v as measurePushPayload, r as runScheduledTick } from './cloudflare-BBPmRS2L.cjs';
1
+ export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, v as measurePushPayload, r as runScheduledTick } from './cloudflare-CH3dBl5b.cjs';
2
2
  import '@rei-standard/amsg-shared';
@@ -1,2 +1,2 @@
1
- export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, v as measurePushPayload, r as runScheduledTick } from './cloudflare-BBPmRS2L.js';
1
+ export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, v as measurePushPayload, r as runScheduledTick } from './cloudflare-CH3dBl5b.js';
2
2
  import '@rei-standard/amsg-shared';
@@ -12,7 +12,7 @@ import {
12
12
  encryptForStorage,
13
13
  measurePushPayload,
14
14
  runScheduledTick
15
- } from "./chunk-I7EUMYQ4.mjs";
15
+ } from "./chunk-LEE5KQ7Y.mjs";
16
16
  export {
17
17
  MAX_PUSH_PAYLOAD_BYTES,
18
18
  WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
package/dist/index.cjs CHANGED
@@ -27,7 +27,7 @@
27
27
 
28
28
 
29
29
 
30
- var _chunkYQPWXPINcjs = require('./chunk-YQPWXPIN.cjs');
30
+ var _chunkHQHRXSQAcjs = require('./chunk-HQHRXSQA.cjs');
31
31
 
32
32
  // src/server/adapters/factory.js
33
33
  async function createAdapter(config) {
@@ -60,7 +60,7 @@ async function createAdapter(config) {
60
60
  // src/server/handlers/init-tenant.js
61
61
  function createInitTenantHandler(ctx) {
62
62
  async function POST(headers, body) {
63
- const initSecret = _chunkYQPWXPINcjs.getHeader.call(void 0, headers, "x-init-secret");
63
+ const initSecret = _chunkHQHRXSQAcjs.getHeader.call(void 0, headers, "x-init-secret");
64
64
  if (ctx.tenant.initSecret && initSecret !== ctx.tenant.initSecret) {
65
65
  return {
66
66
  status: 401,
@@ -73,7 +73,7 @@ function createInitTenantHandler(ctx) {
73
73
  }
74
74
  };
75
75
  }
76
- const parsed = _chunkYQPWXPINcjs.parseJsonBody.call(void 0, body);
76
+ const parsed = _chunkHQHRXSQAcjs.parseJsonBody.call(void 0, body);
77
77
  if (!parsed.ok) {
78
78
  return {
79
79
  status: 400,
@@ -87,7 +87,7 @@ function createInitTenantHandler(ctx) {
87
87
  const tenantId = payload.tenantId || void 0;
88
88
  const driver = payload.driver;
89
89
  const databaseUrl = payload.databaseUrl || payload.connectionString;
90
- if (tenantId && !_chunkYQPWXPINcjs.isValidUUIDv4.call(void 0, tenantId)) {
90
+ if (tenantId && !_chunkHQHRXSQAcjs.isValidUUIDv4.call(void 0, tenantId)) {
91
91
  return {
92
92
  status: 400,
93
93
  body: {
@@ -207,7 +207,7 @@ function createSendNotificationsHandler(ctx) {
207
207
  }
208
208
  };
209
209
  }
210
- const data = await _chunkYQPWXPINcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
210
+ const data = await _chunkHQHRXSQAcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
211
211
  return { status: 200, body: { success: true, data } };
212
212
  }
213
213
  return { POST };
@@ -579,12 +579,12 @@ async function createReiServer(config) {
579
579
  return {
580
580
  handlers: {
581
581
  initTenant: createInitTenantHandler(ctx),
582
- getUserKey: _chunkYQPWXPINcjs.createGetUserKeyHandler.call(void 0, ctx),
583
- scheduleMessage: _chunkYQPWXPINcjs.createScheduleMessageHandler.call(void 0, ctx),
582
+ getUserKey: _chunkHQHRXSQAcjs.createGetUserKeyHandler.call(void 0, ctx),
583
+ scheduleMessage: _chunkHQHRXSQAcjs.createScheduleMessageHandler.call(void 0, ctx),
584
584
  sendNotifications: createSendNotificationsHandler(ctx),
585
- updateMessage: _chunkYQPWXPINcjs.createUpdateMessageHandler.call(void 0, ctx),
586
- cancelMessage: _chunkYQPWXPINcjs.createCancelMessageHandler.call(void 0, ctx),
587
- messages: _chunkYQPWXPINcjs.createMessagesHandler.call(void 0, ctx)
585
+ updateMessage: _chunkHQHRXSQAcjs.createUpdateMessageHandler.call(void 0, ctx),
586
+ cancelMessage: _chunkHQHRXSQAcjs.createCancelMessageHandler.call(void 0, ctx),
587
+ messages: _chunkHQHRXSQAcjs.createMessagesHandler.call(void 0, ctx)
588
588
  }
589
589
  };
590
590
  }
@@ -614,4 +614,4 @@ async function createReiServer(config) {
614
614
 
615
615
 
616
616
 
617
- exports.MAX_PUSH_PAYLOAD_BYTES = _chunkYQPWXPINcjs.MAX_PUSH_PAYLOAD_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkYQPWXPINcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkYQPWXPINcjs.WEB_PUSH_MAX_BODY_BYTES; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkYQPWXPINcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkYQPWXPINcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkYQPWXPINcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkYQPWXPINcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkYQPWXPINcjs.decryptFromStorage; exports.decryptPayload = _chunkYQPWXPINcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkYQPWXPINcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkYQPWXPINcjs.encryptForStorage; exports.isValidISO8601 = _chunkYQPWXPINcjs.isValidISO8601; exports.isValidUUID = _chunkYQPWXPINcjs.isValidUUID; exports.isValidUUIDv4 = _chunkYQPWXPINcjs.isValidUUIDv4; exports.isValidUrl = _chunkYQPWXPINcjs.isValidUrl; exports.measurePushPayload = _chunkYQPWXPINcjs.measurePushPayload; exports.runScheduledTick = _chunkYQPWXPINcjs.runScheduledTick; exports.validateAvatarUrl = _chunkYQPWXPINcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunkYQPWXPINcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkYQPWXPINcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkYQPWXPINcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;
617
+ exports.MAX_PUSH_PAYLOAD_BYTES = _chunkHQHRXSQAcjs.MAX_PUSH_PAYLOAD_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_MAX_BODY_BYTES; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkHQHRXSQAcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkHQHRXSQAcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkHQHRXSQAcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkHQHRXSQAcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkHQHRXSQAcjs.decryptFromStorage; exports.decryptPayload = _chunkHQHRXSQAcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkHQHRXSQAcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkHQHRXSQAcjs.encryptForStorage; exports.isValidISO8601 = _chunkHQHRXSQAcjs.isValidISO8601; exports.isValidUUID = _chunkHQHRXSQAcjs.isValidUUID; exports.isValidUUIDv4 = _chunkHQHRXSQAcjs.isValidUUIDv4; exports.isValidUrl = _chunkHQHRXSQAcjs.isValidUrl; exports.measurePushPayload = _chunkHQHRXSQAcjs.measurePushPayload; exports.runScheduledTick = _chunkHQHRXSQAcjs.runScheduledTick; exports.validateAvatarUrl = _chunkHQHRXSQAcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunkHQHRXSQAcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkHQHRXSQAcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkHQHRXSQAcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { g as getHeader, p as parseJsonBody, i as isValidUUIDv4, r as runScheduledTick, c as createMessagesHandler, a as createCancelMessageHandler, b as createUpdateMessageHandler, d as createScheduleMessageHandler, e as createGetUserKeyHandler } from './cloudflare-BBPmRS2L.cjs';
2
- export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, s as isValidISO8601, t as isValidUUID, u as isValidUrl, v as measurePushPayload, w as validateLlmMessagesArray, x as validateScheduleMessagePayload, y as validateSplitPattern } from './cloudflare-BBPmRS2L.cjs';
1
+ import { g as getHeader, p as parseJsonBody, i as isValidUUIDv4, r as runScheduledTick, c as createMessagesHandler, a as createCancelMessageHandler, b as createUpdateMessageHandler, d as createScheduleMessageHandler, e as createGetUserKeyHandler } from './cloudflare-CH3dBl5b.cjs';
2
+ export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, s as isValidISO8601, t as isValidUUID, u as isValidUrl, v as measurePushPayload, w as validateLlmMessagesArray, x as validateScheduleMessagePayload, y as validateSplitPattern } from './cloudflare-CH3dBl5b.cjs';
3
3
  import { createHash, randomBytes, createCipheriv, createDecipheriv, timingSafeEqual, createHmac, randomUUID } from 'crypto';
4
4
  import { normalizeVapidSubject } from '@rei-standard/amsg-shared';
5
5
  export { validateAvatarUrl } from '@rei-standard/amsg-shared';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { g as getHeader, p as parseJsonBody, i as isValidUUIDv4, r as runScheduledTick, c as createMessagesHandler, a as createCancelMessageHandler, b as createUpdateMessageHandler, d as createScheduleMessageHandler, e as createGetUserKeyHandler } from './cloudflare-BBPmRS2L.js';
2
- export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, s as isValidISO8601, t as isValidUUID, u as isValidUrl, v as measurePushPayload, w as validateLlmMessagesArray, x as validateScheduleMessagePayload, y as validateSplitPattern } from './cloudflare-BBPmRS2L.js';
1
+ import { g as getHeader, p as parseJsonBody, i as isValidUUIDv4, r as runScheduledTick, c as createMessagesHandler, a as createCancelMessageHandler, b as createUpdateMessageHandler, d as createScheduleMessageHandler, e as createGetUserKeyHandler } from './cloudflare-CH3dBl5b.js';
2
+ export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, s as isValidISO8601, t as isValidUUID, u as isValidUrl, v as measurePushPayload, w as validateLlmMessagesArray, x as validateScheduleMessagePayload, y as validateSplitPattern } from './cloudflare-CH3dBl5b.js';
3
3
  import { createHash, randomBytes, createCipheriv, createDecipheriv, timingSafeEqual, createHmac, randomUUID } from 'crypto';
4
4
  import { normalizeVapidSubject } from '@rei-standard/amsg-shared';
5
5
  export { validateAvatarUrl } from '@rei-standard/amsg-shared';
package/dist/index.mjs CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  validateLlmMessagesArray,
28
28
  validateScheduleMessagePayload,
29
29
  validateSplitPattern
30
- } from "./chunk-I7EUMYQ4.mjs";
30
+ } from "./chunk-LEE5KQ7Y.mjs";
31
31
 
32
32
  // src/server/adapters/factory.js
33
33
  async function createAdapter(config) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rei-standard/amsg-server",
3
- "version": "2.6.0-next.7",
3
+ "version": "2.6.0-next.8",
4
4
  "description": "ReiStandard Active Messaging server SDK with pluggable database adapters. Three-axis push schema (messageKind / messageType / messageSubtype) from @rei-standard/amsg-shared. Auto-emits ReasoningPush when the LLM response carries reasoning_content.",
5
5
  "repository": {
6
6
  "type": "git",