github-issue-tower-defence-management 1.80.1 → 1.81.0

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.
Files changed (29) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +2 -2
  3. package/bin/adapter/proxy/RateLimitCache.js +32 -4
  4. package/bin/adapter/proxy/RateLimitCache.js.map +1 -1
  5. package/bin/adapter/proxy/proxyEntry.js +1 -1
  6. package/bin/adapter/proxy/proxyEntry.js.map +1 -1
  7. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js +3 -0
  8. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js.map +1 -1
  9. package/bin/domain/usecases/StartPreparationUseCase.js +8 -0
  10. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +4 -0
  13. package/src/adapter/proxy/RateLimitCache.test.ts +103 -0
  14. package/src/adapter/proxy/RateLimitCache.ts +44 -2
  15. package/src/adapter/proxy/proxyEntry.test.ts +17 -0
  16. package/src/adapter/proxy/proxyEntry.ts +5 -1
  17. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +14 -0
  18. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +3 -0
  19. package/src/domain/entities/ClaudeTokenUsage.ts +1 -0
  20. package/src/domain/usecases/StartPreparationUseCase.test.ts +190 -0
  21. package/src/domain/usecases/StartPreparationUseCase.ts +14 -0
  22. package/types/adapter/proxy/RateLimitCache.d.ts +4 -1
  23. package/types/adapter/proxy/RateLimitCache.d.ts.map +1 -1
  24. package/types/adapter/proxy/proxyEntry.d.ts.map +1 -1
  25. package/types/adapter/repositories/ProxyClaudeTokenUsageRepository.d.ts.map +1 -1
  26. package/types/domain/entities/ClaudeTokenUsage.d.ts +1 -0
  27. package/types/domain/entities/ClaudeTokenUsage.d.ts.map +1 -1
  28. package/types/domain/usecases/StartPreparationUseCase.d.ts +2 -0
  29. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
@@ -50,7 +50,11 @@ const startProxy = (
50
50
  (upstreamResponse) => {
51
51
  if (token !== null) {
52
52
  try {
53
- writeRateLimit(token, upstreamResponse.headers);
53
+ writeRateLimit(
54
+ token,
55
+ upstreamResponse.headers,
56
+ upstreamResponse.statusCode ?? null,
57
+ );
54
58
  } catch (error) {
55
59
  console.error('Failed to write rate limit cache:', error);
56
60
  }
@@ -109,6 +109,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
109
109
  sevenDayUtilization: 0,
110
110
  blocked: false,
111
111
  rejected: false,
112
+ blockedUntilEpoch: 0,
112
113
  modelWeeklyLimits: {
113
114
  seven_day: { rejected: false, resetsAt: futureReset },
114
115
  },
@@ -120,6 +121,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
120
121
  sevenDayUtilization: 0,
121
122
  blocked: false,
122
123
  rejected: false,
124
+ blockedUntilEpoch: 0,
123
125
  modelWeeklyLimits: {},
124
126
  },
125
127
  ]);
@@ -153,6 +155,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
153
155
  sevenDayUtilization: 0,
154
156
  blocked: true,
155
157
  rejected: false,
158
+ blockedUntilEpoch: 0,
156
159
  modelWeeklyLimits: {
157
160
  seven_day: { rejected: false, resetsAt: futureReset },
158
161
  },
@@ -188,6 +191,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
188
191
  sevenDayUtilization: 0,
189
192
  blocked: false,
190
193
  rejected: true,
194
+ blockedUntilEpoch: 0,
191
195
  modelWeeklyLimits: {
192
196
  seven_day: { rejected: false, resetsAt: futureReset },
193
197
  },
@@ -223,6 +227,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
223
227
  sevenDayUtilization: 30,
224
228
  blocked: false,
225
229
  rejected: false,
230
+ blockedUntilEpoch: 0,
226
231
  modelWeeklyLimits: {
227
232
  seven_day: { rejected: false, resetsAt: futureReset },
228
233
  },
@@ -258,6 +263,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
258
263
  sevenDayUtilization: 0,
259
264
  blocked: false,
260
265
  rejected: false,
266
+ blockedUntilEpoch: 0,
261
267
  modelWeeklyLimits: {
262
268
  seven_day: { rejected: false, resetsAt: futureReset },
263
269
  },
@@ -293,6 +299,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
293
299
  sevenDayUtilization: 0,
294
300
  blocked: false,
295
301
  rejected: false,
302
+ blockedUntilEpoch: 0,
296
303
  modelWeeklyLimits: {
297
304
  seven_day: { rejected: false, resetsAt: futureReset },
298
305
  },
@@ -328,6 +335,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
328
335
  sevenDayUtilization: 0,
329
336
  blocked: false,
330
337
  rejected: false,
338
+ blockedUntilEpoch: 0,
331
339
  modelWeeklyLimits: {},
332
340
  },
333
341
  ]);
@@ -361,6 +369,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
361
369
  sevenDayUtilization: 0,
362
370
  blocked: false,
363
371
  rejected: true,
372
+ blockedUntilEpoch: 0,
364
373
  modelWeeklyLimits: {
365
374
  seven_day: { rejected: false, resetsAt: futureReset },
366
375
  },
@@ -396,6 +405,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
396
405
  sevenDayUtilization: 100,
397
406
  blocked: false,
398
407
  rejected: true,
408
+ blockedUntilEpoch: 0,
399
409
  modelWeeklyLimits: {
400
410
  seven_day: { rejected: true, resetsAt: futureReset },
401
411
  },
@@ -431,6 +441,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
431
441
  sevenDayUtilization: 0,
432
442
  blocked: false,
433
443
  rejected: false,
444
+ blockedUntilEpoch: 0,
434
445
  modelWeeklyLimits: {
435
446
  seven_day: { rejected: false, resetsAt: futureReset },
436
447
  },
@@ -455,6 +466,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
455
466
  sevenDayUtilization: 0,
456
467
  blocked: false,
457
468
  rejected: false,
469
+ blockedUntilEpoch: 0,
458
470
  modelWeeklyLimits: {},
459
471
  },
460
472
  ]);
@@ -490,6 +502,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
490
502
  sevenDayUtilization: 10,
491
503
  blocked: false,
492
504
  rejected: false,
505
+ blockedUntilEpoch: 0,
493
506
  modelWeeklyLimits: {
494
507
  seven_day_sonnet: { rejected: true, resetsAt: futureReset },
495
508
  },
@@ -527,6 +540,7 @@ describe('ProxyClaudeTokenUsageRepository', () => {
527
540
  sevenDayUtilization: 10,
528
541
  blocked: false,
529
542
  rejected: false,
543
+ blockedUntilEpoch: 0,
530
544
  modelWeeklyLimits: {
531
545
  seven_day_sonnet: { rejected: false, resetsAt: pastReset },
532
546
  },
@@ -36,6 +36,7 @@ export class ProxyClaudeTokenUsageRepository implements ClaudeTokenUsageReposito
36
36
  blocked: false,
37
37
  rejected: false,
38
38
  modelWeeklyLimits: {},
39
+ blockedUntilEpoch: 0,
39
40
  };
40
41
  }
41
42
  const fiveHourExpired = nowEpochSeconds > snapshot.fiveHourReset;
@@ -83,6 +84,7 @@ export class ProxyClaudeTokenUsageRepository implements ClaudeTokenUsageReposito
83
84
  resetsAt: snapshot.sevenDayReset,
84
85
  };
85
86
  }
87
+ const cooldownActive = snapshot.blockedUntilEpoch > nowEpochSeconds;
86
88
  return {
87
89
  name,
88
90
  token,
@@ -91,6 +93,7 @@ export class ProxyClaudeTokenUsageRepository implements ClaudeTokenUsageReposito
91
93
  blocked: snapshot.blocked,
92
94
  rejected,
93
95
  modelWeeklyLimits,
96
+ blockedUntilEpoch: cooldownActive ? snapshot.blockedUntilEpoch : 0,
94
97
  };
95
98
  });
96
99
  };
@@ -11,4 +11,5 @@ export type ClaudeTokenUsage = {
11
11
  blocked: boolean;
12
12
  rejected: boolean;
13
13
  modelWeeklyLimits: Record<string, ClaudeModelWeeklyLimit>;
14
+ blockedUntilEpoch: number;
14
15
  };