@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/dist/provider.js CHANGED
@@ -1,59 +1,262 @@
1
- // Jev transport: TypeSafe direct (default), OpenRouter Decisions, or
2
- // Cloudflare Workers AI. All speak the {state, questions} / answers contract;
3
- // URL, auth, and model slugs differ. Proxies add hops, so direct TypeSafe
4
- // remains the recommended default.
5
- import { experimental_evaluate } from "ai";
6
- import { TypeSafeClient } from "@typesafe-ai/sdk";
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
- let typesafeClient = null;
10
- function resolve(env) {
11
- const explicit = (env.JEV_PROVIDER ?? "auto").toLowerCase();
12
- const hasTypesafe = Boolean(env.TYPESAFE_API_KEY);
13
- const hasOpenRouter = /^sk-or-/.test(env.OPENROUTER_API_KEY ?? "");
14
- const cfToken = env.JEV_CLOUDFLARE_API_TOKEN || env.CLOUDFLARE_API_TOKEN;
15
- const hasCloudflare = Boolean(cfToken && env.CLOUDFLARE_ACCOUNT_ID);
16
- if (explicit === "typesafe") {
17
- if (!hasTypesafe)
18
- throw new Error("JEV_PROVIDER=typesafe but TYPESAFE_API_KEY is not set.");
19
- return "typesafe";
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
- if (explicit === "openrouter") {
22
- if (!hasOpenRouter)
23
- throw new Error("JEV_PROVIDER=openrouter but OPENROUTER_API_KEY is not set or not an sk-or- key.");
24
- return "openrouter";
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
- if (explicit === "vercel") {
27
- if (!env.AI_GATEWAY_API_KEY)
28
- throw new Error("JEV_PROVIDER=vercel but AI_GATEWAY_API_KEY is not set.");
29
- return "vercel";
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
- if (explicit === "cloudflare") {
32
- if (!hasCloudflare)
33
- 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
- return "cloudflare";
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
- if (hasTypesafe)
37
- return "typesafe";
38
- if (hasOpenRouter)
39
- return "openrouter";
40
- if (hasCloudflare)
41
- return "cloudflare";
42
- if (env.AI_GATEWAY_API_KEY)
43
- return "vercel";
44
- throw new Error("No TYPESAFE_API_KEY, OPENROUTER_API_KEY (sk-or-), or Cloudflare token + CLOUDFLARE_ACCOUNT_ID found. Set one, or JEV_PROVIDER to choose explicitly.");
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
- typesafeClient ??= new TypeSafeClient(process.env.TYPESAFE_BASE_URL ? { baseURL: process.env.TYPESAFE_BASE_URL } : undefined);
50
- const response = await typesafeClient.systemOne({ state, questions, model }, { signal });
51
- return {
52
- answers: response.answers,
53
- usage: { input_tokens: response.usage?.input_tokens ?? 0, output_tokens: response.usage?.output_tokens ?? 0 },
54
- provider,
55
- model,
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 response = await fetch("https://openrouter.ai/api/alpha/decisions", {
65
- method: "POST",
66
- headers: {
67
- Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,
68
- "Content-Type": "application/json",
69
- "HTTP-Referer": REFERER,
70
- "X-Title": X_TITLE,
71
- "X-OpenRouter-Title": X_TITLE,
72
- },
73
- body: JSON.stringify({ model: slug, state, questions }),
74
- signal,
75
- });
76
- if (!response.ok) {
77
- const body = await response.text().catch(() => "");
78
- throw new Error(`OpenRouter decisions API ${response.status}: ${body.slice(0, 200)}`);
79
- }
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
- }
89
- if (provider === "vercel") {
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
- const result = await experimental_evaluate({
103
- model: model.startsWith("typesafe-ai/") ? model : "typesafe-ai/jev",
104
- state: state,
105
- questions: vercelQuestions,
106
- abortSignal: signal,
107
- });
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 };
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
- else if (answer?.type === "choice") {
115
- adapted[id] = { type: "choice", choice: answer.choice, probabilities: answer.probabilities ?? {}, confidence: confidence[id] ?? null };
322
+ catch {
323
+ body = null; // parse failures never retry; surface as invalid response
116
324
  }
117
- else if (answer?.type === "score") {
118
- adapted[id] = { type: "score", score: answer.score, probabilities: answer.probabilities ?? {}, confidence: confidence[id] ?? null };
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
- else {
121
- adapted[id] = answer;
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 cfResponse = await fetch(`https://api.cloudflare.com/client/v4/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/ai/run`, {
135
- method: "POST",
136
- headers: {
137
- Authorization: `Bearer ${process.env.JEV_CLOUDFLARE_API_TOKEN || process.env.CLOUDFLARE_API_TOKEN}`,
138
- "Content-Type": "application/json",
139
- },
140
- body: JSON.stringify({ model: cfSlug, input: { state, questions } }),
141
- signal,
142
- });
143
- const cfBody = await cfResponse.json().catch(() => ({}));
144
- if (!cfResponse.ok || cfBody.success === false) {
145
- throw new Error(`Cloudflare AI run ${cfResponse.status}: ${JSON.stringify(cfBody.errors ?? cfBody).slice(0, 200)}`);
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 new Error(`Cloudflare AI run state ${cfOuter.state}: ${JSON.stringify(cfBody.errors ?? []).slice(0, 200)}`);
399
+ throw cfError(`state ${cfOuter.state}: ${JSON.stringify(cfBody.errors ?? [])}`);
151
400
  }
152
401
  const cfPayload = cfOuter?.result ?? cfOuter ?? cfBody;
153
402
  return {
@@ -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.5.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": ">=20"
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",