@ai-setting/roy-agent-core 1.7.44 → 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.
Files changed (59) hide show
  1. package/dist/config/index.js +4 -4
  2. package/dist/env/agent/index.js +7 -7
  3. package/dist/env/commands/index.js +4 -4
  4. package/dist/env/debug/index.js +4 -4
  5. package/dist/env/event-source/index.js +8 -7
  6. package/dist/env/hook/index.js +2 -2
  7. package/dist/env/index.js +24 -23
  8. package/dist/env/llm/index.js +15 -5
  9. package/dist/env/log-trace/index.js +4 -4
  10. package/dist/env/mcp/index.js +4 -4
  11. package/dist/env/memory/index.js +4 -4
  12. package/dist/env/plugin/index.js +8 -6
  13. package/dist/env/prompt/index.js +4 -4
  14. package/dist/env/session/index.js +7 -7
  15. package/dist/env/session/storage/index.js +3 -3
  16. package/dist/env/skill/index.js +4 -4
  17. package/dist/env/task/delegate/index.js +2 -2
  18. package/dist/env/task/index.js +6 -6
  19. package/dist/env/task/plugins/index.js +2 -2
  20. package/dist/env/task/storage/index.js +1 -1
  21. package/dist/env/tool/index.js +4 -4
  22. package/dist/env/workflow/engine/index.js +3 -3
  23. package/dist/env/workflow/index.js +11 -11
  24. package/dist/env/workflow/tools/index.js +8 -8
  25. package/dist/index.js +37 -30
  26. package/dist/shared/@ai-setting/{roy-agent-core-cysnmvcy.js → roy-agent-core-0r90298w.js} +1 -1
  27. package/dist/shared/@ai-setting/{roy-agent-core-qfktfbrr.js → roy-agent-core-1rm32m5t.js} +3 -3
  28. package/dist/shared/@ai-setting/{roy-agent-core-a236mps6.js → roy-agent-core-3j4by8rj.js} +35 -2
  29. package/dist/shared/@ai-setting/{roy-agent-core-wybj8emq.js → roy-agent-core-4m02hnqf.js} +1 -1
  30. package/dist/shared/@ai-setting/{roy-agent-core-jawzpf5k.js → roy-agent-core-4nnv0dze.js} +1 -1
  31. package/dist/shared/@ai-setting/{roy-agent-core-cw89yj9d.js → roy-agent-core-54wzmvnb.js} +1 -1
  32. package/dist/shared/@ai-setting/{roy-agent-core-jjw7xcxv.js → roy-agent-core-55hkeft7.js} +2 -2
  33. package/dist/shared/@ai-setting/{roy-agent-core-rmn29nrh.js → roy-agent-core-64f22h1g.js} +1 -11
  34. package/dist/shared/@ai-setting/{roy-agent-core-eakjnbaj.js → roy-agent-core-7p5zf8ay.js} +4 -4
  35. package/dist/shared/@ai-setting/{roy-agent-core-qhw8jp6j.js → roy-agent-core-83mk8wrn.js} +2 -2
  36. package/dist/shared/@ai-setting/roy-agent-core-ajtsk20z.js +2396 -0
  37. package/dist/shared/@ai-setting/{roy-agent-core-pc8x07p0.js → roy-agent-core-amp8qckb.js} +1 -1
  38. package/dist/shared/@ai-setting/roy-agent-core-az13yzmc.js +11 -0
  39. package/dist/shared/@ai-setting/{roy-agent-core-2f2nqx7g.js → roy-agent-core-b09eqhhz.js} +86 -60
  40. package/dist/shared/@ai-setting/{roy-agent-core-0gmnp1jt.js → roy-agent-core-bjrtwfta.js} +41 -6
  41. package/dist/shared/@ai-setting/{roy-agent-core-ts56bz5e.js → roy-agent-core-d94ddn0r.js} +3 -3
  42. package/dist/shared/@ai-setting/{roy-agent-core-rczz7e81.js → roy-agent-core-dabnevwe.js} +1 -1
  43. package/dist/shared/@ai-setting/{roy-agent-core-9t675te0.js → roy-agent-core-ead21w5c.js} +2 -2
  44. package/dist/shared/@ai-setting/{roy-agent-core-c95tpapc.js → roy-agent-core-gy1zfe0d.js} +2 -2
  45. package/dist/shared/@ai-setting/{roy-agent-core-5tzc2spk.js → roy-agent-core-h93v6p6y.js} +2 -2
  46. package/dist/shared/@ai-setting/{roy-agent-core-f18jk3cw.js → roy-agent-core-hxazjj4p.js} +1 -1
  47. package/dist/shared/@ai-setting/{roy-agent-core-3h7ajma5.js → roy-agent-core-jfptxs4f.js} +1 -1
  48. package/dist/shared/@ai-setting/{roy-agent-core-4m0t4y9w.js → roy-agent-core-nvcqp6p9.js} +1 -1
  49. package/dist/shared/@ai-setting/{roy-agent-core-jadrj0bz.js → roy-agent-core-p1p9mr8f.js} +13 -0
  50. package/dist/shared/@ai-setting/{roy-agent-core-65q93n1k.js → roy-agent-core-pk1b3kvf.js} +1 -1
  51. package/dist/shared/@ai-setting/{roy-agent-core-n1ceexfz.js → roy-agent-core-qvaqmj3f.js} +1 -1
  52. package/dist/shared/@ai-setting/{roy-agent-core-6mnwqcqf.js → roy-agent-core-v5vs1jby.js} +1 -1
  53. package/dist/shared/@ai-setting/{roy-agent-core-z6kv2mdp.js → roy-agent-core-y1fp2mgf.js} +18 -35
  54. package/dist/shared/@ai-setting/{roy-agent-core-asxe1nt4.js → roy-agent-core-ygnva439.js} +2 -2
  55. package/dist/shared/@ai-setting/{roy-agent-core-8xgk89y4.js → roy-agent-core-yjqj3taz.js} +4 -4
  56. package/dist/shared/@ai-setting/{roy-agent-core-w3tq0j5c.js → roy-agent-core-zrgaemma.js} +1 -1
  57. package/dist/shared/@ai-setting/{roy-agent-core-2ahddbdf.js → roy-agent-core-zy3hqfwg.js} +251 -53
  58. package/package.json +1 -1
  59. package/dist/shared/@ai-setting/roy-agent-core-0zgcfcnq.js +0 -1720
@@ -6,19 +6,266 @@ import {
6
6
  __require
7
7
  } from "./roy-agent-core-fs0mn2jk.js";
8
8
 
9
+ // src/env/llm/opencode-session.ts
10
+ var OPENCODE_SESSION_ID_CACHE_MAX = 1000;
11
+ var opencodeSessionIdCache = new Map;
12
+ function generateOpencodeSessionId(nowMs = Date.now()) {
13
+ const timestampHex = Math.floor(nowMs / 1000).toString(16).padStart(12, "0");
14
+ const randomChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
15
+ let suffix = "";
16
+ for (let i = 0;i < 14; i++) {
17
+ suffix += randomChars[Math.floor(Math.random() * randomChars.length)];
18
+ }
19
+ return `ses_${timestampHex}${suffix}`;
20
+ }
21
+ function isOpencodeProvider(providerId) {
22
+ if (!providerId)
23
+ return false;
24
+ const normalized = providerId.toLowerCase().replace(/[-_]/g, "");
25
+ return normalized === "opencode" || normalized === "opencodego";
26
+ }
27
+ function isOpencodeEndpoint(baseURL) {
28
+ if (!baseURL)
29
+ return false;
30
+ try {
31
+ const url = new URL(baseURL);
32
+ return url.hostname === "opencode.ai" && url.pathname.startsWith("/inference/go");
33
+ } catch {
34
+ return /^https?:\/\/opencode\.ai\/inference\/go(\/|$)/i.test(baseURL);
35
+ }
36
+ }
37
+ function getOrCreateOpencodeSessionId(conversationId, nowMs = Date.now()) {
38
+ if (!conversationId) {
39
+ return generateOpencodeSessionId(nowMs);
40
+ }
41
+ const cached = opencodeSessionIdCache.get(conversationId);
42
+ if (cached) {
43
+ return cached;
44
+ }
45
+ const sessionId = generateOpencodeSessionId(nowMs);
46
+ if (opencodeSessionIdCache.size >= OPENCODE_SESSION_ID_CACHE_MAX) {
47
+ const oldest = opencodeSessionIdCache.keys().next().value;
48
+ if (oldest !== undefined) {
49
+ opencodeSessionIdCache.delete(oldest);
50
+ }
51
+ }
52
+ opencodeSessionIdCache.set(conversationId, sessionId);
53
+ return sessionId;
54
+ }
55
+ function buildOpencodeHeaders(providerId, conversationId, baseURL) {
56
+ if (!isOpencodeProvider(providerId) && !isOpencodeEndpoint(baseURL)) {
57
+ return {};
58
+ }
59
+ return { "x-opencode-session": getOrCreateOpencodeSessionId(conversationId) };
60
+ }
61
+
9
62
  // src/env/llm/invoke.ts
10
- init_logger();
11
63
  import { randomUUID } from "crypto";
12
64
  import { streamText, jsonSchema } from "ai";
13
65
  import { createOpenAI } from "@ai-sdk/openai";
14
66
  import { createAnthropic } from "@ai-sdk/anthropic";
15
67
  import { createGoogleGenerativeAI } from "@ai-sdk/google";
16
68
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
69
+
70
+ // src/env/llm/tool-schema.ts
17
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();
18
157
 
19
158
  // src/env/llm/tool-args-parser.ts
20
159
  init_logger();
21
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
+ }
22
269
  var MAX_SAFE_DEPTH = 5;
23
270
  function safeParseToolArgs(args, depth = 0) {
24
271
  if (depth >= MAX_SAFE_DEPTH) {
@@ -119,7 +366,6 @@ function canonicalizeToolCallArgsInPlace(value) {
119
366
  }
120
367
  }
121
368
  }
122
-
123
369
  // src/env/llm/invoke.ts
124
370
  var logger2 = createLogger("llm:invoke");
125
371
  var MAX_RETRIES = 3;
@@ -396,23 +642,7 @@ function convertToolsToSDK(tools, providerName) {
396
642
  return result;
397
643
  }
398
644
  function extractToolSchema(parameters) {
399
- if (parameters && typeof parameters === "object" && "_def" in parameters) {
400
- const zodSchema = parameters;
401
- const schema = zodToJsonSchema(zodSchema, "zod");
402
- if ("$ref" in schema && schema.definitions) {
403
- const def = schema.definitions.zod;
404
- if (def && def.type === "object" && def.properties) {
405
- return {
406
- type: "object",
407
- properties: def.properties,
408
- required: def.required,
409
- additionalProperties: true
410
- };
411
- }
412
- }
413
- return schema;
414
- }
415
- return parameters;
645
+ return toolParametersToJsonSchema(parameters);
416
646
  }
417
647
  function generateProviderOptions(providerType, options) {
418
648
  const result = {
@@ -793,35 +1023,6 @@ function redactSecrets(text, knownSecrets = []) {
793
1023
  out = out.replace(/\bBearer\s+[A-Za-z0-9._\-+/=]{12,}\b/g, "<redacted>");
794
1024
  return out;
795
1025
  }
796
- function generateOpencodeSessionId(nowMs = Date.now()) {
797
- const timestampHex = Math.floor(nowMs / 1000).toString(16).padStart(12, "0");
798
- const randomChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
799
- let suffix = "";
800
- for (let i = 0;i < 14; i++) {
801
- suffix += randomChars[Math.floor(Math.random() * randomChars.length)];
802
- }
803
- return `ses_${timestampHex}${suffix}`;
804
- }
805
- var OPENCODE_SESSION_ID_CACHE_MAX = 1000;
806
- var opencodeSessionIdCache = new Map;
807
- function getOrCreateOpencodeSessionId(conversationId, nowMs = Date.now()) {
808
- if (!conversationId) {
809
- return generateOpencodeSessionId(nowMs);
810
- }
811
- const cached = opencodeSessionIdCache.get(conversationId);
812
- if (cached) {
813
- return cached;
814
- }
815
- const sessionId = generateOpencodeSessionId(nowMs);
816
- if (opencodeSessionIdCache.size >= OPENCODE_SESSION_ID_CACHE_MAX) {
817
- const oldest = opencodeSessionIdCache.keys().next().value;
818
- if (oldest !== undefined) {
819
- opencodeSessionIdCache.delete(oldest);
820
- }
821
- }
822
- opencodeSessionIdCache.set(conversationId, sessionId);
823
- return sessionId;
824
- }
825
1026
  function createProviderInstance(providerId, apiKey, baseURL, conversationId) {
826
1027
  try {
827
1028
  if (providerId === "openai") {
@@ -843,10 +1044,7 @@ function createProviderInstance(providerId, apiKey, baseURL, conversationId) {
843
1044
  });
844
1045
  return google;
845
1046
  }
846
- const providerHeaders = {};
847
- if (providerId === "opencode" || providerId === "opencode-go" || providerId === "opencodego") {
848
- providerHeaders["x-opencode-session"] = getOrCreateOpencodeSessionId(conversationId);
849
- }
1047
+ const providerHeaders = buildOpencodeHeaders(providerId, conversationId, baseURL);
850
1048
  const defaultProvider = createOpenAICompatible({
851
1049
  name: providerId,
852
1050
  apiKey,
@@ -928,4 +1126,4 @@ function createInvokeConfig(model, apiKey, baseURL) {
928
1126
  };
929
1127
  }
930
1128
 
931
- export { safeParseToolArgs, canonicalizeParts, withTimeout, parseModelString, convertToSDKMessages, invoke, invokeNonStream, createInvokeConfig };
1129
+ export { toolParametersToJsonSchema, parseToolArgsStrict, safeParseToolArgs, generateOpencodeSessionId, isOpencodeProvider, isOpencodeEndpoint, getOrCreateOpencodeSessionId, buildOpencodeHeaders, canonicalizeParts, withTimeout, parseModelString, convertToSDKMessages, invoke, invokeNonStream, createInvokeConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-setting/roy-agent-core",
3
- "version": "1.7.44",
3
+ "version": "1.7.47",
4
4
  "type": "module",
5
5
  "description": "Core SDK for roy-agent - Environment, Components, Tools, Sessions, Tasks",
6
6
  "main": "./dist/index.js",