github-issue-tower-defence-management 1.69.7 → 1.69.9
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.
- package/CHANGELOG.md +14 -0
- package/README.md +1 -1
- package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js +11 -0
- package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js.map +1 -1
- package/bin/domain/usecases/StartPreparationUseCase.js +1 -2
- package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +207 -9
- package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +14 -0
- package/src/domain/usecases/StartPreparationUseCase.test.ts +259 -0
- package/src/domain/usecases/StartPreparationUseCase.ts +1 -4
- package/types/adapter/repositories/ProxyClaudeTokenUsageRepository.d.ts.map +1 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.69.9](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.69.8...v1.69.9) (2026-06-05)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **rotation:** drop currentPreparationIssueCount offset so soonest-7d-reset token is always selected first ([98a7ad4](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/98a7ad450fcaa84bd0adce2946a2ad1e5bbcdc3f)), closes [#748](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/748)
|
|
7
|
+
|
|
8
|
+
## [1.69.8](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.69.7...v1.69.8) (2026-06-04)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **rotation:** bridge snapshot sevenDayReset into modelWeeklyLimits so 7d deadline sort works on proxy path ([b56e46d](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/b56e46ddd6b1ec61036ca42ea517a0bec55841b3)), closes [#733](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/733)
|
|
14
|
+
|
|
1
15
|
## [1.69.7](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.69.6...v1.69.7) (2026-06-04)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -218,7 +218,7 @@ When `claudeCodeOauthTokenListJsonPath` is set, `startDaemon` distributes prepar
|
|
|
218
218
|
|
|
219
219
|
2. Local reverse proxy (`127.0.0.1:8787`): on each `startDaemon` run, the daemon TCP-probes the port. If nothing responds, it spawns a detached child running `bin/adapter/proxy/proxyEntry.js`. The proxy forwards every request to `api.anthropic.com`, observes the `anthropic-ratelimit-unified-*` response headers, and writes them to a per-token cache file at `${XDG_CACHE_HOME:-~/.cache}/tdpm/ratelimit/<sha256-of-token>.json`. The cache file stores the latest 5-hour and 7-day utilization, reset epochs, and the unified, 5-hour, and 7-day statuses (used to detect `blocked` and `rejected` state per window). In addition to the unified headers, the proxy inspects the streamed response body for `rate_limit` events (objects carrying `rateLimitType`, `status`, and `resetsAt`) and records the model-specific weekly limits — at minimum `seven_day_sonnet` and `seven_day` — per token. These model-specific weekly limits are exposed only in the response body, never in the unified headers, so a token can appear healthy on `anthropic-ratelimit-unified-7d-*` while its Sonnet weekly limit is exhausted.
|
|
220
220
|
|
|
221
|
-
3. Selection: before spawning each `aw` job, the daemon reads every token's cache file. A cached observation is treated as expired once its reset epoch has passed: when the current time is past the 5-hour reset, that token's 5-hour utilization is treated as `0` and any 5-hour-window rejection is cleared; likewise, when the 7-day reset has passed, the 7-day utilization is treated as `0` and any 7-day-window rejection is cleared; a model-specific weekly limit rejection is cleared once that limit's `resetsAt` has passed. This stale-reset expiry prevents a token that has actually recovered from being locked out of rotation forever (an excluded token receives no new requests, so the proxy never re-observes it). After expiry normalization, tokens whose status is `blocked`, whose remaining (non-expired) rejection is still active, whose 5-hour utilization meets or exceeds the configured threshold, or whose weekly limit for the model that will be used is rejected are excluded. The model name maps to a limit type: a model name containing `sonnet` maps to `seven_day_sonnet`, one containing `opus` maps to `seven_day_opus`, otherwise `seven_day`; the generic `seven_day` rejection also excludes regardless of model. The remaining eligible tokens are sorted by time until the 7-day reset deadline ascending (soonest 7-day reset first, so quota that would otherwise expire unused is consumed first), with 5-hour utilization ascending as the tiebreaker. The 7-day reset deadline for a given spawn is read from the per-model weekly limit entry in `modelWeeklyLimits` matching the model that will be used (`seven_day_sonnet`, `seven_day_opus`, or the generic `seven_day`); when no
|
|
221
|
+
3. Selection: before spawning each `aw` job, the daemon reads every token's cache file. A cached observation is treated as expired once its reset epoch has passed: when the current time is past the 5-hour reset, that token's 5-hour utilization is treated as `0` and any 5-hour-window rejection is cleared; likewise, when the 7-day reset has passed, the 7-day utilization is treated as `0` and any 7-day-window rejection is cleared; a model-specific weekly limit rejection is cleared once that limit's `resetsAt` has passed. This stale-reset expiry prevents a token that has actually recovered from being locked out of rotation forever (an excluded token receives no new requests, so the proxy never re-observes it). After expiry normalization, tokens whose status is `blocked`, whose remaining (non-expired) rejection is still active, whose 5-hour utilization meets or exceeds the configured threshold, or whose weekly limit for the model that will be used is rejected are excluded. The model name maps to a limit type: a model name containing `sonnet` maps to `seven_day_sonnet`, one containing `opus` maps to `seven_day_opus`, otherwise `seven_day`; the generic `seven_day` rejection also excludes regardless of model. The remaining eligible tokens are sorted by time until the 7-day reset deadline ascending (soonest 7-day reset first, so quota that would otherwise expire unused is consumed first), with 5-hour utilization ascending as the tiebreaker. The 7-day reset deadline for a given spawn is read from the per-model weekly limit entry in `modelWeeklyLimits` matching the model that will be used (`seven_day_sonnet`, `seven_day_opus`, or the generic `seven_day`); when no model-specific or generic `seven_day` entry exists but the cache snapshot recorded a non-expired top-level `anthropic-ratelimit-unified-7d-reset` deadline, that header value is bridged into a synthesized generic `seven_day` entry whose `rejected` flag matches the (non-expired) `anthropic-ratelimit-unified-7d-status` rejection. When neither source supplies a deadline, the token is treated as having an infinite deadline and sorts last. Each token's per-run concurrent preparation slot count is determined by its 7-day utilization: at or below 80%, the token receives the full six concurrent slots; above 80%, the slot count is reduced proportionally — specifically `ceil(6 × (1 − 7d_util) / 0.2)` — with a minimum of 1 slot at any utilization level, so near-exhausted tokens still participate rather than being cut off entirely. Tokens are dispatched round-robin across their available slots, with the token whose 7-day reset is soonest selected preferentially. The effective preparation limit for a run is the lesser of the sum of all eligible tokens' slot counts and the explicit `maximumPreparingIssuesCount` (which defaults to 6). When a token list is configured but no eligible token remains after filtering, preparation is skipped for that run. The selected token and the proxy URL (`http://127.0.0.1:8787`) are passed to the child `aw` process as `CLAUDE_CODE_OAUTH_TOKEN` and `ANTHROPIC_BASE_URL` environment variables. The child inherits the parent process's environment, so no further wiring is required inside `aw`.
|
|
222
222
|
|
|
223
223
|
When `claudeCodeOauthTokenListJsonPath` is unset, no proxy is started and `aw` runs with whatever `CLAUDE_CODE_OAUTH_TOKEN` and `ANTHROPIC_BASE_URL` are already in the environment.
|
|
224
224
|
|
|
@@ -55,6 +55,17 @@ class ProxyClaudeTokenUsageRepository {
|
|
|
55
55
|
resetsAt: limit.resetsAt,
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
|
+
const hasAnySevenDayWeeklyLimit = modelWeeklyLimits['seven_day'] !== undefined ||
|
|
59
|
+
modelWeeklyLimits['seven_day_opus'] !== undefined ||
|
|
60
|
+
modelWeeklyLimits['seven_day_sonnet'] !== undefined;
|
|
61
|
+
if (snapshot.sevenDayReset > 0 &&
|
|
62
|
+
!sevenDayExpired &&
|
|
63
|
+
!hasAnySevenDayWeeklyLimit) {
|
|
64
|
+
modelWeeklyLimits['seven_day'] = {
|
|
65
|
+
rejected: sevenDayRejectionActive,
|
|
66
|
+
resetsAt: snapshot.sevenDayReset,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
58
69
|
return {
|
|
59
70
|
name,
|
|
60
71
|
token,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProxyClaudeTokenUsageRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts"],"names":[],"mappings":";;;AAEA,oEAAiE;AACjE,4DAAoE;AACpE,8DAA4D;AAE5D,MAAa,+BAA+B;IAC1C,YACmB,iBAAgC,EAChC,OAAe,2BAAU;QADzB,sBAAiB,GAAjB,iBAAiB,CAAe;QAChC,SAAI,GAAJ,IAAI,CAAqB;QAG5C,qBAAgB,GAAG,KAAK,IAAmB,EAAE;YAC3C,MAAM,IAAA,uCAAkB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,4BAAuB,GAAG,KAAK,IAAiC,EAAE;YAChE,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;gBACpC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,OAAO,GAAG,IAAA,kCAAgB,EAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;gBACrC,MAAM,QAAQ,GAAG,IAAA,8BAAa,EAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACtB,OAAO;wBACL,IAAI;wBACJ,KAAK;wBACL,mBAAmB,EAAE,CAAC;wBACtB,mBAAmB,EAAE,CAAC;wBACtB,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,KAAK;wBACf,iBAAiB,EAAE,EAAE;qBACtB,CAAC;gBACJ,CAAC;gBACD,MAAM,eAAe,GAAG,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC;gBACjE,MAAM,eAAe,GAAG,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC;gBACjE,MAAM,mBAAmB,GAAG,eAAe;oBACzC,CAAC,CAAC,CAAC;oBACH,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACjC,MAAM,mBAAmB,GAAG,eAAe;oBACzC,CAAC,CAAC,CAAC;oBACH,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACjC,MAAM,uBAAuB,GAC3B,QAAQ,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC;gBAChD,MAAM,uBAAuB,GAC3B,QAAQ,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC;gBAChD,MAAM,sBAAsB,GAC1B,QAAQ,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC;gBAC/C,MAAM,QAAQ,GACZ,sBAAsB;oBACtB,uBAAuB;oBACvB,uBAAuB,CAAC;gBAC1B,MAAM,iBAAiB,GAGnB,EAAE,CAAC;gBACP,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAC7C,QAAQ,CAAC,iBAAiB,CAC3B,EAAE,CAAC;oBACF,MAAM,OAAO,GAAG,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC;oBACjD,iBAAiB,CAAC,SAAS,CAAC,GAAG;wBAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,OAAO;wBACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;qBACzB,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,IAAI;oBACJ,KAAK;oBACL,mBAAmB;oBACnB,mBAAmB;oBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,QAAQ;oBACR,iBAAiB;iBAClB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,iBAAY,GAAG,GAAW,EAAE,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ProxyClaudeTokenUsageRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -258,8 +258,7 @@ class StartPreparationUseCase {
|
|
|
258
258
|
}
|
|
259
259
|
let spawnEnv;
|
|
260
260
|
if (rotationTokens !== null && proxyBaseUrl !== null) {
|
|
261
|
-
const selected = rotationTokens[
|
|
262
|
-
rotationTokens.length];
|
|
261
|
+
const selected = rotationTokens[startedInThisRunCount % rotationTokens.length];
|
|
263
262
|
spawnEnv = {
|
|
264
263
|
CLAUDE_CODE_OAUTH_TOKEN: selected,
|
|
265
264
|
ANTHROPIC_BASE_URL: proxyBaseUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -102,7 +102,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
102
102
|
sevenDayUtilization: 0,
|
|
103
103
|
blocked: false,
|
|
104
104
|
rejected: false,
|
|
105
|
-
modelWeeklyLimits: {
|
|
105
|
+
modelWeeklyLimits: {
|
|
106
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
107
|
+
},
|
|
106
108
|
},
|
|
107
109
|
{
|
|
108
110
|
name: 'bob',
|
|
@@ -144,7 +146,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
144
146
|
sevenDayUtilization: 0,
|
|
145
147
|
blocked: true,
|
|
146
148
|
rejected: false,
|
|
147
|
-
modelWeeklyLimits: {
|
|
149
|
+
modelWeeklyLimits: {
|
|
150
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
151
|
+
},
|
|
148
152
|
},
|
|
149
153
|
]);
|
|
150
154
|
});
|
|
@@ -177,7 +181,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
177
181
|
sevenDayUtilization: 0,
|
|
178
182
|
blocked: false,
|
|
179
183
|
rejected: true,
|
|
180
|
-
modelWeeklyLimits: {
|
|
184
|
+
modelWeeklyLimits: {
|
|
185
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
186
|
+
},
|
|
181
187
|
},
|
|
182
188
|
]);
|
|
183
189
|
});
|
|
@@ -210,7 +216,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
210
216
|
sevenDayUtilization: 30,
|
|
211
217
|
blocked: false,
|
|
212
218
|
rejected: false,
|
|
213
|
-
modelWeeklyLimits: {
|
|
219
|
+
modelWeeklyLimits: {
|
|
220
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
221
|
+
},
|
|
214
222
|
},
|
|
215
223
|
]);
|
|
216
224
|
});
|
|
@@ -243,7 +251,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
243
251
|
sevenDayUtilization: 0,
|
|
244
252
|
blocked: false,
|
|
245
253
|
rejected: false,
|
|
246
|
-
modelWeeklyLimits: {
|
|
254
|
+
modelWeeklyLimits: {
|
|
255
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
256
|
+
},
|
|
247
257
|
},
|
|
248
258
|
]);
|
|
249
259
|
});
|
|
@@ -276,7 +286,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
276
286
|
sevenDayUtilization: 0,
|
|
277
287
|
blocked: false,
|
|
278
288
|
rejected: false,
|
|
279
|
-
modelWeeklyLimits: {
|
|
289
|
+
modelWeeklyLimits: {
|
|
290
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
291
|
+
},
|
|
280
292
|
},
|
|
281
293
|
]);
|
|
282
294
|
});
|
|
@@ -342,7 +354,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
342
354
|
sevenDayUtilization: 0,
|
|
343
355
|
blocked: false,
|
|
344
356
|
rejected: true,
|
|
345
|
-
modelWeeklyLimits: {
|
|
357
|
+
modelWeeklyLimits: {
|
|
358
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
359
|
+
},
|
|
346
360
|
},
|
|
347
361
|
]);
|
|
348
362
|
});
|
|
@@ -375,7 +389,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
375
389
|
sevenDayUtilization: 100,
|
|
376
390
|
blocked: false,
|
|
377
391
|
rejected: true,
|
|
378
|
-
modelWeeklyLimits: {
|
|
392
|
+
modelWeeklyLimits: {
|
|
393
|
+
seven_day: { rejected: true, resetsAt: futureReset },
|
|
394
|
+
},
|
|
379
395
|
},
|
|
380
396
|
]);
|
|
381
397
|
});
|
|
@@ -408,7 +424,9 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
408
424
|
sevenDayUtilization: 0,
|
|
409
425
|
blocked: false,
|
|
410
426
|
rejected: false,
|
|
411
|
-
modelWeeklyLimits: {
|
|
427
|
+
modelWeeklyLimits: {
|
|
428
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
429
|
+
},
|
|
412
430
|
},
|
|
413
431
|
]);
|
|
414
432
|
});
|
|
@@ -508,6 +526,186 @@ describe('ProxyClaudeTokenUsageRepository', () => {
|
|
|
508
526
|
},
|
|
509
527
|
]);
|
|
510
528
|
});
|
|
529
|
+
|
|
530
|
+
it('should bridge sevenDayReset into a synthesized generic seven_day weekly limit when no model-specific weekly limit is present', async () => {
|
|
531
|
+
mockLoadTokenEntries.mockReturnValue([
|
|
532
|
+
{ name: 'alice', token: 'token-a' },
|
|
533
|
+
]);
|
|
534
|
+
mockReadRateLimit.mockReturnValue({
|
|
535
|
+
fiveHourUtilization: 12,
|
|
536
|
+
fiveHourReset: futureReset,
|
|
537
|
+
sevenDayUtilization: 33,
|
|
538
|
+
sevenDayReset: futureReset,
|
|
539
|
+
blocked: false,
|
|
540
|
+
rejected: false,
|
|
541
|
+
unifiedRejected: false,
|
|
542
|
+
fiveHourRejected: false,
|
|
543
|
+
sevenDayRejected: false,
|
|
544
|
+
modelWeeklyLimits: {},
|
|
545
|
+
});
|
|
546
|
+
const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
|
|
547
|
+
|
|
548
|
+
const result = await repository.getAvailableTokenUsages();
|
|
549
|
+
|
|
550
|
+
expect(result[0].modelWeeklyLimits).toEqual({
|
|
551
|
+
seven_day: { rejected: false, resetsAt: futureReset },
|
|
552
|
+
});
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
it('should bridge sevenDayReset with rejected=true when sevenDayRejected is active and 7d reset is in the future', async () => {
|
|
556
|
+
mockLoadTokenEntries.mockReturnValue([
|
|
557
|
+
{ name: 'alice', token: 'token-a' },
|
|
558
|
+
]);
|
|
559
|
+
mockReadRateLimit.mockReturnValue({
|
|
560
|
+
fiveHourUtilization: 10,
|
|
561
|
+
fiveHourReset: futureReset,
|
|
562
|
+
sevenDayUtilization: 100,
|
|
563
|
+
sevenDayReset: futureReset,
|
|
564
|
+
blocked: false,
|
|
565
|
+
rejected: true,
|
|
566
|
+
unifiedRejected: false,
|
|
567
|
+
fiveHourRejected: false,
|
|
568
|
+
sevenDayRejected: true,
|
|
569
|
+
modelWeeklyLimits: {},
|
|
570
|
+
});
|
|
571
|
+
const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
|
|
572
|
+
|
|
573
|
+
const result = await repository.getAvailableTokenUsages();
|
|
574
|
+
|
|
575
|
+
expect(result[0].modelWeeklyLimits).toEqual({
|
|
576
|
+
seven_day: { rejected: true, resetsAt: futureReset },
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
it('should not bridge sevenDayReset when a generic seven_day weekly limit is already present', async () => {
|
|
581
|
+
const existingResetsAt = futureReset + 1000;
|
|
582
|
+
mockLoadTokenEntries.mockReturnValue([
|
|
583
|
+
{ name: 'alice', token: 'token-a' },
|
|
584
|
+
]);
|
|
585
|
+
mockReadRateLimit.mockReturnValue({
|
|
586
|
+
fiveHourUtilization: 10,
|
|
587
|
+
fiveHourReset: futureReset,
|
|
588
|
+
sevenDayUtilization: 50,
|
|
589
|
+
sevenDayReset: futureReset,
|
|
590
|
+
blocked: false,
|
|
591
|
+
rejected: false,
|
|
592
|
+
unifiedRejected: false,
|
|
593
|
+
fiveHourRejected: false,
|
|
594
|
+
sevenDayRejected: false,
|
|
595
|
+
modelWeeklyLimits: {
|
|
596
|
+
seven_day: { rejected: false, resetsAt: existingResetsAt },
|
|
597
|
+
},
|
|
598
|
+
});
|
|
599
|
+
const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
|
|
600
|
+
|
|
601
|
+
const result = await repository.getAvailableTokenUsages();
|
|
602
|
+
|
|
603
|
+
expect(result[0].modelWeeklyLimits).toEqual({
|
|
604
|
+
seven_day: { rejected: false, resetsAt: existingResetsAt },
|
|
605
|
+
});
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
it('should not bridge sevenDayReset when a seven_day_opus weekly limit is already present', async () => {
|
|
609
|
+
const opusResetsAt = futureReset + 2000;
|
|
610
|
+
mockLoadTokenEntries.mockReturnValue([
|
|
611
|
+
{ name: 'alice', token: 'token-a' },
|
|
612
|
+
]);
|
|
613
|
+
mockReadRateLimit.mockReturnValue({
|
|
614
|
+
fiveHourUtilization: 10,
|
|
615
|
+
fiveHourReset: futureReset,
|
|
616
|
+
sevenDayUtilization: 50,
|
|
617
|
+
sevenDayReset: futureReset,
|
|
618
|
+
blocked: false,
|
|
619
|
+
rejected: false,
|
|
620
|
+
unifiedRejected: false,
|
|
621
|
+
fiveHourRejected: false,
|
|
622
|
+
sevenDayRejected: false,
|
|
623
|
+
modelWeeklyLimits: {
|
|
624
|
+
seven_day_opus: { rejected: false, resetsAt: opusResetsAt },
|
|
625
|
+
},
|
|
626
|
+
});
|
|
627
|
+
const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
|
|
628
|
+
|
|
629
|
+
const result = await repository.getAvailableTokenUsages();
|
|
630
|
+
|
|
631
|
+
expect(result[0].modelWeeklyLimits).toEqual({
|
|
632
|
+
seven_day_opus: { rejected: false, resetsAt: opusResetsAt },
|
|
633
|
+
});
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
it('should not bridge sevenDayReset when a seven_day_sonnet weekly limit is already present', async () => {
|
|
637
|
+
const sonnetResetsAt = futureReset + 3000;
|
|
638
|
+
mockLoadTokenEntries.mockReturnValue([
|
|
639
|
+
{ name: 'alice', token: 'token-a' },
|
|
640
|
+
]);
|
|
641
|
+
mockReadRateLimit.mockReturnValue({
|
|
642
|
+
fiveHourUtilization: 10,
|
|
643
|
+
fiveHourReset: futureReset,
|
|
644
|
+
sevenDayUtilization: 50,
|
|
645
|
+
sevenDayReset: futureReset,
|
|
646
|
+
blocked: false,
|
|
647
|
+
rejected: false,
|
|
648
|
+
unifiedRejected: false,
|
|
649
|
+
fiveHourRejected: false,
|
|
650
|
+
sevenDayRejected: false,
|
|
651
|
+
modelWeeklyLimits: {
|
|
652
|
+
seven_day_sonnet: { rejected: false, resetsAt: sonnetResetsAt },
|
|
653
|
+
},
|
|
654
|
+
});
|
|
655
|
+
const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
|
|
656
|
+
|
|
657
|
+
const result = await repository.getAvailableTokenUsages();
|
|
658
|
+
|
|
659
|
+
expect(result[0].modelWeeklyLimits).toEqual({
|
|
660
|
+
seven_day_sonnet: { rejected: false, resetsAt: sonnetResetsAt },
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
it('should not bridge sevenDayReset when the 7d reset has already passed', async () => {
|
|
665
|
+
mockLoadTokenEntries.mockReturnValue([
|
|
666
|
+
{ name: 'alice', token: 'token-a' },
|
|
667
|
+
]);
|
|
668
|
+
mockReadRateLimit.mockReturnValue({
|
|
669
|
+
fiveHourUtilization: 10,
|
|
670
|
+
fiveHourReset: futureReset,
|
|
671
|
+
sevenDayUtilization: 0,
|
|
672
|
+
sevenDayReset: pastReset,
|
|
673
|
+
blocked: false,
|
|
674
|
+
rejected: false,
|
|
675
|
+
unifiedRejected: false,
|
|
676
|
+
fiveHourRejected: false,
|
|
677
|
+
sevenDayRejected: false,
|
|
678
|
+
modelWeeklyLimits: {},
|
|
679
|
+
});
|
|
680
|
+
const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
|
|
681
|
+
|
|
682
|
+
const result = await repository.getAvailableTokenUsages();
|
|
683
|
+
|
|
684
|
+
expect(result[0].modelWeeklyLimits).toEqual({});
|
|
685
|
+
});
|
|
686
|
+
|
|
687
|
+
it('should not bridge sevenDayReset when sevenDayReset is 0', async () => {
|
|
688
|
+
mockLoadTokenEntries.mockReturnValue([
|
|
689
|
+
{ name: 'alice', token: 'token-a' },
|
|
690
|
+
]);
|
|
691
|
+
mockReadRateLimit.mockReturnValue({
|
|
692
|
+
fiveHourUtilization: 10,
|
|
693
|
+
fiveHourReset: futureReset,
|
|
694
|
+
sevenDayUtilization: 0,
|
|
695
|
+
sevenDayReset: 0,
|
|
696
|
+
blocked: false,
|
|
697
|
+
rejected: false,
|
|
698
|
+
unifiedRejected: false,
|
|
699
|
+
fiveHourRejected: false,
|
|
700
|
+
sevenDayRejected: false,
|
|
701
|
+
modelWeeklyLimits: {},
|
|
702
|
+
});
|
|
703
|
+
const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
|
|
704
|
+
|
|
705
|
+
const result = await repository.getAvailableTokenUsages();
|
|
706
|
+
|
|
707
|
+
expect(result[0].modelWeeklyLimits).toEqual({});
|
|
708
|
+
});
|
|
511
709
|
});
|
|
512
710
|
|
|
513
711
|
describe('proxyBaseUrl', () => {
|
|
@@ -67,6 +67,20 @@ export class ProxyClaudeTokenUsageRepository implements ClaudeTokenUsageReposito
|
|
|
67
67
|
resetsAt: limit.resetsAt,
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
|
+
const hasAnySevenDayWeeklyLimit =
|
|
71
|
+
modelWeeklyLimits['seven_day'] !== undefined ||
|
|
72
|
+
modelWeeklyLimits['seven_day_opus'] !== undefined ||
|
|
73
|
+
modelWeeklyLimits['seven_day_sonnet'] !== undefined;
|
|
74
|
+
if (
|
|
75
|
+
snapshot.sevenDayReset > 0 &&
|
|
76
|
+
!sevenDayExpired &&
|
|
77
|
+
!hasAnySevenDayWeeklyLimit
|
|
78
|
+
) {
|
|
79
|
+
modelWeeklyLimits['seven_day'] = {
|
|
80
|
+
rejected: sevenDayRejectionActive,
|
|
81
|
+
resetsAt: snapshot.sevenDayReset,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
70
84
|
return {
|
|
71
85
|
name,
|
|
72
86
|
token,
|
|
@@ -2570,6 +2570,89 @@ describe('StartPreparationUseCase', () => {
|
|
|
2570
2570
|
});
|
|
2571
2571
|
});
|
|
2572
2572
|
|
|
2573
|
+
it('should pick the soonest-7-day-reset token first even when existing Preparation issues exist (regression for issue 748)', async () => {
|
|
2574
|
+
const preparationIssues: Issue[] = Array.from({ length: 3 }, (_, i) =>
|
|
2575
|
+
createMockIssue({
|
|
2576
|
+
url: `https://github.com/user/repo/issues/${i + 1}`,
|
|
2577
|
+
title: `Preparing Issue ${i + 1}`,
|
|
2578
|
+
labels: [],
|
|
2579
|
+
status: 'Preparation',
|
|
2580
|
+
number: i + 1,
|
|
2581
|
+
itemId: `item-${i + 1}`,
|
|
2582
|
+
}),
|
|
2583
|
+
);
|
|
2584
|
+
const awaitingIssue = createMockIssue({
|
|
2585
|
+
url: 'https://github.com/user/repo/issues/100',
|
|
2586
|
+
title: 'Awaiting Issue',
|
|
2587
|
+
labels: ['category:impl'],
|
|
2588
|
+
status: 'Awaiting Workspace',
|
|
2589
|
+
number: 100,
|
|
2590
|
+
itemId: 'item-100',
|
|
2591
|
+
});
|
|
2592
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
2593
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
2594
|
+
createMockStoryObjectMap([...preparationIssues, awaitingIssue]),
|
|
2595
|
+
);
|
|
2596
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
2597
|
+
stdout: '',
|
|
2598
|
+
stderr: '',
|
|
2599
|
+
exitCode: 0,
|
|
2600
|
+
});
|
|
2601
|
+
const nowEpochSeconds = Math.floor(Date.now() / 1000);
|
|
2602
|
+
mockClaudeTokenUsageRepository.getAvailableTokenUsages.mockResolvedValue([
|
|
2603
|
+
{
|
|
2604
|
+
name: 'token-far-reset',
|
|
2605
|
+
token: 'token-far-reset',
|
|
2606
|
+
fiveHourUtilization: 0.1,
|
|
2607
|
+
sevenDayUtilization: 0.7,
|
|
2608
|
+
blocked: false,
|
|
2609
|
+
rejected: false,
|
|
2610
|
+
modelWeeklyLimits: {
|
|
2611
|
+
seven_day_opus: {
|
|
2612
|
+
rejected: false,
|
|
2613
|
+
resetsAt: nowEpochSeconds + 100 * 3600,
|
|
2614
|
+
},
|
|
2615
|
+
},
|
|
2616
|
+
},
|
|
2617
|
+
{
|
|
2618
|
+
name: 'token-soon-reset',
|
|
2619
|
+
token: 'token-soon-reset',
|
|
2620
|
+
fiveHourUtilization: 0.5,
|
|
2621
|
+
sevenDayUtilization: 0.2,
|
|
2622
|
+
blocked: false,
|
|
2623
|
+
rejected: false,
|
|
2624
|
+
modelWeeklyLimits: {
|
|
2625
|
+
seven_day_opus: {
|
|
2626
|
+
rejected: false,
|
|
2627
|
+
resetsAt: nowEpochSeconds + 20 * 3600,
|
|
2628
|
+
},
|
|
2629
|
+
},
|
|
2630
|
+
},
|
|
2631
|
+
]);
|
|
2632
|
+
|
|
2633
|
+
await useCase.run({
|
|
2634
|
+
projectUrl: 'https://github.com/user/repo',
|
|
2635
|
+
defaultAgentName: 'agent1',
|
|
2636
|
+
defaultLlmModelName: 'claude-opus',
|
|
2637
|
+
defaultLlmAgentName: null,
|
|
2638
|
+
configFilePath: '/path/to/config.yml',
|
|
2639
|
+
maximumPreparingIssuesCount: null,
|
|
2640
|
+
utilizationPercentageThreshold: 90,
|
|
2641
|
+
allowedIssueAuthors: null,
|
|
2642
|
+
codexHomeCandidates: null,
|
|
2643
|
+
allowIssueCacheMinutes: 0,
|
|
2644
|
+
labelsAsLlmAgentName: null,
|
|
2645
|
+
});
|
|
2646
|
+
|
|
2647
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
2648
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][2]).toEqual({
|
|
2649
|
+
env: {
|
|
2650
|
+
CLAUDE_CODE_OAUTH_TOKEN: 'token-soon-reset',
|
|
2651
|
+
ANTHROPIC_BASE_URL: 'http://127.0.0.1:8787',
|
|
2652
|
+
},
|
|
2653
|
+
});
|
|
2654
|
+
});
|
|
2655
|
+
|
|
2573
2656
|
it('should exclude blocked tokens from rotation', async () => {
|
|
2574
2657
|
const awaitingIssue = createMockIssue({
|
|
2575
2658
|
url: 'url1',
|
|
@@ -3713,6 +3796,182 @@ describe('StartPreparationUseCase', () => {
|
|
|
3713
3796
|
});
|
|
3714
3797
|
});
|
|
3715
3798
|
|
|
3799
|
+
it('should sort tokens by 7-day reset deadline ascending when only the generic seven_day weekly limit (as bridged by the proxy from the snapshot top-level sevenDayReset) is present', async () => {
|
|
3800
|
+
const awaitingIssues: Issue[] = [
|
|
3801
|
+
createMockIssue({
|
|
3802
|
+
url: 'url1',
|
|
3803
|
+
title: 'Issue 1',
|
|
3804
|
+
labels: ['category:impl'],
|
|
3805
|
+
status: 'Awaiting Workspace',
|
|
3806
|
+
number: 1,
|
|
3807
|
+
itemId: 'item-1',
|
|
3808
|
+
}),
|
|
3809
|
+
createMockIssue({
|
|
3810
|
+
url: 'url2',
|
|
3811
|
+
title: 'Issue 2',
|
|
3812
|
+
labels: ['category:impl'],
|
|
3813
|
+
status: 'Awaiting Workspace',
|
|
3814
|
+
number: 2,
|
|
3815
|
+
itemId: 'item-2',
|
|
3816
|
+
}),
|
|
3817
|
+
createMockIssue({
|
|
3818
|
+
url: 'url3',
|
|
3819
|
+
title: 'Issue 3',
|
|
3820
|
+
labels: ['category:impl'],
|
|
3821
|
+
status: 'Awaiting Workspace',
|
|
3822
|
+
number: 3,
|
|
3823
|
+
itemId: 'item-3',
|
|
3824
|
+
}),
|
|
3825
|
+
];
|
|
3826
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
3827
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
3828
|
+
createMockStoryObjectMap(awaitingIssues),
|
|
3829
|
+
);
|
|
3830
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
3831
|
+
stdout: '',
|
|
3832
|
+
stderr: '',
|
|
3833
|
+
exitCode: 0,
|
|
3834
|
+
});
|
|
3835
|
+
const nowEpochSeconds = Math.floor(Date.now() / 1000);
|
|
3836
|
+
mockClaudeTokenUsageRepository.getAvailableTokenUsages.mockResolvedValue([
|
|
3837
|
+
{
|
|
3838
|
+
name: 'token-7d-far',
|
|
3839
|
+
token: 'token-7d-far',
|
|
3840
|
+
fiveHourUtilization: 0.05,
|
|
3841
|
+
sevenDayUtilization: 0.1,
|
|
3842
|
+
blocked: false,
|
|
3843
|
+
rejected: false,
|
|
3844
|
+
modelWeeklyLimits: {
|
|
3845
|
+
seven_day: {
|
|
3846
|
+
rejected: false,
|
|
3847
|
+
resetsAt: nowEpochSeconds + 150 * 3600,
|
|
3848
|
+
},
|
|
3849
|
+
},
|
|
3850
|
+
},
|
|
3851
|
+
{
|
|
3852
|
+
name: 'token-7d-soon',
|
|
3853
|
+
token: 'token-7d-soon',
|
|
3854
|
+
fiveHourUtilization: 0.5,
|
|
3855
|
+
sevenDayUtilization: 0.1,
|
|
3856
|
+
blocked: false,
|
|
3857
|
+
rejected: false,
|
|
3858
|
+
modelWeeklyLimits: {
|
|
3859
|
+
seven_day: {
|
|
3860
|
+
rejected: false,
|
|
3861
|
+
resetsAt: nowEpochSeconds + 10 * 3600,
|
|
3862
|
+
},
|
|
3863
|
+
},
|
|
3864
|
+
},
|
|
3865
|
+
{
|
|
3866
|
+
name: 'token-7d-mid',
|
|
3867
|
+
token: 'token-7d-mid',
|
|
3868
|
+
fiveHourUtilization: 0.3,
|
|
3869
|
+
sevenDayUtilization: 0.1,
|
|
3870
|
+
blocked: false,
|
|
3871
|
+
rejected: false,
|
|
3872
|
+
modelWeeklyLimits: {
|
|
3873
|
+
seven_day: {
|
|
3874
|
+
rejected: false,
|
|
3875
|
+
resetsAt: nowEpochSeconds + 50 * 3600,
|
|
3876
|
+
},
|
|
3877
|
+
},
|
|
3878
|
+
},
|
|
3879
|
+
]);
|
|
3880
|
+
|
|
3881
|
+
await useCase.run({
|
|
3882
|
+
projectUrl: 'https://github.com/user/repo',
|
|
3883
|
+
defaultAgentName: 'agent1',
|
|
3884
|
+
defaultLlmModelName: 'claude-opus',
|
|
3885
|
+
defaultLlmAgentName: null,
|
|
3886
|
+
configFilePath: '/path/to/config.yml',
|
|
3887
|
+
maximumPreparingIssuesCount: null,
|
|
3888
|
+
utilizationPercentageThreshold: 90,
|
|
3889
|
+
allowedIssueAuthors: null,
|
|
3890
|
+
codexHomeCandidates: null,
|
|
3891
|
+
allowIssueCacheMinutes: 0,
|
|
3892
|
+
labelsAsLlmAgentName: null,
|
|
3893
|
+
});
|
|
3894
|
+
|
|
3895
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(3);
|
|
3896
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][2]).toMatchObject({
|
|
3897
|
+
env: { CLAUDE_CODE_OAUTH_TOKEN: 'token-7d-soon' },
|
|
3898
|
+
});
|
|
3899
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[1][2]).toMatchObject({
|
|
3900
|
+
env: { CLAUDE_CODE_OAUTH_TOKEN: 'token-7d-mid' },
|
|
3901
|
+
});
|
|
3902
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[2][2]).toMatchObject({
|
|
3903
|
+
env: { CLAUDE_CODE_OAUTH_TOKEN: 'token-7d-far' },
|
|
3904
|
+
});
|
|
3905
|
+
});
|
|
3906
|
+
|
|
3907
|
+
it('should fall back to 5-hour utilization ascending as tiebreaker when only the generic seven_day weekly limit (as bridged by the proxy) is present and deadlines tie', async () => {
|
|
3908
|
+
const awaitingIssue = createMockIssue({
|
|
3909
|
+
url: 'url1',
|
|
3910
|
+
title: 'Issue 1',
|
|
3911
|
+
labels: ['category:impl'],
|
|
3912
|
+
status: 'Awaiting Workspace',
|
|
3913
|
+
number: 1,
|
|
3914
|
+
itemId: 'item-1',
|
|
3915
|
+
});
|
|
3916
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
3917
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
3918
|
+
createMockStoryObjectMap([awaitingIssue]),
|
|
3919
|
+
);
|
|
3920
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
3921
|
+
stdout: '',
|
|
3922
|
+
stderr: '',
|
|
3923
|
+
exitCode: 0,
|
|
3924
|
+
});
|
|
3925
|
+
const nowEpochSeconds = Math.floor(Date.now() / 1000);
|
|
3926
|
+
const sharedResetsAt = nowEpochSeconds + 50 * 3600;
|
|
3927
|
+
mockClaudeTokenUsageRepository.getAvailableTokenUsages.mockResolvedValue([
|
|
3928
|
+
{
|
|
3929
|
+
name: 'token-busy-5h',
|
|
3930
|
+
token: 'token-busy-5h',
|
|
3931
|
+
fiveHourUtilization: 0.6,
|
|
3932
|
+
sevenDayUtilization: 0.1,
|
|
3933
|
+
blocked: false,
|
|
3934
|
+
rejected: false,
|
|
3935
|
+
modelWeeklyLimits: {
|
|
3936
|
+
seven_day: { rejected: false, resetsAt: sharedResetsAt },
|
|
3937
|
+
},
|
|
3938
|
+
},
|
|
3939
|
+
{
|
|
3940
|
+
name: 'token-idle-5h',
|
|
3941
|
+
token: 'token-idle-5h',
|
|
3942
|
+
fiveHourUtilization: 0.1,
|
|
3943
|
+
sevenDayUtilization: 0.1,
|
|
3944
|
+
blocked: false,
|
|
3945
|
+
rejected: false,
|
|
3946
|
+
modelWeeklyLimits: {
|
|
3947
|
+
seven_day: { rejected: false, resetsAt: sharedResetsAt },
|
|
3948
|
+
},
|
|
3949
|
+
},
|
|
3950
|
+
]);
|
|
3951
|
+
|
|
3952
|
+
await useCase.run({
|
|
3953
|
+
projectUrl: 'https://github.com/user/repo',
|
|
3954
|
+
defaultAgentName: 'agent1',
|
|
3955
|
+
defaultLlmModelName: 'claude-opus',
|
|
3956
|
+
defaultLlmAgentName: null,
|
|
3957
|
+
configFilePath: '/path/to/config.yml',
|
|
3958
|
+
maximumPreparingIssuesCount: null,
|
|
3959
|
+
utilizationPercentageThreshold: 90,
|
|
3960
|
+
allowedIssueAuthors: null,
|
|
3961
|
+
codexHomeCandidates: null,
|
|
3962
|
+
allowIssueCacheMinutes: 0,
|
|
3963
|
+
labelsAsLlmAgentName: null,
|
|
3964
|
+
});
|
|
3965
|
+
|
|
3966
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
3967
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][2]).toEqual({
|
|
3968
|
+
env: {
|
|
3969
|
+
CLAUDE_CODE_OAUTH_TOKEN: 'token-idle-5h',
|
|
3970
|
+
ANTHROPIC_BASE_URL: 'http://127.0.0.1:8787',
|
|
3971
|
+
},
|
|
3972
|
+
});
|
|
3973
|
+
});
|
|
3974
|
+
|
|
3716
3975
|
it('should fall back to 5-hour utilization ascending as tiebreaker when 7-day reset deadlines are identical', async () => {
|
|
3717
3976
|
const awaitingIssue = createMockIssue({
|
|
3718
3977
|
url: 'url1',
|
|
@@ -452,10 +452,7 @@ export class StartPreparationUseCase {
|
|
|
452
452
|
let spawnEnv: Record<string, string> | undefined;
|
|
453
453
|
if (rotationTokens !== null && proxyBaseUrl !== null) {
|
|
454
454
|
const selected =
|
|
455
|
-
rotationTokens[
|
|
456
|
-
(currentPreparationIssueCount + startedInThisRunCount) %
|
|
457
|
-
rotationTokens.length
|
|
458
|
-
];
|
|
455
|
+
rotationTokens[startedInThisRunCount % rotationTokens.length];
|
|
459
456
|
spawnEnv = {
|
|
460
457
|
CLAUDE_CODE_OAUTH_TOKEN: selected,
|
|
461
458
|
ANTHROPIC_BASE_URL: proxyBaseUrl,
|
|
@@ -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,
|
|
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,CA6E7D;IAEF,YAAY,QAAO,MAAM,CAAoC;CAC9D"}
|
|
@@ -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,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,
|
|
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,CAyPzD;CACH"}
|