@sunerpy/opencode-kiro-auth 0.13.3 → 0.13.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.
|
@@ -75,22 +75,26 @@ export class RequestHandler {
|
|
|
75
75
|
else
|
|
76
76
|
inboundSignal?.addEventListener('abort', abortFromInbound, { once: true });
|
|
77
77
|
let timeout;
|
|
78
|
-
const
|
|
78
|
+
const beginUpstreamWait = (phase) => {
|
|
79
79
|
if (requestController.signal.aborted)
|
|
80
80
|
return;
|
|
81
81
|
if (timeout)
|
|
82
82
|
clearDeadlineTimeout(timeout);
|
|
83
|
-
timeout = setDeadlineTimeout(() => requestController.abort(new DOMException(
|
|
83
|
+
timeout = setDeadlineTimeout(() => requestController.abort(new DOMException(`Kiro request timed out waiting for ${phase}`, 'TimeoutError')), this.config.request_timeout_ms);
|
|
84
|
+
};
|
|
85
|
+
const endUpstreamWait = () => {
|
|
86
|
+
if (!timeout)
|
|
87
|
+
return;
|
|
88
|
+
clearDeadlineTimeout(timeout);
|
|
89
|
+
timeout = undefined;
|
|
84
90
|
};
|
|
85
|
-
refreshRequestDeadline();
|
|
86
91
|
let requestCleanupDone = false;
|
|
87
92
|
let responseOwnsLifecycle = false;
|
|
88
93
|
const cleanupRequest = () => {
|
|
89
94
|
if (requestCleanupDone)
|
|
90
95
|
return;
|
|
91
96
|
requestCleanupDone = true;
|
|
92
|
-
|
|
93
|
-
clearDeadlineTimeout(timeout);
|
|
97
|
+
endUpstreamWait();
|
|
94
98
|
inboundSignal?.removeEventListener('abort', abortFromInbound);
|
|
95
99
|
};
|
|
96
100
|
const signal = requestController.signal;
|
|
@@ -196,15 +200,22 @@ export class RequestHandler {
|
|
|
196
200
|
this.handleSuccessfulRequest(acc);
|
|
197
201
|
await this.usageTracker.syncUsage(acc, auth, isCurrentAttempt);
|
|
198
202
|
};
|
|
199
|
-
|
|
203
|
+
let sdkResponse;
|
|
204
|
+
beginUpstreamWait('SDK response');
|
|
205
|
+
try {
|
|
206
|
+
sdkResponse = await client.send(command, { abortSignal: signal });
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
endUpstreamWait();
|
|
210
|
+
}
|
|
200
211
|
sendResolved = true;
|
|
201
|
-
refreshRequestDeadline();
|
|
202
212
|
if (apiTimestamp) {
|
|
203
213
|
this.logSdkResponse(sdkPrep, apiTimestamp);
|
|
204
214
|
}
|
|
205
215
|
const response = await this.responseHandler.handleSdkSuccess(sdkResponse, model, sdkPrep.conversationId, sdkPrep.streaming, {
|
|
206
216
|
signal,
|
|
207
|
-
|
|
217
|
+
onUpstreamWaitStart: () => beginUpstreamWait('stream event'),
|
|
218
|
+
onUpstreamWaitEnd: endUpstreamWait,
|
|
208
219
|
onComplete: completeRequest,
|
|
209
220
|
onTerminal: cleanupRequest,
|
|
210
221
|
onCancel: (reason) => requestController.abort(reason),
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SdkEventStreamIterationError } from './stream-error.js';
|
|
2
2
|
export interface SdkResponseLifecycle {
|
|
3
3
|
signal?: AbortSignal;
|
|
4
|
-
|
|
4
|
+
onUpstreamWaitStart?: () => void;
|
|
5
|
+
onUpstreamWaitEnd?: () => void;
|
|
5
6
|
onComplete?: () => void | Promise<void>;
|
|
6
7
|
onTerminal?: () => void;
|
|
7
8
|
onCancel?: (reason: unknown) => void;
|
|
@@ -11,7 +11,7 @@ async function closeIterator(iterator) {
|
|
|
11
11
|
}
|
|
12
12
|
catch { }
|
|
13
13
|
}
|
|
14
|
-
function wrapSdkEventStream(sdkResponse, signal,
|
|
14
|
+
function wrapSdkEventStream(sdkResponse, signal, onUpstreamWaitStart, onUpstreamWaitEnd) {
|
|
15
15
|
const eventStream = sdkResponse.generateAssistantResponseResponse;
|
|
16
16
|
if (!eventStream || typeof eventStream[Symbol.asyncIterator] !== 'function') {
|
|
17
17
|
return { response: sdkResponse, closeRaw: async () => { } };
|
|
@@ -25,33 +25,34 @@ function wrapSdkEventStream(sdkResponse, signal, onActivity) {
|
|
|
25
25
|
await closeIterator(rawIterator);
|
|
26
26
|
};
|
|
27
27
|
const nextRaw = async () => {
|
|
28
|
-
|
|
29
|
-
if (!result.done)
|
|
30
|
-
onActivity?.();
|
|
31
|
-
return result;
|
|
32
|
-
};
|
|
33
|
-
if (!signal)
|
|
34
|
-
return rawIterator.next().then(recordActivity);
|
|
35
|
-
if (signal.aborted) {
|
|
28
|
+
if (signal?.aborted) {
|
|
36
29
|
await closeRaw();
|
|
37
30
|
throw abortReason(signal);
|
|
38
31
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
settled =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
32
|
+
onUpstreamWaitStart?.();
|
|
33
|
+
try {
|
|
34
|
+
if (!signal)
|
|
35
|
+
return await rawIterator.next();
|
|
36
|
+
return await new Promise((resolve, reject) => {
|
|
37
|
+
let settled = false;
|
|
38
|
+
const settle = (callback) => {
|
|
39
|
+
if (settled)
|
|
40
|
+
return;
|
|
41
|
+
settled = true;
|
|
42
|
+
signal.removeEventListener('abort', onAbort);
|
|
43
|
+
callback();
|
|
44
|
+
};
|
|
45
|
+
const onAbort = () => {
|
|
46
|
+
void closeRaw();
|
|
47
|
+
settle(() => reject(abortReason(signal)));
|
|
48
|
+
};
|
|
49
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
50
|
+
Promise.resolve(rawIterator.next()).then((result) => settle(() => resolve(result)), (error) => settle(() => reject(error)));
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
onUpstreamWaitEnd?.();
|
|
55
|
+
}
|
|
55
56
|
};
|
|
56
57
|
const wrappedIterator = {
|
|
57
58
|
async next() {
|
|
@@ -118,7 +119,7 @@ export class ResponseHandler {
|
|
|
118
119
|
}), { headers: { 'Content-Type': 'text/event-stream' } });
|
|
119
120
|
}
|
|
120
121
|
async handleSdkStreaming(sdkResponse, model, conversationId, lifecycle) {
|
|
121
|
-
const wrapped = wrapSdkEventStream(sdkResponse, lifecycle.signal, lifecycle.
|
|
122
|
+
const wrapped = wrapSdkEventStream(sdkResponse, lifecycle.signal, lifecycle.onUpstreamWaitStart, lifecycle.onUpstreamWaitEnd);
|
|
122
123
|
const transformed = transformSdkStream(wrapped.response, model, conversationId);
|
|
123
124
|
const buffered = [];
|
|
124
125
|
let firstSemantic;
|
|
@@ -227,7 +228,7 @@ export class ResponseHandler {
|
|
|
227
228
|
const toolCalls = [];
|
|
228
229
|
let inputTokens = 0;
|
|
229
230
|
let outputTokens = 0;
|
|
230
|
-
const wrapped = wrapSdkEventStream(sdkResponse, lifecycle.signal, lifecycle.
|
|
231
|
+
const wrapped = wrapSdkEventStream(sdkResponse, lifecycle.signal, lifecycle.onUpstreamWaitStart, lifecycle.onUpstreamWaitEnd);
|
|
231
232
|
const eventStream = wrapped.response.generateAssistantResponseResponse;
|
|
232
233
|
if (eventStream) {
|
|
233
234
|
try {
|
|
@@ -11,18 +11,11 @@ export class RetryStrategy {
|
|
|
11
11
|
error: `Exceeded max iterations (${this.config.max_request_iterations})`
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
if (Date.now() - context.startTime > this.config.request_timeout_ms) {
|
|
15
|
-
return {
|
|
16
|
-
canContinue: false,
|
|
17
|
-
error: 'Request timeout'
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
14
|
return { canContinue: true };
|
|
21
15
|
}
|
|
22
16
|
createContext() {
|
|
23
17
|
return {
|
|
24
|
-
iterations: 0
|
|
25
|
-
startTime: Date.now()
|
|
18
|
+
iterations: 0
|
|
26
19
|
};
|
|
27
20
|
}
|
|
28
21
|
}
|