@jkudish/jev-mcp 0.5.0 → 0.7.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 +29 -12
- package/README.md +141 -11
- package/dist/index.js +258 -149
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +20 -0
- package/dist/lib.js +24 -0
- package/dist/lib.js.map +1 -1
- package/dist/provider.d.ts +1 -1
- package/dist/provider.js +367 -118
- package/dist/provider.js.map +1 -1
- package/package.json +5 -5
package/dist/provider.js
CHANGED
|
@@ -1,59 +1,262 @@
|
|
|
1
|
-
// Jev transport: TypeSafe direct (default), OpenRouter Decisions,
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// remains the recommended default.
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
+
import { ask, resolveTransport } from "@jkudish/jev-agent-tools";
|
|
6
|
+
import { isRecord } from "./lib.js";
|
|
7
7
|
const X_TITLE = "jev-mcp";
|
|
8
8
|
const REFERER = "https://github.com/jkudish/jev-mcp";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
9
|
+
// Replace every occurrence of the secret so a reflecting endpoint cannot leak
|
|
10
|
+
// it into MCP-visible error text; covering the bare form also covers the
|
|
11
|
+
// "Bearer <secret>" form.
|
|
12
|
+
function redactSecret(text, secret) {
|
|
13
|
+
return secret ? text.split(secret).join("[redacted]") : text;
|
|
14
|
+
}
|
|
15
|
+
// ── Transport resilience ─────────────────────────────────────────────────────
|
|
16
|
+
// Research and the original report: GitHub issue #23 by oppih. Applies to the
|
|
17
|
+
// fetch-based transports (openrouter, cloudflare, compatible); the typesafe
|
|
18
|
+
// and vercel branches go through SDK-owned transports whose retry and timeout
|
|
19
|
+
// semantics are theirs, so no uniformity is claimed for those.
|
|
20
|
+
const positiveIntFromEnv = (name, fallback) => {
|
|
21
|
+
const raw = Number(process.env[name]);
|
|
22
|
+
return Number.isInteger(raw) && raw > 0 ? raw : fallback;
|
|
23
|
+
};
|
|
24
|
+
/** Whole-request deadline (all attempts), overridable for tests and tight hosts. */
|
|
25
|
+
const REQUEST_TIMEOUT_MS = positiveIntFromEnv("JEV_MCP_REQUEST_TIMEOUT_MS", 60_000);
|
|
26
|
+
/** Total attempts per request, including the first; clamped to 1..6. */
|
|
27
|
+
const MAX_ATTEMPTS = Math.min(6, Math.max(1, positiveIntFromEnv("JEV_MCP_MAX_ATTEMPTS", 3)));
|
|
28
|
+
const BASE_RETRY_DELAY_MS = 500;
|
|
29
|
+
const MAX_RETRY_DELAY_MS = 4_000;
|
|
30
|
+
/** Stream-checked ceiling for success and error bodies alike. */
|
|
31
|
+
const MAX_RESPONSE_BYTES = 1_000_000;
|
|
32
|
+
/** Only the not-processed status allowlist is retried, and 5xx means 500-599: out-of-range statuses are protocol noise, not retry signals. */
|
|
33
|
+
const isRetryableStatus = (status) => status === 408 || status === 409 || status === 429 || (status >= 500 && status <= 599);
|
|
34
|
+
/** One deadline covering every attempt; expiry and caller aborts never retry. */
|
|
35
|
+
function deadlineSignal(signal, timeoutMs) {
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
let timedOut = false;
|
|
38
|
+
const timer = setTimeout(() => {
|
|
39
|
+
timedOut = true;
|
|
40
|
+
controller.abort();
|
|
41
|
+
}, timeoutMs);
|
|
42
|
+
const relay = () => controller.abort(signal?.reason);
|
|
43
|
+
if (signal) {
|
|
44
|
+
if (signal.aborted)
|
|
45
|
+
relay();
|
|
46
|
+
else
|
|
47
|
+
signal.addEventListener("abort", relay, { once: true });
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
signal: controller.signal,
|
|
51
|
+
timedOut: () => timedOut,
|
|
52
|
+
dispose: () => {
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
signal?.removeEventListener("abort", relay);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Jittered exponential backoff: 50-100% of the doubling delay, capped. */
|
|
59
|
+
function retryDelayMs(attempt) {
|
|
60
|
+
const exp = Math.min(BASE_RETRY_DELAY_MS * 2 ** (attempt - 1), MAX_RETRY_DELAY_MS);
|
|
61
|
+
return exp * (0.5 + Math.random() * 0.5);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Backoff that ends early, without another attempt, when the deadline expires
|
|
65
|
+
* or the caller aborts: the whole-request deadline must not be overrun by a
|
|
66
|
+
* sleep, and a cancelled call must surface promptly.
|
|
67
|
+
*/
|
|
68
|
+
function backoffDelay(attempt, deadline) {
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
const timer = setTimeout(() => {
|
|
71
|
+
cleanup();
|
|
72
|
+
resolve();
|
|
73
|
+
}, retryDelayMs(attempt));
|
|
74
|
+
const onAbort = () => {
|
|
75
|
+
cleanup();
|
|
76
|
+
reject(deadline.timedOut()
|
|
77
|
+
? new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline.`)
|
|
78
|
+
: deadline.signal.reason);
|
|
79
|
+
};
|
|
80
|
+
const cleanup = () => {
|
|
81
|
+
clearTimeout(timer);
|
|
82
|
+
deadline.signal.removeEventListener("abort", onAbort);
|
|
83
|
+
};
|
|
84
|
+
if (deadline.signal.aborted)
|
|
85
|
+
onAbort();
|
|
86
|
+
else
|
|
87
|
+
deadline.signal.addEventListener("abort", onAbort, { once: true });
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Read a response body with the byte ceiling enforced while streaming.
|
|
92
|
+
* Content-Length is advisory (and absent for chunked responses), so the
|
|
93
|
+
* limit is enforced on the bytes actually read, on success and error paths
|
|
94
|
+
* alike. Never retried: an oversized body is a protocol violation.
|
|
95
|
+
*/
|
|
96
|
+
async function readBodyBounded(response, deadline) {
|
|
97
|
+
const reader = response.body?.getReader();
|
|
98
|
+
if (!reader)
|
|
99
|
+
return "";
|
|
100
|
+
const chunks = [];
|
|
101
|
+
let total = 0;
|
|
102
|
+
// One abort watcher for the whole read, not one per chunk: a fragmented body
|
|
103
|
+
// must not accumulate listeners and closures while it streams.
|
|
104
|
+
let onAbort;
|
|
105
|
+
const aborted = new Promise((_, reject) => {
|
|
106
|
+
onAbort = () => reject(deadline.timedOut()
|
|
107
|
+
? new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline while reading the response.`)
|
|
108
|
+
: deadline.signal.reason);
|
|
109
|
+
});
|
|
110
|
+
aborted.catch(() => { }); // stays handled when a read wins every race
|
|
111
|
+
deadline.signal.addEventListener("abort", onAbort, { once: true });
|
|
112
|
+
try {
|
|
113
|
+
if (deadline.signal.aborted)
|
|
114
|
+
onAbort();
|
|
115
|
+
for (;;) {
|
|
116
|
+
const { done, value } = await Promise.race([reader.read(), aborted]);
|
|
117
|
+
if (done)
|
|
118
|
+
break;
|
|
119
|
+
total += value.byteLength;
|
|
120
|
+
if (total > MAX_RESPONSE_BYTES) {
|
|
121
|
+
throw new Error(`Response exceeded ${MAX_RESPONSE_BYTES} bytes after reading ${total}; aborting the read.`);
|
|
122
|
+
}
|
|
123
|
+
chunks.push(value);
|
|
124
|
+
}
|
|
20
125
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
126
|
+
catch (error) {
|
|
127
|
+
// The body reader races our watcher to the same abort and may reject
|
|
128
|
+
// first with its raw AbortError; translate, exactly as the fetch catch
|
|
129
|
+
// does, so deadline expiry reads as a deadline, not "operation aborted".
|
|
130
|
+
if (deadline.signal.aborted) {
|
|
131
|
+
throw deadline.timedOut()
|
|
132
|
+
? new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline while reading the response.`)
|
|
133
|
+
: deadline.signal.reason;
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
25
136
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
137
|
+
finally {
|
|
138
|
+
deadline.signal.removeEventListener("abort", onAbort);
|
|
139
|
+
// On the success path the reader is already done; on throw this releases
|
|
140
|
+
// the connection instead of leaking it.
|
|
141
|
+
await reader.cancel().catch(() => { });
|
|
142
|
+
try {
|
|
143
|
+
reader.releaseLock();
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Already released by cancel on some runtimes.
|
|
147
|
+
}
|
|
30
148
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
149
|
+
const bytes = new Uint8Array(total);
|
|
150
|
+
let offset = 0;
|
|
151
|
+
for (const chunk of chunks) {
|
|
152
|
+
bytes.set(chunk, offset);
|
|
153
|
+
offset += chunk.byteLength;
|
|
35
154
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
155
|
+
return new TextDecoder().decode(bytes);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Appends a fixed path to a configured API root. Both defaults carry path
|
|
159
|
+
* prefixes, not just origins, and a conventional trailing slash must not
|
|
160
|
+
* produce a "//path" request.
|
|
161
|
+
*/
|
|
162
|
+
function apiUrl(root, path) {
|
|
163
|
+
return `${root.replace(/\/+$/, "")}${path}`;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Fetch with bounded, jittered retries on the 408/409/429/5xx allowlist only.
|
|
167
|
+
* A status cannot prove the request was not processed, but that allowlist is
|
|
168
|
+
* the standard not-processed signal set and the only retry trigger. Ambiguous
|
|
169
|
+
* network-level failures (connection reset mid-response, TLS errors) never
|
|
170
|
+
* retry: without an idempotency key, re-sending after an ambiguous failure can
|
|
171
|
+
* double-process a paid call. Caller aborts and deadline expiry surface
|
|
172
|
+
* immediately, cutting any backoff short, and never retry.
|
|
173
|
+
*/
|
|
174
|
+
async function fetchWithResilience(url, init, deadline) {
|
|
175
|
+
for (let attempt = 1;; attempt++) {
|
|
176
|
+
let response;
|
|
177
|
+
try {
|
|
178
|
+
response = await fetch(url, { ...init, signal: deadline.signal });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (deadline.timedOut()) {
|
|
182
|
+
throw new Error(`Jev request exceeded the ${REQUEST_TIMEOUT_MS}ms deadline.`);
|
|
183
|
+
}
|
|
184
|
+
throw error; // caller cancellation or network failure: never re-sent
|
|
185
|
+
}
|
|
186
|
+
if (isRetryableStatus(response.status) && attempt < MAX_ATTEMPTS) {
|
|
187
|
+
// Drain and release the connection before backing off.
|
|
188
|
+
await response.body?.cancel().catch(() => { });
|
|
189
|
+
await backoffDelay(attempt, deadline);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
return response;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function resolve(env) {
|
|
196
|
+
const explicit = (env.JEV_PROVIDER ?? "auto").toLowerCase();
|
|
197
|
+
const hasCompatible = Boolean(env.JEV_API_KEY && env.JEV_API_BASE_URL);
|
|
198
|
+
if (explicit === "compatible") {
|
|
199
|
+
const missing = ["JEV_API_KEY", "JEV_API_BASE_URL"].filter((name) => !env[name]);
|
|
200
|
+
if (missing.length > 0) {
|
|
201
|
+
throw new Error(`JEV_PROVIDER=compatible but ${missing.join(" and ")} ${missing.length > 1 ? "are" : "is"} not set. ` +
|
|
202
|
+
"JEV_MCP_MODEL is optional and defaults to jev-latest.");
|
|
203
|
+
}
|
|
204
|
+
return "compatible";
|
|
205
|
+
}
|
|
206
|
+
// The published package owns the four built-in credential rules and order.
|
|
207
|
+
if ((explicit === "auto" || explicit === "") && hasCompatible &&
|
|
208
|
+
!env.TYPESAFE_API_KEY && !/^sk-or-/.test(env.OPENROUTER_API_KEY ?? "") &&
|
|
209
|
+
!((env.JEV_CLOUDFLARE_API_TOKEN || env.CLOUDFLARE_API_TOKEN) && env.CLOUDFLARE_ACCOUNT_ID) &&
|
|
210
|
+
!env.AI_GATEWAY_API_KEY)
|
|
211
|
+
return "compatible";
|
|
212
|
+
return resolveTransport({ ...env, JEV_PROVIDER: explicit || "auto" }).name;
|
|
45
213
|
}
|
|
46
214
|
export async function askJev(state, questions, model, signal) {
|
|
47
215
|
const provider = resolve(process.env);
|
|
48
|
-
if (provider === "typesafe") {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
216
|
+
if (provider === "typesafe" || provider === "vercel") {
|
|
217
|
+
// Keep the raw envelope for MCP's per-judgment invalid_response behavior:
|
|
218
|
+
// the shared package rejects a whole batch if even one answer is invalid.
|
|
219
|
+
const builtin = resolveTransport({ ...process.env, JEV_PROVIDER: process.env.JEV_PROVIDER || "auto" });
|
|
220
|
+
let reply;
|
|
221
|
+
const transport = {
|
|
222
|
+
name: builtin.name,
|
|
223
|
+
async ask(input) {
|
|
224
|
+
try {
|
|
225
|
+
return reply = await builtin.ask(input);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
// Both published drivers throw on an invalid usage *container* before
|
|
229
|
+
// the Result validator sees it. Preserve the validation path, not a
|
|
230
|
+
// misleading request_failed network error. Never reinterpret other
|
|
231
|
+
// transport exceptions (including cancellation).
|
|
232
|
+
if (error instanceof Error && (error.message === "TypeSafe API invalid usage (response omitted)" ||
|
|
233
|
+
error.message === "Vercel AI Gateway invalid usage (response omitted)")) {
|
|
234
|
+
return reply = { answers: {}, usage: { input_tokens: 0, output_tokens: 0 }, model: input.model };
|
|
235
|
+
}
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
},
|
|
56
239
|
};
|
|
240
|
+
const result = await ask({ state, questions, model, signal: signal ?? new AbortController().signal }, { transport });
|
|
241
|
+
if (!result.ok) {
|
|
242
|
+
if (result.code === "request_failed")
|
|
243
|
+
throw new Error(result.message);
|
|
244
|
+
// Envelope validation cannot be projected to individual judgments.
|
|
245
|
+
// A bad envelope invalidates the call's judgments, not the MCP call.
|
|
246
|
+
if (!isRecord(reply?.answers) || result.code === "invalid_usage" || result.code === "invalid_model" ||
|
|
247
|
+
!Number.isSafeInteger(reply.usage?.input_tokens) || reply.usage.input_tokens < 0 ||
|
|
248
|
+
!Number.isSafeInteger(reply.usage?.output_tokens) || reply.usage.output_tokens < 0 ||
|
|
249
|
+
typeof reply.model !== "string" || !reply.model.trim() ||
|
|
250
|
+
(result.code === "answer_id_mismatch" && Object.keys(reply.answers).some((id) => !Object.hasOwn(questions, id)))) {
|
|
251
|
+
return { answers: {}, usage: { input_tokens: 0, output_tokens: 0 }, provider, model };
|
|
252
|
+
}
|
|
253
|
+
const answers = Object.fromEntries(Object.entries(reply.answers).filter(([id, answer]) => !isRecord(answer) || !Object.hasOwn(answer, "type") || answer.type === questions[id]?.type));
|
|
254
|
+
// Package rejection is batch-wide; the existing per-tool guards are
|
|
255
|
+
// authoritative for answer validity, including optional score
|
|
256
|
+
// distributions, fractional scores, and valid sibling judgments.
|
|
257
|
+
return { answers, usage: reply.usage, provider, model: reply.model };
|
|
258
|
+
}
|
|
259
|
+
return { answers: result.answer, usage: result.usage, provider, model: result.model };
|
|
57
260
|
}
|
|
58
261
|
if (provider === "openrouter") {
|
|
59
262
|
// OpenRouter has no redirecting "latest" slug; map it to the current
|
|
@@ -61,93 +264,139 @@ export async function askJev(state, questions, model, signal) {
|
|
|
61
264
|
const OPENROUTER_LATEST = "jev-1.13";
|
|
62
265
|
const effective = model === "jev-latest" ? OPENROUTER_LATEST : model;
|
|
63
266
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
// Vercel AI Gateway exposes Jev through the AI SDK's experimental evaluate
|
|
91
|
-
// API: "noul" questions become "boolean", answers return as probabilities,
|
|
92
|
-
// and Choice/Score confidence lives in providerMetadata.typesafe.
|
|
93
|
-
const vercelQuestions = {};
|
|
94
|
-
for (const [id, question] of Object.entries(questions)) {
|
|
95
|
-
const q = question;
|
|
96
|
-
vercelQuestions[id] = {
|
|
97
|
-
type: q.type === "noul" ? "boolean" : q.type,
|
|
98
|
-
instructions: q.instructions,
|
|
99
|
-
criteria: q.criteria,
|
|
267
|
+
const deadline = deadlineSignal(signal, REQUEST_TIMEOUT_MS);
|
|
268
|
+
try {
|
|
269
|
+
const response = await fetchWithResilience(apiUrl(process.env.JEV_OPENROUTER_BASE_URL || "https://openrouter.ai/api", "/alpha/decisions"), {
|
|
270
|
+
method: "POST",
|
|
271
|
+
headers: {
|
|
272
|
+
Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,
|
|
273
|
+
"Content-Type": "application/json",
|
|
274
|
+
"HTTP-Referer": REFERER,
|
|
275
|
+
"X-Title": X_TITLE,
|
|
276
|
+
"X-OpenRouter-Title": X_TITLE,
|
|
277
|
+
},
|
|
278
|
+
body: JSON.stringify({ model: slug, state, questions }),
|
|
279
|
+
}, deadline);
|
|
280
|
+
const bodyText = await readBodyBounded(response, deadline);
|
|
281
|
+
if (!response.ok) {
|
|
282
|
+
// Redact the key before the body becomes MCP-visible error text.
|
|
283
|
+
const body = redactSecret(bodyText, process.env.OPENROUTER_API_KEY ?? "").slice(0, 200);
|
|
284
|
+
throw new Error(`OpenRouter decisions API ${response.status}: ${body}`);
|
|
285
|
+
}
|
|
286
|
+
const body = JSON.parse(bodyText);
|
|
287
|
+
return {
|
|
288
|
+
answers: body.answers ?? {},
|
|
289
|
+
// The decisions endpoint does not document a usage block; tolerate absence.
|
|
290
|
+
usage: { input_tokens: body.usage?.input_tokens ?? 0, output_tokens: body.usage?.output_tokens ?? 0 },
|
|
291
|
+
provider,
|
|
292
|
+
model: slug,
|
|
100
293
|
};
|
|
101
294
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
295
|
+
finally {
|
|
296
|
+
deadline.dispose();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (provider === "compatible") {
|
|
300
|
+
const deadline = deadlineSignal(signal, REQUEST_TIMEOUT_MS);
|
|
301
|
+
try {
|
|
302
|
+
const response = await fetchWithResilience(process.env.JEV_API_BASE_URL, {
|
|
303
|
+
method: "POST",
|
|
304
|
+
headers: {
|
|
305
|
+
Authorization: `Bearer ${process.env.JEV_API_KEY}`,
|
|
306
|
+
"Content-Type": "application/json",
|
|
307
|
+
},
|
|
308
|
+
body: JSON.stringify({ model, state, questions }),
|
|
309
|
+
}, deadline);
|
|
310
|
+
const bodyText = await readBodyBounded(response, deadline);
|
|
311
|
+
if (!response.ok) {
|
|
312
|
+
const apiKey = process.env.JEV_API_KEY ?? "";
|
|
313
|
+
// Redact the key before the body becomes MCP-visible error text; a
|
|
314
|
+
// proxy that reflects the request would otherwise echo it back.
|
|
315
|
+
const body = redactSecret(bodyText, apiKey).slice(0, 200);
|
|
316
|
+
throw new Error(`Jev-compatible endpoint ${response.status}: ${body}`);
|
|
317
|
+
}
|
|
318
|
+
let body;
|
|
319
|
+
try {
|
|
320
|
+
body = JSON.parse(bodyText);
|
|
113
321
|
}
|
|
114
|
-
|
|
115
|
-
|
|
322
|
+
catch {
|
|
323
|
+
body = null; // parse failures never retry; surface as invalid response
|
|
116
324
|
}
|
|
117
|
-
|
|
118
|
-
|
|
325
|
+
const invalid = (why) => new Error(`Jev-compatible endpoint returned an invalid response: ${why}`);
|
|
326
|
+
if (!isRecord(body))
|
|
327
|
+
throw invalid("expected a JSON object.");
|
|
328
|
+
if (!isRecord(body.answers))
|
|
329
|
+
throw invalid("expected an answers object.");
|
|
330
|
+
// Envelope shape is validated here; per-question answer validity is the
|
|
331
|
+
// tools' job. Each tool fails closed under its invalid_response contract,
|
|
332
|
+
// so a missing or malformed answer can never reach tool-level defaults.
|
|
333
|
+
let inputTokens = 0;
|
|
334
|
+
let outputTokens = 0;
|
|
335
|
+
if (body.usage !== undefined && body.usage !== null) {
|
|
336
|
+
const tokenCount = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0;
|
|
337
|
+
if (!isRecord(body.usage) || !tokenCount(body.usage.input_tokens) || !tokenCount(body.usage.output_tokens)) {
|
|
338
|
+
throw invalid("usage must report finite non-negative input_tokens and output_tokens.");
|
|
339
|
+
}
|
|
340
|
+
inputTokens = body.usage.input_tokens;
|
|
341
|
+
outputTokens = body.usage.output_tokens;
|
|
119
342
|
}
|
|
120
|
-
|
|
121
|
-
|
|
343
|
+
if (body.model !== undefined && body.model !== null && typeof body.model !== "string") {
|
|
344
|
+
throw invalid("model must be absent or a string.");
|
|
122
345
|
}
|
|
346
|
+
return {
|
|
347
|
+
answers: body.answers,
|
|
348
|
+
usage: { input_tokens: inputTokens, output_tokens: outputTokens },
|
|
349
|
+
provider,
|
|
350
|
+
model: typeof body.model === "string" ? body.model : model,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
finally {
|
|
354
|
+
deadline.dispose();
|
|
123
355
|
}
|
|
124
|
-
return {
|
|
125
|
-
answers: adapted,
|
|
126
|
-
usage: { input_tokens: result.usage?.inputTokens ?? 0, output_tokens: result.usage?.outputTokens ?? 0 },
|
|
127
|
-
provider,
|
|
128
|
-
model: "typesafe-ai/jev",
|
|
129
|
-
};
|
|
130
356
|
}
|
|
131
357
|
// Cloudflare Workers AI wraps the same contract in {model, input} and the
|
|
132
358
|
// v4 {result, success} envelope. Single alias; no version pinning.
|
|
133
359
|
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
|
-
|
|
360
|
+
const cfToken = process.env.JEV_CLOUDFLARE_API_TOKEN || process.env.CLOUDFLARE_API_TOKEN || "";
|
|
361
|
+
const cfBase = process.env.JEV_CLOUDFLARE_BASE_URL || "https://api.cloudflare.com/client/v4";
|
|
362
|
+
const cfDeadline = deadlineSignal(signal, REQUEST_TIMEOUT_MS);
|
|
363
|
+
let cfBody;
|
|
364
|
+
let cfStatus = 0;
|
|
365
|
+
try {
|
|
366
|
+
const cfResponse = await fetchWithResilience(apiUrl(cfBase, `/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/ai/run`), {
|
|
367
|
+
method: "POST",
|
|
368
|
+
headers: {
|
|
369
|
+
Authorization: `Bearer ${process.env.JEV_CLOUDFLARE_API_TOKEN || process.env.CLOUDFLARE_API_TOKEN}`,
|
|
370
|
+
"Content-Type": "application/json",
|
|
371
|
+
},
|
|
372
|
+
body: JSON.stringify({ model: cfSlug, input: { state, questions } }),
|
|
373
|
+
}, cfDeadline);
|
|
374
|
+
cfStatus = cfResponse.status;
|
|
375
|
+
const bodyText = await readBodyBounded(cfResponse, cfDeadline);
|
|
376
|
+
cfBody = JSON.parse(cfStatus >= 400 ? redactSecret(bodyText, cfToken) : bodyText);
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
if (error instanceof SyntaxError) {
|
|
380
|
+
cfBody = {}; // parse failures never retry; surface as invalid response
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
throw error;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
finally {
|
|
387
|
+
cfDeadline.dispose();
|
|
388
|
+
}
|
|
389
|
+
// One redacted formatter for every Cloudflare error path (HTTP status,
|
|
390
|
+
// success:false, non-Completed state): a reflecting endpoint must never echo
|
|
391
|
+
// the token into MCP-visible error text, on any of the three.
|
|
392
|
+
const cfError = (detail) => new Error(`Cloudflare AI run ${cfStatus}: ${redactSecret(detail, cfToken).slice(0, 200)}`);
|
|
393
|
+
if (cfStatus >= 400 || cfBody.success === false) {
|
|
394
|
+
throw cfError(JSON.stringify(cfBody.errors ?? cfBody));
|
|
146
395
|
}
|
|
147
396
|
// The v4 envelope double-nests: body.result.result holds the model output.
|
|
148
397
|
const cfOuter = cfBody.result;
|
|
149
398
|
if (cfOuter && typeof cfOuter.state === "string" && cfOuter.state !== "Completed") {
|
|
150
|
-
throw
|
|
399
|
+
throw cfError(`state ${cfOuter.state}: ${JSON.stringify(cfBody.errors ?? [])}`);
|
|
151
400
|
}
|
|
152
401
|
const cfPayload = cfOuter?.result ?? cfOuter ?? cfBody;
|
|
153
402
|
return {
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jkudish/jev-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
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",
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
"CHANGELOG.md"
|
|
21
21
|
],
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=
|
|
23
|
+
"node": ">=22"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "tsc",
|
|
27
27
|
"prepare": "npm run build",
|
|
28
28
|
"typecheck": "tsc --noEmit",
|
|
29
|
-
"test": "node --test test/unit.test.mjs test/mock.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": [
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
"semantic-search"
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
|
+
"@jkudish/jev-agent-tools": "^0.1.0",
|
|
44
45
|
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
45
46
|
"@typesafe-ai/sdk": "^0.6.0",
|
|
46
|
-
"zod": "^3.25.0"
|
|
47
|
-
"ai": "^7.0.105"
|
|
47
|
+
"zod": "^3.25.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/node": "^22.0.0",
|