@jkudish/jev-mcp 0.4.0 → 0.6.0
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/CHANGELOG.md +22 -0
- package/README.md +429 -18
- package/dist/index.js +1021 -58
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +150 -0
- package/dist/lib.js +200 -0
- package/dist/lib.js.map +1 -1
- package/dist/provider.d.ts +5 -1
- package/dist/provider.js +371 -59
- package/dist/provider.js.map +1 -1
- package/package.json +6 -5
package/dist/provider.js
CHANGED
|
@@ -1,18 +1,216 @@
|
|
|
1
|
-
// Jev transport: TypeSafe direct (default), OpenRouter Decisions,
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// remains the recommended default.
|
|
1
|
+
// Jev transport: TypeSafe direct (default), OpenRouter Decisions, Cloudflare
|
|
2
|
+
// Workers AI, or a caller-supplied Jev-compatible System One endpoint. All
|
|
3
|
+
// speak the {state, questions} / answers contract; URL, auth, and model slugs
|
|
4
|
+
// differ. Proxies add hops, so direct TypeSafe remains the recommended default.
|
|
5
5
|
import { experimental_evaluate } from "ai";
|
|
6
6
|
import { TypeSafeClient } from "@typesafe-ai/sdk";
|
|
7
|
+
import { fetch as undiciFetch } from "undici";
|
|
8
|
+
import { isRecord } from "./lib.js";
|
|
7
9
|
const X_TITLE = "jev-mcp";
|
|
8
10
|
const REFERER = "https://github.com/jkudish/jev-mcp";
|
|
11
|
+
// Replace every occurrence of the secret so a reflecting endpoint cannot leak
|
|
12
|
+
// it into MCP-visible error text; covering the bare form also covers the
|
|
13
|
+
// "Bearer <secret>" form.
|
|
14
|
+
function redactSecret(text, secret) {
|
|
15
|
+
return secret ? text.split(secret).join("[redacted]") : text;
|
|
16
|
+
}
|
|
17
|
+
// ── Transport resilience ─────────────────────────────────────────────────────
|
|
18
|
+
// Research and the original report: GitHub issue #23 by oppih. Applies to the
|
|
19
|
+
// fetch-based transports (openrouter, cloudflare, compatible); the typesafe
|
|
20
|
+
// and vercel branches go through SDK-owned transports whose retry and timeout
|
|
21
|
+
// semantics are theirs, so no uniformity is claimed for those.
|
|
22
|
+
const positiveIntFromEnv = (name, fallback) => {
|
|
23
|
+
const raw = Number(process.env[name]);
|
|
24
|
+
return Number.isInteger(raw) && raw > 0 ? raw : fallback;
|
|
25
|
+
};
|
|
26
|
+
/** Whole-request deadline (all attempts), overridable for tests and tight hosts. */
|
|
27
|
+
const REQUEST_TIMEOUT_MS = positiveIntFromEnv("JEV_MCP_REQUEST_TIMEOUT_MS", 60_000);
|
|
28
|
+
/** Total attempts per request, including the first; clamped to 1..6. */
|
|
29
|
+
const MAX_ATTEMPTS = Math.min(6, Math.max(1, positiveIntFromEnv("JEV_MCP_MAX_ATTEMPTS", 3)));
|
|
30
|
+
const BASE_RETRY_DELAY_MS = 500;
|
|
31
|
+
const MAX_RETRY_DELAY_MS = 4_000;
|
|
32
|
+
/** Stream-checked ceiling for success and error bodies alike. */
|
|
33
|
+
const MAX_RESPONSE_BYTES = 1_000_000;
|
|
34
|
+
/** Only the not-processed status allowlist is retried, and 5xx means 500-599: out-of-range statuses are protocol noise, not retry signals. */
|
|
35
|
+
const isRetryableStatus = (status) => status === 408 || status === 409 || status === 429 || (status >= 500 && status <= 599);
|
|
36
|
+
/** One deadline covering every attempt; expiry and caller aborts never retry. */
|
|
37
|
+
function deadlineSignal(signal, timeoutMs) {
|
|
38
|
+
const controller = new AbortController();
|
|
39
|
+
let timedOut = false;
|
|
40
|
+
const timer = setTimeout(() => {
|
|
41
|
+
timedOut = true;
|
|
42
|
+
controller.abort();
|
|
43
|
+
}, timeoutMs);
|
|
44
|
+
const relay = () => controller.abort(signal?.reason);
|
|
45
|
+
if (signal) {
|
|
46
|
+
if (signal.aborted)
|
|
47
|
+
relay();
|
|
48
|
+
else
|
|
49
|
+
signal.addEventListener("abort", relay, { once: true });
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
signal: controller.signal,
|
|
53
|
+
timedOut: () => timedOut,
|
|
54
|
+
dispose: () => {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
signal?.removeEventListener("abort", relay);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Jittered exponential backoff: 50-100% of the doubling delay, capped. */
|
|
61
|
+
function retryDelayMs(attempt) {
|
|
62
|
+
const exp = Math.min(BASE_RETRY_DELAY_MS * 2 ** (attempt - 1), MAX_RETRY_DELAY_MS);
|
|
63
|
+
return exp * (0.5 + Math.random() * 0.5);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Backoff that ends early, without another attempt, when the deadline expires
|
|
67
|
+
* or the caller aborts: the whole-request deadline must not be overrun by a
|
|
68
|
+
* sleep, and a cancelled call must surface promptly.
|
|
69
|
+
*/
|
|
70
|
+
function backoffDelay(attempt, deadline) {
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
const timer = setTimeout(() => {
|
|
73
|
+
cleanup();
|
|
74
|
+
resolve();
|
|
75
|
+
}, retryDelayMs(attempt));
|
|
76
|
+
const onAbort = () => {
|
|
77
|
+
cleanup();
|
|
78
|
+
reject(deadline.timedOut()
|
|
79
|
+
? new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline.`)
|
|
80
|
+
: deadline.signal.reason);
|
|
81
|
+
};
|
|
82
|
+
const cleanup = () => {
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
deadline.signal.removeEventListener("abort", onAbort);
|
|
85
|
+
};
|
|
86
|
+
if (deadline.signal.aborted)
|
|
87
|
+
onAbort();
|
|
88
|
+
else
|
|
89
|
+
deadline.signal.addEventListener("abort", onAbort, { once: true });
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Read a response body with the byte ceiling enforced while streaming.
|
|
94
|
+
* Content-Length is advisory (and absent for chunked responses), so the
|
|
95
|
+
* limit is enforced on the bytes actually read, on success and error paths
|
|
96
|
+
* alike. Never retried: an oversized body is a protocol violation.
|
|
97
|
+
*/
|
|
98
|
+
async function readBodyBounded(response, deadline) {
|
|
99
|
+
const reader = response.body?.getReader();
|
|
100
|
+
if (!reader)
|
|
101
|
+
return "";
|
|
102
|
+
const chunks = [];
|
|
103
|
+
let total = 0;
|
|
104
|
+
// One abort watcher for the whole read, not one per chunk: a fragmented body
|
|
105
|
+
// must not accumulate listeners and closures while it streams.
|
|
106
|
+
let onAbort;
|
|
107
|
+
const aborted = new Promise((_, reject) => {
|
|
108
|
+
onAbort = () => reject(deadline.timedOut()
|
|
109
|
+
? new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline while reading the response.`)
|
|
110
|
+
: deadline.signal.reason);
|
|
111
|
+
});
|
|
112
|
+
aborted.catch(() => { }); // stays handled when a read wins every race
|
|
113
|
+
deadline.signal.addEventListener("abort", onAbort, { once: true });
|
|
114
|
+
try {
|
|
115
|
+
if (deadline.signal.aborted)
|
|
116
|
+
onAbort();
|
|
117
|
+
for (;;) {
|
|
118
|
+
const { done, value } = await Promise.race([reader.read(), aborted]);
|
|
119
|
+
if (done)
|
|
120
|
+
break;
|
|
121
|
+
total += value.byteLength;
|
|
122
|
+
if (total > MAX_RESPONSE_BYTES) {
|
|
123
|
+
throw new Error(`Response exceeded ${MAX_RESPONSE_BYTES} bytes after reading ${total}; aborting the read.`);
|
|
124
|
+
}
|
|
125
|
+
chunks.push(value);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// The body reader races our watcher to the same abort and may reject
|
|
130
|
+
// first with its raw AbortError; translate, exactly as the fetch catch
|
|
131
|
+
// does, so deadline expiry reads as a deadline, not "operation aborted".
|
|
132
|
+
if (deadline.signal.aborted) {
|
|
133
|
+
throw deadline.timedOut()
|
|
134
|
+
? new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline while reading the response.`)
|
|
135
|
+
: deadline.signal.reason;
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
deadline.signal.removeEventListener("abort", onAbort);
|
|
141
|
+
// On the success path the reader is already done; on throw this releases
|
|
142
|
+
// the connection instead of leaking it.
|
|
143
|
+
await reader.cancel().catch(() => { });
|
|
144
|
+
try {
|
|
145
|
+
reader.releaseLock();
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Already released by cancel on some runtimes.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const bytes = new Uint8Array(total);
|
|
152
|
+
let offset = 0;
|
|
153
|
+
for (const chunk of chunks) {
|
|
154
|
+
bytes.set(chunk, offset);
|
|
155
|
+
offset += chunk.byteLength;
|
|
156
|
+
}
|
|
157
|
+
return new TextDecoder().decode(bytes);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Appends a fixed path to a configured API root. Both defaults carry path
|
|
161
|
+
* prefixes, not just origins, and a conventional trailing slash must not
|
|
162
|
+
* produce a "//path" request.
|
|
163
|
+
*/
|
|
164
|
+
function apiUrl(root, path) {
|
|
165
|
+
return `${root.replace(/\/+$/, "")}${path}`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Fetch with bounded, jittered retries on the 408/409/429/5xx allowlist only.
|
|
169
|
+
* A status cannot prove the request was not processed, but that allowlist is
|
|
170
|
+
* the standard not-processed signal set and the only retry trigger. Ambiguous
|
|
171
|
+
* network-level failures (connection reset mid-response, TLS errors) never
|
|
172
|
+
* retry: without an idempotency key, re-sending after an ambiguous failure can
|
|
173
|
+
* double-process a paid call. Caller aborts and deadline expiry surface
|
|
174
|
+
* immediately, cutting any backoff short, and never retry.
|
|
175
|
+
*/
|
|
176
|
+
async function fetchWithResilience(url, init, deadline) {
|
|
177
|
+
for (let attempt = 1;; attempt++) {
|
|
178
|
+
let response;
|
|
179
|
+
try {
|
|
180
|
+
response = await fetch(url, { ...init, signal: deadline.signal });
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
if (deadline.timedOut()) {
|
|
184
|
+
throw new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline.`);
|
|
185
|
+
}
|
|
186
|
+
throw error; // caller cancellation or network failure: never re-sent
|
|
187
|
+
}
|
|
188
|
+
if (isRetryableStatus(response.status) && attempt < MAX_ATTEMPTS) {
|
|
189
|
+
// Drain and release the connection before backing off.
|
|
190
|
+
await response.body?.cancel().catch(() => { });
|
|
191
|
+
await backoffDelay(attempt, deadline);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
return response;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
9
197
|
let typesafeClient = null;
|
|
198
|
+
// SDK 0.6.0 on Node 20/22: cancelling a call after response headers terminates
|
|
199
|
+
// the process through the bundled undici clone/cancel abort path, even when the
|
|
200
|
+
// caller catches the SDK's APIUserAbortError (typesafe-sdk-js#2; fixed upstream
|
|
201
|
+
// in nodejs/undici#4804, bundled from Node 24). Route the SDK through the
|
|
202
|
+
// standalone undici fetch, which carries the fix, so wired-through cancellation
|
|
203
|
+
// stays safe on every supported Node. Verified with a child-process regression
|
|
204
|
+
// on Node 22.23.1: the default fetch exits the process on a handled abort;
|
|
205
|
+
// this injection exits 0. Remove when the SDK ships a fixed release.
|
|
206
|
+
const typesafeFetch = (input, init) => undiciFetch(input, init);
|
|
10
207
|
function resolve(env) {
|
|
11
208
|
const explicit = (env.JEV_PROVIDER ?? "auto").toLowerCase();
|
|
12
209
|
const hasTypesafe = Boolean(env.TYPESAFE_API_KEY);
|
|
13
210
|
const hasOpenRouter = /^sk-or-/.test(env.OPENROUTER_API_KEY ?? "");
|
|
14
211
|
const cfToken = env.JEV_CLOUDFLARE_API_TOKEN || env.CLOUDFLARE_API_TOKEN;
|
|
15
212
|
const hasCloudflare = Boolean(cfToken && env.CLOUDFLARE_ACCOUNT_ID);
|
|
213
|
+
const hasCompatible = Boolean(env.JEV_API_KEY && env.JEV_API_BASE_URL);
|
|
16
214
|
if (explicit === "typesafe") {
|
|
17
215
|
if (!hasTypesafe)
|
|
18
216
|
throw new Error("JEV_PROVIDER=typesafe but TYPESAFE_API_KEY is not set.");
|
|
@@ -33,6 +231,14 @@ function resolve(env) {
|
|
|
33
231
|
throw new Error("JEV_PROVIDER=cloudflare but a Cloudflare API token (CLOUDFLARE_API_TOKEN or JEV_CLOUDFLARE_API_TOKEN) and CLOUDFLARE_ACCOUNT_ID are not both set.");
|
|
34
232
|
return "cloudflare";
|
|
35
233
|
}
|
|
234
|
+
if (explicit === "compatible") {
|
|
235
|
+
const missing = ["JEV_API_KEY", "JEV_API_BASE_URL"].filter((name) => !env[name]);
|
|
236
|
+
if (missing.length > 0) {
|
|
237
|
+
throw new Error(`JEV_PROVIDER=compatible but ${missing.join(" and ")} ${missing.length > 1 ? "are" : "is"} not set. ` +
|
|
238
|
+
"JEV_MCP_MODEL is optional and defaults to jev-latest.");
|
|
239
|
+
}
|
|
240
|
+
return "compatible";
|
|
241
|
+
}
|
|
36
242
|
if (hasTypesafe)
|
|
37
243
|
return "typesafe";
|
|
38
244
|
if (hasOpenRouter)
|
|
@@ -41,12 +247,46 @@ function resolve(env) {
|
|
|
41
247
|
return "cloudflare";
|
|
42
248
|
if (env.AI_GATEWAY_API_KEY)
|
|
43
249
|
return "vercel";
|
|
44
|
-
|
|
250
|
+
if (hasCompatible)
|
|
251
|
+
return "compatible";
|
|
252
|
+
throw new Error("No Jev provider credentials found. Set TYPESAFE_API_KEY, OPENROUTER_API_KEY (sk-or-), Cloudflare token + CLOUDFLARE_ACCOUNT_ID, AI_GATEWAY_API_KEY, or JEV_API_KEY + JEV_API_BASE_URL; set JEV_PROVIDER to choose explicitly.");
|
|
253
|
+
}
|
|
254
|
+
// Normalize the AI SDK evaluate envelope without making a provider request.
|
|
255
|
+
export function adaptVercelAnswers(result) {
|
|
256
|
+
const confidence = (result.providerMetadata?.typesafe?.confidence ?? {});
|
|
257
|
+
const adapted = {};
|
|
258
|
+
for (const [id, answer] of Object.entries((result.answers ?? {}))) {
|
|
259
|
+
if (answer?.type === "boolean") {
|
|
260
|
+
adapted[id] = { type: "noul", noul: answer.probability };
|
|
261
|
+
}
|
|
262
|
+
else if (answer?.type === "choice") {
|
|
263
|
+
// A distribution the upstream answer did not carry stays absent rather
|
|
264
|
+
// than becoming {}: score tools treat an absent distribution as "not
|
|
265
|
+
// reported" (still valid) and a present-but-malformed one as invalid;
|
|
266
|
+
// choice tools require a distribution, so absence and {} both fail
|
|
267
|
+
// their validation identically either way.
|
|
268
|
+
adapted[id] = answer.probabilities != null
|
|
269
|
+
? { type: "choice", choice: answer.choice, probabilities: answer.probabilities, confidence: confidence[id] ?? null }
|
|
270
|
+
: { type: "choice", choice: answer.choice, confidence: confidence[id] ?? null };
|
|
271
|
+
}
|
|
272
|
+
else if (answer?.type === "score") {
|
|
273
|
+
adapted[id] = answer.probabilities != null
|
|
274
|
+
? { type: "score", score: answer.score, probabilities: answer.probabilities, confidence: confidence[id] ?? null }
|
|
275
|
+
: { type: "score", score: answer.score, confidence: confidence[id] ?? null };
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
adapted[id] = answer;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return adapted;
|
|
45
282
|
}
|
|
46
283
|
export async function askJev(state, questions, model, signal) {
|
|
47
284
|
const provider = resolve(process.env);
|
|
48
285
|
if (provider === "typesafe") {
|
|
49
|
-
typesafeClient ??= new TypeSafeClient(
|
|
286
|
+
typesafeClient ??= new TypeSafeClient({
|
|
287
|
+
...(process.env.TYPESAFE_BASE_URL ? { baseURL: process.env.TYPESAFE_BASE_URL } : undefined),
|
|
288
|
+
fetch: typesafeFetch,
|
|
289
|
+
});
|
|
50
290
|
const response = await typesafeClient.systemOne({ state, questions, model }, { signal });
|
|
51
291
|
return {
|
|
52
292
|
answers: response.answers,
|
|
@@ -61,30 +301,95 @@ export async function askJev(state, questions, model, signal) {
|
|
|
61
301
|
const OPENROUTER_LATEST = "jev-1.13";
|
|
62
302
|
const effective = model === "jev-latest" ? OPENROUTER_LATEST : model;
|
|
63
303
|
const slug = effective.startsWith("typesafe/") ? effective : `typesafe/${effective}`;
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
304
|
+
const deadline = deadlineSignal(signal, REQUEST_TIMEOUT_MS);
|
|
305
|
+
try {
|
|
306
|
+
const response = await fetchWithResilience(apiUrl(process.env.JEV_OPENROUTER_BASE_URL || "https://openrouter.ai/api", "/alpha/decisions"), {
|
|
307
|
+
method: "POST",
|
|
308
|
+
headers: {
|
|
309
|
+
Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,
|
|
310
|
+
"Content-Type": "application/json",
|
|
311
|
+
"HTTP-Referer": REFERER,
|
|
312
|
+
"X-Title": X_TITLE,
|
|
313
|
+
"X-OpenRouter-Title": X_TITLE,
|
|
314
|
+
},
|
|
315
|
+
body: JSON.stringify({ model: slug, state, questions }),
|
|
316
|
+
}, deadline);
|
|
317
|
+
const bodyText = await readBodyBounded(response, deadline);
|
|
318
|
+
if (!response.ok) {
|
|
319
|
+
// Redact the key before the body becomes MCP-visible error text.
|
|
320
|
+
const body = redactSecret(bodyText, process.env.OPENROUTER_API_KEY ?? "").slice(0, 200);
|
|
321
|
+
throw new Error(`OpenRouter decisions API ${response.status}: ${body}`);
|
|
322
|
+
}
|
|
323
|
+
const body = JSON.parse(bodyText);
|
|
324
|
+
return {
|
|
325
|
+
answers: body.answers ?? {},
|
|
326
|
+
// The decisions endpoint does not document a usage block; tolerate absence.
|
|
327
|
+
usage: { input_tokens: body.usage?.input_tokens ?? 0, output_tokens: body.usage?.output_tokens ?? 0 },
|
|
328
|
+
provider,
|
|
329
|
+
model: slug,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
finally {
|
|
333
|
+
deadline.dispose();
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (provider === "compatible") {
|
|
337
|
+
const deadline = deadlineSignal(signal, REQUEST_TIMEOUT_MS);
|
|
338
|
+
try {
|
|
339
|
+
const response = await fetchWithResilience(process.env.JEV_API_BASE_URL, {
|
|
340
|
+
method: "POST",
|
|
341
|
+
headers: {
|
|
342
|
+
Authorization: `Bearer ${process.env.JEV_API_KEY}`,
|
|
343
|
+
"Content-Type": "application/json",
|
|
344
|
+
},
|
|
345
|
+
body: JSON.stringify({ model, state, questions }),
|
|
346
|
+
}, deadline);
|
|
347
|
+
const bodyText = await readBodyBounded(response, deadline);
|
|
348
|
+
if (!response.ok) {
|
|
349
|
+
const apiKey = process.env.JEV_API_KEY ?? "";
|
|
350
|
+
// Redact the key before the body becomes MCP-visible error text; a
|
|
351
|
+
// proxy that reflects the request would otherwise echo it back.
|
|
352
|
+
const body = redactSecret(bodyText, apiKey).slice(0, 200);
|
|
353
|
+
throw new Error(`Jev-compatible endpoint ${response.status}: ${body}`);
|
|
354
|
+
}
|
|
355
|
+
let body;
|
|
356
|
+
try {
|
|
357
|
+
body = JSON.parse(bodyText);
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
body = null; // parse failures never retry; surface as invalid response
|
|
361
|
+
}
|
|
362
|
+
const invalid = (why) => new Error(`Jev-compatible endpoint returned an invalid response: ${why}`);
|
|
363
|
+
if (!isRecord(body))
|
|
364
|
+
throw invalid("expected a JSON object.");
|
|
365
|
+
if (!isRecord(body.answers))
|
|
366
|
+
throw invalid("expected an answers object.");
|
|
367
|
+
// Envelope shape is validated here; per-question answer validity is the
|
|
368
|
+
// tools' job. Each tool fails closed under its invalid_response contract,
|
|
369
|
+
// so a missing or malformed answer can never reach tool-level defaults.
|
|
370
|
+
let inputTokens = 0;
|
|
371
|
+
let outputTokens = 0;
|
|
372
|
+
if (body.usage !== undefined && body.usage !== null) {
|
|
373
|
+
const tokenCount = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0;
|
|
374
|
+
if (!isRecord(body.usage) || !tokenCount(body.usage.input_tokens) || !tokenCount(body.usage.output_tokens)) {
|
|
375
|
+
throw invalid("usage must report finite non-negative input_tokens and output_tokens.");
|
|
376
|
+
}
|
|
377
|
+
inputTokens = body.usage.input_tokens;
|
|
378
|
+
outputTokens = body.usage.output_tokens;
|
|
379
|
+
}
|
|
380
|
+
if (body.model !== undefined && body.model !== null && typeof body.model !== "string") {
|
|
381
|
+
throw invalid("model must be absent or a string.");
|
|
382
|
+
}
|
|
383
|
+
return {
|
|
384
|
+
answers: body.answers,
|
|
385
|
+
usage: { input_tokens: inputTokens, output_tokens: outputTokens },
|
|
386
|
+
provider,
|
|
387
|
+
model: typeof body.model === "string" ? body.model : model,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
deadline.dispose();
|
|
79
392
|
}
|
|
80
|
-
const body = await response.json();
|
|
81
|
-
return {
|
|
82
|
-
answers: body.answers ?? {},
|
|
83
|
-
// The decisions endpoint does not document a usage block; tolerate absence.
|
|
84
|
-
usage: { input_tokens: body.usage?.input_tokens ?? 0, output_tokens: body.usage?.output_tokens ?? 0 },
|
|
85
|
-
provider,
|
|
86
|
-
model: slug,
|
|
87
|
-
};
|
|
88
393
|
}
|
|
89
394
|
if (provider === "vercel") {
|
|
90
395
|
// Vercel AI Gateway exposes Jev through the AI SDK's experimental evaluate
|
|
@@ -105,24 +410,8 @@ export async function askJev(state, questions, model, signal) {
|
|
|
105
410
|
questions: vercelQuestions,
|
|
106
411
|
abortSignal: signal,
|
|
107
412
|
});
|
|
108
|
-
const confidence = (result.providerMetadata?.typesafe?.confidence ?? {});
|
|
109
|
-
const adapted = {};
|
|
110
|
-
for (const [id, answer] of Object.entries(result.answers)) {
|
|
111
|
-
if (answer?.type === "boolean") {
|
|
112
|
-
adapted[id] = { type: "noul", noul: answer.probability };
|
|
113
|
-
}
|
|
114
|
-
else if (answer?.type === "choice") {
|
|
115
|
-
adapted[id] = { type: "choice", choice: answer.choice, probabilities: answer.probabilities ?? {}, confidence: confidence[id] ?? null };
|
|
116
|
-
}
|
|
117
|
-
else if (answer?.type === "score") {
|
|
118
|
-
adapted[id] = { type: "score", score: answer.score, probabilities: answer.probabilities ?? {}, confidence: confidence[id] ?? null };
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
adapted[id] = answer;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
413
|
return {
|
|
125
|
-
answers:
|
|
414
|
+
answers: adaptVercelAnswers(result),
|
|
126
415
|
usage: { input_tokens: result.usage?.inputTokens ?? 0, output_tokens: result.usage?.outputTokens ?? 0 },
|
|
127
416
|
provider,
|
|
128
417
|
model: "typesafe-ai/jev",
|
|
@@ -131,23 +420,46 @@ export async function askJev(state, questions, model, signal) {
|
|
|
131
420
|
// Cloudflare Workers AI wraps the same contract in {model, input} and the
|
|
132
421
|
// v4 {result, success} envelope. Single alias; no version pinning.
|
|
133
422
|
const cfSlug = model.startsWith("typesafe/") ? model : `typesafe/${model === "jev-latest" ? "jev" : model}`;
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
423
|
+
const cfToken = process.env.JEV_CLOUDFLARE_API_TOKEN || process.env.CLOUDFLARE_API_TOKEN || "";
|
|
424
|
+
const cfBase = process.env.JEV_CLOUDFLARE_BASE_URL || "https://api.cloudflare.com/client/v4";
|
|
425
|
+
const cfDeadline = deadlineSignal(signal, REQUEST_TIMEOUT_MS);
|
|
426
|
+
let cfBody;
|
|
427
|
+
let cfStatus = 0;
|
|
428
|
+
try {
|
|
429
|
+
const cfResponse = await fetchWithResilience(apiUrl(cfBase, `/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/ai/run`), {
|
|
430
|
+
method: "POST",
|
|
431
|
+
headers: {
|
|
432
|
+
Authorization: `Bearer ${process.env.JEV_CLOUDFLARE_API_TOKEN || process.env.CLOUDFLARE_API_TOKEN}`,
|
|
433
|
+
"Content-Type": "application/json",
|
|
434
|
+
},
|
|
435
|
+
body: JSON.stringify({ model: cfSlug, input: { state, questions } }),
|
|
436
|
+
}, cfDeadline);
|
|
437
|
+
cfStatus = cfResponse.status;
|
|
438
|
+
const bodyText = await readBodyBounded(cfResponse, cfDeadline);
|
|
439
|
+
cfBody = JSON.parse(cfStatus >= 400 ? redactSecret(bodyText, cfToken) : bodyText);
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
if (error instanceof SyntaxError) {
|
|
443
|
+
cfBody = {}; // parse failures never retry; surface as invalid response
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
throw error;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
finally {
|
|
450
|
+
cfDeadline.dispose();
|
|
451
|
+
}
|
|
452
|
+
// One redacted formatter for every Cloudflare error path (HTTP status,
|
|
453
|
+
// success:false, non-Completed state): a reflecting endpoint must never echo
|
|
454
|
+
// the token into MCP-visible error text, on any of the three.
|
|
455
|
+
const cfError = (detail) => new Error(`Cloudflare AI run ${cfStatus}: ${redactSecret(detail, cfToken).slice(0, 200)}`);
|
|
456
|
+
if (cfStatus >= 400 || cfBody.success === false) {
|
|
457
|
+
throw cfError(JSON.stringify(cfBody.errors ?? cfBody));
|
|
146
458
|
}
|
|
147
459
|
// The v4 envelope double-nests: body.result.result holds the model output.
|
|
148
460
|
const cfOuter = cfBody.result;
|
|
149
461
|
if (cfOuter && typeof cfOuter.state === "string" && cfOuter.state !== "Completed") {
|
|
150
|
-
throw
|
|
462
|
+
throw cfError(`state ${cfOuter.state}: ${JSON.stringify(cfBody.errors ?? [])}`);
|
|
151
463
|
}
|
|
152
464
|
const cfPayload = cfOuter?.result ?? cfOuter ?? cfBody;
|
|
153
465
|
return {
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,8EAA8E;AAC9E,0EAA0E;AAC1E,mCAAmC;AAEnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWlD,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,OAAO,GAAG,oCAAoC,CAAC;AAErD,IAAI,cAAc,GAA0B,IAAI,CAAC;AAEjD,SAAS,OAAO,CAAC,GAAsB;IACrC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,oBAAoB,CAAC;IACzE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEpE,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5F,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACvH,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACvG,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,mJAAmJ,CAAC,CAAC;QACzL,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,WAAW;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,aAAa;QAAE,OAAO,YAAY,CAAC;IACvC,IAAI,aAAa;QAAE,OAAO,YAAY,CAAC;IACvC,IAAI,GAAG,CAAC,kBAAkB;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,IAAI,KAAK,CACb,qJAAqJ,CACtJ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,KAAc,EACd,SAAkC,EAClC,KAAa,EACb,MAAoB;IAEpB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,cAAc,KAAK,IAAI,cAAc,CACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,SAAS,CACvF,CAAC;QACF,MAAM,QAAQ,GAAG,MACf,cAAc,CAAC,SAIhB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,KAAK,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,EAAE;YAC7G,QAAQ;YACR,KAAK;SACN,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,qEAAqE;QACrE,wEAAwE;QACxE,MAAM,iBAAiB,GAAG,UAAU,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC;QACrF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,2CAA2C,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE;gBACzD,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,OAAO;gBACvB,SAAS,EAAE,OAAO;gBAClB,oBAAoB,EAAE,OAAO;aAC9B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACvD,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,4EAA4E;YAC5E,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,EAAE;YACrG,QAAQ;YACR,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC5B,2EAA2E;QAC3E,2EAA2E;QAC3E,kEAAkE;QAClE,MAAM,eAAe,GAAwB,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,QAAwE,CAAC;YACnF,eAAe,CAAC,EAAE,CAAC,GAAG;gBACpB,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC5C,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACzC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB;YACnE,KAAK,EAAE,KAAY;YACnB,SAAS,EAAE,eAAsB;YACjC,WAAW,EAAE,MAAM;SACpB,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,CAAE,MAAc,CAAC,gBAAgB,EAAE,QAAQ,EAAE,UAAU,IAAI,EAAE,CAA2B,CAAC;QAC5G,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAA8B,CAAC,EAAE,CAAC;YACjF,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3D,CAAC;iBAAM,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;YACzI,CAAC;iBAAM,IAAI,MAAM,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;YACtI,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,EAAE;YACvG,QAAQ;YACR,KAAK,EAAE,iBAAiB;SACzB,CAAC;IACJ,CAAC;IAEC,0EAA0E;IAC1E,mEAAmE;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5G,MAAM,UAAU,GAAG,MAAM,KAAK,CAC5B,iDAAiD,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,EAC3F;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE;YACnG,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;QACpE,MAAM;KACP,CACF,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACtH,CAAC;IACD,2EAA2E;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpH,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC;IACvD,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,EAAE;QAChC,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,EAAE,aAAa,EAAE,SAAS,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,EAAE;QAC/G,QAAQ;QACR,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,MAAM;KACjC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jkudish/jev-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server exposing TypeSafe
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "MCP server exposing TypeSafe Jev as purpose-built judgment tools: verify claims, screen for injection, find, rerank, classify, decide, compare passages, extract fields, review patches, and gate completion claims, each with typed probabilities.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Joey Kudish",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"build": "tsc",
|
|
27
27
|
"prepare": "npm run build",
|
|
28
28
|
"typecheck": "tsc --noEmit",
|
|
29
|
-
"test": "node --test test/unit.test.mjs",
|
|
29
|
+
"test": "node --test test/unit.test.mjs test/mock.test.mjs test/provider.test.mjs test/typesafe-abort-regression.test.mjs",
|
|
30
30
|
"test:e2e": "node --test test/e2e.test.mjs"
|
|
31
31
|
},
|
|
32
32
|
"keywords": [
|
|
@@ -43,8 +43,9 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
45
45
|
"@typesafe-ai/sdk": "^0.6.0",
|
|
46
|
-
"
|
|
47
|
-
"
|
|
46
|
+
"ai": "^7.0.105",
|
|
47
|
+
"undici": "^7.29.1",
|
|
48
|
+
"zod": "^3.25.0"
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|
|
50
51
|
"@types/node": "^22.0.0",
|