@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 +1 -1
- package/dist/{server-UsHsMP_2.js → server-D2zjqsEM.js} +58 -24
- package/dist/server-D2zjqsEM.js.map +1 -0
- package/dist/{start-C7_M_42Q.js → start-CNhCFSlB.js} +2 -2
- package/dist/{start-C7_M_42Q.js.map → start-CNhCFSlB.js.map} +1 -1
- package/package.json +1 -1
- package/dist/server-UsHsMP_2.js.map +0 -1
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-
|
|
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) =>
|
|
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
|
|
2728
|
-
|
|
2729
|
-
const
|
|
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
|
|
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
|
|
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
|
|
2756
|
+
return {
|
|
2757
|
+
entry: existing,
|
|
2758
|
+
pooled: true
|
|
2759
|
+
};
|
|
2752
2760
|
}
|
|
2753
|
-
const entry =
|
|
2761
|
+
const entry = createResponsesWebSocketEntry(request);
|
|
2754
2762
|
responsesWebSocketPool.set(request.poolKey, entry);
|
|
2755
|
-
return
|
|
2763
|
+
return {
|
|
2764
|
+
entry,
|
|
2765
|
+
pooled: true
|
|
2766
|
+
};
|
|
2756
2767
|
};
|
|
2757
|
-
const
|
|
2768
|
+
const createResponsesWebSocketEntry = (request) => {
|
|
2758
2769
|
const entry = {
|
|
2759
2770
|
closed: false,
|
|
2760
2771
|
idleTimer: null,
|
|
2761
|
-
|
|
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
|
|
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
|
-
|
|
2793
|
-
|
|
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)
|
|
2811
|
-
|
|
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-
|
|
4839
|
+
//# sourceMappingURL=server-D2zjqsEM.js.map
|