@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.
- package/dist/{chunk-YQPWXPIN.cjs → chunk-HQHRXSQA.cjs} +21 -5
- package/dist/{chunk-I7EUMYQ4.mjs → chunk-LEE5KQ7Y.mjs} +21 -5
- package/dist/{cloudflare-BBPmRS2L.d.cts → cloudflare-CH3dBl5b.d.cts} +39 -5
- package/dist/{cloudflare-BBPmRS2L.d.ts → cloudflare-CH3dBl5b.d.ts} +39 -5
- package/dist/cloudflare.cjs +2 -2
- package/dist/cloudflare.d.cts +1 -1
- package/dist/cloudflare.d.ts +1 -1
- package/dist/cloudflare.mjs +1 -1
- package/dist/index.cjs +11 -11
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
{
|
|
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
|
|
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.
|
|
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
|
-
{
|
|
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
|
|
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.
|
|
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
|
-
{
|
|
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
|
-
|
|
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:
|
|
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
|
-
{
|
|
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
|
-
|
|
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:
|
|
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
|
|
package/dist/cloudflare.cjs
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
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 =
|
|
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;
|
package/dist/cloudflare.d.cts
CHANGED
|
@@ -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-
|
|
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';
|
package/dist/cloudflare.d.ts
CHANGED
|
@@ -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-
|
|
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';
|
package/dist/cloudflare.mjs
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
var
|
|
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 =
|
|
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 =
|
|
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 && !
|
|
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
|
|
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:
|
|
583
|
-
scheduleMessage:
|
|
582
|
+
getUserKey: _chunkHQHRXSQAcjs.createGetUserKeyHandler.call(void 0, ctx),
|
|
583
|
+
scheduleMessage: _chunkHQHRXSQAcjs.createScheduleMessageHandler.call(void 0, ctx),
|
|
584
584
|
sendNotifications: createSendNotificationsHandler(ctx),
|
|
585
|
-
updateMessage:
|
|
586
|
-
cancelMessage:
|
|
587
|
-
messages:
|
|
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 =
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rei-standard/amsg-server",
|
|
3
|
-
"version": "2.6.0-next.
|
|
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",
|