@cotal-ai/linear 0.0.0-bootstrap.0 → 0.76.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.
@@ -0,0 +1,592 @@
1
+ /**
2
+ * One bounded MCP client session against the pinned Linear MCP server, for one account.
3
+ *
4
+ * DISCOVERY is complete or it fails: the negotiated server capabilities, then every page of
5
+ * `tools/list`, and, only when advertised, every page of `resources/list`,
6
+ * `resources/templates/list` and `prompts/list`. Cursors are opaque and passed back verbatim. Pages
7
+ * and total bytes are capped across the whole inventory, and crossing a cap refuses the inventory
8
+ * rather than returning part of it. Names, descriptions, schemas and annotations are kept exactly as
9
+ * the server sent them. The inventory carries a digest so a caller can pin the context it read.
10
+ *
11
+ * Capabilities this package does not represent (resource subscriptions, logging, experimental and
12
+ * anything unknown) are listed in `unsupported`, never dropped silently. This client declares no
13
+ * client capabilities, so the server has no sampling, elicitation or roots to call back into.
14
+ *
15
+ * DISPATCH never retries. Once a request has been handed to the transport, a timeout, a caller
16
+ * cancellation, a response over the byte cap, a lost session (HTTP 404) or any transport failure is
17
+ * reported with outcome `unknown`: the tool may or may not have run, and that holds for read-only
18
+ * tools too. A tool result with `isError: true` is an ordinary MCP result and is returned as such. A
19
+ * JSON-RPC error from the server is a protocol error, kept apart from both. `not-executed` is only
20
+ * claimed for refusals made before dispatch (queue full, unknown tool, stale inventory pin, the
21
+ * deadline expiring while queued, discovering or connecting). An HTTP 401/403/429 answer to a
22
+ * dispatched request is `unknown` too: the MCP transport gives no proof that the server did not act.
23
+ *
24
+ * One deadline bounds the whole operation: the slot wait, discovery, connect and the call itself,
25
+ * including the HTTP request underneath: the SDK hands `fetch` only its transport-wide signal, so
26
+ * each request's own signal is joined in through {@link CapturingTransport}. The same wrapper keeps
27
+ * every response's `result` exactly as the server sent it, because the SDK's result schemas drop
28
+ * fields they do not model (extension capabilities, vendor fields on tools and content blocks).
29
+ * Errors carry a status or a class, never response text, and the bearer is scrubbed from anything
30
+ * the server sent back before it leaves this module.
31
+ */
32
+ import { AsyncLocalStorage } from "node:async_hooks";
33
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
34
+ import { StreamableHTTPClientTransport, StreamableHTTPError } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
35
+ import { CallToolResultSchema, CompleteResultSchema, ErrorCode, GetPromptResultSchema, ListPromptsResultSchema, ListResourcesResultSchema, ListResourceTemplatesResultSchema, ListToolsResultSchema, McpError, PromptListChangedNotificationSchema, ReadResourceResultSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema, } from "@modelcontextprotocol/sdk/types.js";
36
+ import { contractDigest } from "@cotal-ai/core";
37
+ import { credentialFor } from "./oauth.js";
38
+ import { linearMcpUrl, OriginRefusedError, RedirectRefusedError, pinnedFetch, ResponseTooLargeError } from "./origin.js";
39
+ /** Bytes of `value` as an agent tool prints it: pretty JSON, nested where an inventory page nests an
40
+ * entry. Indentation grows with depth, so a compact entry of a few kilobytes can print to hundreds;
41
+ * this measure is never smaller than the wire form, so one bound covers both. */
42
+ export function renderedBytes(value) {
43
+ return Buffer.byteLength(JSON.stringify({ items: [value] }, null, 2));
44
+ }
45
+ export const DEFAULT_LIMITS = {
46
+ maxResponseBytes: 512 * 1024,
47
+ maxInventoryBytes: 4 * 1024 * 1024,
48
+ maxInventoryPages: 200,
49
+ maxInventoryEntryBytes: 48 * 1024,
50
+ maxConcurrent: 8,
51
+ maxQueued: 32,
52
+ defaultTimeoutMs: 30_000,
53
+ maxTimeoutMs: 120_000,
54
+ maxInventoryAgeMs: 15 * 60_000,
55
+ };
56
+ /** Paths in the server capability object that this package represents. */
57
+ const REPRESENTED = new Set([
58
+ "tools", "tools.listChanged",
59
+ "resources", "resources.listChanged",
60
+ "prompts", "prompts.listChanged",
61
+ "completions",
62
+ ]);
63
+ function capabilityPaths(caps, prefix = "") {
64
+ const out = [];
65
+ for (const [k, v] of Object.entries(caps)) {
66
+ const path = prefix ? `${prefix}.${k}` : k;
67
+ out.push(path);
68
+ if (v && typeof v === "object" && !Array.isArray(v) && path !== "experimental")
69
+ out.push(...capabilityPaths(v, path));
70
+ }
71
+ return out;
72
+ }
73
+ class Slots {
74
+ max;
75
+ maxQueued;
76
+ active = 0;
77
+ waiting = [];
78
+ constructor(max, maxQueued) {
79
+ this.max = max;
80
+ this.maxQueued = maxQueued;
81
+ }
82
+ /** Resolves with a release function, `null` when the queue is full, or rejects with the
83
+ * signal's reason when it aborts while waiting (the waiter leaves the queue). */
84
+ async acquire(signal) {
85
+ signal?.throwIfAborted();
86
+ if (this.active < this.max)
87
+ this.active++;
88
+ else if (this.waiting.length >= this.maxQueued)
89
+ return null;
90
+ // A released slot is handed straight to the next waiter, so `active` never overshoots.
91
+ else
92
+ await new Promise((resolve, reject) => {
93
+ const wake = () => {
94
+ signal?.removeEventListener("abort", onAbort);
95
+ resolve();
96
+ };
97
+ const onAbort = () => {
98
+ const i = this.waiting.indexOf(wake);
99
+ if (i >= 0)
100
+ this.waiting.splice(i, 1);
101
+ reject(signal.reason);
102
+ };
103
+ this.waiting.push(wake);
104
+ signal?.addEventListener("abort", onAbort, { once: true });
105
+ });
106
+ let released = false;
107
+ return () => {
108
+ if (released)
109
+ return;
110
+ released = true;
111
+ const next = this.waiting.shift();
112
+ if (next)
113
+ next();
114
+ else
115
+ this.active--;
116
+ };
117
+ }
118
+ }
119
+ /** Reject when `signal` aborts, without leaving a listener behind. */
120
+ function bounded(p, signal) {
121
+ if (signal.aborted)
122
+ return Promise.reject(signal.reason);
123
+ return new Promise((resolve, reject) => {
124
+ const onAbort = () => reject(signal.reason);
125
+ signal.addEventListener("abort", onAbort, { once: true });
126
+ p.then((v) => { signal.removeEventListener("abort", onAbort); resolve(v); }, (e) => { signal.removeEventListener("abort", onAbort); reject(e); });
127
+ });
128
+ }
129
+ class DeadlineError extends Error {
130
+ constructor() {
131
+ super("the request deadline expired before dispatch");
132
+ this.name = "DeadlineError";
133
+ }
134
+ }
135
+ const dispatching = new AsyncLocalStorage();
136
+ function dispatch(signal) {
137
+ const end = new AbortController();
138
+ return { signal: AbortSignal.any([signal, end.signal]), end };
139
+ }
140
+ /** The SDK transport, with each request's {@link Dispatch} attached at send and resolved at the
141
+ * matching response. The SDK parses incoming messages with a passthrough result schema, so the
142
+ * `result` seen here is the server's object verbatim. */
143
+ class CapturingTransport {
144
+ inner;
145
+ onclose;
146
+ onerror;
147
+ onmessage;
148
+ pending = new Map();
149
+ constructor(inner) {
150
+ this.inner = inner;
151
+ inner.onclose = () => {
152
+ this.pending.clear();
153
+ this.onclose?.();
154
+ };
155
+ inner.onerror = (e) => this.onerror?.(e);
156
+ inner.onmessage = (message) => {
157
+ const id = "id" in message && !("method" in message) ? message.id : undefined;
158
+ if (typeof id === "string" || typeof id === "number") {
159
+ const d = this.pending.get(id);
160
+ this.pending.delete(id);
161
+ if (d && "result" in message)
162
+ d.raw = message.result;
163
+ }
164
+ this.onmessage?.(message);
165
+ };
166
+ }
167
+ start() {
168
+ return this.inner.start();
169
+ }
170
+ async send(message, options) {
171
+ const d = dispatching.getStore();
172
+ if (d && "method" in message && "id" in message) {
173
+ d.id = message.id;
174
+ this.pending.set(message.id, d);
175
+ }
176
+ await this.inner.send(message, options);
177
+ }
178
+ /** A request that ended without its response (deadline, cancellation) leaves no entry behind. */
179
+ forget(d) {
180
+ if (d.id !== undefined && this.pending.get(d.id) === d)
181
+ this.pending.delete(d.id);
182
+ }
183
+ close() {
184
+ return this.inner.close();
185
+ }
186
+ get sessionId() {
187
+ return this.inner.sessionId;
188
+ }
189
+ setProtocolVersion(version) {
190
+ this.inner.setProtocolVersion(version);
191
+ }
192
+ }
193
+ export class LinearUpstream {
194
+ account;
195
+ limits;
196
+ client;
197
+ transport;
198
+ /** The server's `initialize` result, verbatim. */
199
+ initialized;
200
+ connecting;
201
+ current;
202
+ stale = true;
203
+ closed = false;
204
+ /** Aborts every queued or in-flight operation on {@link close}. */
205
+ closing = new AbortController();
206
+ slots;
207
+ url;
208
+ credential;
209
+ constructor(account, limits = DEFAULT_LIMITS) {
210
+ this.account = account;
211
+ this.limits = limits;
212
+ this.url = linearMcpUrl(account.mode);
213
+ this.credential = credentialFor(account);
214
+ this.slots = new Slots(limits.maxConcurrent, limits.maxQueued);
215
+ }
216
+ /** The session, or the connect in flight shared by every caller waiting on it. `signal` is this
217
+ * caller's own deadline: when the last waiting caller leaves, the connect is ended with it, so an
218
+ * operation's deadline never leaves an initialize running behind nobody. */
219
+ async session(signal) {
220
+ if (this.closed)
221
+ throw new Error("the Linear upstream is closed");
222
+ if (this.client)
223
+ return this.client;
224
+ if (!this.connecting) {
225
+ const abandoned = new AbortController();
226
+ const shared = { abandoned, waiters: 0, done: false, promise: this.connect(abandoned.signal) };
227
+ shared.promise.finally(() => { shared.done = true; this.connecting = undefined; }).catch(() => { });
228
+ this.connecting = shared;
229
+ }
230
+ const c = this.connecting;
231
+ c.waiters++;
232
+ try {
233
+ return await bounded(c.promise, signal);
234
+ }
235
+ finally {
236
+ if (--c.waiters === 0 && !c.done)
237
+ c.abandoned.abort(new Error("every caller left before the session was established"));
238
+ }
239
+ }
240
+ async connect(abandoned) {
241
+ const pinned = pinnedFetch(this.url, () => this.credential.bearer(), this.limits.maxResponseBytes);
242
+ const transport = new CapturingTransport(new StreamableHTTPClientTransport(this.url, {
243
+ // The request being dispatched ends its own HTTP request when its deadline expires; the SDK
244
+ // only passes its transport-wide signal here.
245
+ fetch: (url, init) => {
246
+ const d = dispatching.getStore();
247
+ // Only the request's own POST belongs to it. The standalone GET stream the SDK opens after
248
+ // `initialized` is the session's, bounded by the transport-wide signal and {@link close}.
249
+ if (!d || init?.method !== "POST")
250
+ return pinned(url, init);
251
+ const p = pinned(url, { ...init, signal: init?.signal ? AbortSignal.any([init.signal, d.signal]) : d.signal });
252
+ // The slot behind this request is held until this HTTP request has ended, so a deadline
253
+ // never lets the next request start while the aborted one is still open.
254
+ d.inflight = p.then(() => undefined, () => undefined);
255
+ return p;
256
+ },
257
+ // Resuming a dropped stream is not a re-dispatch, but this client still never reconnects on its own.
258
+ reconnectionOptions: { maxRetries: 0, initialReconnectionDelay: 1000, maxReconnectionDelay: 1000, reconnectionDelayGrowFactor: 1 },
259
+ }));
260
+ const client = new Client({ name: "cotal-linear", version: "1" }, { capabilities: {} });
261
+ const markStale = async () => {
262
+ this.stale = true;
263
+ };
264
+ client.setNotificationHandler(ToolListChangedNotificationSchema, markStale);
265
+ client.setNotificationHandler(ResourceListChangedNotificationSchema, markStale);
266
+ client.setNotificationHandler(PromptListChangedNotificationSchema, markStale);
267
+ client.onclose = () => this.drop(client);
268
+ // Closing the upstream ends a connect in flight: the initialize request is aborted and no
269
+ // session is published afterwards.
270
+ const init = dispatch(AbortSignal.any([this.closing.signal, abandoned, AbortSignal.timeout(this.limits.defaultTimeoutMs)]));
271
+ try {
272
+ await dispatching.run(init, () => client.connect(transport, { timeout: this.limits.defaultTimeoutMs }));
273
+ if (!init.raw)
274
+ throw new Error("the initialize response was not captured");
275
+ if (this.closed)
276
+ throw new Error("the Linear upstream is closed");
277
+ }
278
+ catch (e) {
279
+ transport.forget(init);
280
+ init.end.abort();
281
+ await client.close().catch(() => { });
282
+ throw e;
283
+ }
284
+ finally {
285
+ init.end.abort();
286
+ }
287
+ this.client = client;
288
+ this.transport = transport;
289
+ this.initialized = init.raw;
290
+ // A new session may negotiate differently, so the inventory is re-read before the next call.
291
+ this.stale = true;
292
+ return client;
293
+ }
294
+ /** Forget a session the server ended or that failed. Its in-flight requests reject. */
295
+ drop(client) {
296
+ if (this.client !== client)
297
+ return;
298
+ this.client = undefined;
299
+ this.transport = undefined;
300
+ this.initialized = undefined;
301
+ this.stale = true;
302
+ void client.close().catch(() => { });
303
+ }
304
+ /** One SDK request in its own dispatch context: the schema still validates the shape, and the
305
+ * server's `result` is returned verbatim. */
306
+ async raw(signal, run) {
307
+ const d = dispatch(signal);
308
+ try {
309
+ await dispatching.run(d, run);
310
+ }
311
+ finally {
312
+ this.transport?.forget(d);
313
+ // Settled either way: a response stream still open past the result is ended here.
314
+ d.end.abort();
315
+ await d.inflight;
316
+ }
317
+ if (!d.raw)
318
+ throw new Error("the MCP response was not captured");
319
+ return d.raw;
320
+ }
321
+ /** Complete discovery. Refuses on any cap rather than returning a partial inventory. `signal`
322
+ * bounds the whole read, including the slot wait and connect. */
323
+ async inventory(opts = {}) {
324
+ const fresh = this.current && Date.now() - Date.parse(this.current.fetchedAt) < this.limits.maxInventoryAgeMs;
325
+ if (this.current && fresh && !this.stale && !opts.refresh)
326
+ return this.current;
327
+ const signal = AbortSignal.any([this.closing.signal, opts.signal ?? AbortSignal.timeout(this.limits.maxTimeoutMs)]);
328
+ const release = await this.slots.acquire(signal);
329
+ if (!release)
330
+ throw new Error("the Linear upstream queue is full");
331
+ try {
332
+ await bounded(this.credential.prepare(), signal);
333
+ const client = await this.session(signal);
334
+ const initialized = this.initialized ?? {};
335
+ const caps = (initialized.capabilities ?? {});
336
+ const version = initialized.serverInfo;
337
+ const instructions = initialized.instructions;
338
+ const head = { server: version, ...(typeof instructions === "string" ? { instructions } : {}), capabilities: caps };
339
+ const headSize = renderedBytes(head);
340
+ if (headSize > this.limits.maxInventoryEntryBytes)
341
+ throw new Error(`initialize's instructions and capabilities render to ${headSize} bytes, over the ${this.limits.maxInventoryEntryBytes}-byte bound; refusing the inventory`);
342
+ let pages = 0;
343
+ let bytes = 0;
344
+ const timeout = this.limits.defaultTimeoutMs;
345
+ const drain = async (method, schema, key) => {
346
+ const items = [];
347
+ const seen = new Set();
348
+ let cursor;
349
+ do {
350
+ if (++pages > this.limits.maxInventoryPages)
351
+ throw new Error(`Linear discovery exceeded ${this.limits.maxInventoryPages} pages; refusing a partial inventory`);
352
+ const page = await this.raw(signal, () => client.request({ method, params: cursor === undefined ? {} : { cursor } }, schema, { timeout, signal }));
353
+ bytes += Buffer.byteLength(JSON.stringify(page));
354
+ if (bytes > this.limits.maxInventoryBytes)
355
+ throw new Error(`Linear discovery exceeded ${this.limits.maxInventoryBytes} bytes; refusing a partial inventory`);
356
+ const list = page[key];
357
+ if (!Array.isArray(list))
358
+ throw new Error(`${method} returned no ${key} array`);
359
+ for (const entry of list) {
360
+ const size = renderedBytes(entry);
361
+ if (size > this.limits.maxInventoryEntryBytes)
362
+ throw new Error(`${key}[${items.length}] ("${String(entry.name ?? entry.uri ?? entry.uriTemplate ?? "")}") renders to ${size} bytes, over the ${this.limits.maxInventoryEntryBytes}-byte entry bound; refusing the inventory`);
363
+ items.push(entry);
364
+ }
365
+ const next = page.nextCursor;
366
+ if (next !== undefined && typeof next !== "string")
367
+ throw new Error(`${method} returned a non-string cursor`);
368
+ if (next !== undefined && seen.has(next))
369
+ throw new Error(`${method} repeated a cursor; refusing a looping inventory`);
370
+ if (next !== undefined)
371
+ seen.add(next);
372
+ cursor = next;
373
+ } while (cursor !== undefined);
374
+ return items;
375
+ };
376
+ // Mark fresh before reading, so a list_changed that lands mid-read leaves it stale.
377
+ this.stale = false;
378
+ const tools = caps.tools ? await drain("tools/list", ListToolsResultSchema, "tools") : [];
379
+ const resources = caps.resources ? await drain("resources/list", ListResourcesResultSchema, "resources") : undefined;
380
+ const resourceTemplates = caps.resources ? await drain("resources/templates/list", ListResourceTemplatesResultSchema, "resourceTemplates") : undefined;
381
+ const prompts = caps.prompts ? await drain("prompts/list", ListPromptsResultSchema, "prompts") : undefined;
382
+ const names = new Set();
383
+ for (const t of tools) {
384
+ if (typeof t.name !== "string")
385
+ throw new Error("tools/list returned a tool with no name");
386
+ if (names.has(t.name))
387
+ throw new Error(`tools/list returned the tool name "${t.name}" twice`);
388
+ names.add(t.name);
389
+ }
390
+ const body = {
391
+ endpoint: this.url.href,
392
+ mode: this.account.mode,
393
+ server: { ...(version?.name !== undefined ? { name: version.name } : {}), ...(version?.version !== undefined ? { version: version.version } : {}) },
394
+ ...(typeof instructions === "string" ? { instructions } : {}),
395
+ capabilities: caps,
396
+ tools,
397
+ ...(resources ? { resources } : {}),
398
+ ...(resourceTemplates ? { resourceTemplates } : {}),
399
+ ...(prompts ? { prompts } : {}),
400
+ unsupported: capabilityPaths(caps).filter((p) => !REPRESENTED.has(p)),
401
+ };
402
+ const inv = { ...body, pages, bytes, fetchedAt: new Date().toISOString(), digest: contractDigest(JSON.parse(JSON.stringify(body))) };
403
+ this.current = inv;
404
+ return inv;
405
+ }
406
+ catch (e) {
407
+ this.stale = true;
408
+ if (e instanceof StreamableHTTPError && e.code === 404 && this.client)
409
+ this.drop(this.client);
410
+ throw new Error(this.describeError(e));
411
+ }
412
+ finally {
413
+ release();
414
+ }
415
+ }
416
+ /** Forward `tools/call`. `inventoryDigest`, when given, must match the live inventory. */
417
+ async callTool(req) {
418
+ return this.forward(req, (inv) => {
419
+ if (!inv.tools.some((t) => t.name === req.name))
420
+ return `the tool "${req.name}" is not in the current inventory`;
421
+ }, { method: "tools/call", params: { name: req.name, ...(req.arguments !== undefined ? { arguments: req.arguments } : {}) } }, CallToolResultSchema);
422
+ }
423
+ async readResource(req) {
424
+ return this.forward(req, (inv) => (inv.capabilities.resources ? undefined : "the server does not advertise resources"), { method: "resources/read", params: { uri: req.uri } }, ReadResourceResultSchema, "not-advertised");
425
+ }
426
+ async getPrompt(req) {
427
+ return this.forward(req, (inv) => (inv.prompts?.some((p) => p.name === req.name) ? undefined : `the prompt "${req.name}" is not in the current inventory`), { method: "prompts/get", params: { name: req.name, ...(req.arguments ? { arguments: req.arguments } : {}) } }, GetPromptResultSchema, "not-advertised");
428
+ }
429
+ async complete(req) {
430
+ return this.forward(req, (inv) => (inv.capabilities.completions ? undefined : "the server does not advertise completions"), { method: "completion/complete", params: req.params }, CompleteResultSchema, "not-advertised");
431
+ }
432
+ async forward(req, precheck, request, schema, absentReason = "unknown-tool") {
433
+ if (this.closed)
434
+ return { kind: "refused", reason: "closed", detail: "the Linear upstream is closed", outcome: "not-executed" };
435
+ const timeoutMs = Math.min(req.timeoutMs ?? this.limits.defaultTimeoutMs, this.limits.maxTimeoutMs);
436
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0)
437
+ throw new Error(`timeoutMs must be a positive integer`);
438
+ // ONE deadline for the whole operation: queueing, discovery, connect and the call.
439
+ const ctl = new AbortController();
440
+ let why;
441
+ const timer = setTimeout(() => {
442
+ why ??= "timeout";
443
+ ctl.abort(new DeadlineError());
444
+ }, timeoutMs);
445
+ const onCancel = () => {
446
+ why ??= "cancelled";
447
+ ctl.abort(new Error("cancelled"));
448
+ };
449
+ req.signal?.addEventListener("abort", onCancel, { once: true });
450
+ this.closing.signal.addEventListener("abort", onCancel, { once: true });
451
+ if (req.signal?.aborted || this.closing.signal.aborted)
452
+ onCancel();
453
+ const notDispatched = () => why === "timeout"
454
+ ? { kind: "refused", reason: "deadline", detail: "the deadline expired before the request was sent", outcome: "not-executed" }
455
+ : { kind: "refused", reason: "closed", detail: "cancelled before the request was sent", outcome: "not-executed" };
456
+ let release;
457
+ try {
458
+ // Discovery happens before dispatch: a stale or never-read inventory is re-read first. The
459
+ // request itself has not been sent if discovery fails.
460
+ let inv;
461
+ try {
462
+ inv = await this.inventory({ signal: ctl.signal });
463
+ await bounded(this.credential.prepare(), ctl.signal);
464
+ }
465
+ catch (e) {
466
+ if (ctl.signal.aborted)
467
+ return notDispatched();
468
+ return { kind: "refused", reason: "discovery-failed", detail: `Linear discovery failed: ${this.describeError(e)}`, outcome: "not-executed" };
469
+ }
470
+ if (req.inventoryDigest !== undefined && req.inventoryDigest !== inv.digest)
471
+ return { kind: "refused", reason: "stale-inventory", detail: `the inventory changed (now ${inv.digest}); read it again before calling`, outcome: "not-executed" };
472
+ const absent = precheck(inv);
473
+ if (absent)
474
+ return { kind: "refused", reason: absentReason, detail: absent, outcome: "not-executed" };
475
+ try {
476
+ release = await this.slots.acquire(ctl.signal);
477
+ }
478
+ catch {
479
+ return notDispatched();
480
+ }
481
+ if (!release)
482
+ return { kind: "refused", reason: "queue-full", detail: "the Linear upstream queue is full", outcome: "not-executed" };
483
+ const client = this.client;
484
+ if (!client)
485
+ return { kind: "refused", reason: "discovery-failed", detail: "the MCP session ended after discovery; read the inventory again", outcome: "not-executed" };
486
+ if (ctl.signal.aborted)
487
+ return notDispatched();
488
+ // From here the request is handed to the transport. The SDK sends notifications/cancelled
489
+ // when the signal aborts and the HTTP request underneath ends with it; the SDK's own timeout
490
+ // sits past ours.
491
+ const result = await this.raw(ctl.signal, () => client.request(request, schema, { signal: ctl.signal, timeout: timeoutMs + 5_000 }));
492
+ return { kind: "result", result, inventoryDigest: inv.digest };
493
+ }
494
+ catch (e) {
495
+ return this.classify(e, why);
496
+ }
497
+ finally {
498
+ clearTimeout(timer);
499
+ req.signal?.removeEventListener("abort", onCancel);
500
+ this.closing.signal.removeEventListener("abort", onCancel);
501
+ release?.();
502
+ }
503
+ }
504
+ /** A failure as a status or class, with the bearer scrubbed. Response bodies are never kept. */
505
+ describeError(e) {
506
+ if (e instanceof StreamableHTTPError)
507
+ return `HTTP ${e.code ?? "error"} from the Linear MCP server`;
508
+ if (e instanceof OriginRefusedError || e instanceof RedirectRefusedError || e instanceof ResponseTooLargeError || e instanceof DeadlineError)
509
+ return e.message;
510
+ if (e instanceof McpError)
511
+ return this.scrub(`MCP error ${e.code}: ${e.message}`);
512
+ return this.scrub(e instanceof Error ? `${e.name}: ${e.message}` : "an unexpected failure");
513
+ }
514
+ /** Remove the current bearer from text the server or a library produced. */
515
+ scrub(text) {
516
+ let token;
517
+ try {
518
+ token = this.credential.bearer();
519
+ }
520
+ catch {
521
+ token = undefined;
522
+ }
523
+ return token && token.length >= 8 ? text.split(token).join("[redacted]") : text;
524
+ }
525
+ scrubValue(v) {
526
+ if (typeof v === "string")
527
+ return this.scrub(v);
528
+ if (Array.isArray(v))
529
+ return v.map((x) => this.scrubValue(x));
530
+ if (v && typeof v === "object")
531
+ return Object.fromEntries(Object.entries(v).map(([k, x]) => [this.scrub(k), this.scrubValue(x)]));
532
+ return v;
533
+ }
534
+ classify(e, why) {
535
+ const detail = this.describeError(e);
536
+ if (e instanceof OriginRefusedError)
537
+ return { kind: "failed", reason: "transport", detail, outcome: "not-executed" };
538
+ if (e instanceof RedirectRefusedError)
539
+ return { kind: "failed", reason: "transport", detail, outcome: "unknown" };
540
+ if (why)
541
+ return { kind: "failed", reason: why, detail: `${why} after dispatch; the request may or may not have run`, outcome: "unknown" };
542
+ // Attributed only when THIS request's own response crossed the cap. A streamed overflow on
543
+ // another request's stream ends that request, not this one.
544
+ if (e instanceof ResponseTooLargeError)
545
+ return { kind: "failed", reason: "output-too-large", detail: `the response exceeded ${this.limits.maxResponseBytes} bytes and was discarded; the request may have run`, outcome: "unknown" };
546
+ if (e instanceof StreamableHTTPError) {
547
+ const status = e.code;
548
+ if (status === 404) {
549
+ if (this.client)
550
+ this.drop(this.client);
551
+ return { kind: "failed", reason: "session-expired", detail: "the MCP session expired; the call is not retried and may have run", outcome: "unknown" };
552
+ }
553
+ if (status === 401)
554
+ return { kind: "failed", reason: "unauthenticated", detail, outcome: "unknown" };
555
+ if (status === 403)
556
+ return { kind: "failed", reason: "permission-denied", detail, outcome: "unknown" };
557
+ if (status === 429)
558
+ return { kind: "failed", reason: "rate-limited", detail, outcome: "unknown" };
559
+ return { kind: "failed", reason: "transport", detail, outcome: "unknown" };
560
+ }
561
+ if (e instanceof McpError) {
562
+ if (e.code === ErrorCode.RequestTimeout)
563
+ return { kind: "failed", reason: "timeout", detail, outcome: "unknown" };
564
+ if (e.code === ErrorCode.ConnectionClosed)
565
+ return { kind: "failed", reason: "transport", detail, outcome: "unknown" };
566
+ return { kind: "protocol-error", code: e.code, message: this.scrub(e.message), ...(e.data !== undefined ? { data: this.scrubValue(e.data) } : {}), outcome: "unknown" };
567
+ }
568
+ return { kind: "failed", reason: "transport", detail, outcome: "unknown" };
569
+ }
570
+ /** Close the session and end it upstream, within `graceMs`. Queued requests refuse before
571
+ * dispatch; in-flight ones are cancelled and report `unknown`. */
572
+ async close(graceMs = 5_000) {
573
+ this.closed = true;
574
+ this.closing.abort(new Error("the Linear upstream is closing"));
575
+ const transport = this.transport;
576
+ const client = this.client;
577
+ const connecting = this.connecting;
578
+ this.client = undefined;
579
+ this.transport = undefined;
580
+ const grace = AbortSignal.timeout(graceMs);
581
+ if (transport?.sessionId)
582
+ await bounded(transport.inner.terminateSession(), grace).catch(() => { });
583
+ await bounded(client?.close() ?? Promise.resolve(), grace).catch(() => { });
584
+ // A connect in flight was aborted above; one that still completes is closed, never published.
585
+ if (connecting) {
586
+ const late = await bounded(connecting.promise, grace).catch(() => undefined);
587
+ if (late)
588
+ await bounded(late.close(), grace).catch(() => { });
589
+ }
590
+ }
591
+ }
592
+ //# sourceMappingURL=upstream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"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"}