github-issue-tower-defence-management 1.101.1 → 1.101.2
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/bin/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.js +2 -1
- package/bin/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.js.map +1 -1
- package/bin/domain/usecases/OauthTokenSelectUseCase.js +7 -7
- package/bin/domain/usecases/OauthTokenSelectUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +28 -4
- package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +8 -2
- package/src/domain/usecases/OauthTokenSelectUseCase.ts +2 -2
- package/types/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.d.ts.map +1 -1
- package/types/domain/usecases/OauthTokenSelectUseCase.d.ts +2 -0
- package/types/domain/usecases/OauthTokenSelectUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [1.101.2](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.101.1...v1.101.2) (2026-06-25)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **cli:** name 5h/7d free thresholds in selectLiveSessionOauthToken no-eligible error ([#951](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/951)) ([dbfefda](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/dbfefda5a6b80de2bdbc2eb59bce63366cd0b6a2)), closes [#950](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/950)
|
|
7
|
+
|
|
1
8
|
## [1.101.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.101.0...v1.101.1) (2026-06-25)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LiveSessionOauthTokenSelectHandler = void 0;
|
|
4
4
|
const LiveSessionOauthTokenSelectUseCase_1 = require("../../../domain/usecases/LiveSessionOauthTokenSelectUseCase");
|
|
5
|
+
const OauthTokenSelectUseCase_1 = require("../../../domain/usecases/OauthTokenSelectUseCase");
|
|
5
6
|
const ProcClaudeLiveSessionRepository_1 = require("../../repositories/ProcClaudeLiveSessionRepository");
|
|
6
7
|
const RateLimitCache_1 = require("../../proxy/RateLimitCache");
|
|
7
8
|
const TokenListLoader_1 = require("../../proxy/TokenListLoader");
|
|
@@ -64,7 +65,7 @@ class LiveSessionOauthTokenSelectHandler {
|
|
|
64
65
|
return `${metric.name}: ${metric.liveSessionCount} live session(s), 5h ${Math.round(metric.fiveHourFreeRatio * 100)}% free, 7d ${Math.round(metric.sevenDayFreeRatio * 100)}% free, 7d-end in ${secondsUntilSevenDayEnd}s -> ${status}`;
|
|
65
66
|
});
|
|
66
67
|
if (result.selected === null) {
|
|
67
|
-
lines.push(
|
|
68
|
+
lines.push(`No eligible token: every token is below the 5h >= ${Math.round(OauthTokenSelectUseCase_1.FIVE_HOUR_MIN_FREE_RATIO * 100)}% free and 7d >= ${Math.round(OauthTokenSelectUseCase_1.SEVEN_DAY_MIN_FREE_RATIO * 100)}% free thresholds required to start a live session.`);
|
|
68
69
|
}
|
|
69
70
|
else {
|
|
70
71
|
lines.push(`Selected ${result.selected.name} (fewest live sessions, then soonest 7d reset among eligible tokens).`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveSessionOauthTokenSelectHandler.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts"],"names":[],"mappings":";;;AACA,oHAGqE;
|
|
1
|
+
{"version":3,"file":"LiveSessionOauthTokenSelectHandler.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OauthTokenSelectUseCase = void 0;
|
|
3
|
+
exports.OauthTokenSelectUseCase = exports.SEVEN_DAY_MIN_FREE_RATIO = exports.FIVE_HOUR_MIN_FREE_RATIO = void 0;
|
|
4
4
|
const SECONDS_PER_DAY = 86400;
|
|
5
5
|
const SEVEN_DAYS_IN_SECONDS = 7 * SECONDS_PER_DAY;
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
exports.FIVE_HOUR_MIN_FREE_RATIO = 0.6;
|
|
7
|
+
exports.SEVEN_DAY_MIN_FREE_RATIO = 0.3;
|
|
8
8
|
class OauthTokenSelectUseCase {
|
|
9
9
|
constructor() {
|
|
10
10
|
this.run = (candidates, nowEpochSeconds) => {
|
|
@@ -37,11 +37,11 @@ class OauthTokenSelectUseCase {
|
|
|
37
37
|
};
|
|
38
38
|
};
|
|
39
39
|
this.exclusionReason = (fiveHourFreeRatio, sevenDayFreeRatio) => {
|
|
40
|
-
if (fiveHourFreeRatio < FIVE_HOUR_MIN_FREE_RATIO) {
|
|
41
|
-
return `5h window only ${this.toPercent(fiveHourFreeRatio)}% free (requires >= ${this.toPercent(FIVE_HOUR_MIN_FREE_RATIO)}%)`;
|
|
40
|
+
if (fiveHourFreeRatio < exports.FIVE_HOUR_MIN_FREE_RATIO) {
|
|
41
|
+
return `5h window only ${this.toPercent(fiveHourFreeRatio)}% free (requires >= ${this.toPercent(exports.FIVE_HOUR_MIN_FREE_RATIO)}%)`;
|
|
42
42
|
}
|
|
43
|
-
if (sevenDayFreeRatio < SEVEN_DAY_MIN_FREE_RATIO) {
|
|
44
|
-
return `7d window only ${this.toPercent(sevenDayFreeRatio)}% free (requires >= ${this.toPercent(SEVEN_DAY_MIN_FREE_RATIO)}%)`;
|
|
43
|
+
if (sevenDayFreeRatio < exports.SEVEN_DAY_MIN_FREE_RATIO) {
|
|
44
|
+
return `7d window only ${this.toPercent(sevenDayFreeRatio)}% free (requires >= ${this.toPercent(exports.SEVEN_DAY_MIN_FREE_RATIO)}%)`;
|
|
45
45
|
}
|
|
46
46
|
return null;
|
|
47
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OauthTokenSelectUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":";;;AA2BA,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,qBAAqB,GAAG,CAAC,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"OauthTokenSelectUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -218,7 +218,7 @@ describe('LiveSessionOauthTokenSelectHandler', () => {
|
|
|
218
218
|
expect(output.selectedName).toBe('free');
|
|
219
219
|
});
|
|
220
220
|
|
|
221
|
-
it('returns
|
|
221
|
+
it('returns no token and a threshold-naming diagnostic without leaking the token when no token passes the filter', () => {
|
|
222
222
|
writeTokenList([{ name: 'busy', token: 'fake-busy' }]);
|
|
223
223
|
writeCache('fake-busy', {
|
|
224
224
|
fiveHourUtilization: 0.9,
|
|
@@ -235,9 +235,33 @@ describe('LiveSessionOauthTokenSelectHandler', () => {
|
|
|
235
235
|
});
|
|
236
236
|
|
|
237
237
|
expect(output.selectedToken).toBeNull();
|
|
238
|
-
expect(output.
|
|
239
|
-
|
|
240
|
-
);
|
|
238
|
+
expect(output.selectedName).toBeNull();
|
|
239
|
+
const diagnostics = output.diagnostics.join('\n');
|
|
240
|
+
expect(diagnostics).toContain('No eligible token');
|
|
241
|
+
expect(diagnostics).toContain('5h >= 60% free');
|
|
242
|
+
expect(diagnostics).toContain('7d >= 30% free');
|
|
243
|
+
expect(diagnostics).not.toContain('fake-busy');
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('returns the token on the selected path when an eligible token exists', () => {
|
|
247
|
+
writeTokenList([{ name: 'free', token: 'fake-free' }]);
|
|
248
|
+
writeCache('fake-free', {
|
|
249
|
+
fiveHourUtilization: 0.1,
|
|
250
|
+
fiveHourReset: NOW + HOUR,
|
|
251
|
+
sevenDayUtilization: 0.1,
|
|
252
|
+
sevenDayReset: NOW + DAY,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
const handler = buildHandler([]);
|
|
256
|
+
const output = handler.handle({
|
|
257
|
+
tokenListJsonPath: tokenListPath,
|
|
258
|
+
cacheDirectory,
|
|
259
|
+
nowEpochSeconds: NOW,
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
expect(output.selectedToken).toBe('fake-free');
|
|
263
|
+
expect(output.selectedName).toBe('free');
|
|
264
|
+
expect(output.diagnostics.join('\n')).not.toContain('No eligible token');
|
|
241
265
|
});
|
|
242
266
|
|
|
243
267
|
it('returns a diagnostic when no token list path is resolvable', () => {
|
|
@@ -3,7 +3,11 @@ import {
|
|
|
3
3
|
LiveSessionOauthTokenSelectResult,
|
|
4
4
|
LiveSessionOauthTokenSelectUseCase,
|
|
5
5
|
} from '../../../domain/usecases/LiveSessionOauthTokenSelectUseCase';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
FIVE_HOUR_MIN_FREE_RATIO,
|
|
8
|
+
OauthTokenCandidate,
|
|
9
|
+
SEVEN_DAY_MIN_FREE_RATIO,
|
|
10
|
+
} from '../../../domain/usecases/OauthTokenSelectUseCase';
|
|
7
11
|
import { ProcClaudeLiveSessionRepository } from '../../repositories/ProcClaudeLiveSessionRepository';
|
|
8
12
|
import { readRateLimit } from '../../proxy/RateLimitCache';
|
|
9
13
|
import { loadTokenEntries } from '../../proxy/TokenListLoader';
|
|
@@ -104,7 +108,9 @@ export class LiveSessionOauthTokenSelectHandler {
|
|
|
104
108
|
});
|
|
105
109
|
|
|
106
110
|
if (result.selected === null) {
|
|
107
|
-
lines.push(
|
|
111
|
+
lines.push(
|
|
112
|
+
`No eligible token: every token is below the 5h >= ${Math.round(FIVE_HOUR_MIN_FREE_RATIO * 100)}% free and 7d >= ${Math.round(SEVEN_DAY_MIN_FREE_RATIO * 100)}% free thresholds required to start a live session.`,
|
|
113
|
+
);
|
|
108
114
|
} else {
|
|
109
115
|
lines.push(
|
|
110
116
|
`Selected ${result.selected.name} (fewest live sessions, then soonest 7d reset among eligible tokens).`,
|
|
@@ -28,8 +28,8 @@ export type OauthTokenSelectResult = {
|
|
|
28
28
|
const SECONDS_PER_DAY = 86400;
|
|
29
29
|
const SEVEN_DAYS_IN_SECONDS = 7 * SECONDS_PER_DAY;
|
|
30
30
|
|
|
31
|
-
const FIVE_HOUR_MIN_FREE_RATIO = 0.6;
|
|
32
|
-
const SEVEN_DAY_MIN_FREE_RATIO = 0.3;
|
|
31
|
+
export const FIVE_HOUR_MIN_FREE_RATIO = 0.6;
|
|
32
|
+
export const SEVEN_DAY_MIN_FREE_RATIO = 0.3;
|
|
33
33
|
|
|
34
34
|
export class OauthTokenSelectUseCase {
|
|
35
35
|
run = (
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveSessionOauthTokenSelectHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,yEAAyE,CAAC;AACtH,OAAO,EAEL,kCAAkC,EACnC,MAAM,6DAA6D,CAAC;
|
|
1
|
+
{"version":3,"file":"LiveSessionOauthTokenSelectHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,yEAAyE,CAAC;AACtH,OAAO,EAEL,kCAAkC,EACnC,MAAM,6DAA6D,CAAC;AAcrE,MAAM,MAAM,uCAAuC,GAAG;IACpD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,wCAAwC,GAAG;IACrD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,qBAAa,kCAAkC;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBADrB,OAAO,GAAE,kCAA6E,EACtF,qBAAqB,GAAE,2BAAmE;IAG7G,MAAM,GACJ,OAAO,uCAAuC,KAC7C,wCAAwC,CAuDzC;IAEF,OAAO,CAAC,iBAAiB,CAyBvB;CACH"}
|
|
@@ -21,6 +21,8 @@ export type OauthTokenSelectResult = {
|
|
|
21
21
|
selected: OauthTokenCandidate | null;
|
|
22
22
|
metrics: OauthTokenCandidateMetrics[];
|
|
23
23
|
};
|
|
24
|
+
export declare const FIVE_HOUR_MIN_FREE_RATIO = 0.6;
|
|
25
|
+
export declare const SEVEN_DAY_MIN_FREE_RATIO = 0.3;
|
|
24
26
|
export declare class OauthTokenSelectUseCase {
|
|
25
27
|
run: (candidates: OauthTokenCandidate[], nowEpochSeconds: number) => OauthTokenSelectResult;
|
|
26
28
|
private evaluate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OauthTokenSelectUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,0BAA0B,EAAE,CAAC;CACvC,CAAC;
|
|
1
|
+
{"version":3,"file":"OauthTokenSelectUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,0BAA0B,EAAE,CAAC;CACvC,CAAC;AAKF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,qBAAa,uBAAuB;IAClC,GAAG,GACD,YAAY,mBAAmB,EAAE,EACjC,iBAAiB,MAAM,KACtB,sBAAsB,CAoBvB;IAEF,OAAO,CAAC,QAAQ,CA8Bd;IAEF,OAAO,CAAC,eAAe,CAWrB;IAEF,OAAO,CAAC,iBAAiB,CAWvB;IAEF,OAAO,CAAC,iBAAiB,CAWvB;IAEF,OAAO,CAAC,gBAAgB,CActB;IAEF,OAAO,CAAC,aAAa,CAGwC;IAE7D,OAAO,CAAC,wBAAwB,CAG9B;IAEF,OAAO,CAAC,SAAS,CAAsD;CACxE"}
|