@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/dist/provider.js CHANGED
@@ -1,18 +1,216 @@
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.
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
- 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.");
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(process.env.TYPESAFE_BASE_URL ? { baseURL: process.env.TYPESAFE_BASE_URL } : undefined);
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 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)}`);
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: adapted,
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 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)}`);
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 new Error(`Cloudflare AI run state ${cfOuter.state}: ${JSON.stringify(cfBody.errors ?? []).slice(0, 200)}`);
462
+ throw cfError(`state ${cfOuter.state}: ${JSON.stringify(cfBody.errors ?? [])}`);
151
463
  }
152
464
  const cfPayload = cfOuter?.result ?? cfOuter ?? cfBody;
153
465
  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,7 +1,7 @@
1
1
  {
2
2
  "name": "@jkudish/jev-mcp",
3
- "version": "0.4.0",
4
- "description": "MCP server exposing TypeSafe's Jev (System One) as purpose-built judgment tools: verify claims against evidence, screen content for injection, find semantically without embeddings.",
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
- "zod": "^3.25.0",
47
- "ai": "^7.0.105"
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",