@sunerpy/opencode-kiro-auth 0.13.2 → 0.13.3

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.
@@ -74,14 +74,23 @@ export class RequestHandler {
74
74
  abortFromInbound();
75
75
  else
76
76
  inboundSignal?.addEventListener('abort', abortFromInbound, { once: true });
77
- const timeout = setDeadlineTimeout(() => requestController.abort(new DOMException('Kiro request timed out', 'TimeoutError')), this.config.request_timeout_ms);
77
+ let timeout;
78
+ const refreshRequestDeadline = () => {
79
+ if (requestController.signal.aborted)
80
+ return;
81
+ if (timeout)
82
+ clearDeadlineTimeout(timeout);
83
+ timeout = setDeadlineTimeout(() => requestController.abort(new DOMException('Kiro request timed out', 'TimeoutError')), this.config.request_timeout_ms);
84
+ };
85
+ refreshRequestDeadline();
78
86
  let requestCleanupDone = false;
79
87
  let responseOwnsLifecycle = false;
80
88
  const cleanupRequest = () => {
81
89
  if (requestCleanupDone)
82
90
  return;
83
91
  requestCleanupDone = true;
84
- clearDeadlineTimeout(timeout);
92
+ if (timeout)
93
+ clearDeadlineTimeout(timeout);
85
94
  inboundSignal?.removeEventListener('abort', abortFromInbound);
86
95
  };
87
96
  const signal = requestController.signal;
@@ -189,11 +198,13 @@ export class RequestHandler {
189
198
  };
190
199
  const sdkResponse = await client.send(command, { abortSignal: signal });
191
200
  sendResolved = true;
201
+ refreshRequestDeadline();
192
202
  if (apiTimestamp) {
193
203
  this.logSdkResponse(sdkPrep, apiTimestamp);
194
204
  }
195
205
  const response = await this.responseHandler.handleSdkSuccess(sdkResponse, model, sdkPrep.conversationId, sdkPrep.streaming, {
196
206
  signal,
207
+ onActivity: refreshRequestDeadline,
197
208
  onComplete: completeRequest,
198
209
  onTerminal: cleanupRequest,
199
210
  onCancel: (reason) => requestController.abort(reason),
@@ -1,6 +1,7 @@
1
1
  import { SdkEventStreamIterationError } from './stream-error.js';
2
2
  export interface SdkResponseLifecycle {
3
3
  signal?: AbortSignal;
4
+ onActivity?: () => void;
4
5
  onComplete?: () => void | Promise<void>;
5
6
  onTerminal?: () => void;
6
7
  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, onActivity) {
15
15
  const eventStream = sdkResponse.generateAssistantResponseResponse;
16
16
  if (!eventStream || typeof eventStream[Symbol.asyncIterator] !== 'function') {
17
17
  return { response: sdkResponse, closeRaw: async () => { } };
@@ -25,8 +25,13 @@ function wrapSdkEventStream(sdkResponse, signal) {
25
25
  await closeIterator(rawIterator);
26
26
  };
27
27
  const nextRaw = async () => {
28
+ const recordActivity = (result) => {
29
+ if (!result.done)
30
+ onActivity?.();
31
+ return result;
32
+ };
28
33
  if (!signal)
29
- return rawIterator.next();
34
+ return rawIterator.next().then(recordActivity);
30
35
  if (signal.aborted) {
31
36
  await closeRaw();
32
37
  throw abortReason(signal);
@@ -45,7 +50,7 @@ function wrapSdkEventStream(sdkResponse, signal) {
45
50
  settle(() => reject(abortReason(signal)));
46
51
  };
47
52
  signal.addEventListener('abort', onAbort, { once: true });
48
- Promise.resolve(rawIterator.next()).then((result) => settle(() => resolve(result)), (error) => settle(() => reject(error)));
53
+ Promise.resolve(rawIterator.next()).then((result) => settle(() => resolve(recordActivity(result))), (error) => settle(() => reject(error)));
49
54
  });
50
55
  };
51
56
  const wrappedIterator = {
@@ -94,7 +99,7 @@ export class ResponseHandler {
94
99
  if (streaming) {
95
100
  return this.handleSdkStreaming(sdkResponse, model, conversationId, lifecycle);
96
101
  }
97
- return this.handleSdkNonStreaming(sdkResponse, model, conversationId, lifecycle.signal);
102
+ return this.handleSdkNonStreaming(sdkResponse, model, conversationId, lifecycle);
98
103
  }
99
104
  async handleStreaming(response, model, conversationId) {
100
105
  const s = transformKiroStream(response, model, conversationId);
@@ -113,7 +118,7 @@ export class ResponseHandler {
113
118
  }), { headers: { 'Content-Type': 'text/event-stream' } });
114
119
  }
115
120
  async handleSdkStreaming(sdkResponse, model, conversationId, lifecycle) {
116
- const wrapped = wrapSdkEventStream(sdkResponse, lifecycle.signal);
121
+ const wrapped = wrapSdkEventStream(sdkResponse, lifecycle.signal, lifecycle.onActivity);
117
122
  const transformed = transformSdkStream(wrapped.response, model, conversationId);
118
123
  const buffered = [];
119
124
  let firstSemantic;
@@ -215,14 +220,14 @@ export class ResponseHandler {
215
220
  }
216
221
  }, { highWaterMark: 0 }), { headers: { 'Content-Type': 'text/event-stream' } });
217
222
  }
218
- async handleSdkNonStreaming(sdkResponse, model, conversationId, signal) {
223
+ async handleSdkNonStreaming(sdkResponse, model, conversationId, lifecycle) {
219
224
  // For non-streaming SDK responses, collect all events
220
225
  let content = '';
221
226
  let reasoningContent = '';
222
227
  const toolCalls = [];
223
228
  let inputTokens = 0;
224
229
  let outputTokens = 0;
225
- const wrapped = wrapSdkEventStream(sdkResponse, signal);
230
+ const wrapped = wrapSdkEventStream(sdkResponse, lifecycle.signal, lifecycle.onActivity);
226
231
  const eventStream = wrapped.response.generateAssistantResponseResponse;
227
232
  if (eventStream) {
228
233
  try {
@@ -243,7 +248,7 @@ export class ResponseHandler {
243
248
  }
244
249
  }
245
250
  finally {
246
- if (signal?.aborted)
251
+ if (lifecycle.signal?.aborted)
247
252
  await wrapped.closeRaw();
248
253
  }
249
254
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunerpy/opencode-kiro-auth",
3
- "version": "0.13.2",
3
+ "version": "0.13.3",
4
4
  "description": "OpenCode plugin for AWS Kiro (CodeWhisperer) providing access to Claude models",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",