@kaitranntt/ccs 7.13.1 → 7.14.0-dev.1

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 (119) hide show
  1. package/README.md +8 -0
  2. package/config/base-agy.settings.json +1 -1
  3. package/dist/cliproxy/auth/auth-types.d.ts +3 -1
  4. package/dist/cliproxy/auth/auth-types.d.ts.map +1 -1
  5. package/dist/cliproxy/auth/auth-types.js +8 -5
  6. package/dist/cliproxy/auth/auth-types.js.map +1 -1
  7. package/dist/cliproxy/auth/gemini-token-refresh.d.ts +2 -1
  8. package/dist/cliproxy/auth/gemini-token-refresh.d.ts.map +1 -1
  9. package/dist/cliproxy/auth/gemini-token-refresh.js +4 -3
  10. package/dist/cliproxy/auth/gemini-token-refresh.js.map +1 -1
  11. package/dist/cliproxy/auth/oauth-process.d.ts.map +1 -1
  12. package/dist/cliproxy/auth/oauth-process.js +31 -1
  13. package/dist/cliproxy/auth/oauth-process.js.map +1 -1
  14. package/dist/cliproxy/auth/provider-refreshers/index.d.ts +21 -0
  15. package/dist/cliproxy/auth/provider-refreshers/index.d.ts.map +1 -0
  16. package/dist/cliproxy/auth/provider-refreshers/index.js +56 -0
  17. package/dist/cliproxy/auth/provider-refreshers/index.js.map +1 -0
  18. package/dist/cliproxy/auth/token-expiry-checker.d.ts +37 -0
  19. package/dist/cliproxy/auth/token-expiry-checker.d.ts.map +1 -0
  20. package/dist/cliproxy/auth/token-expiry-checker.js +114 -0
  21. package/dist/cliproxy/auth/token-expiry-checker.js.map +1 -0
  22. package/dist/cliproxy/auth/token-refresh-config.d.ts +13 -0
  23. package/dist/cliproxy/auth/token-refresh-config.d.ts.map +1 -0
  24. package/dist/cliproxy/auth/token-refresh-config.js +31 -0
  25. package/dist/cliproxy/auth/token-refresh-config.js.map +1 -0
  26. package/dist/cliproxy/auth/token-refresh-worker.d.ts +83 -0
  27. package/dist/cliproxy/auth/token-refresh-worker.d.ts.map +1 -0
  28. package/dist/cliproxy/auth/token-refresh-worker.js +214 -0
  29. package/dist/cliproxy/auth/token-refresh-worker.js.map +1 -0
  30. package/dist/cliproxy/auth-session-manager.d.ts.map +1 -1
  31. package/dist/cliproxy/auth-session-manager.js +28 -0
  32. package/dist/cliproxy/auth-session-manager.js.map +1 -1
  33. package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -1
  34. package/dist/cliproxy/binary/lifecycle.js +47 -6
  35. package/dist/cliproxy/binary/lifecycle.js.map +1 -1
  36. package/dist/cliproxy/binary/types.d.ts +13 -0
  37. package/dist/cliproxy/binary/types.d.ts.map +1 -1
  38. package/dist/cliproxy/binary/types.js +3 -1
  39. package/dist/cliproxy/binary/types.js.map +1 -1
  40. package/dist/cliproxy/binary/version-cache.d.ts +13 -1
  41. package/dist/cliproxy/binary/version-cache.d.ts.map +1 -1
  42. package/dist/cliproxy/binary/version-cache.js +46 -1
  43. package/dist/cliproxy/binary/version-cache.js.map +1 -1
  44. package/dist/cliproxy/binary/version-checker.d.ts +6 -1
  45. package/dist/cliproxy/binary/version-checker.d.ts.map +1 -1
  46. package/dist/cliproxy/binary/version-checker.js +37 -1
  47. package/dist/cliproxy/binary/version-checker.js.map +1 -1
  48. package/dist/cliproxy/binary-manager.d.ts +3 -0
  49. package/dist/cliproxy/binary-manager.d.ts.map +1 -1
  50. package/dist/cliproxy/binary-manager.js +36 -1
  51. package/dist/cliproxy/binary-manager.js.map +1 -1
  52. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -1
  53. package/dist/cliproxy/cliproxy-executor.js +34 -0
  54. package/dist/cliproxy/cliproxy-executor.js.map +1 -1
  55. package/dist/cliproxy/platform-detector.d.ts +6 -0
  56. package/dist/cliproxy/platform-detector.d.ts.map +1 -1
  57. package/dist/cliproxy/platform-detector.js +7 -1
  58. package/dist/cliproxy/platform-detector.js.map +1 -1
  59. package/dist/cliproxy/quota-fetcher.d.ts +44 -0
  60. package/dist/cliproxy/quota-fetcher.d.ts.map +1 -1
  61. package/dist/cliproxy/quota-fetcher.js +91 -1
  62. package/dist/cliproxy/quota-fetcher.js.map +1 -1
  63. package/dist/cliproxy/service-manager.d.ts +12 -0
  64. package/dist/cliproxy/service-manager.d.ts.map +1 -1
  65. package/dist/cliproxy/service-manager.js +66 -1
  66. package/dist/cliproxy/service-manager.js.map +1 -1
  67. package/dist/commands/cliproxy-command.d.ts.map +1 -1
  68. package/dist/commands/cliproxy-command.js +93 -0
  69. package/dist/commands/cliproxy-command.js.map +1 -1
  70. package/dist/commands/help-command.d.ts.map +1 -1
  71. package/dist/commands/help-command.js +1 -0
  72. package/dist/commands/help-command.js.map +1 -1
  73. package/dist/config/unified-config-types.d.ts +18 -0
  74. package/dist/config/unified-config-types.d.ts.map +1 -1
  75. package/dist/config/unified-config-types.js.map +1 -1
  76. package/dist/management/oauth-port-diagnostics.js +2 -2
  77. package/dist/management/oauth-port-diagnostics.js.map +1 -1
  78. package/dist/management/shared-manager.d.ts +8 -0
  79. package/dist/management/shared-manager.d.ts.map +1 -1
  80. package/dist/management/shared-manager.js +33 -0
  81. package/dist/management/shared-manager.js.map +1 -1
  82. package/dist/ui/assets/{accounts-DKm_BUkJ.js → accounts-wkvC_Z1E.js} +1 -1
  83. package/dist/ui/assets/{alert-dialog-BBbNIyvF.js → alert-dialog--nlDi-Dj.js} +1 -1
  84. package/dist/ui/assets/{api-p6k8BwWO.js → api-DeyefOLW.js} +1 -1
  85. package/dist/ui/assets/auth-section-BQXfw1cb.js +1 -0
  86. package/dist/ui/assets/{card-D6fGkasO.js → card-P5vPGo2D.js} +1 -1
  87. package/dist/ui/assets/cliproxy-CcMLaKpF.js +3 -0
  88. package/dist/ui/assets/{cliproxy-control-panel-D7gdCCO7.js → cliproxy-control-panel-Dbs8NAQa.js} +1 -1
  89. package/dist/ui/assets/{confirm-dialog-D55Qga4b.js → confirm-dialog-BM75Bkww.js} +1 -1
  90. package/dist/ui/assets/{copilot-fwj1xk6l.js → copilot-BwylIlO5.js} +3 -3
  91. package/dist/ui/assets/{globalenv-section-DMSdqrn_.js → globalenv-section-Cgpz_NQ0.js} +1 -1
  92. package/dist/ui/assets/{health-65nETbIF.js → health-DWUjYWDI.js} +1 -1
  93. package/dist/ui/assets/icons-U9n5DGj9.js +1 -0
  94. package/dist/ui/assets/index-1g-Hy9VA.css +1 -0
  95. package/dist/ui/assets/{index-Dc8X9bLV.js → index-4Wd5fx72.js} +1 -1
  96. package/dist/ui/assets/{index-BrijlHVl.js → index-CIWe-99u.js} +1 -1
  97. package/dist/ui/assets/{index-8HAJX3-Y.js → index-D8MFq-UJ.js} +17 -17
  98. package/dist/ui/assets/{index-CwDi6WPm.js → index-f_AuSs01.js} +1 -1
  99. package/dist/ui/assets/{radix-ui-uXQB-q0u.js → radix-ui-CBgg0XeO.js} +1 -1
  100. package/dist/ui/assets/{shared-CMWj9K3T.js → shared-I-pAdvVQ.js} +1 -1
  101. package/dist/ui/assets/{switch-D_o-N1Sa.js → switch-DHwS-NMF.js} +1 -1
  102. package/dist/ui/assets/{tanstack-Coed0rqz.js → tanstack-CxYN0q6L.js} +1 -1
  103. package/dist/ui/index.html +5 -5
  104. package/dist/utils/port-utils.d.ts.map +1 -1
  105. package/dist/utils/port-utils.js +12 -9
  106. package/dist/utils/port-utils.js.map +1 -1
  107. package/dist/web-server/health/cliproxy-checks.d.ts.map +1 -1
  108. package/dist/web-server/health/cliproxy-checks.js +14 -0
  109. package/dist/web-server/health/cliproxy-checks.js.map +1 -1
  110. package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -1
  111. package/dist/web-server/routes/cliproxy-stats-routes.js +88 -0
  112. package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -1
  113. package/lib/hooks/websearch-transformer.cjs +4 -1
  114. package/package.json +3 -1
  115. package/scripts/dev-symlink.sh +115 -0
  116. package/dist/ui/assets/auth-section-B4wvcy8z.js +0 -1
  117. package/dist/ui/assets/cliproxy-DuWY_mzK.js +0 -3
  118. package/dist/ui/assets/icons-CwFZAiDB.js +0 -1
  119. package/dist/ui/assets/index-oS2cgEFl.css +0 -1
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Token Refresh Worker
3
+ *
4
+ * Background worker that periodically checks and refreshes OAuth tokens
5
+ * before they expire. Runs as interval loop with retry logic.
6
+ */
7
+ import { CLIProxyProvider } from '../types';
8
+ /** Worker configuration */
9
+ export interface TokenRefreshConfig {
10
+ /** Refresh check interval in minutes (default: 30) */
11
+ refreshInterval: number;
12
+ /** Preemptive refresh time in minutes (default: 45) */
13
+ preemptiveTime: number;
14
+ /** Maximum retry attempts per token (default: 3) */
15
+ maxRetries: number;
16
+ /** Base delay for exponential backoff in ms (default: 1000) */
17
+ retryBaseDelay: number;
18
+ /** Timeout for refresh operations in ms (default: 10000) */
19
+ refreshTimeout: number;
20
+ /** Enable verbose logging */
21
+ verbose: boolean;
22
+ }
23
+ /** Result of a token refresh attempt */
24
+ export interface RefreshResult {
25
+ provider: CLIProxyProvider;
26
+ accountId: string;
27
+ success: boolean;
28
+ error?: string;
29
+ refreshedAt?: Date;
30
+ nextExpiry?: number;
31
+ }
32
+ /**
33
+ * Background token refresh worker
34
+ * Manages periodic token refresh checks with retry logic
35
+ */
36
+ export declare class TokenRefreshWorker {
37
+ private config;
38
+ private intervalId;
39
+ private running;
40
+ private lastResults;
41
+ private exitHandler;
42
+ constructor(config?: Partial<TokenRefreshConfig>);
43
+ /**
44
+ * Start the worker
45
+ * Runs refresh loop immediately, then on interval
46
+ */
47
+ start(): void;
48
+ /**
49
+ * Stop the worker
50
+ */
51
+ stop(): void;
52
+ /**
53
+ * Check if worker is active
54
+ */
55
+ isActive(): boolean;
56
+ /**
57
+ * Manually trigger refresh check now
58
+ */
59
+ refreshNow(): Promise<RefreshResult[]>;
60
+ /**
61
+ * Get results from last refresh cycle
62
+ */
63
+ getLastRefreshResults(): RefreshResult[];
64
+ /**
65
+ * Main refresh loop
66
+ * Checks all tokens and refreshes those needing refresh
67
+ */
68
+ private refreshLoop;
69
+ /**
70
+ * Refresh a single token with retry logic
71
+ * Uses exponential backoff on failures
72
+ */
73
+ private refreshWithRetry;
74
+ /**
75
+ * Check if error is unrecoverable (should not retry)
76
+ */
77
+ private isUnrecoverableError;
78
+ /**
79
+ * Log message if verbose enabled
80
+ */
81
+ private log;
82
+ }
83
+ //# sourceMappingURL=token-refresh-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-refresh-worker.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/auth/token-refresh-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAI5C,2BAA2B;AAC3B,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,cAAc,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,cAAc,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmDD;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAA6B;gBAEpC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAIpD;;;OAGG;IACH,KAAK,IAAI,IAAI;IAwBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAsBZ;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAI5C;;OAEG;IACH,qBAAqB,IAAI,aAAa,EAAE;IAIxC;;;OAGG;YACW,WAAW;IAkCzB;;;OAGG;YACW,gBAAgB;IA+C9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ /**
3
+ * Token Refresh Worker
4
+ *
5
+ * Background worker that periodically checks and refreshes OAuth tokens
6
+ * before they expire. Runs as interval loop with retry logic.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TokenRefreshWorker = void 0;
10
+ const token_expiry_checker_1 = require("./token-expiry-checker");
11
+ const provider_refreshers_1 = require("./provider-refreshers");
12
+ /** Default worker configuration */
13
+ const DEFAULT_CONFIG = {
14
+ refreshInterval: 30,
15
+ preemptiveTime: 45,
16
+ maxRetries: 3,
17
+ retryBaseDelay: 1000,
18
+ refreshTimeout: 10000,
19
+ verbose: false,
20
+ };
21
+ /** Minimum config values to prevent infinite loops */
22
+ const MIN_REFRESH_INTERVAL = 1; // 1 minute minimum
23
+ const MIN_RETRY_BASE_DELAY = 100; // 100ms minimum
24
+ /** Unrecoverable error patterns - don't retry these */
25
+ const UNRECOVERABLE_ERRORS = [
26
+ 'No refresh token',
27
+ 'Invalid client',
28
+ 'Invalid grant',
29
+ 'Token has been revoked',
30
+ 'Token not found',
31
+ ];
32
+ /** Validate and sanitize config values */
33
+ function sanitizeConfig(config) {
34
+ return {
35
+ refreshInterval: Math.max(MIN_REFRESH_INTERVAL, config.refreshInterval || DEFAULT_CONFIG.refreshInterval),
36
+ preemptiveTime: Math.max(0, config.preemptiveTime || DEFAULT_CONFIG.preemptiveTime),
37
+ maxRetries: Math.max(1, config.maxRetries || DEFAULT_CONFIG.maxRetries),
38
+ retryBaseDelay: Math.max(MIN_RETRY_BASE_DELAY, config.retryBaseDelay || DEFAULT_CONFIG.retryBaseDelay),
39
+ refreshTimeout: Math.max(1000, config.refreshTimeout || DEFAULT_CONFIG.refreshTimeout),
40
+ verbose: config.verbose ?? DEFAULT_CONFIG.verbose,
41
+ };
42
+ }
43
+ /** Promise with timeout */
44
+ function withTimeout(promise, timeoutMs, errorMsg) {
45
+ return Promise.race([
46
+ promise,
47
+ new Promise((_, reject) => setTimeout(() => reject(new Error(errorMsg)), timeoutMs)),
48
+ ]);
49
+ }
50
+ /**
51
+ * Background token refresh worker
52
+ * Manages periodic token refresh checks with retry logic
53
+ */
54
+ class TokenRefreshWorker {
55
+ constructor(config = {}) {
56
+ this.intervalId = null;
57
+ this.running = false;
58
+ this.lastResults = [];
59
+ this.exitHandler = null;
60
+ this.config = sanitizeConfig({ ...DEFAULT_CONFIG, ...config });
61
+ }
62
+ /**
63
+ * Start the worker
64
+ * Runs refresh loop immediately, then on interval
65
+ */
66
+ start() {
67
+ if (this.running) {
68
+ return;
69
+ }
70
+ this.running = true;
71
+ this.log('[i] Token refresh worker started');
72
+ // Register process exit handlers for cleanup
73
+ this.exitHandler = () => this.stop();
74
+ process.on('SIGINT', this.exitHandler);
75
+ process.on('SIGTERM', this.exitHandler);
76
+ process.on('beforeExit', this.exitHandler);
77
+ // Run immediately on start
78
+ void this.refreshLoop();
79
+ // Then run on interval
80
+ const intervalMs = this.config.refreshInterval * 60 * 1000;
81
+ this.intervalId = setInterval(() => {
82
+ void this.refreshLoop();
83
+ }, intervalMs);
84
+ }
85
+ /**
86
+ * Stop the worker
87
+ */
88
+ stop() {
89
+ if (!this.running) {
90
+ return;
91
+ }
92
+ this.running = false;
93
+ if (this.intervalId) {
94
+ clearInterval(this.intervalId);
95
+ this.intervalId = null;
96
+ }
97
+ // Remove process exit handlers
98
+ if (this.exitHandler) {
99
+ process.off('SIGINT', this.exitHandler);
100
+ process.off('SIGTERM', this.exitHandler);
101
+ process.off('beforeExit', this.exitHandler);
102
+ this.exitHandler = null;
103
+ }
104
+ this.log('[i] Token refresh worker stopped');
105
+ }
106
+ /**
107
+ * Check if worker is active
108
+ */
109
+ isActive() {
110
+ return this.running;
111
+ }
112
+ /**
113
+ * Manually trigger refresh check now
114
+ */
115
+ async refreshNow() {
116
+ return await this.refreshLoop();
117
+ }
118
+ /**
119
+ * Get results from last refresh cycle
120
+ */
121
+ getLastRefreshResults() {
122
+ return [...this.lastResults];
123
+ }
124
+ /**
125
+ * Main refresh loop
126
+ * Checks all tokens and refreshes those needing refresh
127
+ */
128
+ async refreshLoop() {
129
+ const results = [];
130
+ try {
131
+ const tokens = (0, token_expiry_checker_1.getAllTokenExpiryInfo)();
132
+ const tokensNeedingRefresh = tokens.filter((t) => t.needsRefresh);
133
+ if (tokensNeedingRefresh.length === 0) {
134
+ this.log('[OK] All tokens valid, no refresh needed');
135
+ this.lastResults = [];
136
+ return results;
137
+ }
138
+ this.log(`[i] Refreshing ${tokensNeedingRefresh.length} token(s)...`);
139
+ for (const token of tokensNeedingRefresh) {
140
+ const result = await this.refreshWithRetry(token);
141
+ results.push(result);
142
+ if (result.success) {
143
+ this.log(`[OK] ${token.provider}/${token.accountId} refreshed`);
144
+ }
145
+ else {
146
+ this.log(`[X] ${token.provider}/${token.accountId} failed: ${result.error}`);
147
+ }
148
+ }
149
+ }
150
+ catch (error) {
151
+ const msg = error instanceof Error ? error.message : 'Unknown error';
152
+ this.log(`[X] Refresh loop error: ${msg}`);
153
+ }
154
+ this.lastResults = results;
155
+ return results;
156
+ }
157
+ /**
158
+ * Refresh a single token with retry logic
159
+ * Uses exponential backoff on failures
160
+ */
161
+ async refreshWithRetry(token) {
162
+ let lastError = 'Unknown error';
163
+ for (let attempt = 0; attempt < this.config.maxRetries; attempt++) {
164
+ try {
165
+ // Apply timeout to refresh operation
166
+ const result = await withTimeout((0, provider_refreshers_1.refreshToken)(token.provider, token.accountId), this.config.refreshTimeout, `Refresh timeout after ${this.config.refreshTimeout}ms`);
167
+ if (result.success) {
168
+ return {
169
+ provider: token.provider,
170
+ accountId: token.accountId,
171
+ success: true,
172
+ refreshedAt: new Date(),
173
+ nextExpiry: result.expiresAt,
174
+ };
175
+ }
176
+ lastError = result.error || 'Refresh failed';
177
+ // Don't retry if error indicates unrecoverable issue
178
+ if (this.isUnrecoverableError(lastError)) {
179
+ break;
180
+ }
181
+ }
182
+ catch (error) {
183
+ lastError = error instanceof Error ? error.message : 'Unknown error';
184
+ }
185
+ // Exponential backoff before retry
186
+ if (attempt < this.config.maxRetries - 1) {
187
+ const delay = this.config.retryBaseDelay * Math.pow(2, attempt);
188
+ await new Promise((resolve) => setTimeout(resolve, delay));
189
+ }
190
+ }
191
+ return {
192
+ provider: token.provider,
193
+ accountId: token.accountId,
194
+ success: false,
195
+ error: lastError,
196
+ };
197
+ }
198
+ /**
199
+ * Check if error is unrecoverable (should not retry)
200
+ */
201
+ isUnrecoverableError(error) {
202
+ return UNRECOVERABLE_ERRORS.some((pattern) => error.includes(pattern));
203
+ }
204
+ /**
205
+ * Log message if verbose enabled
206
+ */
207
+ log(msg) {
208
+ if (this.config.verbose) {
209
+ console.error(`[token-refresh] ${msg}`);
210
+ }
211
+ }
212
+ }
213
+ exports.TokenRefreshWorker = TokenRefreshWorker;
214
+ //# sourceMappingURL=token-refresh-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-refresh-worker.js","sourceRoot":"","sources":["../../../src/cliproxy/auth/token-refresh-worker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-session-manager.d.ts","sourceRoot":"","sources":["../../src/cliproxy/auth-session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,uBAAqB,CAAC;AAIpD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,YAAY,GACrB,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAKrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAG7D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAc5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAE5E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAOtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAarE"}
1
+ {"version":3,"file":"auth-session-manager.d.ts","sourceRoot":"","sources":["../../src/cliproxy/auth-session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK7C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,uBAAqB,CAAC;AA6BpD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,YAAY,GACrB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAKrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAG7D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAc5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAE5E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAOtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAarE"}
@@ -8,8 +8,34 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.cancelAllSessionsForProvider = exports.hasActiveSession = exports.getActiveSessionForProvider = exports.getActiveSession = exports.cancelAuthSession = exports.unregisterAuthSession = exports.attachProcessToSession = exports.registerAuthSession = exports.authSessionEvents = void 0;
10
10
  const events_1 = require("events");
11
+ // H8: TTL for stale session cleanup (10 minutes - generous for OAuth flows)
12
+ const SESSION_TTL_MS = 10 * 60 * 1000;
11
13
  exports.authSessionEvents = new events_1.EventEmitter();
12
14
  const activeSessions = new Map();
15
+ // H8: Periodic cleanup of stale sessions (prevents memory leak from orphaned sessions)
16
+ let cleanupInterval = null;
17
+ function startCleanupInterval() {
18
+ if (cleanupInterval)
19
+ return;
20
+ cleanupInterval = setInterval(() => {
21
+ const now = Date.now();
22
+ for (const [sessionId, session] of activeSessions.entries()) {
23
+ if (now - session.startedAt > SESSION_TTL_MS) {
24
+ // Stale session - kill process if still running, then remove
25
+ if (session.process && !session.process.killed) {
26
+ session.process.kill('SIGTERM');
27
+ }
28
+ activeSessions.delete(sessionId);
29
+ exports.authSessionEvents.emit('session:expired', sessionId);
30
+ }
31
+ }
32
+ // Stop interval if no active sessions
33
+ if (activeSessions.size === 0 && cleanupInterval) {
34
+ clearInterval(cleanupInterval);
35
+ cleanupInterval = null;
36
+ }
37
+ }, 60000); // Check every minute
38
+ }
13
39
  /**
14
40
  * Register an active OAuth session
15
41
  */
@@ -20,6 +46,8 @@ function registerAuthSession(sessionId, provider, process) {
20
46
  startedAt: Date.now(),
21
47
  process,
22
48
  });
49
+ // H8: Start TTL cleanup when first session registered
50
+ startCleanupInterval();
23
51
  exports.authSessionEvents.emit('session:started', sessionId, provider);
24
52
  }
25
53
  exports.registerAuthSession = registerAuthSession;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-session-manager.js","sourceRoot":"","sources":["../../src/cliproxy/auth-session-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-session-manager.js","sourceRoot":"","sources":["../../src/cliproxy/auth-session-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAiC/C;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0C/E"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA+E/C;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8C/E"}
@@ -34,18 +34,55 @@ const installer_1 = require("./installer");
34
34
  const ui_1 = require("../../utils/ui");
35
35
  const stats_fetcher_1 = require("../stats-fetcher");
36
36
  const config_generator_1 = require("../config-generator");
37
+ const platform_detector_1 = require("../platform-detector");
37
38
  /** Log helper */
38
39
  function log(message, verbose) {
39
40
  if (verbose)
40
41
  console.error(`[cliproxy] ${message}`);
41
42
  }
43
+ /**
44
+ * Check if version is above max stable (known unstable)
45
+ */
46
+ function isAboveMaxStable(version) {
47
+ return (0, version_checker_1.isNewerVersion)(version, platform_detector_1.CLIPROXY_MAX_STABLE_VERSION);
48
+ }
49
+ /**
50
+ * Clamp version to max stable if newer versions are unstable
51
+ * Returns max stable version if input is empty/invalid
52
+ */
53
+ function clampToMaxStable(version, verbose) {
54
+ if (!version) {
55
+ log(`Empty version, using max stable ${platform_detector_1.CLIPROXY_MAX_STABLE_VERSION}`, verbose);
56
+ return platform_detector_1.CLIPROXY_MAX_STABLE_VERSION;
57
+ }
58
+ if (isAboveMaxStable(version)) {
59
+ log(`Clamping ${version} to max stable ${platform_detector_1.CLIPROXY_MAX_STABLE_VERSION}`, verbose);
60
+ return platform_detector_1.CLIPROXY_MAX_STABLE_VERSION;
61
+ }
62
+ return version;
63
+ }
42
64
  /** Handle auto-update when binary exists */
43
65
  async function handleAutoUpdate(config, verbose) {
44
66
  const updateResult = await (0, version_checker_1.checkForUpdates)(config.binPath, config.version, verbose);
67
+ const currentVersion = updateResult.currentVersion;
68
+ const latestVersion = updateResult.latestVersion;
69
+ // Check if user is on known unstable version - inform but don't force downgrade
70
+ if (isAboveMaxStable(currentVersion)) {
71
+ console.log((0, ui_1.warn)(`CLIProxy Plus v${currentVersion} has known stability issues. ` +
72
+ `Stable version: v${platform_detector_1.CLIPROXY_MAX_STABLE_VERSION}`));
73
+ console.log((0, ui_1.info)('Run "ccs cliproxy install 80" to downgrade, or wait for upstream fix'));
74
+ }
45
75
  if (!updateResult.hasUpdate)
46
76
  return;
77
+ // Clamp to max stable version
78
+ const targetVersion = clampToMaxStable(latestVersion, verbose);
79
+ if (!(0, version_checker_1.isNewerVersion)(targetVersion, currentVersion)) {
80
+ log(`Already at max stable version ${currentVersion}`, verbose);
81
+ return;
82
+ }
47
83
  const proxyRunning = await (0, stats_fetcher_1.isCliproxyRunning)(config_generator_1.CLIPROXY_DEFAULT_PORT);
48
- const updateMsg = `CLIProxy Plus update available: v${updateResult.currentVersion} -> v${updateResult.latestVersion}`;
84
+ const latestNote = isAboveMaxStable(latestVersion) ? ` (latest v${latestVersion} unstable)` : '';
85
+ const updateMsg = `CLIProxy Plus update: v${currentVersion} -> v${targetVersion}${latestNote}`;
49
86
  if (proxyRunning) {
50
87
  console.log((0, ui_1.info)(updateMsg));
51
88
  console.log((0, ui_1.info)('Run "ccs cliproxy stop" then restart to apply update'));
@@ -55,7 +92,7 @@ async function handleAutoUpdate(config, verbose) {
55
92
  console.log((0, ui_1.info)(updateMsg));
56
93
  console.log((0, ui_1.info)('Updating CLIProxy Plus...'));
57
94
  (0, installer_1.deleteBinary)(config.binPath, verbose);
58
- config.version = updateResult.latestVersion;
95
+ config.version = targetVersion;
59
96
  await (0, installer_1.downloadAndInstall)(config, verbose);
60
97
  }
61
98
  }
@@ -87,13 +124,17 @@ async function ensureBinary(config) {
87
124
  if (!config.forceVersion) {
88
125
  try {
89
126
  const latestVersion = await (0, version_checker_1.fetchLatestVersion)(verbose);
90
- if (latestVersion && (0, version_checker_1.isNewerVersion)(latestVersion, config.version)) {
91
- log(`Using latest version: ${latestVersion} (instead of ${config.version})`, verbose);
92
- config.version = latestVersion;
127
+ const targetVersion = clampToMaxStable(latestVersion, verbose);
128
+ if (targetVersion && (0, version_checker_1.isNewerVersion)(targetVersion, config.version)) {
129
+ log(`Using version: ${targetVersion} (instead of ${config.version})`, verbose);
130
+ config.version = targetVersion;
93
131
  }
94
132
  }
95
133
  catch {
96
- log(`Using pinned version: ${config.version}`, verbose);
134
+ // API failed - use fallback but still clamp to max stable
135
+ const fallbackVersion = clampToMaxStable(config.version, verbose);
136
+ config.version = fallbackVersion;
137
+ log(`Using fallback version: ${fallbackVersion}`, verbose);
97
138
  }
98
139
  }
99
140
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -21,4 +21,17 @@ export declare const VERSION_CACHE_DURATION_MS: number;
21
21
  export declare const VERSION_PIN_FILE = ".version-pin";
22
22
  /** GitHub API URL for latest release (CLIProxyAPIPlus fork with Kiro + Copilot support) */
23
23
  export declare const GITHUB_API_LATEST_RELEASE = "https://api.github.com/repos/router-for-me/CLIProxyAPIPlus/releases/latest";
24
+ /** GitHub API URL for all releases */
25
+ export declare const GITHUB_API_ALL_RELEASES = "https://api.github.com/repos/router-for-me/CLIProxyAPIPlus/releases";
26
+ /** Version list cache structure */
27
+ export interface VersionListCache {
28
+ versions: string[];
29
+ latestStable: string;
30
+ latest: string;
31
+ checkedAt: number;
32
+ }
33
+ /** Version list result from API */
34
+ export interface VersionListResult extends VersionListCache {
35
+ fromCache: boolean;
36
+ }
24
37
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0BAA0B;AAC1B,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,2FAA2F;AAC3F,eAAO,MAAM,yBAAyB,+EACwC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0BAA0B;AAC1B,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,2FAA2F;AAC3F,eAAO,MAAM,yBAAyB,+EACwC,CAAC;AAE/E,sCAAsC;AACtC,eAAO,MAAM,uBAAuB,wEACmC,CAAC;AAExE,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,SAAS,EAAE,OAAO,CAAC;CACpB"}
@@ -4,11 +4,13 @@
4
4
  * Types specific to binary management operations.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.GITHUB_API_LATEST_RELEASE = exports.VERSION_PIN_FILE = exports.VERSION_CACHE_DURATION_MS = void 0;
7
+ exports.GITHUB_API_ALL_RELEASES = exports.GITHUB_API_LATEST_RELEASE = exports.VERSION_PIN_FILE = exports.VERSION_CACHE_DURATION_MS = void 0;
8
8
  /** Cache duration for version check (1 hour in milliseconds) */
9
9
  exports.VERSION_CACHE_DURATION_MS = 60 * 60 * 1000;
10
10
  /** Version pin file name - stores user's explicit version choice */
11
11
  exports.VERSION_PIN_FILE = '.version-pin';
12
12
  /** GitHub API URL for latest release (CLIProxyAPIPlus fork with Kiro + Copilot support) */
13
13
  exports.GITHUB_API_LATEST_RELEASE = 'https://api.github.com/repos/router-for-me/CLIProxyAPIPlus/releases/latest';
14
+ /** GitHub API URL for all releases */
15
+ exports.GITHUB_API_ALL_RELEASES = 'https://api.github.com/repos/router-for-me/CLIProxyAPIPlus/releases';
14
16
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAiBH,gEAAgE;AACnD,QAAA,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExD,oEAAoE;AACvD,QAAA,gBAAgB,GAAG,cAAc,CAAC;AAE/C,2FAA2F;AAC9E,QAAA,yBAAyB,GACpC,4EAA4E,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAiBH,gEAAgE;AACnD,QAAA,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExD,oEAAoE;AACvD,QAAA,gBAAgB,GAAG,cAAc,CAAC;AAE/C,2FAA2F;AAC9E,QAAA,yBAAyB,GACpC,4EAA4E,CAAC;AAE/E,sCAAsC;AACzB,QAAA,uBAAuB,GAClC,qEAAqE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Version Cache Manager
3
3
  * Handles reading/writing version cache to avoid excessive GitHub API calls.
4
4
  */
5
- import { VersionCache } from './types';
5
+ import { VersionCache, VersionListCache } from './types';
6
6
  /**
7
7
  * Get path to version cache file
8
8
  */
@@ -43,4 +43,16 @@ export declare function clearPinnedVersion(): void;
43
43
  * Check if a version is currently pinned
44
44
  */
45
45
  export declare function isVersionPinned(): boolean;
46
+ /**
47
+ * Get path to version list cache file
48
+ */
49
+ export declare function getVersionListCachePath(): string;
50
+ /**
51
+ * Read version list cache if still valid
52
+ */
53
+ export declare function readVersionListCache(): VersionListCache | null;
54
+ /**
55
+ * Write version list to cache
56
+ */
57
+ export declare function writeVersionListCache(cache: VersionListCache): void;
46
58
  //# sourceMappingURL=version-cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-cache.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/version-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,YAAY,EAA+C,MAAM,SAAS,CAAC;AAEpF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAoBtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAavD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAUrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAO5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAUhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
1
+ {"version":3,"file":"version-cache.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/version-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACL,YAAY,EAGZ,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAoBtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAavD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAUrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAO5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAUhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,GAAG,IAAI,CAmB9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CASnE"}
@@ -27,7 +27,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
27
27
  return result;
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.isVersionPinned = exports.clearPinnedVersion = exports.savePinnedVersion = exports.getPinnedVersion = exports.writeInstalledVersion = exports.readInstalledVersion = exports.writeVersionCache = exports.readVersionCache = exports.getVersionPinPath = exports.getVersionCachePath = void 0;
30
+ exports.writeVersionListCache = exports.readVersionListCache = exports.getVersionListCachePath = exports.isVersionPinned = exports.clearPinnedVersion = exports.savePinnedVersion = exports.getPinnedVersion = exports.writeInstalledVersion = exports.readInstalledVersion = exports.writeVersionCache = exports.readVersionCache = exports.getVersionPinPath = exports.getVersionCachePath = void 0;
31
31
  const fs = __importStar(require("fs"));
32
32
  const path = __importStar(require("path"));
33
33
  const config_generator_1 = require("../config-generator");
@@ -168,4 +168,49 @@ function isVersionPinned() {
168
168
  return getPinnedVersion() !== null;
169
169
  }
170
170
  exports.isVersionPinned = isVersionPinned;
171
+ // ==================== Version List Cache ====================
172
+ const VERSION_LIST_CACHE_FILE = '.version-list-cache.json';
173
+ /**
174
+ * Get path to version list cache file
175
+ */
176
+ function getVersionListCachePath() {
177
+ return path.join((0, config_generator_1.getCliproxyDir)(), VERSION_LIST_CACHE_FILE);
178
+ }
179
+ exports.getVersionListCachePath = getVersionListCachePath;
180
+ /**
181
+ * Read version list cache if still valid
182
+ */
183
+ function readVersionListCache() {
184
+ const cachePath = getVersionListCachePath();
185
+ if (!fs.existsSync(cachePath)) {
186
+ return null;
187
+ }
188
+ try {
189
+ const content = fs.readFileSync(cachePath, 'utf8');
190
+ const cache = JSON.parse(content);
191
+ // Check if cache is still valid (1 hour)
192
+ if (Date.now() - cache.checkedAt < types_1.VERSION_CACHE_DURATION_MS) {
193
+ return cache;
194
+ }
195
+ return null;
196
+ }
197
+ catch {
198
+ return null;
199
+ }
200
+ }
201
+ exports.readVersionListCache = readVersionListCache;
202
+ /**
203
+ * Write version list to cache
204
+ */
205
+ function writeVersionListCache(cache) {
206
+ const cachePath = getVersionListCachePath();
207
+ try {
208
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
209
+ fs.writeFileSync(cachePath, JSON.stringify(cache), 'utf8');
210
+ }
211
+ catch {
212
+ // Silent fail - caching is optional
213
+ }
214
+ }
215
+ exports.writeVersionListCache = writeVersionListCache;
171
216
  //# sourceMappingURL=version-cache.js.map