@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.
- 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 +15 -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 +37 -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-eakjnbaj.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-0gmnp1jt.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-c95tpapc.js → roy-agent-core-gy1zfe0d.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-5tzc2spk.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-65q93n1k.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-z6kv2mdp.js → roy-agent-core-y1fp2mgf.js} +18 -35
- 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-w3tq0j5c.js → roy-agent-core-zrgaemma.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-2ahddbdf.js → roy-agent-core-zy3hqfwg.js} +251 -53
- package/package.json +1 -1
- 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
|
-
|
|
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 };
|