@ai-setting/roy-agent-core 1.7.46 → 1.7.47
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/config/index.js +4 -4
- package/dist/env/agent/index.js +7 -7
- package/dist/env/commands/index.js +4 -4
- package/dist/env/debug/index.js +4 -4
- package/dist/env/event-source/index.js +8 -7
- package/dist/env/hook/index.js +2 -2
- package/dist/env/index.js +24 -23
- package/dist/env/llm/index.js +5 -5
- package/dist/env/log-trace/index.js +4 -4
- package/dist/env/mcp/index.js +4 -4
- package/dist/env/memory/index.js +4 -4
- package/dist/env/plugin/index.js +8 -6
- package/dist/env/prompt/index.js +4 -4
- package/dist/env/session/index.js +7 -7
- package/dist/env/session/storage/index.js +3 -3
- package/dist/env/skill/index.js +4 -4
- package/dist/env/task/delegate/index.js +2 -2
- package/dist/env/task/index.js +6 -6
- package/dist/env/task/plugins/index.js +2 -2
- package/dist/env/task/storage/index.js +1 -1
- package/dist/env/tool/index.js +4 -4
- package/dist/env/workflow/engine/index.js +3 -3
- package/dist/env/workflow/index.js +11 -11
- package/dist/env/workflow/tools/index.js +8 -8
- package/dist/index.js +31 -30
- package/dist/shared/@ai-setting/{roy-agent-core-cysnmvcy.js → roy-agent-core-0r90298w.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-qfktfbrr.js → roy-agent-core-1rm32m5t.js} +3 -3
- package/dist/shared/@ai-setting/{roy-agent-core-a236mps6.js → roy-agent-core-3j4by8rj.js} +35 -2
- package/dist/shared/@ai-setting/{roy-agent-core-wybj8emq.js → roy-agent-core-4m02hnqf.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-jawzpf5k.js → roy-agent-core-4nnv0dze.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-cw89yj9d.js → roy-agent-core-54wzmvnb.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-jjw7xcxv.js → roy-agent-core-55hkeft7.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-rmn29nrh.js → roy-agent-core-64f22h1g.js} +1 -11
- package/dist/shared/@ai-setting/{roy-agent-core-12d4qzmw.js → roy-agent-core-7p5zf8ay.js} +4 -4
- package/dist/shared/@ai-setting/{roy-agent-core-qhw8jp6j.js → roy-agent-core-83mk8wrn.js} +2 -2
- package/dist/shared/@ai-setting/roy-agent-core-ajtsk20z.js +2396 -0
- package/dist/shared/@ai-setting/{roy-agent-core-pc8x07p0.js → roy-agent-core-amp8qckb.js} +1 -1
- package/dist/shared/@ai-setting/roy-agent-core-az13yzmc.js +11 -0
- package/dist/shared/@ai-setting/{roy-agent-core-2f2nqx7g.js → roy-agent-core-b09eqhhz.js} +86 -60
- package/dist/shared/@ai-setting/{roy-agent-core-4w5vdzg8.js → roy-agent-core-bjrtwfta.js} +41 -6
- package/dist/shared/@ai-setting/{roy-agent-core-ts56bz5e.js → roy-agent-core-d94ddn0r.js} +3 -3
- package/dist/shared/@ai-setting/{roy-agent-core-rczz7e81.js → roy-agent-core-dabnevwe.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-9t675te0.js → roy-agent-core-ead21w5c.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-xv7k1p2j.js → roy-agent-core-gy1zfe0d.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-4eke3pd4.js → roy-agent-core-h93v6p6y.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-f18jk3cw.js → roy-agent-core-hxazjj4p.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-3h7ajma5.js → roy-agent-core-jfptxs4f.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-4m0t4y9w.js → roy-agent-core-nvcqp6p9.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-jadrj0bz.js → roy-agent-core-p1p9mr8f.js} +13 -0
- package/dist/shared/@ai-setting/{roy-agent-core-ykrcrktp.js → roy-agent-core-pk1b3kvf.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-n1ceexfz.js → roy-agent-core-qvaqmj3f.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-6mnwqcqf.js → roy-agent-core-v5vs1jby.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-9jmzyc8t.js → roy-agent-core-y1fp2mgf.js} +6 -31
- package/dist/shared/@ai-setting/{roy-agent-core-asxe1nt4.js → roy-agent-core-ygnva439.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-8xgk89y4.js → roy-agent-core-yjqj3taz.js} +4 -4
- package/dist/shared/@ai-setting/{roy-agent-core-2ccy0zd2.js → roy-agent-core-zrgaemma.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-r4z6h3ch.js → roy-agent-core-zy3hqfwg.js} +197 -19
- package/package.json +1 -1
- package/dist/shared/@ai-setting/roy-agent-core-0zgcfcnq.js +0 -1720
|
@@ -60,18 +60,212 @@ function buildOpencodeHeaders(providerId, conversationId, baseURL) {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
// src/env/llm/invoke.ts
|
|
63
|
-
init_logger();
|
|
64
63
|
import { randomUUID } from "crypto";
|
|
65
64
|
import { streamText, jsonSchema } from "ai";
|
|
66
65
|
import { createOpenAI } from "@ai-sdk/openai";
|
|
67
66
|
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
68
67
|
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
|
69
68
|
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
69
|
+
|
|
70
|
+
// src/env/llm/tool-schema.ts
|
|
70
71
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
72
|
+
function isZodSchema(obj) {
|
|
73
|
+
return !!obj && typeof obj === "object" && "_def" in obj;
|
|
74
|
+
}
|
|
75
|
+
function dereference(node, root, seenRefs = new Set) {
|
|
76
|
+
if (Array.isArray(node)) {
|
|
77
|
+
return node.map((n) => dereference(n, root, seenRefs));
|
|
78
|
+
}
|
|
79
|
+
if (!node || typeof node !== "object")
|
|
80
|
+
return node;
|
|
81
|
+
const obj = node;
|
|
82
|
+
const ref = obj["$ref"];
|
|
83
|
+
if (typeof ref === "string" && ref.startsWith("#/")) {
|
|
84
|
+
if (seenRefs.has(ref)) {
|
|
85
|
+
return { type: "object" };
|
|
86
|
+
}
|
|
87
|
+
const target = resolvePointer(root, ref);
|
|
88
|
+
if (target === undefined) {
|
|
89
|
+
return { type: "object" };
|
|
90
|
+
}
|
|
91
|
+
const nextSeen = new Set(seenRefs);
|
|
92
|
+
nextSeen.add(ref);
|
|
93
|
+
const resolved = dereference(target, root, nextSeen);
|
|
94
|
+
const { $ref: _drop, ...rest } = obj;
|
|
95
|
+
if (resolved && typeof resolved === "object" && !Array.isArray(resolved)) {
|
|
96
|
+
return { ...resolved, ...rest };
|
|
97
|
+
}
|
|
98
|
+
return resolved;
|
|
99
|
+
}
|
|
100
|
+
const out = {};
|
|
101
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
102
|
+
if (k === "definitions" || k === "$defs" || k === "$schema")
|
|
103
|
+
continue;
|
|
104
|
+
out[k] = dereference(v, root, seenRefs);
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
function resolvePointer(root, ref) {
|
|
109
|
+
const path = ref.replace(/^#\//, "").split("/").filter((s) => s.length > 0);
|
|
110
|
+
let cur = root;
|
|
111
|
+
for (const rawSeg of path) {
|
|
112
|
+
const seg = rawSeg.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
113
|
+
if (cur === null || cur === undefined || typeof cur !== "object")
|
|
114
|
+
return;
|
|
115
|
+
cur = cur[seg];
|
|
116
|
+
}
|
|
117
|
+
return cur;
|
|
118
|
+
}
|
|
119
|
+
function toolParametersToJsonSchema(parameters) {
|
|
120
|
+
const EMPTY = {
|
|
121
|
+
type: "object",
|
|
122
|
+
properties: {}
|
|
123
|
+
};
|
|
124
|
+
if (parameters === null || parameters === undefined)
|
|
125
|
+
return EMPTY;
|
|
126
|
+
if (typeof parameters !== "object")
|
|
127
|
+
return EMPTY;
|
|
128
|
+
let raw;
|
|
129
|
+
if (isZodSchema(parameters)) {
|
|
130
|
+
try {
|
|
131
|
+
raw = zodToJsonSchema(parameters, "zod");
|
|
132
|
+
} catch {
|
|
133
|
+
return EMPTY;
|
|
134
|
+
}
|
|
135
|
+
} else {
|
|
136
|
+
raw = JSON.parse(JSON.stringify(parameters));
|
|
137
|
+
}
|
|
138
|
+
const deref = dereference(raw, raw);
|
|
139
|
+
if (deref["type"] !== "object") {
|
|
140
|
+
if (deref["properties"] && typeof deref["properties"] === "object") {
|
|
141
|
+
deref["type"] = "object";
|
|
142
|
+
} else {
|
|
143
|
+
return EMPTY;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!deref["properties"] || typeof deref["properties"] !== "object") {
|
|
147
|
+
deref["properties"] = {};
|
|
148
|
+
}
|
|
149
|
+
delete deref["definitions"];
|
|
150
|
+
delete deref["$defs"];
|
|
151
|
+
delete deref["$schema"];
|
|
152
|
+
return deref;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// src/env/llm/invoke.ts
|
|
156
|
+
init_logger();
|
|
71
157
|
|
|
72
158
|
// src/env/llm/tool-args-parser.ts
|
|
73
159
|
init_logger();
|
|
74
160
|
var logger = createLogger("llm:tool-args-parser");
|
|
161
|
+
var ARG_KEY_RE = /<arg_key>([\s\S]*?)<\/arg_key>\s*<arg_value>([\s\S]*?)<\/arg_value>/g;
|
|
162
|
+
function salvageTextualToolArgs(raw) {
|
|
163
|
+
if (!raw.includes("<arg_key>"))
|
|
164
|
+
return;
|
|
165
|
+
const out = {};
|
|
166
|
+
let matched = false;
|
|
167
|
+
ARG_KEY_RE.lastIndex = 0;
|
|
168
|
+
let m;
|
|
169
|
+
while ((m = ARG_KEY_RE.exec(raw)) !== null) {
|
|
170
|
+
const key = m[1].trim();
|
|
171
|
+
if (!key)
|
|
172
|
+
continue;
|
|
173
|
+
const value = m[2];
|
|
174
|
+
try {
|
|
175
|
+
out[key] = JSON.parse(value);
|
|
176
|
+
} catch {
|
|
177
|
+
out[key] = value;
|
|
178
|
+
}
|
|
179
|
+
matched = true;
|
|
180
|
+
}
|
|
181
|
+
return matched ? out : undefined;
|
|
182
|
+
}
|
|
183
|
+
function stripTextualToolArgsMarkers(raw) {
|
|
184
|
+
return raw.replace(/<\/?arg_key>/g, "").replace(/<\/?arg_value>/g, "").replace(/<\/?tool_call>/g, "");
|
|
185
|
+
}
|
|
186
|
+
function parseToolArgsStrict(args) {
|
|
187
|
+
if (args && typeof args === "object" && !Array.isArray(args)) {
|
|
188
|
+
return { ok: true, args };
|
|
189
|
+
}
|
|
190
|
+
if (typeof args !== "string") {
|
|
191
|
+
return {
|
|
192
|
+
ok: false,
|
|
193
|
+
args: {},
|
|
194
|
+
error: `tool arguments must be a JSON object, got ${args === null ? "null" : typeof args}`
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const raw = args.trim();
|
|
198
|
+
if (raw.length === 0) {
|
|
199
|
+
return { ok: true, args: {} };
|
|
200
|
+
}
|
|
201
|
+
const direct = tryParseObject(raw);
|
|
202
|
+
if (direct.ok) {
|
|
203
|
+
if (raw.includes("<arg_key>") || raw.includes("<arg_value>") || raw.includes("<tool_call>")) {
|
|
204
|
+
logger.warn("[parseToolArgsStrict] arguments 里出现上游文本工具调用标记,已清洗值中的 marker");
|
|
205
|
+
return { ok: true, args: sanitizeArgValues(direct.args), salvaged: true };
|
|
206
|
+
}
|
|
207
|
+
return { ok: true, args: direct.args };
|
|
208
|
+
}
|
|
209
|
+
if (raw.includes("<arg_key>") || raw.includes("<arg_value>")) {
|
|
210
|
+
const stripped = stripTextualToolArgsMarkers(raw);
|
|
211
|
+
const afterStrip = tryParseObject(stripped);
|
|
212
|
+
if (afterStrip.ok) {
|
|
213
|
+
logger.warn("[parseToolArgsStrict] 上游把文本工具调用标记混进了 arguments,已剥离 marker 后恢复");
|
|
214
|
+
return { ok: true, args: afterStrip.args, salvaged: true };
|
|
215
|
+
}
|
|
216
|
+
const salvaged = salvageTextualToolArgs(raw);
|
|
217
|
+
if (salvaged) {
|
|
218
|
+
logger.warn("[parseToolArgsStrict] 上游输出的是文本工具调用格式,已按 <arg_key>/<arg_value> 重建参数", { keys: Object.keys(salvaged).join(",") });
|
|
219
|
+
return { ok: true, args: salvaged, salvaged: true };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const nested = tryParseObject(raw);
|
|
223
|
+
if (!nested.ok && raw.length > 1) {
|
|
224
|
+
const rec = safeParseToolArgs(raw);
|
|
225
|
+
if (Object.keys(rec).length > 0) {
|
|
226
|
+
return { ok: true, args: rec, salvaged: true };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
ok: false,
|
|
231
|
+
args: {},
|
|
232
|
+
error: "tool arguments 不是合法 JSON(上游模型输出可能已损坏)。请重新调用该工具,确保 arguments 是合法 JSON 对象。" + ` 原始片段:${raw.slice(0, 200)}`
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function sanitizeArgValues(args) {
|
|
236
|
+
const clean = (v) => {
|
|
237
|
+
if (typeof v === "string")
|
|
238
|
+
return stripTextualToolArgsMarkers(v);
|
|
239
|
+
if (Array.isArray(v))
|
|
240
|
+
return v.map(clean);
|
|
241
|
+
if (v && typeof v === "object") {
|
|
242
|
+
const out = {};
|
|
243
|
+
for (const [k, val] of Object.entries(v)) {
|
|
244
|
+
out[k] = clean(val);
|
|
245
|
+
}
|
|
246
|
+
return out;
|
|
247
|
+
}
|
|
248
|
+
return v;
|
|
249
|
+
};
|
|
250
|
+
return clean(args);
|
|
251
|
+
}
|
|
252
|
+
function tryParseObject(raw) {
|
|
253
|
+
try {
|
|
254
|
+
const parsed = JSON.parse(raw);
|
|
255
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
256
|
+
return { ok: true, args: parsed };
|
|
257
|
+
}
|
|
258
|
+
if (typeof parsed === "string") {
|
|
259
|
+
const twice = JSON.parse(parsed);
|
|
260
|
+
if (twice && typeof twice === "object" && !Array.isArray(twice)) {
|
|
261
|
+
return { ok: true, args: twice };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return { ok: false };
|
|
265
|
+
} catch {
|
|
266
|
+
return { ok: false };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
75
269
|
var MAX_SAFE_DEPTH = 5;
|
|
76
270
|
function safeParseToolArgs(args, depth = 0) {
|
|
77
271
|
if (depth >= MAX_SAFE_DEPTH) {
|
|
@@ -448,23 +642,7 @@ function convertToolsToSDK(tools, providerName) {
|
|
|
448
642
|
return result;
|
|
449
643
|
}
|
|
450
644
|
function extractToolSchema(parameters) {
|
|
451
|
-
|
|
452
|
-
const zodSchema = parameters;
|
|
453
|
-
const schema = zodToJsonSchema(zodSchema, "zod");
|
|
454
|
-
if ("$ref" in schema && schema.definitions) {
|
|
455
|
-
const def = schema.definitions.zod;
|
|
456
|
-
if (def && def.type === "object" && def.properties) {
|
|
457
|
-
return {
|
|
458
|
-
type: "object",
|
|
459
|
-
properties: def.properties,
|
|
460
|
-
required: def.required,
|
|
461
|
-
additionalProperties: true
|
|
462
|
-
};
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
return schema;
|
|
466
|
-
}
|
|
467
|
-
return parameters;
|
|
645
|
+
return toolParametersToJsonSchema(parameters);
|
|
468
646
|
}
|
|
469
647
|
function generateProviderOptions(providerType, options) {
|
|
470
648
|
const result = {
|
|
@@ -948,4 +1126,4 @@ function createInvokeConfig(model, apiKey, baseURL) {
|
|
|
948
1126
|
};
|
|
949
1127
|
}
|
|
950
1128
|
|
|
951
|
-
export { safeParseToolArgs, generateOpencodeSessionId, isOpencodeProvider, isOpencodeEndpoint, getOrCreateOpencodeSessionId, buildOpencodeHeaders, canonicalizeParts, withTimeout, parseModelString, convertToSDKMessages, invoke, invokeNonStream, createInvokeConfig };
|
|
1129
|
+
export { toolParametersToJsonSchema, parseToolArgsStrict, safeParseToolArgs, generateOpencodeSessionId, isOpencodeProvider, isOpencodeEndpoint, getOrCreateOpencodeSessionId, buildOpencodeHeaders, canonicalizeParts, withTimeout, parseModelString, convertToSDKMessages, invoke, invokeNonStream, createInvokeConfig };
|