github-issue-tower-defence-management 1.69.5 → 1.69.7

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 (33) hide show
  1. package/.prettierignore +1 -0
  2. package/CHANGELOG.md +14 -0
  3. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +13 -0
  4. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  5. package/bin/adapter/proxy/RateLimitCache.js +3 -0
  6. package/bin/adapter/proxy/RateLimitCache.js.map +1 -1
  7. package/bin/adapter/repositories/ProxyRateLimitCacheRepository.js +2 -1
  8. package/bin/adapter/repositories/ProxyRateLimitCacheRepository.js.map +1 -1
  9. package/bin/domain/usecases/StartPreparationUseCase.js +2 -1
  10. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  11. package/bin/domain/usecases/UpdateRateLimitCacheUseCase.js +5 -1
  12. package/bin/domain/usecases/UpdateRateLimitCacheUseCase.js.map +1 -1
  13. package/package.json +1 -1
  14. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +94 -0
  15. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +44 -0
  16. package/src/adapter/proxy/RateLimitCache.test.ts +43 -0
  17. package/src/adapter/proxy/RateLimitCache.ts +4 -0
  18. package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +21 -6
  19. package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +2 -1
  20. package/src/domain/usecases/StartPreparationUseCase.test.ts +249 -152
  21. package/src/domain/usecases/StartPreparationUseCase.ts +6 -2
  22. package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +108 -11
  23. package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +7 -1
  24. package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +1 -0
  25. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  26. package/types/adapter/proxy/RateLimitCache.d.ts +1 -0
  27. package/types/adapter/proxy/RateLimitCache.d.ts.map +1 -1
  28. package/types/adapter/repositories/ProxyRateLimitCacheRepository.d.ts.map +1 -1
  29. package/types/domain/usecases/StartPreparationUseCase.d.ts +1 -1
  30. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  31. package/types/domain/usecases/UpdateRateLimitCacheUseCase.d.ts.map +1 -1
  32. package/types/domain/usecases/adapter-interfaces/RateLimitCacheRepository.d.ts +1 -0
  33. package/types/domain/usecases/adapter-interfaces/RateLimitCacheRepository.d.ts.map +1 -1
@@ -24,7 +24,7 @@ export class StartPreparationUseCase {
24
24
  private readonly projectRepository: Pick<ProjectRepository, 'getByUrl'>,
25
25
  private readonly issueRepository: Pick<
26
26
  IssueRepository,
27
- | 'getAllOpened'
27
+ | 'getStoryObjectMap'
28
28
  | 'updateStatus'
29
29
  | 'findRelatedOpenPRs'
30
30
  | 'getOpenPullRequest'
@@ -254,10 +254,14 @@ export class StartPreparationUseCase {
254
254
  }
255
255
 
256
256
  const project = await this.projectRepository.getByUrl(params.projectUrl);
257
- const allOpenedIssues = await this.issueRepository.getAllOpened(
257
+ const storyObjectMap = await this.issueRepository.getStoryObjectMap(
258
258
  project,
259
259
  params.allowIssueCacheMinutes,
260
260
  );
261
+
262
+ const allOpenedIssues = Array.from(storyObjectMap.values()).flatMap(
263
+ (storyObject) => storyObject.issues,
264
+ );
261
265
  const preparationStatusOption = project.status.statuses.find(
262
266
  (s) => s.name === PREPARATION_STATUS_NAME,
263
267
  );
@@ -12,10 +12,14 @@ describe('UpdateRateLimitCacheUseCase', () => {
12
12
  });
13
13
 
14
14
  it('should probe a token whose unifiedReset is in the past', async () => {
15
- const pastReset = 1000000000;
16
15
  const nowEpochSeconds = 1000000100;
16
+ const pastReset = 1000000000;
17
17
  mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
18
- { token: 'token-expired', unifiedReset: pastReset },
18
+ {
19
+ token: 'token-expired',
20
+ unifiedReset: pastReset,
21
+ lastProbeEpoch: nowEpochSeconds,
22
+ },
19
23
  ]);
20
24
  mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
21
25
 
@@ -26,11 +30,16 @@ describe('UpdateRateLimitCacheUseCase', () => {
26
30
  );
27
31
  });
28
32
 
29
- it('should not probe a token whose unifiedReset is in the future', async () => {
30
- const futureReset = 9999999999;
33
+ it('should not probe a token whose unifiedReset is in the future and was probed within the last hour', async () => {
31
34
  const nowEpochSeconds = 1000000000;
35
+ const futureReset = nowEpochSeconds + 1800;
36
+ const tenMinutesAgo = nowEpochSeconds - 600;
32
37
  mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
33
- { token: 'token-active', unifiedReset: futureReset },
38
+ {
39
+ token: 'token-active',
40
+ unifiedReset: futureReset,
41
+ lastProbeEpoch: tenMinutesAgo,
42
+ },
34
43
  ]);
35
44
 
36
45
  await useCase.run({ nowEpochSeconds });
@@ -39,12 +48,20 @@ describe('UpdateRateLimitCacheUseCase', () => {
39
48
  });
40
49
 
41
50
  it('should probe only tokens with expired reset when mixed tokens exist', async () => {
42
- const pastReset = 1000000000;
43
- const futureReset = 9999999999;
44
51
  const nowEpochSeconds = 1000000100;
52
+ const pastReset = 1000000000;
53
+ const futureReset = nowEpochSeconds + 1800;
45
54
  mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
46
- { token: 'token-expired', unifiedReset: pastReset },
47
- { token: 'token-active', unifiedReset: futureReset },
55
+ {
56
+ token: 'token-expired',
57
+ unifiedReset: pastReset,
58
+ lastProbeEpoch: nowEpochSeconds,
59
+ },
60
+ {
61
+ token: 'token-active',
62
+ unifiedReset: futureReset,
63
+ lastProbeEpoch: nowEpochSeconds,
64
+ },
48
65
  ]);
49
66
  mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
50
67
 
@@ -57,10 +74,14 @@ describe('UpdateRateLimitCacheUseCase', () => {
57
74
  });
58
75
 
59
76
  it('should update the cache after probing by relying on the repository side effect', async () => {
60
- const pastReset = 1000000000;
61
77
  const nowEpochSeconds = 1000000100;
78
+ const pastReset = 1000000000;
62
79
  mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
63
- { token: 'token-expired', unifiedReset: pastReset },
80
+ {
81
+ token: 'token-expired',
82
+ unifiedReset: pastReset,
83
+ lastProbeEpoch: nowEpochSeconds,
84
+ },
64
85
  ]);
65
86
  mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
66
87
 
@@ -78,4 +99,80 @@ describe('UpdateRateLimitCacheUseCase', () => {
78
99
 
79
100
  expect(mockRateLimitCacheRepository.probeToken).not.toHaveBeenCalled();
80
101
  });
102
+
103
+ it('should probe a token whose last probe was 61 minutes ago even when unifiedReset is in the future', async () => {
104
+ const nowEpochSeconds = 1000000000;
105
+ const futureReset = nowEpochSeconds + 7200;
106
+ const sixtyOneMinutesAgo = nowEpochSeconds - 61 * 60;
107
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
108
+ {
109
+ token: 'token-stale-probe',
110
+ unifiedReset: futureReset,
111
+ lastProbeEpoch: sixtyOneMinutesAgo,
112
+ },
113
+ ]);
114
+ mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
115
+
116
+ await useCase.run({ nowEpochSeconds });
117
+
118
+ expect(mockRateLimitCacheRepository.probeToken).toHaveBeenCalledWith(
119
+ 'token-stale-probe',
120
+ );
121
+ });
122
+
123
+ it('should not probe a token whose last probe was 10 minutes ago', async () => {
124
+ const nowEpochSeconds = 1000000000;
125
+ const futureReset = nowEpochSeconds + 7200;
126
+ const tenMinutesAgo = nowEpochSeconds - 10 * 60;
127
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
128
+ {
129
+ token: 'token-fresh-probe',
130
+ unifiedReset: futureReset,
131
+ lastProbeEpoch: tenMinutesAgo,
132
+ },
133
+ ]);
134
+
135
+ await useCase.run({ nowEpochSeconds });
136
+
137
+ expect(mockRateLimitCacheRepository.probeToken).not.toHaveBeenCalled();
138
+ });
139
+
140
+ it('should probe a token with unifiedReset in the past regardless of last probe time', async () => {
141
+ const nowEpochSeconds = 1000000000;
142
+ const pastReset = nowEpochSeconds - 60;
143
+ const oneMinuteAgo = nowEpochSeconds - 60;
144
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
145
+ {
146
+ token: 'token-expired-recent-probe',
147
+ unifiedReset: pastReset,
148
+ lastProbeEpoch: oneMinuteAgo,
149
+ },
150
+ ]);
151
+ mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
152
+
153
+ await useCase.run({ nowEpochSeconds });
154
+
155
+ expect(mockRateLimitCacheRepository.probeToken).toHaveBeenCalledWith(
156
+ 'token-expired-recent-probe',
157
+ );
158
+ });
159
+
160
+ it('should probe a token that has never been probed even when unifiedReset is in the future', async () => {
161
+ const nowEpochSeconds = 1000000000;
162
+ const futureReset = nowEpochSeconds + 7200;
163
+ mockRateLimitCacheRepository.getTokenRateLimitCaches.mockReturnValue([
164
+ {
165
+ token: 'token-never-probed',
166
+ unifiedReset: futureReset,
167
+ lastProbeEpoch: 0,
168
+ },
169
+ ]);
170
+ mockRateLimitCacheRepository.probeToken.mockResolvedValue(undefined);
171
+
172
+ await useCase.run({ nowEpochSeconds });
173
+
174
+ expect(mockRateLimitCacheRepository.probeToken).toHaveBeenCalledWith(
175
+ 'token-never-probed',
176
+ );
177
+ });
81
178
  });
@@ -1,5 +1,7 @@
1
1
  import { RateLimitCacheRepository } from './adapter-interfaces/RateLimitCacheRepository';
2
2
 
3
+ const HOURLY_PROBE_INTERVAL_SECONDS = 3600;
4
+
3
5
  export class UpdateRateLimitCacheUseCase {
4
6
  constructor(
5
7
  private readonly rateLimitCacheRepository: RateLimitCacheRepository,
@@ -8,7 +10,11 @@ export class UpdateRateLimitCacheUseCase {
8
10
  run = async (params: { nowEpochSeconds: number }): Promise<void> => {
9
11
  const caches = this.rateLimitCacheRepository.getTokenRateLimitCaches();
10
12
  for (const cache of caches) {
11
- if (cache.unifiedReset < params.nowEpochSeconds) {
13
+ const unifiedResetExpired = cache.unifiedReset < params.nowEpochSeconds;
14
+ const hourlyProbeDue =
15
+ params.nowEpochSeconds - cache.lastProbeEpoch >=
16
+ HOURLY_PROBE_INTERVAL_SECONDS;
17
+ if (unifiedResetExpired || hourlyProbeDue) {
12
18
  await this.rateLimitCacheRepository.probeToken(cache.token);
13
19
  }
14
20
  }
@@ -1,6 +1,7 @@
1
1
  export interface TokenRateLimitCache {
2
2
  token: string;
3
3
  unifiedReset: number;
4
+ lastProbeEpoch: number;
4
5
  }
5
6
 
6
7
  export interface RateLimitCacheRepository {
@@ -1 +1 @@
1
- {"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AA2B3D,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,CAuPP;CACH"}
1
+ {"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AA2B3D,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,CAmSP;CACH"}
@@ -13,6 +13,7 @@ export interface RateLimitSnapshot {
13
13
  fiveHourRejected: boolean;
14
14
  sevenDayRejected: boolean;
15
15
  modelWeeklyLimits: Record<string, ModelWeeklyLimit>;
16
+ lastUpdatedEpoch: number;
16
17
  }
17
18
  export declare const PROXY_PORT = 8787;
18
19
  export declare const cacheDir: () => string;
@@ -1 +1 @@
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,IA8BF,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
+ {"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;IACpD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;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,IA8BF,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,IAiDjE,CAAC"}
@@ -1 +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
+ {"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,CAcjD;IAEF,UAAU,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CA6B/C;CACH"}
@@ -15,7 +15,7 @@ export declare class StartPreparationUseCase {
15
15
  private readonly issueRepository;
16
16
  private readonly localCommandRunner;
17
17
  private readonly claudeTokenUsageRepository;
18
- constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'getAllOpened' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'closePullRequest' | 'deletePullRequestBranch' | 'createCommentByUrl'>, localCommandRunner: LocalCommandRunner, claudeTokenUsageRepository: ClaudeTokenUsageRepository);
18
+ constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'getStoryObjectMap' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'closePullRequest' | 'deletePullRequestBranch' | 'createCommentByUrl'>, localCommandRunner: LocalCommandRunner, claudeTokenUsageRepository: ClaudeTokenUsageRepository);
19
19
  private weeklyLimitTypeForModel;
20
20
  private isModelWeeklyLimitRejected;
21
21
  private secondsUntilSevenDayReset;
@@ -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,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAShE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,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,cAAc,GACd,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,yBAAyB,CAc/B;IAEF,OAAO,CAAC,wCAAwC,CAoB9C;IAEF,OAAO,CAAC,uBAAuB,CAU7B;IAEF,OAAO,CAAC,oBAAoB,CAkD1B;IAEF,kBAAkB,GAChB,aAAa,gBAAgB,EAAE,EAC/B,gCAAgC,MAAM,EACtC,WAAW,MAAM,GAAG,IAAI,KACvB,kBAAkB,EAAE,CA6CrB;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;QAC/B,oBAAoB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACvC,KAAG,OAAO,CAAC;QAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CAwPzD;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;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAShE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,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,yBAAyB,CAc/B;IAEF,OAAO,CAAC,wCAAwC,CAoB9C;IAEF,OAAO,CAAC,uBAAuB,CAU7B;IAEF,OAAO,CAAC,oBAAoB,CAkD1B;IAEF,kBAAkB,GAChB,aAAa,gBAAgB,EAAE,EAC/B,gCAAgC,MAAM,EACtC,WAAW,MAAM,GAAG,IAAI,KACvB,kBAAkB,EAAE,CA6CrB;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;QAC/B,oBAAoB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACvC,KAAG,OAAO,CAAC;QAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CA4PzD;CACH"}
@@ -1 +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"}
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;AAIzF,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,CAW9D;CACH"}
@@ -1,6 +1,7 @@
1
1
  export interface TokenRateLimitCache {
2
2
  token: string;
3
3
  unifiedReset: number;
4
+ lastProbeEpoch: number;
4
5
  }
5
6
  export interface RateLimitCacheRepository {
6
7
  getTokenRateLimitCaches: () => TokenRateLimitCache[];
@@ -1 +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"}
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;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;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"}