@jeffreycao/copilot-api 1.10.2 → 1.10.4

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/main.js CHANGED
@@ -42,7 +42,7 @@ bindElectronFetch();
42
42
  const { auth } = await import("./auth-BHa2OHXf.js");
43
43
  const { checkUsage } = await import("./check-usage-BdXGp1Wr.js");
44
44
  const { debug } = await import("./debug-C_TBkyUw.js");
45
- const { start } = await import("./start-BVraN8xz.js");
45
+ const { start } = await import("./start-CNhCFSlB.js");
46
46
  await runMain(defineCommand({
47
47
  meta: {
48
48
  name: "copilot-api",
@@ -2705,7 +2705,7 @@ const buildResponsesWebSocketPoolKey = (payload, { requestId, subagentMarker })
2705
2705
  const getResponsesWebSocketInitiator = (preparedHeaders) => {
2706
2706
  return getHeaderValue(preparedHeaders, "x-initiator")?.toLowerCase() === "agent" ? "agent" : "user";
2707
2707
  };
2708
- const createPooledResponsesWebSocketStream = (request) => runResponsesWebSocketPoolRequest(request);
2708
+ const createPooledResponsesWebSocketStream = (request) => runResponsesWebSocketRequest(request);
2709
2709
  const buildResponsesWebSocketPayload = (payload, initiator) => {
2710
2710
  const websocketPayload = {
2711
2711
  ...payload,
@@ -2724,11 +2724,12 @@ const buildResponsesWebSocketUrl = (baseUrl) => {
2724
2724
  return url.toString();
2725
2725
  };
2726
2726
  const responsesWebSocketPool = /* @__PURE__ */ new Map();
2727
- const runResponsesWebSocketPoolRequest = async function* (request) {
2728
- const entry = getResponsesWebSocketPoolEntry(request);
2729
- const release = await acquireResponsesWebSocketPoolEntry(request.poolKey, entry);
2727
+ const responsesWebSocketActiveRequests = /* @__PURE__ */ new Map();
2728
+ const runResponsesWebSocketRequest = async function* (request) {
2729
+ const { entry, pooled } = getResponsesWebSocketRequestTarget(request);
2730
+ const release = acquireResponsesWebSocketEntry(request.poolKey, entry, pooled);
2730
2731
  try {
2731
- const websocket = await entry.websocketPromise;
2732
+ const websocket = await getReadyResponsesWebSocket(request.poolKey, entry, pooled);
2732
2733
  websocket.send(JSON.stringify(request.payload));
2733
2734
  for await (const data of createWebSocketMessageStream(websocket)) {
2734
2735
  const chunk = createResponsesWebSocketStreamChunk(data);
@@ -2744,21 +2745,31 @@ const runResponsesWebSocketPoolRequest = async function* (request) {
2744
2745
  release();
2745
2746
  }
2746
2747
  };
2747
- const getResponsesWebSocketPoolEntry = (request) => {
2748
+ const getResponsesWebSocketRequestTarget = (request) => {
2749
+ if (getResponsesWebSocketActiveRequestCount(request.poolKey) > 0) return {
2750
+ entry: createResponsesWebSocketEntry(request),
2751
+ pooled: false
2752
+ };
2748
2753
  const existing = responsesWebSocketPool.get(request.poolKey);
2749
2754
  if (existing && !existing.closed) {
2750
2755
  clearResponsesWebSocketIdleTimer(existing);
2751
- return existing;
2756
+ return {
2757
+ entry: existing,
2758
+ pooled: true
2759
+ };
2752
2760
  }
2753
- const entry = createResponsesWebSocketPoolEntry(request);
2761
+ const entry = createResponsesWebSocketEntry(request);
2754
2762
  responsesWebSocketPool.set(request.poolKey, entry);
2755
- return entry;
2763
+ return {
2764
+ entry,
2765
+ pooled: true
2766
+ };
2756
2767
  };
2757
- const createResponsesWebSocketPoolEntry = (request) => {
2768
+ const createResponsesWebSocketEntry = (request) => {
2758
2769
  const entry = {
2759
2770
  closed: false,
2760
2771
  idleTimer: null,
2761
- lock: Promise.resolve(),
2772
+ requestCount: 0,
2762
2773
  websocketPromise: openResponsesWebSocket({
2763
2774
  headers: request.headers,
2764
2775
  url: buildResponsesWebSocketUrl(copilotBaseUrl(state))
@@ -2776,23 +2787,34 @@ const createResponsesWebSocketPoolEntry = (request) => {
2776
2787
  });
2777
2788
  return entry;
2778
2789
  };
2779
- const acquireResponsesWebSocketPoolEntry = async (poolKey, entry) => {
2780
- clearResponsesWebSocketIdleTimer(entry);
2781
- let releaseCurrent;
2782
- const previousLock = entry.lock;
2783
- entry.lock = new Promise((resolve) => {
2784
- releaseCurrent = resolve;
2785
- });
2786
- await previousLock;
2790
+ const acquireResponsesWebSocketEntry = (poolKey, entry, pooled) => {
2787
2791
  clearResponsesWebSocketIdleTimer(entry);
2792
+ incrementResponsesWebSocketActiveRequestCount(poolKey);
2793
+ entry.requestCount += 1;
2788
2794
  let released = false;
2789
2795
  return () => {
2790
2796
  if (released) return;
2791
2797
  released = true;
2792
- releaseCurrent();
2793
- if (!entry.closed) scheduleResponsesWebSocketIdleClose(poolKey, entry);
2798
+ entry.requestCount -= 1;
2799
+ decrementResponsesWebSocketActiveRequestCount(poolKey);
2800
+ if (entry.closed || entry.requestCount > 0) return;
2801
+ if (pooled && responsesWebSocketPool.get(poolKey) === entry) {
2802
+ scheduleResponsesWebSocketIdleClose(poolKey, entry);
2803
+ return;
2804
+ }
2805
+ removeResponsesWebSocketPoolEntry(poolKey, entry);
2794
2806
  };
2795
2807
  };
2808
+ const getReadyResponsesWebSocket = async (poolKey, entry, pooled) => {
2809
+ if (entry.closed) throw new Error("Responses websocket became unavailable before the request started");
2810
+ const websocket = await entry.websocketPromise;
2811
+ if (entry.closed || pooled && responsesWebSocketPool.get(poolKey) !== entry) throw new Error("Responses websocket became unavailable before the request started");
2812
+ if (websocket.readyState !== WebSocket.OPEN) {
2813
+ removeResponsesWebSocketPoolEntry(poolKey, entry);
2814
+ throw new Error("Responses websocket became unavailable before the request started");
2815
+ }
2816
+ return websocket;
2817
+ };
2796
2818
  const scheduleResponsesWebSocketIdleClose = (poolKey, entry) => {
2797
2819
  clearResponsesWebSocketIdleTimer(entry);
2798
2820
  entry.idleTimer = setTimeout(() => {
@@ -2806,9 +2828,21 @@ const clearResponsesWebSocketIdleTimer = (entry) => {
2806
2828
  entry.idleTimer = null;
2807
2829
  }
2808
2830
  };
2831
+ const getResponsesWebSocketActiveRequestCount = (poolKey) => responsesWebSocketActiveRequests.get(poolKey) ?? 0;
2832
+ const incrementResponsesWebSocketActiveRequestCount = (poolKey) => {
2833
+ responsesWebSocketActiveRequests.set(poolKey, getResponsesWebSocketActiveRequestCount(poolKey) + 1);
2834
+ };
2835
+ const decrementResponsesWebSocketActiveRequestCount = (poolKey) => {
2836
+ const nextCount = getResponsesWebSocketActiveRequestCount(poolKey) - 1;
2837
+ if (nextCount <= 0) {
2838
+ responsesWebSocketActiveRequests.delete(poolKey);
2839
+ return;
2840
+ }
2841
+ responsesWebSocketActiveRequests.set(poolKey, nextCount);
2842
+ };
2809
2843
  const removeResponsesWebSocketPoolEntry = (poolKey, entry) => {
2810
- if (responsesWebSocketPool.get(poolKey) !== entry) return;
2811
- responsesWebSocketPool.delete(poolKey);
2844
+ if (responsesWebSocketPool.get(poolKey) === entry) responsesWebSocketPool.delete(poolKey);
2845
+ if (entry.closed) return;
2812
2846
  entry.closed = true;
2813
2847
  clearResponsesWebSocketIdleTimer(entry);
2814
2848
  entry.websocketPromise.then(closeResponsesWebSocket).catch(() => {});
@@ -2816,6 +2850,12 @@ const removeResponsesWebSocketPoolEntry = (poolKey, entry) => {
2816
2850
  const unrefTimer = (timer) => {
2817
2851
  if (typeof timer === "object" && "unref" in timer && typeof timer.unref === "function") timer.unref();
2818
2852
  };
2853
+ const createResponsesWebSocketError = (message, event) => {
2854
+ const reason = event?.error ?? event?.message;
2855
+ if (reason === void 0 || reason === "") return new Error(message);
2856
+ const cause = toError(reason);
2857
+ return new Error(`${message}: ${cause.message}`, { cause });
2858
+ };
2819
2859
  const openResponsesWebSocket = async ({ headers, url }) => await new Promise((resolve, reject) => {
2820
2860
  const dispatcher = getProxyEnvDispatcher();
2821
2861
  const websocket = new WebSocket(url, dispatcher ? {
@@ -2830,9 +2870,9 @@ const openResponsesWebSocket = async ({ headers, url }) => await new Promise((re
2830
2870
  cleanup();
2831
2871
  resolve(websocket);
2832
2872
  };
2833
- const onError = () => {
2873
+ const onError = (event) => {
2834
2874
  cleanup();
2835
- reject(/* @__PURE__ */ new Error("Failed to create responses websocket"));
2875
+ reject(createResponsesWebSocketError("Failed to create responses websocket", event));
2836
2876
  };
2837
2877
  websocket.addEventListener("open", onOpen);
2838
2878
  websocket.addEventListener("error", onError);
@@ -2854,8 +2894,8 @@ const createWebSocketMessageStream = async function* (websocket) {
2854
2894
  closed = true;
2855
2895
  wake();
2856
2896
  };
2857
- const onError = () => {
2858
- error = /* @__PURE__ */ new Error("Responses websocket stream error");
2897
+ const onError = (event) => {
2898
+ error = createResponsesWebSocketError("Responses websocket stream error", event);
2859
2899
  wake();
2860
2900
  };
2861
2901
  websocket.addEventListener("message", onMessage);
@@ -4796,4 +4836,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
4796
4836
  //#endregion
4797
4837
  export { server };
4798
4838
 
4799
- //# sourceMappingURL=server-csGHkK-m.js.map
4839
+ //# sourceMappingURL=server-D2zjqsEM.js.map