@sunerpy/opencode-kiro-auth 0.13.4 → 0.13.6

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,12 +75,26 @@ export class RequestHandler {
75
75
  else
76
76
  inboundSignal?.addEventListener('abort', abortFromInbound, { once: true });
77
77
  let timeout;
78
- const beginUpstreamWait = (phase) => {
78
+ const beginUpstreamWait = (phase, timeoutMs, details = {}) => {
79
79
  if (requestController.signal.aborted)
80
80
  return;
81
81
  if (timeout)
82
82
  clearDeadlineTimeout(timeout);
83
- timeout = setDeadlineTimeout(() => requestController.abort(new DOMException(`Kiro request timed out waiting for ${phase}`, 'TimeoutError')), this.config.request_timeout_ms);
83
+ if (timeoutMs <= 0) {
84
+ timeout = undefined;
85
+ return;
86
+ }
87
+ const startedAt = Date.now();
88
+ timeout = setDeadlineTimeout(() => {
89
+ logger.warn('Kiro upstream wait timed out', {
90
+ phase,
91
+ configuredTimeoutMs: timeoutMs,
92
+ elapsedMs: Date.now() - startedAt,
93
+ platform: process.platform,
94
+ ...details
95
+ });
96
+ requestController.abort(new DOMException(`Kiro request timed out waiting for ${phase}`, 'TimeoutError'));
97
+ }, timeoutMs);
84
98
  };
85
99
  const endUpstreamWait = () => {
86
100
  if (!timeout)
@@ -201,7 +215,17 @@ export class RequestHandler {
201
215
  await this.usageTracker.syncUsage(acc, auth, isCurrentAttempt);
202
216
  };
203
217
  let sdkResponse;
204
- beginUpstreamWait('SDK response');
218
+ if (this.config.sdk_response_timeout_enabled) {
219
+ const messageContext = sdkPrep.conversationState.currentMessage?.userInputMessage?.userInputMessageContext;
220
+ beginUpstreamWait('SDK response', this.config.sdk_response_timeout_ms, {
221
+ model,
222
+ effectiveModel: sdkPrep.effectiveModel,
223
+ effort: sdkPrep.effort,
224
+ region: sdkPrep.region,
225
+ historyLength: sdkPrep.conversationState.history?.length ?? 0,
226
+ toolCount: messageContext?.tools?.length ?? 0
227
+ });
228
+ }
205
229
  try {
206
230
  sdkResponse = await client.send(command, { abortSignal: signal });
207
231
  }
@@ -214,7 +238,11 @@ export class RequestHandler {
214
238
  }
215
239
  const response = await this.responseHandler.handleSdkSuccess(sdkResponse, model, sdkPrep.conversationId, sdkPrep.streaming, {
216
240
  signal,
217
- onUpstreamWaitStart: () => beginUpstreamWait('stream event'),
241
+ onUpstreamWaitStart: () => beginUpstreamWait('stream event', this.config.request_timeout_ms, {
242
+ model,
243
+ effectiveModel: sdkPrep.effectiveModel,
244
+ region: sdkPrep.region
245
+ }),
218
246
  onUpstreamWaitEnd: endUpstreamWait,
219
247
  onComplete: completeRequest,
220
248
  onTerminal: cleanupRequest,
@@ -135,6 +135,8 @@ function applyEnvOverrides(config) {
135
135
  rate_limit_retry_delay_ms: parseNumberEnv(env.KIRO_RATE_LIMIT_RETRY_DELAY_MS, config.rate_limit_retry_delay_ms),
136
136
  rate_limit_max_retries: parseNumberEnv(env.KIRO_RATE_LIMIT_MAX_RETRIES, config.rate_limit_max_retries),
137
137
  max_request_iterations: parseNumberEnv(env.KIRO_MAX_REQUEST_ITERATIONS, config.max_request_iterations),
138
+ sdk_response_timeout_enabled: parseBooleanEnv(env.KIRO_SDK_RESPONSE_TIMEOUT_ENABLED, config.sdk_response_timeout_enabled),
139
+ sdk_response_timeout_ms: parseNumberEnv(env.KIRO_SDK_RESPONSE_TIMEOUT_MS, config.sdk_response_timeout_ms),
138
140
  request_timeout_ms: parseNumberEnv(env.KIRO_REQUEST_TIMEOUT_MS, config.request_timeout_ms),
139
141
  token_expiry_buffer_ms: parseNumberEnv(env.KIRO_TOKEN_EXPIRY_BUFFER_MS, config.token_expiry_buffer_ms),
140
142
  usage_sync_max_retries: parseNumberEnv(env.KIRO_USAGE_SYNC_MAX_RETRIES, config.usage_sync_max_retries),
@@ -55,6 +55,20 @@ export declare const KiroConfigSchema: z.ZodObject<{
55
55
  rate_limit_retry_delay_ms: z.ZodDefault<z.ZodNumber>;
56
56
  rate_limit_max_retries: z.ZodDefault<z.ZodNumber>;
57
57
  max_request_iterations: z.ZodDefault<z.ZodNumber>;
58
+ /**
59
+ * Opt into a fixed deadline while waiting for client.send() to return.
60
+ * Disabled by default because a pending request is ambiguous: Kiro may
61
+ * still be performing a valid long-running generation.
62
+ */
63
+ sdk_response_timeout_enabled: z.ZodDefault<z.ZodBoolean>;
64
+ /**
65
+ * Maximum wait for client.send() to return the initial SDK response.
66
+ * Only used when sdk_response_timeout_enabled is true.
67
+ */
68
+ sdk_response_timeout_ms: z.ZodDefault<z.ZodNumber>;
69
+ /**
70
+ * Maximum inactivity while waiting for the next upstream stream event.
71
+ */
58
72
  request_timeout_ms: z.ZodDefault<z.ZodNumber>;
59
73
  token_expiry_buffer_ms: z.ZodDefault<z.ZodNumber>;
60
74
  /**
@@ -104,6 +118,8 @@ export declare const KiroConfigSchema: z.ZodObject<{
104
118
  rate_limit_retry_delay_ms: number;
105
119
  rate_limit_max_retries: number;
106
120
  max_request_iterations: number;
121
+ sdk_response_timeout_enabled: boolean;
122
+ sdk_response_timeout_ms: number;
107
123
  request_timeout_ms: number;
108
124
  token_expiry_buffer_ms: number;
109
125
  token_keepalive_enabled: boolean;
@@ -137,6 +153,8 @@ export declare const KiroConfigSchema: z.ZodObject<{
137
153
  rate_limit_retry_delay_ms?: number | undefined;
138
154
  rate_limit_max_retries?: number | undefined;
139
155
  max_request_iterations?: number | undefined;
156
+ sdk_response_timeout_enabled?: boolean | undefined;
157
+ sdk_response_timeout_ms?: number | undefined;
140
158
  request_timeout_ms?: number | undefined;
141
159
  token_expiry_buffer_ms?: number | undefined;
142
160
  token_keepalive_enabled?: boolean | undefined;
@@ -87,6 +87,20 @@ export const KiroConfigSchema = z.object({
87
87
  rate_limit_retry_delay_ms: z.number().min(1000).max(60000).default(5000),
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
+ /**
91
+ * Opt into a fixed deadline while waiting for client.send() to return.
92
+ * Disabled by default because a pending request is ambiguous: Kiro may
93
+ * still be performing a valid long-running generation.
94
+ */
95
+ sdk_response_timeout_enabled: z.boolean().default(false),
96
+ /**
97
+ * Maximum wait for client.send() to return the initial SDK response.
98
+ * Only used when sdk_response_timeout_enabled is true.
99
+ */
100
+ sdk_response_timeout_ms: z.number().min(30000).max(600000).default(300000),
101
+ /**
102
+ * Maximum inactivity while waiting for the next upstream stream event.
103
+ */
90
104
  request_timeout_ms: z.number().min(30000).max(600000).default(120000),
91
105
  token_expiry_buffer_ms: z.number().min(30000).max(300000).default(300000),
92
106
  /**
@@ -137,6 +151,8 @@ export const DEFAULT_CONFIG = {
137
151
  rate_limit_retry_delay_ms: 5000,
138
152
  rate_limit_max_retries: 3,
139
153
  max_request_iterations: 20,
154
+ sdk_response_timeout_enabled: false,
155
+ sdk_response_timeout_ms: 300000,
140
156
  request_timeout_ms: 120000,
141
157
  token_expiry_buffer_ms: 300000,
142
158
  token_keepalive_enabled: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunerpy/opencode-kiro-auth",
3
- "version": "0.13.4",
3
+ "version": "0.13.6",
4
4
  "description": "OpenCode plugin for AWS Kiro (CodeWhisperer) providing access to Claude models",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",