@sunerpy/opencode-kiro-auth 0.14.0 → 0.14.2

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.
@@ -242,8 +242,9 @@ export class RequestHandler {
242
242
  try {
243
243
  sdkResponse = await client.send(command, { abortSignal: signal });
244
244
  }
245
- finally {
245
+ catch (error) {
246
246
  endUpstreamWait();
247
+ throw error;
247
248
  }
248
249
  sendResolved = true;
249
250
  if (apiTimestamp) {
@@ -251,11 +252,21 @@ export class RequestHandler {
251
252
  }
252
253
  const response = await this.responseHandler.handleSdkSuccess(sdkResponse, model, sdkPrep.conversationId, sdkPrep.streaming, {
253
254
  signal,
254
- onUpstreamWaitStart: () => beginUpstreamWait('stream event', this.config.request_timeout_ms, {
255
- model,
256
- effectiveModel: sdkPrep.effectiveModel,
257
- region: sdkPrep.region
258
- }),
255
+ onUpstreamWaitStart: ({ eventIndex }) => {
256
+ if (eventIndex === 0) {
257
+ if (!this.config.sdk_response_timeout_enabled)
258
+ endUpstreamWait();
259
+ return;
260
+ }
261
+ if (!this.config.stream_event_timeout_enabled)
262
+ return;
263
+ beginUpstreamWait('stream event', this.config.request_timeout_ms, {
264
+ model,
265
+ effectiveModel: sdkPrep.effectiveModel,
266
+ region: sdkPrep.region,
267
+ eventIndex
268
+ });
269
+ },
259
270
  onUpstreamWaitEnd: endUpstreamWait,
260
271
  onIterationError: (error, afterCompletionMetadata) => logger.warn('Kiro SDK event stream iteration failed', {
261
272
  model,
@@ -1,7 +1,9 @@
1
1
  import { SdkEventStreamIterationError } from './stream-error.js';
2
2
  export interface SdkResponseLifecycle {
3
3
  signal?: AbortSignal;
4
- onUpstreamWaitStart?: () => void;
4
+ onUpstreamWaitStart?: (context: {
5
+ eventIndex: number;
6
+ }) => void;
5
7
  onUpstreamWaitEnd?: () => void;
6
8
  onIterationError?: (error: unknown, afterCompletionMetadata: boolean) => void;
7
9
  onComplete?: () => void | Promise<void>;
@@ -27,6 +27,7 @@ function wrapSdkEventStream(sdkResponse, signal, onUpstreamWaitStart, onUpstream
27
27
  const rawIterator = eventStream[Symbol.asyncIterator]();
28
28
  let closed = false;
29
29
  let completionMetadataSeen = false;
30
+ let eventIndex = 0;
30
31
  const closeRaw = async () => {
31
32
  if (closed)
32
33
  return;
@@ -38,26 +39,33 @@ function wrapSdkEventStream(sdkResponse, signal, onUpstreamWaitStart, onUpstream
38
39
  await closeRaw();
39
40
  throw abortReason(signal);
40
41
  }
41
- onUpstreamWaitStart?.();
42
+ onUpstreamWaitStart?.({ eventIndex });
42
43
  try {
43
- if (!signal)
44
- return await rawIterator.next();
45
- return await new Promise((resolve, reject) => {
46
- let settled = false;
47
- const settle = (callback) => {
48
- if (settled)
49
- return;
50
- settled = true;
51
- signal.removeEventListener('abort', onAbort);
52
- callback();
53
- };
54
- const onAbort = () => {
55
- void closeRaw();
56
- settle(() => reject(abortReason(signal)));
57
- };
58
- signal.addEventListener('abort', onAbort, { once: true });
59
- Promise.resolve(rawIterator.next()).then((result) => settle(() => resolve(result)), (error) => settle(() => reject(error)));
60
- });
44
+ let result;
45
+ if (!signal) {
46
+ result = await rawIterator.next();
47
+ }
48
+ else {
49
+ result = await new Promise((resolve, reject) => {
50
+ let settled = false;
51
+ const settle = (callback) => {
52
+ if (settled)
53
+ return;
54
+ settled = true;
55
+ signal.removeEventListener('abort', onAbort);
56
+ callback();
57
+ };
58
+ const onAbort = () => {
59
+ void closeRaw();
60
+ settle(() => reject(abortReason(signal)));
61
+ };
62
+ signal.addEventListener('abort', onAbort, { once: true });
63
+ Promise.resolve(rawIterator.next()).then((nextResult) => settle(() => resolve(nextResult)), (error) => settle(() => reject(error)));
64
+ });
65
+ }
66
+ if (!result.done)
67
+ eventIndex++;
68
+ return result;
61
69
  }
62
70
  finally {
63
71
  onUpstreamWaitEnd?.();
@@ -137,6 +137,7 @@ function applyEnvOverrides(config) {
137
137
  max_request_iterations: parseNumberEnv(env.KIRO_MAX_REQUEST_ITERATIONS, config.max_request_iterations),
138
138
  sdk_response_timeout_enabled: parseBooleanEnv(env.KIRO_SDK_RESPONSE_TIMEOUT_ENABLED, config.sdk_response_timeout_enabled),
139
139
  sdk_response_timeout_ms: parseNumberEnv(env.KIRO_SDK_RESPONSE_TIMEOUT_MS, config.sdk_response_timeout_ms),
140
+ stream_event_timeout_enabled: parseBooleanEnv(env.KIRO_STREAM_EVENT_TIMEOUT_ENABLED, config.stream_event_timeout_enabled),
140
141
  request_timeout_ms: parseNumberEnv(env.KIRO_REQUEST_TIMEOUT_MS, config.request_timeout_ms),
141
142
  token_expiry_buffer_ms: parseNumberEnv(env.KIRO_TOKEN_EXPIRY_BUFFER_MS, config.token_expiry_buffer_ms),
142
143
  usage_sync_max_retries: parseNumberEnv(env.KIRO_USAGE_SYNC_MAX_RETRIES, config.usage_sync_max_retries),
@@ -56,18 +56,25 @@ export declare const KiroConfigSchema: z.ZodObject<{
56
56
  rate_limit_max_retries: z.ZodDefault<z.ZodNumber>;
57
57
  max_request_iterations: z.ZodDefault<z.ZodNumber>;
58
58
  /**
59
- * Opt into a fixed deadline while waiting for client.send() to return.
59
+ * Opt into a fixed deadline covering client.send() and the first stream event.
60
60
  * Disabled by default because a pending request is ambiguous: Kiro may
61
61
  * still be performing a valid long-running generation.
62
62
  */
63
63
  sdk_response_timeout_enabled: z.ZodDefault<z.ZodBoolean>;
64
64
  /**
65
- * Maximum wait for client.send() to return the initial SDK response.
65
+ * Maximum wait for the initial SDK response and first stream event.
66
66
  * Only used when sdk_response_timeout_enabled is true.
67
67
  */
68
68
  sdk_response_timeout_ms: z.ZodDefault<z.ZodNumber>;
69
69
  /**
70
- * Maximum inactivity while waiting for the next upstream stream event.
70
+ * Opt into a fixed inactivity deadline between upstream stream events.
71
+ * Disabled by default because a silent event gap is ambiguous: Kiro may
72
+ * still be performing a valid long-running generation.
73
+ */
74
+ stream_event_timeout_enabled: z.ZodDefault<z.ZodBoolean>;
75
+ /**
76
+ * Maximum inactivity between upstream stream events.
77
+ * Only used when stream_event_timeout_enabled is true.
71
78
  */
72
79
  request_timeout_ms: z.ZodDefault<z.ZodNumber>;
73
80
  token_expiry_buffer_ms: z.ZodDefault<z.ZodNumber>;
@@ -120,6 +127,7 @@ export declare const KiroConfigSchema: z.ZodObject<{
120
127
  max_request_iterations: number;
121
128
  sdk_response_timeout_enabled: boolean;
122
129
  sdk_response_timeout_ms: number;
130
+ stream_event_timeout_enabled: boolean;
123
131
  request_timeout_ms: number;
124
132
  token_expiry_buffer_ms: number;
125
133
  token_keepalive_enabled: boolean;
@@ -155,6 +163,7 @@ export declare const KiroConfigSchema: z.ZodObject<{
155
163
  max_request_iterations?: number | undefined;
156
164
  sdk_response_timeout_enabled?: boolean | undefined;
157
165
  sdk_response_timeout_ms?: number | undefined;
166
+ stream_event_timeout_enabled?: boolean | undefined;
158
167
  request_timeout_ms?: number | undefined;
159
168
  token_expiry_buffer_ms?: number | undefined;
160
169
  token_keepalive_enabled?: boolean | undefined;
@@ -88,18 +88,25 @@ export const KiroConfigSchema = z.object({
88
88
  rate_limit_max_retries: z.number().min(0).max(10).default(3),
89
89
  max_request_iterations: z.number().min(5).max(1000).default(20),
90
90
  /**
91
- * Opt into a fixed deadline while waiting for client.send() to return.
91
+ * Opt into a fixed deadline covering client.send() and the first stream event.
92
92
  * Disabled by default because a pending request is ambiguous: Kiro may
93
93
  * still be performing a valid long-running generation.
94
94
  */
95
95
  sdk_response_timeout_enabled: z.boolean().default(false),
96
96
  /**
97
- * Maximum wait for client.send() to return the initial SDK response.
97
+ * Maximum wait for the initial SDK response and first stream event.
98
98
  * Only used when sdk_response_timeout_enabled is true.
99
99
  */
100
100
  sdk_response_timeout_ms: z.number().min(30000).max(600000).default(300000),
101
101
  /**
102
- * Maximum inactivity while waiting for the next upstream stream event.
102
+ * Opt into a fixed inactivity deadline between upstream stream events.
103
+ * Disabled by default because a silent event gap is ambiguous: Kiro may
104
+ * still be performing a valid long-running generation.
105
+ */
106
+ stream_event_timeout_enabled: z.boolean().default(false),
107
+ /**
108
+ * Maximum inactivity between upstream stream events.
109
+ * Only used when stream_event_timeout_enabled is true.
103
110
  */
104
111
  request_timeout_ms: z.number().min(30000).max(600000).default(120000),
105
112
  token_expiry_buffer_ms: z.number().min(30000).max(300000).default(300000),
@@ -153,6 +160,7 @@ export const DEFAULT_CONFIG = {
153
160
  max_request_iterations: 20,
154
161
  sdk_response_timeout_enabled: false,
155
162
  sdk_response_timeout_ms: 300000,
163
+ stream_event_timeout_enabled: false,
156
164
  request_timeout_ms: 120000,
157
165
  token_expiry_buffer_ms: 300000,
158
166
  token_keepalive_enabled: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunerpy/opencode-kiro-auth",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "OpenCode plugin for AWS Kiro (CodeWhisperer) providing access to Claude models",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",