github-issue-tower-defence-management 1.58.2 → 1.59.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 (61) hide show
  1. package/.gitattributes +2 -0
  2. package/.prettierignore +1 -0
  3. package/CHANGELOG.md +21 -0
  4. package/README.md +3 -3
  5. package/bin/adapter/entry-points/cli/index.js +1 -3
  6. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  7. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +8 -4
  8. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  9. package/bin/adapter/proxy/RateLimitCache.js +104 -12
  10. package/bin/adapter/proxy/RateLimitCache.js.map +1 -1
  11. package/bin/adapter/proxy/proxyEntry.js +19 -0
  12. package/bin/adapter/proxy/proxyEntry.js.map +1 -1
  13. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js +33 -2
  14. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js.map +1 -1
  15. package/bin/adapter/repositories/ProxyRateLimitCacheRepository.js +92 -0
  16. package/bin/adapter/repositories/ProxyRateLimitCacheRepository.js.map +1 -0
  17. package/bin/domain/usecases/HandleScheduledEventUseCase.js +7 -1
  18. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
  19. package/bin/domain/usecases/StartPreparationUseCase.js +34 -35
  20. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  21. package/bin/domain/usecases/UpdateRateLimitCacheUseCase.js +18 -0
  22. package/bin/domain/usecases/UpdateRateLimitCacheUseCase.js.map +1 -0
  23. package/bin/domain/usecases/adapter-interfaces/RateLimitCacheRepository.js +3 -0
  24. package/bin/domain/usecases/adapter-interfaces/RateLimitCacheRepository.js.map +1 -0
  25. package/package.json +1 -1
  26. package/src/adapter/entry-points/cli/index.ts +0 -3
  27. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +6 -0
  28. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +9 -3
  29. package/src/adapter/proxy/RateLimitCache.test.ts +250 -0
  30. package/src/adapter/proxy/RateLimitCache.ts +114 -25
  31. package/src/adapter/proxy/proxyEntry.ts +24 -1
  32. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +354 -7
  33. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +42 -2
  34. package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +101 -0
  35. package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +66 -0
  36. package/src/domain/entities/ClaudeTokenUsage.ts +7 -0
  37. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +63 -0
  38. package/src/domain/usecases/HandleScheduledEventUseCase.ts +7 -0
  39. package/src/domain/usecases/StartPreparationUseCase.test.ts +1212 -887
  40. package/src/domain/usecases/StartPreparationUseCase.ts +47 -57
  41. package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +81 -0
  42. package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +16 -0
  43. package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +9 -0
  44. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  45. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  46. package/types/adapter/proxy/RateLimitCache.d.ts +11 -0
  47. package/types/adapter/proxy/RateLimitCache.d.ts.map +1 -1
  48. package/types/adapter/proxy/proxyEntry.d.ts.map +1 -1
  49. package/types/adapter/repositories/ProxyClaudeTokenUsageRepository.d.ts.map +1 -1
  50. package/types/adapter/repositories/ProxyRateLimitCacheRepository.d.ts +10 -0
  51. package/types/adapter/repositories/ProxyRateLimitCacheRepository.d.ts.map +1 -0
  52. package/types/domain/entities/ClaudeTokenUsage.d.ts +6 -0
  53. package/types/domain/entities/ClaudeTokenUsage.d.ts.map +1 -1
  54. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +3 -1
  55. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
  56. package/types/domain/usecases/StartPreparationUseCase.d.ts +3 -3
  57. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  58. package/types/domain/usecases/UpdateRateLimitCacheUseCase.d.ts +9 -0
  59. package/types/domain/usecases/UpdateRateLimitCacheUseCase.d.ts.map +1 -0
  60. package/types/domain/usecases/adapter-interfaces/RateLimitCacheRepository.d.ts +9 -0
  61. package/types/domain/usecases/adapter-interfaces/RateLimitCacheRepository.d.ts.map +1 -0
@@ -1,7 +1,6 @@
1
1
  import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
2
  import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
3
3
  import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
4
- import { ClaudeRepository } from './adapter-interfaces/ClaudeRepository';
5
4
  import { ClaudeTokenUsageRepository } from './adapter-interfaces/ClaudeTokenUsageRepository';
6
5
  import { ClaudeTokenUsage } from '../entities/ClaudeTokenUsage';
7
6
  import {
@@ -22,16 +21,46 @@ export class StartPreparationUseCase {
22
21
  | 'deletePullRequestBranch'
23
22
  | 'createCommentByUrl'
24
23
  >,
25
- private readonly claudeRepository: Pick<ClaudeRepository, 'getUsage'>,
26
24
  private readonly localCommandRunner: LocalCommandRunner,
27
25
  private readonly claudeTokenUsageRepository: ClaudeTokenUsageRepository,
28
26
  ) {}
29
27
 
30
- private selectRotationTokens = (tokenUsages: ClaudeTokenUsage[]): string[] =>
31
- tokenUsages
28
+ private weeklyLimitTypeForModel = (modelName: string | null): string => {
29
+ const normalized = (modelName ?? '').toLowerCase();
30
+ if (normalized.includes('sonnet')) return 'seven_day_sonnet';
31
+ if (normalized.includes('opus')) return 'seven_day_opus';
32
+ return 'seven_day';
33
+ };
34
+
35
+ private isModelWeeklyLimitRejected = (
36
+ usage: ClaudeTokenUsage,
37
+ weeklyLimitType: string,
38
+ ): boolean => {
39
+ const specific = usage.modelWeeklyLimits[weeklyLimitType];
40
+ if (specific !== undefined && specific.rejected) return true;
41
+ const general = usage.modelWeeklyLimits['seven_day'];
42
+ return general !== undefined && general.rejected;
43
+ };
44
+
45
+ private selectRotationTokens = (
46
+ tokenUsages: ClaudeTokenUsage[],
47
+ utilizationPercentageThreshold: number,
48
+ modelName: string | null,
49
+ ): string[] => {
50
+ const weeklyLimitType = this.weeklyLimitTypeForModel(modelName);
51
+ return tokenUsages
32
52
  .filter((usage) => !usage.blocked)
53
+ .filter((usage) => !usage.rejected)
54
+ .filter(
55
+ (usage) => !this.isModelWeeklyLimitRejected(usage, weeklyLimitType),
56
+ )
57
+ .filter(
58
+ (usage) =>
59
+ usage.fiveHourUtilization * 100 < utilizationPercentageThreshold,
60
+ )
33
61
  .sort((a, b) => a.fiveHourUtilization - b.fiveHourUtilization)
34
62
  .map((usage) => usage.token);
63
+ };
35
64
 
36
65
  run = async (params: {
37
66
  projectUrl: string;
@@ -45,66 +74,27 @@ export class StartPreparationUseCase {
45
74
  codexHomeCandidates: string[] | null;
46
75
  allowIssueCacheMinutes: number;
47
76
  }): Promise<void> => {
48
- const claudeUsages = await this.claudeRepository.getUsage();
49
- const weeklyWindowHours = 168;
50
- const nonWeeklyUsages = claudeUsages.filter(
51
- (usage) => usage.hour !== weeklyWindowHours,
52
- );
53
- if (
54
- nonWeeklyUsages.some(
55
- (usage) =>
56
- usage.utilizationPercentage > params.utilizationPercentageThreshold,
57
- )
58
- ) {
59
- console.warn(
60
- 'Claude usage limit exceeded. Skipping starting preparation.',
61
- );
62
- return;
63
- }
64
-
65
- let maximumPreparingIssuesCount = params.maximumPreparingIssuesCount ?? 6;
66
-
67
- const weeklyUsages = claudeUsages.filter(
68
- (usage) => usage.hour === weeklyWindowHours,
69
- );
70
- if (
71
- weeklyUsages.length > 0 &&
72
- params.utilizationPercentageThreshold < 100
73
- ) {
74
- const maxWeeklyUtilization = Math.max(
75
- ...weeklyUsages.map((usage) => usage.utilizationPercentage),
76
- );
77
- if (maxWeeklyUtilization > params.utilizationPercentageThreshold) {
78
- const normalizedUtilizationBeyondThreshold =
79
- (maxWeeklyUtilization - params.utilizationPercentageThreshold) /
80
- (100 - params.utilizationPercentageThreshold);
81
- maximumPreparingIssuesCount = Math.floor(
82
- maximumPreparingIssuesCount *
83
- Math.pow(1 - normalizedUtilizationBeyondThreshold, 2),
84
- );
85
- if (maximumPreparingIssuesCount <= 0) {
86
- console.warn(
87
- `Weekly Claude usage (${maxWeeklyUtilization}%) exceeds threshold (${params.utilizationPercentageThreshold}%). Skipping starting preparation.`,
88
- );
89
- return;
90
- }
91
- console.warn(
92
- `Weekly Claude usage (${maxWeeklyUtilization}%) exceeds threshold (${params.utilizationPercentageThreshold}%). Reducing maximumPreparingIssuesCount to ${maximumPreparingIssuesCount}.`,
93
- );
94
- }
95
- }
77
+ const maximumPreparingIssuesCount = params.maximumPreparingIssuesCount ?? 6;
96
78
 
97
79
  const tokenUsages =
98
80
  await this.claudeTokenUsageRepository.getAvailableTokenUsages();
99
81
  let rotationTokens: string[] | null = null;
100
82
  let proxyBaseUrl: string | null = null;
101
83
  if (tokenUsages.length > 0) {
102
- const ranked = this.selectRotationTokens(tokenUsages);
103
- if (ranked.length > 0) {
104
- await this.claudeTokenUsageRepository.ensureObservable();
105
- rotationTokens = ranked;
106
- proxyBaseUrl = this.claudeTokenUsageRepository.proxyBaseUrl();
84
+ const ranked = this.selectRotationTokens(
85
+ tokenUsages,
86
+ params.utilizationPercentageThreshold,
87
+ params.defaultLlmModelName,
88
+ );
89
+ if (ranked.length === 0) {
90
+ console.warn(
91
+ `All ${tokenUsages.length} configured Claude OAuth token(s) are unavailable (blocked, rejected, weekly limit for ${this.weeklyLimitTypeForModel(params.defaultLlmModelName)} exhausted, or 5h utilization >= ${params.utilizationPercentageThreshold}%). Skipping starting preparation.`,
92
+ );
93
+ return;
107
94
  }
95
+ await this.claudeTokenUsageRepository.ensureObservable();
96
+ rotationTokens = ranked;
97
+ proxyBaseUrl = this.claudeTokenUsageRepository.proxyBaseUrl();
108
98
  }
109
99
 
110
100
  const project = await this.projectRepository.getByUrl(params.projectUrl);
@@ -0,0 +1,81 @@
1
+ import { UpdateRateLimitCacheUseCase } from './UpdateRateLimitCacheUseCase';
2
+ import { mock } from 'jest-mock-extended';
3
+ import { RateLimitCacheRepository } from './adapter-interfaces/RateLimitCacheRepository';
4
+
5
+ describe('UpdateRateLimitCacheUseCase', () => {
6
+ const mockRateLimitCacheRepository = mock<RateLimitCacheRepository>();
7
+
8
+ const useCase = new UpdateRateLimitCacheUseCase(mockRateLimitCacheRepository);
9
+
10
+ beforeEach(() => {
11
+ jest.clearAllMocks();
12
+ });
13
+
14
+ it('should probe a token whose unifiedReset is in the past', async () => {
15
+ const pastReset = 1000000000;
16
+ const nowEpochSeconds = 1000000100;
17
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
18
+ { token: 'token-expired', unifiedReset: pastReset },
19
+ ]);
20
+ mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
21
+
22
+ await useCase.run({ nowEpochSeconds });
23
+
24
+ expect(mockRateLimitCacheRepository.probeToken).toHaveBeenCalledWith(
25
+ 'token-expired',
26
+ );
27
+ });
28
+
29
+ it('should not probe a token whose unifiedReset is in the future', async () => {
30
+ const futureReset = 9999999999;
31
+ const nowEpochSeconds = 1000000000;
32
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
33
+ { token: 'token-active', unifiedReset: futureReset },
34
+ ]);
35
+
36
+ await useCase.run({ nowEpochSeconds });
37
+
38
+ expect(mockRateLimitCacheRepository.probeToken).not.toHaveBeenCalled();
39
+ });
40
+
41
+ it('should probe only tokens with expired reset when mixed tokens exist', async () => {
42
+ const pastReset = 1000000000;
43
+ const futureReset = 9999999999;
44
+ const nowEpochSeconds = 1000000100;
45
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
46
+ { token: 'token-expired', unifiedReset: pastReset },
47
+ { token: 'token-active', unifiedReset: futureReset },
48
+ ]);
49
+ mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
50
+
51
+ await useCase.run({ nowEpochSeconds });
52
+
53
+ expect(mockRateLimitCacheRepository.probeToken).toHaveBeenCalledTimes(1);
54
+ expect(mockRateLimitCacheRepository.probeToken).toHaveBeenCalledWith(
55
+ 'token-expired',
56
+ );
57
+ });
58
+
59
+ it('should update the cache after probing by relying on the repository side effect', async () => {
60
+ const pastReset = 1000000000;
61
+ const nowEpochSeconds = 1000000100;
62
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
63
+ { token: 'token-expired', unifiedReset: pastReset },
64
+ ]);
65
+ mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
66
+
67
+ await useCase.run({ nowEpochSeconds });
68
+
69
+ expect(mockRateLimitCacheRepository.probeToken).toHaveBeenCalledWith(
70
+ 'token-expired',
71
+ );
72
+ });
73
+
74
+ it('should handle an empty token list without errors', async () => {
75
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([]);
76
+
77
+ await useCase.run({ nowEpochSeconds: 1000000000 });
78
+
79
+ expect(mockRateLimitCacheRepository.probeToken).not.toHaveBeenCalled();
80
+ });
81
+ });
@@ -0,0 +1,16 @@
1
+ import { RateLimitCacheRepository } from './adapter-interfaces/RateLimitCacheRepository';
2
+
3
+ export class UpdateRateLimitCacheUseCase {
4
+ constructor(
5
+ private readonly rateLimitCacheRepository: RateLimitCacheRepository,
6
+ ) {}
7
+
8
+ run = async (params: { nowEpochSeconds: number }): Promise<void> => {
9
+ const caches = this.rateLimitCacheRepository.getTokenRateLimitCaches();
10
+ for (const cache of caches) {
11
+ if (cache.unifiedReset < params.nowEpochSeconds) {
12
+ await this.rateLimitCacheRepository.probeToken(cache.token);
13
+ }
14
+ }
15
+ };
16
+ }
@@ -0,0 +1,9 @@
1
+ export interface TokenRateLimitCache {
2
+ token: string;
3
+ unifiedReset: number;
4
+ }
5
+
6
+ export interface RateLimitCacheRepository {
7
+ getTokenRateLimitCaches: () => TokenRateLimitCache[];
8
+ probeToken: (token: string) => Promise<void>;
9
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAkEzB,eAAO,MAAM,OAAO,SAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAiEzB,eAAO,MAAM,OAAO,SAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAyB3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,KAChB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,IAAI,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC,CAmPP;CACH"}
1
+ {"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AA0B3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,KAChB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,IAAI,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC,CAwPP;CACH"}
@@ -1,14 +1,25 @@
1
+ export interface ModelWeeklyLimit {
2
+ rejected: boolean;
3
+ resetsAt: number;
4
+ }
1
5
  export interface RateLimitSnapshot {
2
6
  fiveHourUtilization: number;
3
7
  fiveHourReset: number;
4
8
  sevenDayUtilization: number;
5
9
  sevenDayReset: number;
6
10
  blocked: boolean;
11
+ rejected: boolean;
12
+ unifiedRejected: boolean;
13
+ fiveHourRejected: boolean;
14
+ sevenDayRejected: boolean;
15
+ modelWeeklyLimits: Record<string, ModelWeeklyLimit>;
7
16
  }
8
17
  export declare const PROXY_PORT = 8787;
9
18
  export declare const cacheDir: () => string;
10
19
  export declare const hashToken: (token: string) => string;
11
20
  export declare const cachePathForToken: (token: string) => string;
12
21
  export declare const writeRateLimit: (token: string, headers: Record<string, string | string[] | undefined>) => void;
22
+ export declare const writeModelRateLimit: (token: string, limits: Record<string, ModelWeeklyLimit>) => void;
23
+ export declare const parseModelRateLimitsFromBody: (body: string) => Record<string, ModelWeeklyLimit>;
13
24
  export declare const readRateLimit: (token: string) => RateLimitSnapshot | null;
14
25
  //# sourceMappingURL=RateLimitCache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RateLimitCache.d.ts","sourceRoot":"","sources":["../../../src/adapter/proxy/RateLimitCache.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,UAAU,OAAO,CAAC;AAI/B,eAAO,MAAM,QAAQ,QAAO,MAG3B,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MACqB,CAAC;AAEhE,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MACC,CAAC;AAEpD,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,KACrD,IAsCF,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,iBAAiB,GAAG,IAwCjE,CAAC"}
1
+ {"version":3,"file":"RateLimitCache.d.ts","sourceRoot":"","sources":["../../../src/adapter/proxy/RateLimitCache.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACrD;AAED,eAAO,MAAM,UAAU,OAAO,CAAC;AAI/B,eAAO,MAAM,QAAQ,QAAO,MAG3B,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MACqB,CAAC;AAEhE,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MACC,CAAC;AAiCpD,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,KACrD,IA2BF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,MAAM,EACb,QAAQ,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,KACvC,IAkBF,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,MAAM,MAAM,KACX,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA0BjC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,iBAAiB,GAAG,IA8CjE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"proxyEntry.d.ts","sourceRoot":"","sources":["../../../src/adapter/proxy/proxyEntry.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,YAAY,GAChB,eAAe,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAC3C,MAAM,GAAG,IAQX,CAAC;AAEF,QAAA,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,IA0ClC,CAAC;AAMF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"proxyEntry.d.ts","sourceRoot":"","sources":["../../../src/adapter/proxy/proxyEntry.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,YAAY,GAChB,eAAe,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAC3C,MAAM,GAAG,IAQX,CAAC;AAEF,QAAA,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,IA0DlC,CAAC;AAMF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProxyClaudeTokenUsageRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qEAAqE,CAAC;AAKjH,qBAAa,+BAAgC,YAAW,0BAA0B;IAE9E,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,IAAI,GAAE,MAAmB;IAG5C,gBAAgB,QAAa,OAAO,CAAC,IAAI,CAAC,CAExC;IAEF,uBAAuB,QAAa,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgB7D;IAEF,YAAY,QAAO,MAAM,CAAoC;CAC9D"}
1
+ {"version":3,"file":"ProxyClaudeTokenUsageRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qEAAqE,CAAC;AAKjH,qBAAa,+BAAgC,YAAW,0BAA0B;IAE9E,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,IAAI,GAAE,MAAmB;IAG5C,gBAAgB,QAAa,OAAO,CAAC,IAAI,CAAC,CAExC;IAEF,uBAAuB,QAAa,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwD7D;IAEF,YAAY,QAAO,MAAM,CAAoC;CAC9D"}
@@ -0,0 +1,10 @@
1
+ import { RateLimitCacheRepository } from '../../domain/usecases/adapter-interfaces/RateLimitCacheRepository';
2
+ import { TokenRateLimitCache } from '../../domain/usecases/adapter-interfaces/RateLimitCacheRepository';
3
+ export declare class ProxyRateLimitCacheRepository implements RateLimitCacheRepository {
4
+ private readonly tokenListJsonPath;
5
+ private readonly port;
6
+ constructor(tokenListJsonPath: string | null, port?: number);
7
+ getTokenRateLimitCaches: () => TokenRateLimitCache[];
8
+ probeToken: (token: string) => Promise<void>;
9
+ }
10
+ //# sourceMappingURL=ProxyRateLimitCacheRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProxyRateLimitCacheRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/ProxyRateLimitCacheRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,mBAAmB,EAAE,MAAM,mEAAmE,CAAC;AAYxG,qBAAa,6BAA8B,YAAW,wBAAwB;IAE1E,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,IAAI,GAAE,MAAmB;IAG5C,uBAAuB,QAAO,mBAAmB,EAAE,CAajD;IAEF,UAAU,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CA6B/C;CACH"}
@@ -1,6 +1,12 @@
1
+ export type ClaudeModelWeeklyLimit = {
2
+ rejected: boolean;
3
+ resetsAt: number;
4
+ };
1
5
  export type ClaudeTokenUsage = {
2
6
  token: string;
3
7
  fiveHourUtilization: number;
4
8
  blocked: boolean;
9
+ rejected: boolean;
10
+ modelWeeklyLimits: Record<string, ClaudeModelWeeklyLimit>;
5
11
  };
6
12
  //# sourceMappingURL=ClaudeTokenUsage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeTokenUsage.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/ClaudeTokenUsage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"ClaudeTokenUsage.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/ClaudeTokenUsage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CAC3D,CAAC"}
@@ -23,6 +23,7 @@ import { StartPreparationUseCase } from './StartPreparationUseCase';
23
23
  import { RevertOrphanedPreparationUseCase } from './RevertOrphanedPreparationUseCase';
24
24
  import { RevertNotReadyAwaitingQualityCheckUseCase } from './RevertNotReadyAwaitingQualityCheckUseCase';
25
25
  import { SetupTowerDefenceProjectUseCase } from './SetupTowerDefenceProjectUseCase';
26
+ import { UpdateRateLimitCacheUseCase } from './UpdateRateLimitCacheUseCase';
26
27
  export declare class ProjectNotFoundError extends Error {
27
28
  constructor(message: string);
28
29
  }
@@ -44,11 +45,12 @@ export declare class HandleScheduledEventUseCase {
44
45
  readonly startPreparationUseCase: StartPreparationUseCase;
45
46
  readonly revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase;
46
47
  readonly revertNotReadyAwaitingQualityCheckUseCase: RevertNotReadyAwaitingQualityCheckUseCase;
48
+ readonly updateRateLimitCacheUseCase: UpdateRateLimitCacheUseCase | null;
47
49
  readonly dateRepository: DateRepository;
48
50
  readonly spreadsheetRepository: SpreadsheetRepository;
49
51
  readonly projectRepository: ProjectRepository;
50
52
  readonly issueRepository: IssueRepository;
51
- constructor(setupTowerDefenceProjectUseCase: SetupTowerDefenceProjectUseCase, actionAnnouncementUseCase: ActionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase: SetWorkflowManagementIssueToStoryUseCase, clearPastNextActionUseCase: ClearPastNextActionDateHourUseCase, analyzeProblemByIssueUseCase: AnalyzeProblemByIssueUseCase, analyzeStoriesUseCase: AnalyzeStoriesUseCase, clearDependedIssueURLUseCase: ClearDependedIssueURLUseCase, createEstimationIssueUseCase: CreateEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase: ConvertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase: ChangeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase: SetNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase, startPreparationUseCase: StartPreparationUseCase, revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase, revertNotReadyAwaitingQualityCheckUseCase: RevertNotReadyAwaitingQualityCheckUseCase, dateRepository: DateRepository, spreadsheetRepository: SpreadsheetRepository, projectRepository: ProjectRepository, issueRepository: IssueRepository);
53
+ constructor(setupTowerDefenceProjectUseCase: SetupTowerDefenceProjectUseCase, actionAnnouncementUseCase: ActionAnnouncementUseCase, setWorkflowManagementIssueToStoryUseCase: SetWorkflowManagementIssueToStoryUseCase, clearPastNextActionUseCase: ClearPastNextActionDateHourUseCase, analyzeProblemByIssueUseCase: AnalyzeProblemByIssueUseCase, analyzeStoriesUseCase: AnalyzeStoriesUseCase, clearDependedIssueURLUseCase: ClearDependedIssueURLUseCase, createEstimationIssueUseCase: CreateEstimationIssueUseCase, convertCheckboxToIssueInStoryIssueUseCase: ConvertCheckboxToIssueInStoryIssueUseCase, changeStatusByStoryColorUseCase: ChangeStatusByStoryColorUseCase, setNoStoryIssueToStoryUseCase: SetNoStoryIssueToStoryUseCase, createNewStoryByLabelUseCase: CreateNewStoryByLabelUseCase, assignNoAssigneeIssueToManagerUseCase: AssignNoAssigneeIssueToManagerUseCase, updateIssueStatusByLabelUseCase: UpdateIssueStatusByLabelUseCase, startPreparationUseCase: StartPreparationUseCase, revertOrphanedPreparationUseCase: RevertOrphanedPreparationUseCase, revertNotReadyAwaitingQualityCheckUseCase: RevertNotReadyAwaitingQualityCheckUseCase, updateRateLimitCacheUseCase: UpdateRateLimitCacheUseCase | null, dateRepository: DateRepository, spreadsheetRepository: SpreadsheetRepository, projectRepository: ProjectRepository, issueRepository: IssueRepository);
52
54
  run: (input: {
53
55
  projectName: string;
54
56
  org: string;
@@ -1 +1 @@
1
- {"version":3,"file":"HandleScheduledEventUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yCAAyC,EAAE,MAAM,6CAA6C,CAAC;AACxG,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,yCAAyC,EAAE,MAAM,6CAA6C,CAAC;AACxG,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAID,qBAAa,2BAA2B;IAEpC,QAAQ,CAAC,+BAA+B,EAAE,+BAA+B;IACzE,QAAQ,CAAC,yBAAyB,EAAE,yBAAyB;IAC7D,QAAQ,CAAC,wCAAwC,EAAE,wCAAwC;IAC3F,QAAQ,CAAC,0BAA0B,EAAE,kCAAkC;IACvE,QAAQ,CAAC,4BAA4B,EAAE,4BAA4B;IACnE,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,4BAA4B,EAAE,4BAA4B;IACnE,QAAQ,CAAC,4BAA4B,EAAE,4BAA4B;IACnE,QAAQ,CAAC,yCAAyC,EAAE,yCAAyC;IAC7F,QAAQ,CAAC,+BAA+B,EAAE,+BAA+B;IACzE,QAAQ,CAAC,6BAA6B,EAAE,6BAA6B;IACrE,QAAQ,CAAC,4BAA4B,EAAE,4BAA4B;IACnE,QAAQ,CAAC,qCAAqC,EAAE,qCAAqC;IACrF,QAAQ,CAAC,+BAA+B,EAAE,+BAA+B;IACzE,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB;IACzD,QAAQ,CAAC,gCAAgC,EAAE,gCAAgC;IAC3E,QAAQ,CAAC,yCAAyC,EAAE,yCAAyC;IAC7F,QAAQ,CAAC,cAAc,EAAE,cAAc;IACvC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAC7C,QAAQ,CAAC,eAAe,EAAE,eAAe;gBApBhC,+BAA+B,EAAE,+BAA+B,EAChE,yBAAyB,EAAE,yBAAyB,EACpD,wCAAwC,EAAE,wCAAwC,EAClF,0BAA0B,EAAE,kCAAkC,EAC9D,4BAA4B,EAAE,4BAA4B,EAC1D,qBAAqB,EAAE,qBAAqB,EAC5C,4BAA4B,EAAE,4BAA4B,EAC1D,4BAA4B,EAAE,4BAA4B,EAC1D,yCAAyC,EAAE,yCAAyC,EACpF,+BAA+B,EAAE,+BAA+B,EAChE,6BAA6B,EAAE,6BAA6B,EAC5D,4BAA4B,EAAE,4BAA4B,EAC1D,qCAAqC,EAAE,qCAAqC,EAC5E,+BAA+B,EAAE,+BAA+B,EAChE,uBAAuB,EAAE,uBAAuB,EAChD,gCAAgC,EAAE,gCAAgC,EAClE,yCAAyC,EAAE,yCAAyC,EACpF,cAAc,EAAE,cAAc,EAC9B,qBAAqB,EAAE,qBAAqB,EAC5C,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe;IAG3C,GAAG,GAAU,OAAO;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,aAAa,EAAE;YACb,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,cAAc,EAAE,MAAM,CAAC;SACxB,CAAC;QACF,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,OAAO,CAAC;QAClB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,gBAAgB,CAAC,EAAE;YACjB,gBAAgB,EAAE,MAAM,CAAC;YACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACpC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACpC,cAAc,EAAE,MAAM,CAAC;YACvB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;YAC3C,8BAA8B,CAAC,EAAE,MAAM,CAAC;YACxC,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACtC,8BAA8B,CAAC,EAAE,MAAM,CAAC;YACxC,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;YAC5B,0BAA0B,CAAC,EAAE,MAAM,CAAC;YACpC,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SAC5C,GAAG,IAAI,CAAC;QACT,yBAAyB,CAAC,EAAE;YAC1B,8BAA8B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;SAChD,GAAG,IAAI,CAAC;KACV,KAAG,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,IAAI,EAAE,CAAC;QACxB,WAAW,EAAE,cAAc,CAAC;KAC7B,GAAG,IAAI,CAAC,CA+IP;IACF,eAAe,GACb,OAAO,UAAU,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EACxD,SAAS,OAAO,EAChB,QAAQ,KAAK,EAAE,EACf,WAAW,OAAO,EAClB,iBAAiB,IAAI,EAAE,EACvB,gBAAgB,cAAc,EAC9B,cAAc,OAAO,KACpB,OAAO,CAAC,IAAI,CAAC,CA8Cd;IACF,oBAAoB,GAClB,OAAO,UAAU,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EACxD,SAAS,OAAO,EAChB,QAAQ,KAAK,EAAE,EACf,WAAW,OAAO,EAClB,iBAAiB,IAAI,EAAE,EACvB,gBAAgB,cAAc,KAC7B,OAAO,CAAC,IAAI,CAAC,CA2Fd;IACF,MAAM,CAAC,qBAAqB,GAAI,MAAM,IAAI,EAAE,IAAI,IAAI,KAAG,IAAI,EAAE,CAoB3D;IACF,4CAA4C,GAC1C,gBAAgB,MAAM,EACtB,KAAK,IAAI,KACR,OAAO,CAAC,IAAI,EAAE,CAAC,CAgChB;IACF,kBAAkB,GAChB,gBAAgB,MAAM,EACtB,KAAK,IAAI,KACR,OAAO,CAAC,OAAO,CAAC,CA8BjB;IACF,WAAW,GAAU,OAAO;QAC1B,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;KACjB,KAAG,OAAO,CAAC,cAAc,CAAC,CAoBzB;CACH"}
1
+ {"version":3,"file":"HandleScheduledEventUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/HandleScheduledEventUseCase.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
2
  import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
3
3
  import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
4
- import { ClaudeRepository } from './adapter-interfaces/ClaudeRepository';
5
4
  import { ClaudeTokenUsageRepository } from './adapter-interfaces/ClaudeTokenUsageRepository';
6
5
  export declare class StartPreparationUseCase {
7
6
  private readonly projectRepository;
8
7
  private readonly issueRepository;
9
- private readonly claudeRepository;
10
8
  private readonly localCommandRunner;
11
9
  private readonly claudeTokenUsageRepository;
12
- constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'getStoryObjectMap' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'closePullRequest' | 'deletePullRequestBranch' | 'createCommentByUrl'>, claudeRepository: Pick<ClaudeRepository, 'getUsage'>, localCommandRunner: LocalCommandRunner, claudeTokenUsageRepository: ClaudeTokenUsageRepository);
10
+ constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'getStoryObjectMap' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'closePullRequest' | 'deletePullRequestBranch' | 'createCommentByUrl'>, localCommandRunner: LocalCommandRunner, claudeTokenUsageRepository: ClaudeTokenUsageRepository);
11
+ private weeklyLimitTypeForModel;
12
+ private isModelWeeklyLimitRejected;
13
13
  private selectRotationTokens;
14
14
  run: (params: {
15
15
  projectUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAO7F,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAUhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;gBAb1B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,mBAAmB,GACnB,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,yBAAyB,GACzB,oBAAoB,CACvB,EACgB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,EACpD,kBAAkB,EAAE,kBAAkB,EACtC,0BAA0B,EAAE,0BAA0B;IAGzE,OAAO,CAAC,oBAAoB,CAIK;IAEjC,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;QACzB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,cAAc,EAAE,MAAM,CAAC;QACvB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,8BAA8B,EAAE,MAAM,CAAC;QACvC,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACrC,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACrC,sBAAsB,EAAE,MAAM,CAAC;KAChC,KAAG,OAAO,CAAC,IAAI,CAAC,CA2Qf;CACH"}
1
+ {"version":3,"file":"StartPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAO7F,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAUhC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,0BAA0B;gBAZ1B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,mBAAmB,GACnB,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,yBAAyB,GACzB,oBAAoB,CACvB,EACgB,kBAAkB,EAAE,kBAAkB,EACtC,0BAA0B,EAAE,0BAA0B;IAGzE,OAAO,CAAC,uBAAuB,CAK7B;IAEF,OAAO,CAAC,0BAA0B,CAQhC;IAEF,OAAO,CAAC,oBAAoB,CAkB1B;IAEF,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;QACzB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,cAAc,EAAE,MAAM,CAAC;QACvB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,8BAA8B,EAAE,MAAM,CAAC;QACvC,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACrC,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACrC,sBAAsB,EAAE,MAAM,CAAC;KAChC,KAAG,OAAO,CAAC,IAAI,CAAC,CAoOf;CACH"}
@@ -0,0 +1,9 @@
1
+ import { RateLimitCacheRepository } from './adapter-interfaces/RateLimitCacheRepository';
2
+ export declare class UpdateRateLimitCacheUseCase {
3
+ private readonly rateLimitCacheRepository;
4
+ constructor(rateLimitCacheRepository: RateLimitCacheRepository);
5
+ run: (params: {
6
+ nowEpochSeconds: number;
7
+ }) => Promise<void>;
8
+ }
9
+ //# sourceMappingURL=UpdateRateLimitCacheUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateRateLimitCacheUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/UpdateRateLimitCacheUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AAEzF,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ,CAAC,wBAAwB;gBAAxB,wBAAwB,EAAE,wBAAwB;IAGrE,GAAG,GAAU,QAAQ;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAO9D;CACH"}
@@ -0,0 +1,9 @@
1
+ export interface TokenRateLimitCache {
2
+ token: string;
3
+ unifiedReset: number;
4
+ }
5
+ export interface RateLimitCacheRepository {
6
+ getTokenRateLimitCaches: () => TokenRateLimitCache[];
7
+ probeToken: (token: string) => Promise<void>;
8
+ }
9
+ //# sourceMappingURL=RateLimitCacheRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitCacheRepository.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,uBAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;IACrD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}