sunpeak 0.18.13 → 0.18.14

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/mcp/index.js CHANGED
@@ -7566,7 +7566,7 @@ var toRequestError = (e) => {
7566
7566
  return new RequestError(e.message, { cause: e });
7567
7567
  };
7568
7568
  var GlobalRequest = global.Request;
7569
- var Request = class extends GlobalRequest {
7569
+ var Request$1 = class extends GlobalRequest {
7570
7570
  constructor(input, options) {
7571
7571
  if (typeof input === "object" && getRequestCache in input) input = input[getRequestCache]();
7572
7572
  if (typeof options?.body?.getReader !== "undefined") options.duplex ??= "half";
@@ -7591,7 +7591,7 @@ var newRequestFromIncoming = (method, url, headers, incoming, abortController) =
7591
7591
  };
7592
7592
  if (method === "TRACE") {
7593
7593
  init.method = "GET";
7594
- const req = new Request(url, init);
7594
+ const req = new Request$1(url, init);
7595
7595
  Object.defineProperty(req, "method", { get() {
7596
7596
  return "TRACE";
7597
7597
  } });
@@ -7614,7 +7614,7 @@ var newRequestFromIncoming = (method, url, headers, incoming, abortController) =
7614
7614
  }
7615
7615
  } });
7616
7616
  } else init.body = Readable.toWeb(incoming);
7617
- return new Request(url, init);
7617
+ return new Request$1(url, init);
7618
7618
  };
7619
7619
  var getRequestCache = Symbol("getRequestCache");
7620
7620
  var requestCache = Symbol("requestCache");
@@ -7671,7 +7671,7 @@ var requestPrototype = {
7671
7671
  return this[getRequestCache]()[k]();
7672
7672
  } });
7673
7673
  });
7674
- Object.setPrototypeOf(requestPrototype, Request.prototype);
7674
+ Object.setPrototypeOf(requestPrototype, Request$1.prototype);
7675
7675
  var newRequest = (incoming, defaultHostname) => {
7676
7676
  const req = Object.create(requestPrototype);
7677
7677
  req[incomingKey] = incoming;
@@ -7922,8 +7922,8 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
7922
7922
  };
7923
7923
  var getRequestListener = (fetchCallback, options = {}) => {
7924
7924
  const autoCleanupIncoming = options.autoCleanupIncoming ?? true;
7925
- if (options.overrideGlobalObjects !== false && global.Request !== Request) {
7926
- Object.defineProperty(global, "Request", { value: Request });
7925
+ if (options.overrideGlobalObjects !== false && global.Request !== Request$1) {
7926
+ Object.defineProperty(global, "Request", { value: Request$1 });
7927
7927
  Object.defineProperty(global, "Response", { value: Response2 });
7928
7928
  }
7929
7929
  return async (incoming, outgoing) => {
@@ -9866,6 +9866,39 @@ var CORS_HEADERS = {
9866
9866
  "Access-Control-Allow-Headers": "content-type, accept, authorization, mcp-session-id, ngrok-skip-browser-warning",
9867
9867
  "Access-Control-Expose-Headers": "mcp-session-id"
9868
9868
  };
9869
+ /** Convert a Node.js IncomingMessage to a minimal Web Standard Request (body is passed separately). */
9870
+ function nodeReqToWebRequest(req) {
9871
+ const url = new URL$1(req.url, `http://${req.headers.host ?? "localhost"}`);
9872
+ const headers = new Headers();
9873
+ for (const [key, value] of Object.entries(req.headers)) if (value != null) headers.set(key, Array.isArray(value) ? value.join(", ") : value);
9874
+ return new Request(url.toString(), {
9875
+ method: req.method,
9876
+ headers
9877
+ });
9878
+ }
9879
+ /** Pipe a Web Standard Response (including streaming SSE) back to a Node.js ServerResponse. */
9880
+ async function pipeWebResponseToNode(webResponse, res) {
9881
+ const headers = {};
9882
+ webResponse.headers.forEach((value, key) => {
9883
+ headers[key] = value;
9884
+ });
9885
+ res.writeHead(webResponse.status, headers);
9886
+ if (!webResponse.body) {
9887
+ res.end();
9888
+ return;
9889
+ }
9890
+ const reader = webResponse.body.getReader();
9891
+ res.on("close", () => reader.cancel());
9892
+ try {
9893
+ for (;;) {
9894
+ const { done, value } = await reader.read();
9895
+ if (done) break;
9896
+ if (!res.destroyed) res.write(value);
9897
+ }
9898
+ } finally {
9899
+ if (!res.destroyed) res.end();
9900
+ }
9901
+ }
9869
9902
  /**
9870
9903
  * Create a request handler that manages MCP sessions over Streamable HTTP.
9871
9904
  *
@@ -9917,15 +9950,18 @@ function createMcpHandler(config) {
9917
9950
  res.end();
9918
9951
  return;
9919
9952
  }
9920
- for (const [key, value] of Object.entries(CORS_HEADERS)) res.setHeader(key, value);
9953
+ let authInfo;
9921
9954
  if (authFn) {
9922
- const authInfo = await authFn(req);
9923
- if (!authInfo) {
9924
- res.writeHead(401, { "WWW-Authenticate": "Bearer" });
9955
+ const result = await authFn(req);
9956
+ if (!result) {
9957
+ res.writeHead(401, {
9958
+ ...CORS_HEADERS,
9959
+ "WWW-Authenticate": "Bearer"
9960
+ });
9925
9961
  res.end("Unauthorized");
9926
9962
  return;
9927
9963
  }
9928
- req.auth = authInfo;
9964
+ authInfo = result;
9929
9965
  }
9930
9966
  let parsedBody;
9931
9967
  if (req.method === "POST") {
@@ -9951,6 +9987,7 @@ function createMcpHandler(config) {
9951
9987
  return;
9952
9988
  }
9953
9989
  }
9990
+ const webRequest = nodeReqToWebRequest(req);
9954
9991
  const sessionId = req.headers["mcp-session-id"];
9955
9992
  if (sessionId) {
9956
9993
  const session = sessions.get(sessionId);
@@ -9959,12 +9996,15 @@ function createMcpHandler(config) {
9959
9996
  return;
9960
9997
  }
9961
9998
  session.lastActivity = Date.now();
9962
- await session.transport.handleRequest(req, res, parsedBody);
9999
+ await pipeWebResponseToNode(addCorsHeaders(await session.transport.handleRequest(webRequest, {
10000
+ parsedBody,
10001
+ authInfo
10002
+ })), res);
9963
10003
  return;
9964
10004
  }
9965
10005
  if (req.method === "POST") {
9966
10006
  const server = createProductionMcpServer(config);
9967
- const transport = new StreamableHTTPServerTransport({
10007
+ const transport = new WebStandardStreamableHTTPServerTransport({
9968
10008
  sessionIdGenerator: () => randomUUID(),
9969
10009
  enableJsonResponse: config.enableJsonResponse ?? true,
9970
10010
  onsessioninitialized: (id) => {
@@ -10004,7 +10044,10 @@ function createMcpHandler(config) {
10004
10044
  }
10005
10045
  };
10006
10046
  await server.connect(transport);
10007
- await transport.handleRequest(req, res, parsedBody);
10047
+ await pipeWebResponseToNode(addCorsHeaders(await transport.handleRequest(webRequest, {
10048
+ parsedBody,
10049
+ authInfo
10050
+ })), res);
10008
10051
  return;
10009
10052
  }
10010
10053
  res.writeHead(400).end("Bad Request: session ID required");
@@ -10137,8 +10180,7 @@ function createHandler(config) {
10137
10180
  /** Add CORS headers to a response (including streaming SSE responses). */
10138
10181
  function addCorsHeaders(response) {
10139
10182
  const headers = new Headers(response.headers);
10140
- headers.set("Access-Control-Allow-Origin", "*");
10141
- headers.set("Access-Control-Expose-Headers", "mcp-session-id");
10183
+ for (const [key, value] of Object.entries(CORS_HEADERS)) headers.set(key, value);
10142
10184
  return new Response(response.body, {
10143
10185
  status: response.status,
10144
10186
  statusText: response.statusText,