@jeffreycao/copilot-api 1.10.3 → 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-C7_M_42Q.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(() => {});
@@ -4802,4 +4836,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
4802
4836
  //#endregion
4803
4837
  export { server };
4804
4838
 
4805
- //# sourceMappingURL=server-UsHsMP_2.js.map
4839
+ //# sourceMappingURL=server-D2zjqsEM.js.map