github-issue-tower-defence-management 1.63.1 → 1.64.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.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -1
- package/bin/domain/usecases/StartPreparationUseCase.js +69 -28
- package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/usecases/StartPreparationUseCase.test.ts +210 -2
- package/src/domain/usecases/StartPreparationUseCase.ts +97 -42
- package/types/domain/usecases/StartPreparationUseCase.d.ts +3 -1
- package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.64.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.63.1...v1.64.0) (2026-05-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **core:** route spawn to a usable model per token using per-model 7d availability ([f3bdf07](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/f3bdf07dea62cf01b62647942cc8175604d6d826)), closes [#672](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/672)
|
|
7
|
+
|
|
1
8
|
## [1.63.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.63.0...v1.63.1) (2026-05-25)
|
|
2
9
|
|
|
3
10
|
|
package/README.md
CHANGED
|
@@ -213,7 +213,7 @@ When `claudeCodeOauthTokenListJsonPath` is set, `startDaemon` distributes prepar
|
|
|
213
213
|
|
|
214
214
|
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.
|
|
215
215
|
|
|
216
|
-
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; a 7-day-window rejection is cleared once the 7-day reset has passed; 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
|
|
216
|
+
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; a 7-day-window rejection is cleared once the 7-day reset has passed; 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` or whose remaining (non-expired) rejection is still active are excluded. Tokens are also excluded when all candidate model-specific weekly limits are exhausted or the general `seven_day` limit is rejected; however, when only the default model's weekly limit is rejected (e.g., `seven_day_sonnet`), the token remains in rotation and is spawned with a fallback model whose limit is still available (e.g., `seven_day_opus`). 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 tokens are sorted by 5-hour utilization ascending. Each available token receives up to six concurrent preparation slots through 80% 5-hour utilization; above 80%, its slot count decays exponentially; at 95% or higher, its slot count is 0. The first token (lowest utilization) is selected for the next spawn, then the next, weighted round-robin by remaining slots, for the duration of the run. The effective preparation limit is the sum of available token slots; a lower explicit `maximumPreparingIssuesCount` remains honored. When a token list is configured but no token has remaining slots, preparation is skipped for that run. The selected token, the selected model (which may differ from the default when a fallback model was chosen), and the proxy URL (`http://127.0.0.1:8787`) are passed to the child `aw` process as `CLAUDE_CODE_OAUTH_TOKEN`, the model argument, and `ANTHROPIC_BASE_URL` environment variables. The child inherits the parent process's environment, so no further wiring is required inside `aw`.
|
|
217
217
|
|
|
218
218
|
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.
|
|
219
219
|
|
|
@@ -12,6 +12,10 @@ class StartPreparationUseCase {
|
|
|
12
12
|
this.issueRepository = issueRepository;
|
|
13
13
|
this.localCommandRunner = localCommandRunner;
|
|
14
14
|
this.claudeTokenUsageRepository = claudeTokenUsageRepository;
|
|
15
|
+
this.KNOWN_MODEL_SPECIFIC_LIMIT_TYPES = [
|
|
16
|
+
'seven_day_sonnet',
|
|
17
|
+
'seven_day_opus',
|
|
18
|
+
];
|
|
15
19
|
this.weeklyLimitTypeForModel = (modelName) => {
|
|
16
20
|
const normalized = (modelName ?? '').toLowerCase();
|
|
17
21
|
if (normalized.includes('sonnet'))
|
|
@@ -20,12 +24,38 @@ class StartPreparationUseCase {
|
|
|
20
24
|
return 'seven_day_opus';
|
|
21
25
|
return 'seven_day';
|
|
22
26
|
};
|
|
23
|
-
this.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
this.deriveFallbackModelName = (limitType, defaultModelName) => {
|
|
28
|
+
if (limitType === this.weeklyLimitTypeForModel(defaultModelName)) {
|
|
29
|
+
return defaultModelName;
|
|
30
|
+
}
|
|
31
|
+
if (limitType === 'seven_day_opus' &&
|
|
32
|
+
defaultModelName.toLowerCase().includes('sonnet')) {
|
|
33
|
+
return defaultModelName.replace(/sonnet/gi, 'opus');
|
|
34
|
+
}
|
|
35
|
+
if (limitType === 'seven_day_sonnet' &&
|
|
36
|
+
defaultModelName.toLowerCase().includes('opus')) {
|
|
37
|
+
return defaultModelName.replace(/opus/gi, 'sonnet');
|
|
38
|
+
}
|
|
39
|
+
return defaultModelName;
|
|
40
|
+
};
|
|
41
|
+
this.selectModelForToken = (usage, defaultModelName) => {
|
|
42
|
+
const generalLimit = usage.modelWeeklyLimits['seven_day'];
|
|
43
|
+
if (generalLimit !== undefined && generalLimit.rejected)
|
|
44
|
+
return null;
|
|
45
|
+
if (defaultModelName === null)
|
|
46
|
+
return null;
|
|
47
|
+
const defaultLimitType = this.weeklyLimitTypeForModel(defaultModelName);
|
|
48
|
+
const candidateLimitTypes = [
|
|
49
|
+
defaultLimitType,
|
|
50
|
+
...this.KNOWN_MODEL_SPECIFIC_LIMIT_TYPES.filter((t) => t !== defaultLimitType),
|
|
51
|
+
];
|
|
52
|
+
for (const limitType of candidateLimitTypes) {
|
|
53
|
+
const limit = usage.modelWeeklyLimits[limitType];
|
|
54
|
+
if (limit === undefined || !limit.rejected) {
|
|
55
|
+
return this.deriveFallbackModelName(limitType, defaultModelName);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
29
59
|
};
|
|
30
60
|
this.maximumPreparingProcessCountForToken = (fiveHourUtilization) => {
|
|
31
61
|
if (fiveHourUtilization <= PROCESS_COUNT_DECAY_START_UTILIZATION) {
|
|
@@ -43,20 +73,27 @@ class StartPreparationUseCase {
|
|
|
43
73
|
return Math.max(1, Math.floor(MAXIMUM_PREPARING_PROCESS_COUNT_PER_TOKEN * remainingRatio));
|
|
44
74
|
};
|
|
45
75
|
this.selectRotationTokens = (tokenUsages, modelName) => {
|
|
46
|
-
const weeklyLimitType = this.weeklyLimitTypeForModel(modelName);
|
|
47
76
|
return tokenUsages
|
|
48
77
|
.filter((usage) => !usage.blocked)
|
|
49
78
|
.filter((usage) => !usage.rejected)
|
|
50
|
-
.
|
|
51
|
-
.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
79
|
+
.flatMap((usage) => {
|
|
80
|
+
const selectedModel = this.selectModelForToken(usage, modelName);
|
|
81
|
+
if (selectedModel === null)
|
|
82
|
+
return [];
|
|
83
|
+
return [
|
|
84
|
+
{
|
|
85
|
+
token: usage.token,
|
|
86
|
+
model: selectedModel,
|
|
87
|
+
fiveHourUtilization: usage.fiveHourUtilization,
|
|
88
|
+
maximumPreparingProcessCount: this.maximumPreparingProcessCountForToken(usage.fiveHourUtilization),
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
})
|
|
56
92
|
.filter((usage) => usage.maximumPreparingProcessCount > 0)
|
|
57
93
|
.sort((a, b) => a.fiveHourUtilization - b.fiveHourUtilization)
|
|
58
94
|
.map((usage) => ({
|
|
59
95
|
token: usage.token,
|
|
96
|
+
model: usage.model,
|
|
60
97
|
maximumPreparingProcessCount: usage.maximumPreparingProcessCount,
|
|
61
98
|
}));
|
|
62
99
|
};
|
|
@@ -66,7 +103,7 @@ class StartPreparationUseCase {
|
|
|
66
103
|
for (let i = 0; i < slotCount; i++) {
|
|
67
104
|
tokenSlots.push(...rotationTokens
|
|
68
105
|
.filter((token) => i < token.maximumPreparingProcessCount)
|
|
69
|
-
.map((token) => token.token));
|
|
106
|
+
.map((token) => ({ token: token.token, model: token.model })));
|
|
70
107
|
}
|
|
71
108
|
return tokenSlots;
|
|
72
109
|
};
|
|
@@ -78,10 +115,12 @@ class StartPreparationUseCase {
|
|
|
78
115
|
};
|
|
79
116
|
this.buildRotationOrder = (tokenUsages, utilizationPercentageThreshold, modelName) => {
|
|
80
117
|
const weeklyLimitType = this.weeklyLimitTypeForModel(modelName);
|
|
118
|
+
const isWeeklyLimitRejected = (usage) => usage.modelWeeklyLimits[weeklyLimitType]?.rejected === true ||
|
|
119
|
+
usage.modelWeeklyLimits['seven_day']?.rejected === true;
|
|
81
120
|
const selectedTokens = tokenUsages
|
|
82
121
|
.filter((usage) => !usage.blocked)
|
|
83
122
|
.filter((usage) => !usage.rejected)
|
|
84
|
-
.filter((usage) => !
|
|
123
|
+
.filter((usage) => !isWeeklyLimitRejected(usage))
|
|
85
124
|
.filter((usage) => this.maximumPreparingProcessCountForToken(usage.fiveHourUtilization) >
|
|
86
125
|
0)
|
|
87
126
|
.sort((a, b) => a.fiveHourUtilization - b.fiveHourUtilization);
|
|
@@ -95,7 +134,7 @@ class StartPreparationUseCase {
|
|
|
95
134
|
rejected: usage.rejected,
|
|
96
135
|
thresholdExcluded: !usage.blocked &&
|
|
97
136
|
!usage.rejected &&
|
|
98
|
-
!
|
|
137
|
+
!isWeeklyLimitRejected(usage) &&
|
|
99
138
|
this.maximumPreparingProcessCountForToken(usage.fiveHourUtilization) === 0,
|
|
100
139
|
}));
|
|
101
140
|
const selectedEntries = selectedTokens.map((usage) => ({
|
|
@@ -117,7 +156,7 @@ class StartPreparationUseCase {
|
|
|
117
156
|
if (tokenUsages.length > 0) {
|
|
118
157
|
const ranked = this.selectRotationTokens(tokenUsages, params.defaultLlmModelName);
|
|
119
158
|
if (ranked.length === 0) {
|
|
120
|
-
console.warn(`All ${tokenUsages.length} configured Claude OAuth token(s) are unavailable (blocked, rejected,
|
|
159
|
+
console.warn(`All ${tokenUsages.length} configured Claude OAuth token(s) are unavailable (blocked, rejected, all model weekly limits exhausted, or 5h utilization >= 95%). Skipping starting preparation.`);
|
|
121
160
|
return { rotationOrder };
|
|
122
161
|
}
|
|
123
162
|
await this.claudeTokenUsageRepository.ensureObservable();
|
|
@@ -174,7 +213,7 @@ class StartPreparationUseCase {
|
|
|
174
213
|
.find((label) => label.startsWith('llm-model:'))
|
|
175
214
|
?.replace('llm-model:', '')
|
|
176
215
|
.trim() || params.defaultLlmModelName;
|
|
177
|
-
if (!model) {
|
|
216
|
+
if (!model && rotationTokenSlots === null) {
|
|
178
217
|
console.error(`No LLM model configured for issue ${issue.url}. Provide --defaultLlmModelName or add an llm-model: label.`);
|
|
179
218
|
continue;
|
|
180
219
|
}
|
|
@@ -230,10 +269,21 @@ class StartPreparationUseCase {
|
|
|
230
269
|
}
|
|
231
270
|
await this.issueRepository.updateStatus(project, issue, preparationStatusOption.id);
|
|
232
271
|
issue.status = WorkflowStatus_1.PREPARATION_STATUS_NAME;
|
|
272
|
+
let spawnEnv;
|
|
273
|
+
let spawnModel = model ?? '';
|
|
274
|
+
if (rotationTokenSlots !== null && proxyBaseUrl !== null) {
|
|
275
|
+
const selected = rotationTokenSlots[(currentPreparationIssueCount + startedInThisRunCount) %
|
|
276
|
+
rotationTokenSlots.length];
|
|
277
|
+
spawnModel = selected.model;
|
|
278
|
+
spawnEnv = {
|
|
279
|
+
CLAUDE_CODE_OAUTH_TOKEN: selected.token,
|
|
280
|
+
ANTHROPIC_BASE_URL: proxyBaseUrl,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
233
283
|
const awArgs = [
|
|
234
284
|
issue.url,
|
|
235
285
|
agent,
|
|
236
|
-
|
|
286
|
+
spawnModel,
|
|
237
287
|
'--configFilePath',
|
|
238
288
|
params.configFilePath,
|
|
239
289
|
'--branch',
|
|
@@ -244,15 +294,6 @@ class StartPreparationUseCase {
|
|
|
244
294
|
const codexHome = params.codexHomeCandidates[startedInThisRunCount % params.codexHomeCandidates.length];
|
|
245
295
|
awArgs.push('--codexHome', codexHome);
|
|
246
296
|
}
|
|
247
|
-
let spawnEnv;
|
|
248
|
-
if (rotationTokenSlots !== null && proxyBaseUrl !== null) {
|
|
249
|
-
const selected = rotationTokenSlots[(currentPreparationIssueCount + startedInThisRunCount) %
|
|
250
|
-
rotationTokenSlots.length];
|
|
251
|
-
spawnEnv = {
|
|
252
|
-
CLAUDE_CODE_OAUTH_TOKEN: selected,
|
|
253
|
-
ANTHROPIC_BASE_URL: proxyBaseUrl,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
297
|
await this.localCommandRunner.runCommand('aw', awArgs, spawnEnv ? { env: spawnEnv } : undefined);
|
|
257
298
|
startedInThisRunCount++;
|
|
258
299
|
updatedCurrentPreparationIssueCount++;
|
|
@@ -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
|
@@ -3148,7 +3148,7 @@ describe('StartPreparationUseCase', () => {
|
|
|
3148
3148
|
expect(mockLocalCommandRunner.runCommand.mock.calls[0][2]).toBeUndefined();
|
|
3149
3149
|
});
|
|
3150
3150
|
|
|
3151
|
-
it('should
|
|
3151
|
+
it('should keep a token in rotation with opus model when seven_day_sonnet is rejected and seven_day_opus is available', async () => {
|
|
3152
3152
|
const awaitingIssue = createMockIssue({
|
|
3153
3153
|
url: 'url1',
|
|
3154
3154
|
title: 'Issue 1',
|
|
@@ -3204,10 +3204,13 @@ describe('StartPreparationUseCase', () => {
|
|
|
3204
3204
|
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
3205
3205
|
expect(mockLocalCommandRunner.runCommand.mock.calls[0][2]).toEqual({
|
|
3206
3206
|
env: {
|
|
3207
|
-
CLAUDE_CODE_OAUTH_TOKEN: 'token-
|
|
3207
|
+
CLAUDE_CODE_OAUTH_TOKEN: 'token-sonnet-exhausted',
|
|
3208
3208
|
ANTHROPIC_BASE_URL: 'http://127.0.0.1:8787',
|
|
3209
3209
|
},
|
|
3210
3210
|
});
|
|
3211
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][1][2]).toBe(
|
|
3212
|
+
'claude-opus-4-6',
|
|
3213
|
+
);
|
|
3211
3214
|
});
|
|
3212
3215
|
|
|
3213
3216
|
it('should re-admit a token whose seven_day_sonnet rejection has been cleared by stale-reset expiry', async () => {
|
|
@@ -3395,6 +3398,211 @@ describe('StartPreparationUseCase', () => {
|
|
|
3395
3398
|
},
|
|
3396
3399
|
});
|
|
3397
3400
|
});
|
|
3401
|
+
|
|
3402
|
+
it('should include a token in rotation with opus model when seven_day_sonnet is rejected but seven_day_opus is available', async () => {
|
|
3403
|
+
const awaitingIssue = createMockIssue({
|
|
3404
|
+
url: 'url1',
|
|
3405
|
+
title: 'Issue 1',
|
|
3406
|
+
labels: ['category:impl'],
|
|
3407
|
+
status: 'Awaiting Workspace',
|
|
3408
|
+
number: 1,
|
|
3409
|
+
itemId: 'item-1',
|
|
3410
|
+
});
|
|
3411
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
3412
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
3413
|
+
createMockStoryObjectMap([awaitingIssue]),
|
|
3414
|
+
);
|
|
3415
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
3416
|
+
stdout: '',
|
|
3417
|
+
stderr: '',
|
|
3418
|
+
exitCode: 0,
|
|
3419
|
+
});
|
|
3420
|
+
const futureReset = Math.floor(Date.now() / 1000) + 3600;
|
|
3421
|
+
mockClaudeTokenUsageRepository.getAvailableTokenUsages.mockResolvedValue([
|
|
3422
|
+
{
|
|
3423
|
+
token: 'token-sonnet-exhausted',
|
|
3424
|
+
fiveHourUtilization: 0.1,
|
|
3425
|
+
blocked: false,
|
|
3426
|
+
rejected: false,
|
|
3427
|
+
modelWeeklyLimits: {
|
|
3428
|
+
seven_day_sonnet: { rejected: true, resetsAt: futureReset },
|
|
3429
|
+
},
|
|
3430
|
+
},
|
|
3431
|
+
]);
|
|
3432
|
+
|
|
3433
|
+
await useCase.run({
|
|
3434
|
+
projectUrl: 'https://github.com/user/repo',
|
|
3435
|
+
defaultAgentName: 'agent1',
|
|
3436
|
+
defaultLlmModelName: 'claude-sonnet-4-6',
|
|
3437
|
+
defaultLlmAgentName: null,
|
|
3438
|
+
configFilePath: '/path/to/config.yml',
|
|
3439
|
+
maximumPreparingIssuesCount: null,
|
|
3440
|
+
utilizationPercentageThreshold: 90,
|
|
3441
|
+
allowedIssueAuthors: null,
|
|
3442
|
+
codexHomeCandidates: null,
|
|
3443
|
+
allowIssueCacheMinutes: 0,
|
|
3444
|
+
});
|
|
3445
|
+
|
|
3446
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
3447
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][1][2]).toBe(
|
|
3448
|
+
'claude-opus-4-6',
|
|
3449
|
+
);
|
|
3450
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][2]).toEqual({
|
|
3451
|
+
env: {
|
|
3452
|
+
CLAUDE_CODE_OAUTH_TOKEN: 'token-sonnet-exhausted',
|
|
3453
|
+
ANTHROPIC_BASE_URL: 'http://127.0.0.1:8787',
|
|
3454
|
+
},
|
|
3455
|
+
});
|
|
3456
|
+
});
|
|
3457
|
+
|
|
3458
|
+
it('should exclude a token from rotation when both seven_day_sonnet and seven_day_opus weekly limits are rejected', async () => {
|
|
3459
|
+
const awaitingIssue = createMockIssue({
|
|
3460
|
+
url: 'url1',
|
|
3461
|
+
title: 'Issue 1',
|
|
3462
|
+
labels: ['category:impl'],
|
|
3463
|
+
status: 'Awaiting Workspace',
|
|
3464
|
+
number: 1,
|
|
3465
|
+
itemId: 'item-1',
|
|
3466
|
+
});
|
|
3467
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
3468
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
3469
|
+
createMockStoryObjectMap([awaitingIssue]),
|
|
3470
|
+
);
|
|
3471
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
3472
|
+
stdout: '',
|
|
3473
|
+
stderr: '',
|
|
3474
|
+
exitCode: 0,
|
|
3475
|
+
});
|
|
3476
|
+
const futureReset = Math.floor(Date.now() / 1000) + 3600;
|
|
3477
|
+
mockClaudeTokenUsageRepository.getAvailableTokenUsages.mockResolvedValue([
|
|
3478
|
+
{
|
|
3479
|
+
token: 'token-all-exhausted',
|
|
3480
|
+
fiveHourUtilization: 0.1,
|
|
3481
|
+
blocked: false,
|
|
3482
|
+
rejected: false,
|
|
3483
|
+
modelWeeklyLimits: {
|
|
3484
|
+
seven_day_sonnet: { rejected: true, resetsAt: futureReset },
|
|
3485
|
+
seven_day_opus: { rejected: true, resetsAt: futureReset },
|
|
3486
|
+
},
|
|
3487
|
+
},
|
|
3488
|
+
]);
|
|
3489
|
+
|
|
3490
|
+
await useCase.run({
|
|
3491
|
+
projectUrl: 'https://github.com/user/repo',
|
|
3492
|
+
defaultAgentName: 'agent1',
|
|
3493
|
+
defaultLlmModelName: 'claude-sonnet-4-6',
|
|
3494
|
+
defaultLlmAgentName: null,
|
|
3495
|
+
configFilePath: '/path/to/config.yml',
|
|
3496
|
+
maximumPreparingIssuesCount: null,
|
|
3497
|
+
utilizationPercentageThreshold: 90,
|
|
3498
|
+
allowedIssueAuthors: null,
|
|
3499
|
+
codexHomeCandidates: null,
|
|
3500
|
+
allowIssueCacheMinutes: 0,
|
|
3501
|
+
});
|
|
3502
|
+
|
|
3503
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
|
|
3504
|
+
});
|
|
3505
|
+
|
|
3506
|
+
it('should use default model for a token with no modelWeeklyLimits entries', async () => {
|
|
3507
|
+
const awaitingIssue = createMockIssue({
|
|
3508
|
+
url: 'url1',
|
|
3509
|
+
title: 'Issue 1',
|
|
3510
|
+
labels: ['category:impl'],
|
|
3511
|
+
status: 'Awaiting Workspace',
|
|
3512
|
+
number: 1,
|
|
3513
|
+
itemId: 'item-1',
|
|
3514
|
+
});
|
|
3515
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
3516
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
3517
|
+
createMockStoryObjectMap([awaitingIssue]),
|
|
3518
|
+
);
|
|
3519
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
3520
|
+
stdout: '',
|
|
3521
|
+
stderr: '',
|
|
3522
|
+
exitCode: 0,
|
|
3523
|
+
});
|
|
3524
|
+
mockClaudeTokenUsageRepository.getAvailableTokenUsages.mockResolvedValue([
|
|
3525
|
+
{
|
|
3526
|
+
token: 'token-no-limits',
|
|
3527
|
+
fiveHourUtilization: 0.1,
|
|
3528
|
+
blocked: false,
|
|
3529
|
+
rejected: false,
|
|
3530
|
+
modelWeeklyLimits: {},
|
|
3531
|
+
},
|
|
3532
|
+
]);
|
|
3533
|
+
|
|
3534
|
+
await useCase.run({
|
|
3535
|
+
projectUrl: 'https://github.com/user/repo',
|
|
3536
|
+
defaultAgentName: 'agent1',
|
|
3537
|
+
defaultLlmModelName: 'claude-sonnet-4-6',
|
|
3538
|
+
defaultLlmAgentName: null,
|
|
3539
|
+
configFilePath: '/path/to/config.yml',
|
|
3540
|
+
maximumPreparingIssuesCount: null,
|
|
3541
|
+
utilizationPercentageThreshold: 90,
|
|
3542
|
+
allowedIssueAuthors: null,
|
|
3543
|
+
codexHomeCandidates: null,
|
|
3544
|
+
allowIssueCacheMinutes: 0,
|
|
3545
|
+
});
|
|
3546
|
+
|
|
3547
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(1);
|
|
3548
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][1][2]).toBe(
|
|
3549
|
+
'claude-sonnet-4-6',
|
|
3550
|
+
);
|
|
3551
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls[0][2]).toEqual({
|
|
3552
|
+
env: {
|
|
3553
|
+
CLAUDE_CODE_OAUTH_TOKEN: 'token-no-limits',
|
|
3554
|
+
ANTHROPIC_BASE_URL: 'http://127.0.0.1:8787',
|
|
3555
|
+
},
|
|
3556
|
+
});
|
|
3557
|
+
});
|
|
3558
|
+
|
|
3559
|
+
it('should exclude a token when seven_day general limit is rejected even if per-model limits are available', async () => {
|
|
3560
|
+
const awaitingIssue = createMockIssue({
|
|
3561
|
+
url: 'url1',
|
|
3562
|
+
title: 'Issue 1',
|
|
3563
|
+
labels: ['category:impl'],
|
|
3564
|
+
status: 'Awaiting Workspace',
|
|
3565
|
+
number: 1,
|
|
3566
|
+
itemId: 'item-1',
|
|
3567
|
+
});
|
|
3568
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
3569
|
+
mockIssueRepository.getStoryObjectMap.mockResolvedValue(
|
|
3570
|
+
createMockStoryObjectMap([awaitingIssue]),
|
|
3571
|
+
);
|
|
3572
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
3573
|
+
stdout: '',
|
|
3574
|
+
stderr: '',
|
|
3575
|
+
exitCode: 0,
|
|
3576
|
+
});
|
|
3577
|
+
const futureReset = Math.floor(Date.now() / 1000) + 3600;
|
|
3578
|
+
mockClaudeTokenUsageRepository.getAvailableTokenUsages.mockResolvedValue([
|
|
3579
|
+
{
|
|
3580
|
+
token: 'token-general-limit-rejected',
|
|
3581
|
+
fiveHourUtilization: 0.1,
|
|
3582
|
+
blocked: false,
|
|
3583
|
+
rejected: false,
|
|
3584
|
+
modelWeeklyLimits: {
|
|
3585
|
+
seven_day: { rejected: true, resetsAt: futureReset },
|
|
3586
|
+
seven_day_sonnet: { rejected: false, resetsAt: futureReset },
|
|
3587
|
+
},
|
|
3588
|
+
},
|
|
3589
|
+
]);
|
|
3590
|
+
|
|
3591
|
+
await useCase.run({
|
|
3592
|
+
projectUrl: 'https://github.com/user/repo',
|
|
3593
|
+
defaultAgentName: 'agent1',
|
|
3594
|
+
defaultLlmModelName: 'claude-sonnet-4-6',
|
|
3595
|
+
defaultLlmAgentName: null,
|
|
3596
|
+
configFilePath: '/path/to/config.yml',
|
|
3597
|
+
maximumPreparingIssuesCount: null,
|
|
3598
|
+
utilizationPercentageThreshold: 90,
|
|
3599
|
+
allowedIssueAuthors: null,
|
|
3600
|
+
codexHomeCandidates: null,
|
|
3601
|
+
allowIssueCacheMinutes: 0,
|
|
3602
|
+
});
|
|
3603
|
+
|
|
3604
|
+
expect(mockLocalCommandRunner.runCommand.mock.calls).toHaveLength(0);
|
|
3605
|
+
});
|
|
3398
3606
|
});
|
|
3399
3607
|
|
|
3400
3608
|
describe('StartPreparationUseCase.buildRotationOrder', () => {
|
|
@@ -15,6 +15,7 @@ const PROCESS_COUNT_DECAY_STEEPNESS = 2;
|
|
|
15
15
|
|
|
16
16
|
type RotationToken = {
|
|
17
17
|
token: string;
|
|
18
|
+
model: string;
|
|
18
19
|
maximumPreparingProcessCount: number;
|
|
19
20
|
};
|
|
20
21
|
|
|
@@ -43,6 +44,11 @@ export class StartPreparationUseCase {
|
|
|
43
44
|
private readonly claudeTokenUsageRepository: ClaudeTokenUsageRepository,
|
|
44
45
|
) {}
|
|
45
46
|
|
|
47
|
+
private readonly KNOWN_MODEL_SPECIFIC_LIMIT_TYPES = [
|
|
48
|
+
'seven_day_sonnet',
|
|
49
|
+
'seven_day_opus',
|
|
50
|
+
];
|
|
51
|
+
|
|
46
52
|
private weeklyLimitTypeForModel = (modelName: string | null): string => {
|
|
47
53
|
const normalized = (modelName ?? '').toLowerCase();
|
|
48
54
|
if (normalized.includes('sonnet')) return 'seven_day_sonnet';
|
|
@@ -50,14 +56,53 @@ export class StartPreparationUseCase {
|
|
|
50
56
|
return 'seven_day';
|
|
51
57
|
};
|
|
52
58
|
|
|
53
|
-
private
|
|
59
|
+
private deriveFallbackModelName = (
|
|
60
|
+
limitType: string,
|
|
61
|
+
defaultModelName: string,
|
|
62
|
+
): string => {
|
|
63
|
+
if (limitType === this.weeklyLimitTypeForModel(defaultModelName)) {
|
|
64
|
+
return defaultModelName;
|
|
65
|
+
}
|
|
66
|
+
if (
|
|
67
|
+
limitType === 'seven_day_opus' &&
|
|
68
|
+
defaultModelName.toLowerCase().includes('sonnet')
|
|
69
|
+
) {
|
|
70
|
+
return defaultModelName.replace(/sonnet/gi, 'opus');
|
|
71
|
+
}
|
|
72
|
+
if (
|
|
73
|
+
limitType === 'seven_day_sonnet' &&
|
|
74
|
+
defaultModelName.toLowerCase().includes('opus')
|
|
75
|
+
) {
|
|
76
|
+
return defaultModelName.replace(/opus/gi, 'sonnet');
|
|
77
|
+
}
|
|
78
|
+
return defaultModelName;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
private selectModelForToken = (
|
|
54
82
|
usage: ClaudeTokenUsage,
|
|
55
|
-
|
|
56
|
-
):
|
|
57
|
-
const
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
|
|
83
|
+
defaultModelName: string | null,
|
|
84
|
+
): string | null => {
|
|
85
|
+
const generalLimit = usage.modelWeeklyLimits['seven_day'];
|
|
86
|
+
if (generalLimit !== undefined && generalLimit.rejected) return null;
|
|
87
|
+
|
|
88
|
+
if (defaultModelName === null) return null;
|
|
89
|
+
|
|
90
|
+
const defaultLimitType = this.weeklyLimitTypeForModel(defaultModelName);
|
|
91
|
+
const candidateLimitTypes = [
|
|
92
|
+
defaultLimitType,
|
|
93
|
+
...this.KNOWN_MODEL_SPECIFIC_LIMIT_TYPES.filter(
|
|
94
|
+
(t) => t !== defaultLimitType,
|
|
95
|
+
),
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
for (const limitType of candidateLimitTypes) {
|
|
99
|
+
const limit = usage.modelWeeklyLimits[limitType];
|
|
100
|
+
if (limit === undefined || !limit.rejected) {
|
|
101
|
+
return this.deriveFallbackModelName(limitType, defaultModelName);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return null;
|
|
61
106
|
};
|
|
62
107
|
|
|
63
108
|
private maximumPreparingProcessCountForToken = (
|
|
@@ -87,40 +132,45 @@ export class StartPreparationUseCase {
|
|
|
87
132
|
tokenUsages: ClaudeTokenUsage[],
|
|
88
133
|
modelName: string | null,
|
|
89
134
|
): RotationToken[] => {
|
|
90
|
-
const weeklyLimitType = this.weeklyLimitTypeForModel(modelName);
|
|
91
135
|
return tokenUsages
|
|
92
136
|
.filter((usage) => !usage.blocked)
|
|
93
137
|
.filter((usage) => !usage.rejected)
|
|
94
|
-
.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
138
|
+
.flatMap((usage) => {
|
|
139
|
+
const selectedModel = this.selectModelForToken(usage, modelName);
|
|
140
|
+
if (selectedModel === null) return [];
|
|
141
|
+
return [
|
|
142
|
+
{
|
|
143
|
+
token: usage.token,
|
|
144
|
+
model: selectedModel,
|
|
145
|
+
fiveHourUtilization: usage.fiveHourUtilization,
|
|
146
|
+
maximumPreparingProcessCount:
|
|
147
|
+
this.maximumPreparingProcessCountForToken(
|
|
148
|
+
usage.fiveHourUtilization,
|
|
149
|
+
),
|
|
150
|
+
},
|
|
151
|
+
];
|
|
152
|
+
})
|
|
104
153
|
.filter((usage) => usage.maximumPreparingProcessCount > 0)
|
|
105
154
|
.sort((a, b) => a.fiveHourUtilization - b.fiveHourUtilization)
|
|
106
155
|
.map((usage) => ({
|
|
107
156
|
token: usage.token,
|
|
157
|
+
model: usage.model,
|
|
108
158
|
maximumPreparingProcessCount: usage.maximumPreparingProcessCount,
|
|
109
159
|
}));
|
|
110
160
|
};
|
|
111
161
|
|
|
112
162
|
private createRotationTokenSlots = (
|
|
113
163
|
rotationTokens: RotationToken[],
|
|
114
|
-
): string
|
|
164
|
+
): Array<{ token: string; model: string }> => {
|
|
115
165
|
const slotCount = Math.max(
|
|
116
166
|
...rotationTokens.map((token) => token.maximumPreparingProcessCount),
|
|
117
167
|
);
|
|
118
|
-
const tokenSlots: string
|
|
168
|
+
const tokenSlots: Array<{ token: string; model: string }> = [];
|
|
119
169
|
for (let i = 0; i < slotCount; i++) {
|
|
120
170
|
tokenSlots.push(
|
|
121
171
|
...rotationTokens
|
|
122
172
|
.filter((token) => i < token.maximumPreparingProcessCount)
|
|
123
|
-
.map((token) => token.token),
|
|
173
|
+
.map((token) => ({ token: token.token, model: token.model })),
|
|
124
174
|
);
|
|
125
175
|
}
|
|
126
176
|
return tokenSlots;
|
|
@@ -128,7 +178,7 @@ export class StartPreparationUseCase {
|
|
|
128
178
|
|
|
129
179
|
private resolveMaximumPreparingIssuesCount = (
|
|
130
180
|
configuredMaximumPreparingIssuesCount: number | null,
|
|
131
|
-
rotationTokenSlots: string
|
|
181
|
+
rotationTokenSlots: Array<{ token: string; model: string }> | null,
|
|
132
182
|
): number => {
|
|
133
183
|
if (rotationTokenSlots === null) {
|
|
134
184
|
return configuredMaximumPreparingIssuesCount ?? 6;
|
|
@@ -145,12 +195,13 @@ export class StartPreparationUseCase {
|
|
|
145
195
|
modelName: string | null,
|
|
146
196
|
): RotationOrderEntry[] => {
|
|
147
197
|
const weeklyLimitType = this.weeklyLimitTypeForModel(modelName);
|
|
198
|
+
const isWeeklyLimitRejected = (usage: ClaudeTokenUsage): boolean =>
|
|
199
|
+
usage.modelWeeklyLimits[weeklyLimitType]?.rejected === true ||
|
|
200
|
+
usage.modelWeeklyLimits['seven_day']?.rejected === true;
|
|
148
201
|
const selectedTokens = tokenUsages
|
|
149
202
|
.filter((usage) => !usage.blocked)
|
|
150
203
|
.filter((usage) => !usage.rejected)
|
|
151
|
-
.filter(
|
|
152
|
-
(usage) => !this.isModelWeeklyLimitRejected(usage, weeklyLimitType),
|
|
153
|
-
)
|
|
204
|
+
.filter((usage) => !isWeeklyLimitRejected(usage))
|
|
154
205
|
.filter(
|
|
155
206
|
(usage) =>
|
|
156
207
|
this.maximumPreparingProcessCountForToken(usage.fiveHourUtilization) >
|
|
@@ -168,7 +219,7 @@ export class StartPreparationUseCase {
|
|
|
168
219
|
thresholdExcluded:
|
|
169
220
|
!usage.blocked &&
|
|
170
221
|
!usage.rejected &&
|
|
171
|
-
!
|
|
222
|
+
!isWeeklyLimitRejected(usage) &&
|
|
172
223
|
this.maximumPreparingProcessCountForToken(
|
|
173
224
|
usage.fiveHourUtilization,
|
|
174
225
|
) === 0,
|
|
@@ -199,7 +250,8 @@ export class StartPreparationUseCase {
|
|
|
199
250
|
}): Promise<{ rotationOrder: RotationOrderEntry[] | null }> => {
|
|
200
251
|
const tokenUsages =
|
|
201
252
|
await this.claudeTokenUsageRepository.getAvailableTokenUsages();
|
|
202
|
-
let rotationTokenSlots: string
|
|
253
|
+
let rotationTokenSlots: Array<{ token: string; model: string }> | null =
|
|
254
|
+
null;
|
|
203
255
|
let proxyBaseUrl: string | null = null;
|
|
204
256
|
const rotationOrder: RotationOrderEntry[] | null =
|
|
205
257
|
tokenUsages.length > 0
|
|
@@ -216,7 +268,7 @@ export class StartPreparationUseCase {
|
|
|
216
268
|
);
|
|
217
269
|
if (ranked.length === 0) {
|
|
218
270
|
console.warn(
|
|
219
|
-
`All ${tokenUsages.length} configured Claude OAuth token(s) are unavailable (blocked, rejected,
|
|
271
|
+
`All ${tokenUsages.length} configured Claude OAuth token(s) are unavailable (blocked, rejected, all model weekly limits exhausted, or 5h utilization >= 95%). Skipping starting preparation.`,
|
|
220
272
|
);
|
|
221
273
|
return { rotationOrder };
|
|
222
274
|
}
|
|
@@ -314,7 +366,7 @@ export class StartPreparationUseCase {
|
|
|
314
366
|
.find((label: string) => label.startsWith('llm-model:'))
|
|
315
367
|
?.replace('llm-model:', '')
|
|
316
368
|
.trim() || params.defaultLlmModelName;
|
|
317
|
-
if (!model) {
|
|
369
|
+
if (!model && rotationTokenSlots === null) {
|
|
318
370
|
console.error(
|
|
319
371
|
`No LLM model configured for issue ${issue.url}. Provide --defaultLlmModelName or add an llm-model: label.`,
|
|
320
372
|
);
|
|
@@ -397,10 +449,25 @@ export class StartPreparationUseCase {
|
|
|
397
449
|
);
|
|
398
450
|
issue.status = PREPARATION_STATUS_NAME;
|
|
399
451
|
|
|
452
|
+
let spawnEnv: Record<string, string> | undefined;
|
|
453
|
+
let spawnModel = model ?? '';
|
|
454
|
+
if (rotationTokenSlots !== null && proxyBaseUrl !== null) {
|
|
455
|
+
const selected =
|
|
456
|
+
rotationTokenSlots[
|
|
457
|
+
(currentPreparationIssueCount + startedInThisRunCount) %
|
|
458
|
+
rotationTokenSlots.length
|
|
459
|
+
];
|
|
460
|
+
spawnModel = selected.model;
|
|
461
|
+
spawnEnv = {
|
|
462
|
+
CLAUDE_CODE_OAUTH_TOKEN: selected.token,
|
|
463
|
+
ANTHROPIC_BASE_URL: proxyBaseUrl,
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
400
467
|
const awArgs: string[] = [
|
|
401
468
|
issue.url,
|
|
402
469
|
agent,
|
|
403
|
-
|
|
470
|
+
spawnModel,
|
|
404
471
|
'--configFilePath',
|
|
405
472
|
params.configFilePath,
|
|
406
473
|
'--branch',
|
|
@@ -416,18 +483,6 @@ export class StartPreparationUseCase {
|
|
|
416
483
|
];
|
|
417
484
|
awArgs.push('--codexHome', codexHome);
|
|
418
485
|
}
|
|
419
|
-
let spawnEnv: Record<string, string> | undefined;
|
|
420
|
-
if (rotationTokenSlots !== null && proxyBaseUrl !== null) {
|
|
421
|
-
const selected =
|
|
422
|
-
rotationTokenSlots[
|
|
423
|
-
(currentPreparationIssueCount + startedInThisRunCount) %
|
|
424
|
-
rotationTokenSlots.length
|
|
425
|
-
];
|
|
426
|
-
spawnEnv = {
|
|
427
|
-
CLAUDE_CODE_OAUTH_TOKEN: selected,
|
|
428
|
-
ANTHROPIC_BASE_URL: proxyBaseUrl,
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
486
|
await this.localCommandRunner.runCommand(
|
|
432
487
|
'aw',
|
|
433
488
|
awArgs,
|
|
@@ -16,8 +16,10 @@ export declare class StartPreparationUseCase {
|
|
|
16
16
|
private readonly localCommandRunner;
|
|
17
17
|
private readonly claudeTokenUsageRepository;
|
|
18
18
|
constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'getStoryObjectMap' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'closePullRequest' | 'deletePullRequestBranch' | 'createCommentByUrl'>, localCommandRunner: LocalCommandRunner, claudeTokenUsageRepository: ClaudeTokenUsageRepository);
|
|
19
|
+
private readonly KNOWN_MODEL_SPECIFIC_LIMIT_TYPES;
|
|
19
20
|
private weeklyLimitTypeForModel;
|
|
20
|
-
private
|
|
21
|
+
private deriveFallbackModelName;
|
|
22
|
+
private selectModelForToken;
|
|
21
23
|
private maximumPreparingProcessCountForToken;
|
|
22
24
|
private selectRotationTokens;
|
|
23
25
|
private createRotationTokenSlots;
|
|
@@ -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;
|
|
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;AAiBhE,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,QAAQ,CAAC,gCAAgC,CAG/C;IAEF,OAAO,CAAC,uBAAuB,CAK7B;IAEF,OAAO,CAAC,uBAAuB,CAoB7B;IAEF,OAAO,CAAC,mBAAmB,CAyBzB;IAEF,OAAO,CAAC,oCAAoC,CAqB1C;IAEF,OAAO,CAAC,oBAAoB,CA6B1B;IAEF,OAAO,CAAC,wBAAwB,CAe9B;IAEF,OAAO,CAAC,kCAAkC,CAWxC;IAEF,kBAAkB,GAChB,aAAa,gBAAgB,EAAE,EAC/B,gCAAgC,MAAM,EACtC,WAAW,MAAM,GAAG,IAAI,KACvB,kBAAkB,EAAE,CAyCrB;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;QAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CAqPzD;CACH"}
|