@kaitranntt/ccs 7.7.1 → 7.8.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/dist/auth/profile-registry.d.ts +11 -0
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +30 -0
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/ccs.js +12 -0
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/auth-token-manager.d.ts +82 -0
- package/dist/cliproxy/auth-token-manager.d.ts.map +1 -0
- package/dist/cliproxy/auth-token-manager.js +187 -0
- package/dist/cliproxy/auth-token-manager.js.map +1 -0
- package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -1
- package/dist/cliproxy/cliproxy-executor.js +5 -3
- package/dist/cliproxy/cliproxy-executor.js.map +1 -1
- package/dist/cliproxy/config-generator.d.ts +13 -4
- package/dist/cliproxy/config-generator.d.ts.map +1 -1
- package/dist/cliproxy/config-generator.js +37 -15
- package/dist/cliproxy/config-generator.js.map +1 -1
- package/dist/cliproxy/index.d.ts +1 -0
- package/dist/cliproxy/index.d.ts.map +1 -1
- package/dist/cliproxy/index.js +12 -1
- package/dist/cliproxy/index.js.map +1 -1
- package/dist/cliproxy/model-config.d.ts.map +1 -1
- package/dist/cliproxy/model-config.js +4 -3
- package/dist/cliproxy/model-config.js.map +1 -1
- package/dist/cliproxy/services/variant-config-adapter.d.ts +12 -2
- package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-config-adapter.js +49 -6
- package/dist/cliproxy/services/variant-config-adapter.js.map +1 -1
- package/dist/cliproxy/services/variant-service.d.ts +10 -0
- package/dist/cliproxy/services/variant-service.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-service.js +63 -6
- package/dist/cliproxy/services/variant-service.js.map +1 -1
- package/dist/cliproxy/services/variant-settings.d.ts +6 -2
- package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-settings.js +36 -8
- package/dist/cliproxy/services/variant-settings.js.map +1 -1
- package/dist/cliproxy/session-tracker.d.ts +17 -7
- package/dist/cliproxy/session-tracker.d.ts.map +1 -1
- package/dist/cliproxy/session-tracker.js +86 -40
- package/dist/cliproxy/session-tracker.js.map +1 -1
- package/dist/cliproxy/stats-fetcher.js +6 -6
- package/dist/cliproxy/stats-fetcher.js.map +1 -1
- package/dist/commands/cliproxy-command.d.ts.map +1 -1
- package/dist/commands/cliproxy-command.js +8 -3
- package/dist/commands/cliproxy-command.js.map +1 -1
- package/dist/commands/tokens-command.d.ts +19 -0
- package/dist/commands/tokens-command.d.ts.map +1 -0
- package/dist/commands/tokens-command.js +173 -0
- package/dist/commands/tokens-command.js.map +1 -0
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +4 -26
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/config/unified-config-types.d.ts +18 -1
- package/dist/config/unified-config-types.d.ts.map +1 -1
- package/dist/config/unified-config-types.js +2 -1
- package/dist/config/unified-config-types.js.map +1 -1
- package/dist/management/checks/config-check.d.ts +12 -1
- package/dist/management/checks/config-check.d.ts.map +1 -1
- package/dist/management/checks/config-check.js +97 -41
- package/dist/management/checks/config-check.js.map +1 -1
- package/dist/management/checks/profile-check.d.ts +5 -1
- package/dist/management/checks/profile-check.d.ts.map +1 -1
- package/dist/management/checks/profile-check.js +56 -25
- package/dist/management/checks/profile-check.js.map +1 -1
- package/dist/management/recovery-manager.d.ts +0 -12
- package/dist/management/recovery-manager.d.ts.map +1 -1
- package/dist/management/recovery-manager.js +0 -92
- package/dist/management/recovery-manager.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/ui/assets/{accounts-BMhHiKKx.js → accounts-SAhf2aVn.js} +1 -1
- package/dist/ui/assets/{api-OCBlXCQa.js → api-DgjYmgeK.js} +1 -1
- package/dist/ui/assets/auth-section-c488oSia.js +1 -0
- package/dist/ui/assets/{card-CLsl42We.js → card-BrSGmssG.js} +1 -1
- package/dist/ui/assets/cliproxy-DagVtdBM.js +3 -0
- package/dist/ui/assets/cliproxy-control-panel-CqFvwaNM.js +1 -0
- package/dist/ui/assets/{confirm-dialog-BtYM09Tb.js → confirm-dialog-B0FsZkP6.js} +1 -1
- package/dist/ui/assets/{copilot-7MWkGdns.js → copilot-Bccuuvux.js} +2 -2
- package/dist/ui/assets/{globalenv-section-Co6qbs3V.js → globalenv-section-Bli-EFPP.js} +1 -1
- package/dist/ui/assets/{health-Bh1b5210.js → health-mnF1gWAc.js} +1 -1
- package/dist/ui/assets/icons-DBie6Tez.js +1 -0
- package/dist/ui/assets/{index-B_TRzkFq.js → index-B38yaYR3.js} +1 -1
- package/dist/ui/assets/{index-C8KcL2cj.js → index-Buv2h9oP.js} +1 -1
- package/dist/ui/assets/index-CytnH70K.css +1 -0
- package/dist/ui/assets/{index-CXVq9xuH.js → index-mn6heIpP.js} +1 -1
- package/dist/ui/assets/{index-CApIIy9d.js → index-t5yDkLoB.js} +12 -12
- package/dist/ui/assets/{shared-Ckt5nAjF.js → shared-B9w3h6Sd.js} +1 -1
- package/dist/ui/assets/{switch-BCFPnHGe.js → switch-CRxPpAN8.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/web-server/file-watcher.d.ts.map +1 -1
- package/dist/web-server/file-watcher.js +3 -2
- package/dist/web-server/file-watcher.js.map +1 -1
- package/dist/web-server/health/config-checks.d.ts +3 -2
- package/dist/web-server/health/config-checks.d.ts.map +1 -1
- package/dist/web-server/health/config-checks.js +40 -2
- package/dist/web-server/health/config-checks.js.map +1 -1
- package/dist/web-server/health/profile-checks.d.ts +2 -1
- package/dist/web-server/health/profile-checks.d.ts.map +1 -1
- package/dist/web-server/health/profile-checks.js +33 -1
- package/dist/web-server/health/profile-checks.js.map +1 -1
- package/dist/web-server/health-service.d.ts.map +1 -1
- package/dist/web-server/health-service.js +14 -0
- package/dist/web-server/health-service.js.map +1 -1
- package/dist/web-server/overview-routes.d.ts.map +1 -1
- package/dist/web-server/overview-routes.js +10 -29
- package/dist/web-server/overview-routes.js.map +1 -1
- package/dist/web-server/routes/account-routes.d.ts +3 -2
- package/dist/web-server/routes/account-routes.d.ts.map +1 -1
- package/dist/web-server/routes/account-routes.js +43 -46
- package/dist/web-server/routes/account-routes.js.map +1 -1
- package/dist/web-server/routes/route-helpers.d.ts +0 -6
- package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
- package/dist/web-server/routes/route-helpers.js +1 -24
- package/dist/web-server/routes/route-helpers.js.map +1 -1
- package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
- package/dist/web-server/routes/settings-routes.js +161 -13
- package/dist/web-server/routes/settings-routes.js.map +1 -1
- package/dist/web-server/routes/variant-routes.d.ts +2 -0
- package/dist/web-server/routes/variant-routes.d.ts.map +1 -1
- package/dist/web-server/routes/variant-routes.js +44 -98
- package/dist/web-server/routes/variant-routes.js.map +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/cliproxy-C09j9zae.js +0 -3
- package/dist/ui/assets/cliproxy-control-panel-CM6pDYK8.js +0 -1
- package/dist/ui/assets/icons-B9mnOvwW.js +0 -1
- package/dist/ui/assets/index-CK2sRZzn.css +0 -1
|
@@ -29,10 +29,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
29
29
|
return result;
|
|
30
30
|
};
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
-
exports.removeVariant = exports.createVariant = exports.listVariants = exports.variantExists = exports.validateProfileName = void 0;
|
|
32
|
+
exports.updateVariant = exports.removeVariant = exports.createVariant = exports.listVariants = exports.variantExists = exports.validateProfileName = void 0;
|
|
33
|
+
const os = __importStar(require("os"));
|
|
33
34
|
const path = __importStar(require("path"));
|
|
34
35
|
const reserved_names_1 = require("../../config/reserved-names");
|
|
35
36
|
const unified_config_loader_1 = require("../../config/unified-config-loader");
|
|
37
|
+
const config_generator_1 = require("../config-generator");
|
|
38
|
+
const session_tracker_1 = require("../session-tracker");
|
|
36
39
|
const variant_settings_1 = require("./variant-settings");
|
|
37
40
|
const variant_config_adapter_1 = require("./variant-config-adapter");
|
|
38
41
|
/**
|
|
@@ -73,19 +76,21 @@ exports.listVariants = listVariants;
|
|
|
73
76
|
*/
|
|
74
77
|
function createVariant(name, provider, model, account) {
|
|
75
78
|
try {
|
|
79
|
+
// Allocate unique port for this variant
|
|
80
|
+
const port = (0, variant_config_adapter_1.getNextAvailablePort)();
|
|
76
81
|
let settingsPath;
|
|
77
82
|
if ((0, unified_config_loader_1.isUnifiedMode)()) {
|
|
78
|
-
settingsPath = (0, variant_settings_1.createSettingsFileUnified)(name, provider, model);
|
|
79
|
-
(0, variant_config_adapter_1.saveVariantUnified)(name, provider, (0, variant_settings_1.getRelativeSettingsPath)(provider, name), account);
|
|
83
|
+
settingsPath = (0, variant_settings_1.createSettingsFileUnified)(name, provider, model, port);
|
|
84
|
+
(0, variant_config_adapter_1.saveVariantUnified)(name, provider, (0, variant_settings_1.getRelativeSettingsPath)(provider, name), account, port);
|
|
80
85
|
}
|
|
81
86
|
else {
|
|
82
|
-
settingsPath = (0, variant_settings_1.createSettingsFile)(name, provider, model);
|
|
83
|
-
(0, variant_config_adapter_1.saveVariantLegacy)(name, provider, `~/.ccs/${path.basename(settingsPath)}`, account);
|
|
87
|
+
settingsPath = (0, variant_settings_1.createSettingsFile)(name, provider, model, port);
|
|
88
|
+
(0, variant_config_adapter_1.saveVariantLegacy)(name, provider, `~/.ccs/${path.basename(settingsPath)}`, account, port);
|
|
84
89
|
}
|
|
85
90
|
return {
|
|
86
91
|
success: true,
|
|
87
92
|
settingsPath,
|
|
88
|
-
variant: { provider, model, account },
|
|
93
|
+
variant: { provider, model, account, port },
|
|
89
94
|
};
|
|
90
95
|
}
|
|
91
96
|
catch (error) {
|
|
@@ -107,6 +112,11 @@ function removeVariant(name) {
|
|
|
107
112
|
if (unifiedVariant?.settings) {
|
|
108
113
|
(0, variant_settings_1.deleteSettingsFile)(unifiedVariant.settings);
|
|
109
114
|
}
|
|
115
|
+
// Clean up port-specific config and session files
|
|
116
|
+
if (unifiedVariant?.port) {
|
|
117
|
+
(0, config_generator_1.deleteConfigForPort)(unifiedVariant.port);
|
|
118
|
+
(0, session_tracker_1.deleteSessionLockForPort)(unifiedVariant.port);
|
|
119
|
+
}
|
|
110
120
|
variant = unifiedVariant;
|
|
111
121
|
}
|
|
112
122
|
else {
|
|
@@ -114,6 +124,11 @@ function removeVariant(name) {
|
|
|
114
124
|
if (variant?.settings) {
|
|
115
125
|
(0, variant_settings_1.deleteSettingsFile)(variant.settings);
|
|
116
126
|
}
|
|
127
|
+
// Clean up port-specific config and session files
|
|
128
|
+
if (variant?.port) {
|
|
129
|
+
(0, config_generator_1.deleteConfigForPort)(variant.port);
|
|
130
|
+
(0, session_tracker_1.deleteSessionLockForPort)(variant.port);
|
|
131
|
+
}
|
|
117
132
|
}
|
|
118
133
|
if (!variant) {
|
|
119
134
|
return { success: false, error: `Variant '${name}' not found` };
|
|
@@ -125,4 +140,46 @@ function removeVariant(name) {
|
|
|
125
140
|
}
|
|
126
141
|
}
|
|
127
142
|
exports.removeVariant = removeVariant;
|
|
143
|
+
/**
|
|
144
|
+
* Update an existing CLIProxy variant
|
|
145
|
+
*/
|
|
146
|
+
function updateVariant(name, updates) {
|
|
147
|
+
try {
|
|
148
|
+
const variants = (0, variant_config_adapter_1.listVariantsFromConfig)();
|
|
149
|
+
const existing = variants[name];
|
|
150
|
+
if (!existing) {
|
|
151
|
+
return { success: false, error: `Variant '${name}' not found` };
|
|
152
|
+
}
|
|
153
|
+
// Update model in settings file if provided
|
|
154
|
+
if (updates.model !== undefined && existing.settings) {
|
|
155
|
+
const settingsPath = existing.settings.replace(/^~/, os.homedir());
|
|
156
|
+
(0, variant_settings_1.updateSettingsModel)(settingsPath, updates.model);
|
|
157
|
+
}
|
|
158
|
+
// Update config entry if provider or account changed
|
|
159
|
+
if (updates.provider !== undefined || updates.account !== undefined) {
|
|
160
|
+
const newProvider = updates.provider ?? existing.provider;
|
|
161
|
+
const newAccount = updates.account !== undefined ? updates.account : existing.account;
|
|
162
|
+
if ((0, unified_config_loader_1.isUnifiedMode)()) {
|
|
163
|
+
(0, variant_config_adapter_1.saveVariantUnified)(name, newProvider, existing.settings || '', newAccount || undefined, existing.port);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
(0, variant_config_adapter_1.saveVariantLegacy)(name, newProvider, existing.settings || '', newAccount || undefined, existing.port);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
success: true,
|
|
171
|
+
variant: {
|
|
172
|
+
provider: updates.provider ?? existing.provider,
|
|
173
|
+
model: updates.model ?? existing.model,
|
|
174
|
+
account: updates.account !== undefined ? updates.account : existing.account,
|
|
175
|
+
port: existing.port,
|
|
176
|
+
settings: existing.settings,
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return { success: false, error: error.message };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.updateVariant = updateVariant;
|
|
128
185
|
//# sourceMappingURL=variant-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant-service.js","sourceRoot":"","sources":["../../../src/cliproxy/services/variant-service.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAG7B,gEAA6D;AAC7D,8EAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"variant-service.js","sourceRoot":"","sources":["../../../src/cliproxy/services/variant-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,14 +20,18 @@ export declare function getRelativeSettingsPath(provider: CLIProxyProfileName, n
|
|
|
20
20
|
/**
|
|
21
21
|
* Create settings.json file for CLIProxy variant (legacy mode)
|
|
22
22
|
*/
|
|
23
|
-
export declare function createSettingsFile(name: string, provider: CLIProxyProfileName, model: string): string;
|
|
23
|
+
export declare function createSettingsFile(name: string, provider: CLIProxyProfileName, model: string, port?: number): string;
|
|
24
24
|
/**
|
|
25
25
|
* Create settings.json file for CLIProxy variant (unified mode)
|
|
26
26
|
*/
|
|
27
|
-
export declare function createSettingsFileUnified(name: string, provider: CLIProxyProfileName, model: string): string;
|
|
27
|
+
export declare function createSettingsFileUnified(name: string, provider: CLIProxyProfileName, model: string, port?: number): string;
|
|
28
28
|
/**
|
|
29
29
|
* Delete settings file if it exists.
|
|
30
30
|
* Uses expandPath() for cross-platform path handling.
|
|
31
31
|
*/
|
|
32
32
|
export declare function deleteSettingsFile(settingsPath: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Update model in an existing settings file
|
|
35
|
+
*/
|
|
36
|
+
export declare function updateSettingsModel(settingsPath: string, model: string): void;
|
|
33
37
|
//# sourceMappingURL=variant-settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant-settings.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/services/variant-settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"variant-settings.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/services/variant-settings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAwDlE;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAA8B,GACnC,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAA8B,GACnC,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAOhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAwB7E"}
|
|
@@ -29,7 +29,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
29
29
|
return result;
|
|
30
30
|
};
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
-
exports.deleteSettingsFile = exports.createSettingsFileUnified = exports.createSettingsFile = exports.getRelativeSettingsPath = exports.getSettingsFileName = exports.getSettingsFilePath = void 0;
|
|
32
|
+
exports.updateSettingsModel = exports.deleteSettingsFile = exports.createSettingsFileUnified = exports.createSettingsFile = exports.getRelativeSettingsPath = exports.getSettingsFileName = exports.getSettingsFilePath = void 0;
|
|
33
33
|
const fs = __importStar(require("fs"));
|
|
34
34
|
const path = __importStar(require("path"));
|
|
35
35
|
const os = __importStar(require("os"));
|
|
@@ -39,8 +39,8 @@ const config_generator_1 = require("../config-generator");
|
|
|
39
39
|
/**
|
|
40
40
|
* Build settings env object for a variant
|
|
41
41
|
*/
|
|
42
|
-
function buildSettingsEnv(provider, model) {
|
|
43
|
-
const baseEnv = (0, config_generator_1.getClaudeEnvVars)(provider,
|
|
42
|
+
function buildSettingsEnv(provider, model, port = config_generator_1.CLIPROXY_DEFAULT_PORT) {
|
|
43
|
+
const baseEnv = (0, config_generator_1.getClaudeEnvVars)(provider, port);
|
|
44
44
|
return {
|
|
45
45
|
ANTHROPIC_BASE_URL: baseEnv.ANTHROPIC_BASE_URL || '',
|
|
46
46
|
ANTHROPIC_AUTH_TOKEN: baseEnv.ANTHROPIC_AUTH_TOKEN || '',
|
|
@@ -89,11 +89,11 @@ exports.getRelativeSettingsPath = getRelativeSettingsPath;
|
|
|
89
89
|
/**
|
|
90
90
|
* Create settings.json file for CLIProxy variant (legacy mode)
|
|
91
91
|
*/
|
|
92
|
-
function createSettingsFile(name, provider, model) {
|
|
92
|
+
function createSettingsFile(name, provider, model, port = config_generator_1.CLIPROXY_DEFAULT_PORT) {
|
|
93
93
|
const ccsDir = (0, config_manager_1.getCcsDir)();
|
|
94
94
|
const settingsPath = getSettingsFilePath(provider, name);
|
|
95
95
|
const settings = {
|
|
96
|
-
env: buildSettingsEnv(provider, model),
|
|
96
|
+
env: buildSettingsEnv(provider, model, port),
|
|
97
97
|
};
|
|
98
98
|
ensureDir(ccsDir);
|
|
99
99
|
writeSettings(settingsPath, settings);
|
|
@@ -103,11 +103,11 @@ exports.createSettingsFile = createSettingsFile;
|
|
|
103
103
|
/**
|
|
104
104
|
* Create settings.json file for CLIProxy variant (unified mode)
|
|
105
105
|
*/
|
|
106
|
-
function createSettingsFileUnified(name, provider, model) {
|
|
107
|
-
const ccsDir =
|
|
106
|
+
function createSettingsFileUnified(name, provider, model, port = config_generator_1.CLIPROXY_DEFAULT_PORT) {
|
|
107
|
+
const ccsDir = (0, config_manager_1.getCcsDir)(); // Use centralized function for CCS_HOME support
|
|
108
108
|
const settingsPath = path.join(ccsDir, getSettingsFileName(provider, name));
|
|
109
109
|
const settings = {
|
|
110
|
-
env: buildSettingsEnv(provider, model),
|
|
110
|
+
env: buildSettingsEnv(provider, model, port),
|
|
111
111
|
};
|
|
112
112
|
ensureDir(ccsDir);
|
|
113
113
|
writeSettings(settingsPath, settings);
|
|
@@ -127,4 +127,32 @@ function deleteSettingsFile(settingsPath) {
|
|
|
127
127
|
return false;
|
|
128
128
|
}
|
|
129
129
|
exports.deleteSettingsFile = deleteSettingsFile;
|
|
130
|
+
/**
|
|
131
|
+
* Update model in an existing settings file
|
|
132
|
+
*/
|
|
133
|
+
function updateSettingsModel(settingsPath, model) {
|
|
134
|
+
const resolvedPath = settingsPath.replace(/^~/, os.homedir());
|
|
135
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const content = fs.readFileSync(resolvedPath, 'utf8');
|
|
140
|
+
const settings = JSON.parse(content);
|
|
141
|
+
if (model) {
|
|
142
|
+
settings.env = settings.env || {};
|
|
143
|
+
settings.env.ANTHROPIC_MODEL = model;
|
|
144
|
+
settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = model;
|
|
145
|
+
settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = model;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Clear model settings to use defaults
|
|
149
|
+
delete settings.env.ANTHROPIC_MODEL;
|
|
150
|
+
}
|
|
151
|
+
fs.writeFileSync(resolvedPath, JSON.stringify(settings, null, 2) + '\n', 'utf8');
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Ignore errors - settings file may be invalid
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.updateSettingsModel = updateSettingsModel;
|
|
130
158
|
//# sourceMappingURL=variant-settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant-settings.js","sourceRoot":"","sources":["../../../src/cliproxy/services/variant-settings.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,+DAAuD;AACvD,iDAAiD;AACjD,0DAA8E;AAiB9E;;GAEG;AACH,SAAS,gBAAgB,
|
|
1
|
+
{"version":3,"file":"variant-settings.js","sourceRoot":"","sources":["../../../src/cliproxy/services/variant-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,12 @@ interface SessionLock {
|
|
|
20
20
|
sessions: string[];
|
|
21
21
|
startedAt: string;
|
|
22
22
|
}
|
|
23
|
+
/** Get path to session lock file (default port) - kept for future use */
|
|
24
|
+
declare function _getSessionLockPath(): string;
|
|
25
|
+
export { _getSessionLockPath as getSessionLockPath };
|
|
26
|
+
export { deleteSessionLockForPort };
|
|
27
|
+
/** Delete session lock file for specific port */
|
|
28
|
+
declare function deleteSessionLockForPort(port: number): void;
|
|
23
29
|
/**
|
|
24
30
|
* Check if there's an existing proxy running that we can reuse.
|
|
25
31
|
* Returns the existing lock if proxy is healthy, null otherwise.
|
|
@@ -33,18 +39,22 @@ export declare function getExistingProxy(port: number): SessionLock | null;
|
|
|
33
39
|
export declare function registerSession(port: number, proxyPid: number): string;
|
|
34
40
|
/**
|
|
35
41
|
* Unregister a session from the proxy.
|
|
42
|
+
* @param sessionId Session ID to unregister
|
|
43
|
+
* @param port Port to unregister from (optional, searches default port if not provided)
|
|
36
44
|
* @returns true if this was the last session (proxy should be killed)
|
|
37
45
|
*/
|
|
38
|
-
export declare function unregisterSession(sessionId: string): boolean;
|
|
46
|
+
export declare function unregisterSession(sessionId: string, port?: number): boolean;
|
|
39
47
|
/**
|
|
40
48
|
* Get current session count for the proxy.
|
|
49
|
+
* @param port Port to check (defaults to CLIPROXY_DEFAULT_PORT)
|
|
41
50
|
*/
|
|
42
|
-
export declare function getSessionCount(): number;
|
|
51
|
+
export declare function getSessionCount(port?: number): number;
|
|
43
52
|
/**
|
|
44
53
|
* Check if proxy has any active sessions.
|
|
45
54
|
* Used to determine if a "zombie" proxy should be killed.
|
|
55
|
+
* @param port Port to check (defaults to CLIPROXY_DEFAULT_PORT)
|
|
46
56
|
*/
|
|
47
|
-
export declare function hasActiveSessions(): boolean;
|
|
57
|
+
export declare function hasActiveSessions(port?: number): boolean;
|
|
48
58
|
/**
|
|
49
59
|
* Clean up orphaned sessions (when proxy crashes).
|
|
50
60
|
* Called on startup to ensure clean state.
|
|
@@ -53,23 +63,23 @@ export declare function cleanupOrphanedSessions(port: number): void;
|
|
|
53
63
|
/**
|
|
54
64
|
* Stop the CLIProxy process and clean up session lock.
|
|
55
65
|
* Falls back to port-based detection if no session lock exists.
|
|
66
|
+
* @param port Port to stop (defaults to CLIPROXY_DEFAULT_PORT)
|
|
56
67
|
* @returns Object with success status and details
|
|
57
68
|
*/
|
|
58
|
-
export declare function stopProxy(): Promise<{
|
|
69
|
+
export declare function stopProxy(port?: number): Promise<{
|
|
59
70
|
stopped: boolean;
|
|
60
71
|
pid?: number;
|
|
61
72
|
sessionCount?: number;
|
|
62
73
|
error?: string;
|
|
63
74
|
}>;
|
|
64
75
|
/**
|
|
65
|
-
* Get proxy status information.
|
|
76
|
+
* Get proxy status information for specific port.
|
|
66
77
|
*/
|
|
67
|
-
export declare function getProxyStatus(): {
|
|
78
|
+
export declare function getProxyStatus(port?: number): {
|
|
68
79
|
running: boolean;
|
|
69
80
|
port?: number;
|
|
70
81
|
pid?: number;
|
|
71
82
|
sessionCount?: number;
|
|
72
83
|
startedAt?: string;
|
|
73
84
|
};
|
|
74
|
-
export {};
|
|
75
85
|
//# sourceMappingURL=session-tracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-tracker.d.ts","sourceRoot":"","sources":["../../src/cliproxy/session-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,kCAAkC;AAClC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"session-tracker.d.ts","sourceRoot":"","sources":["../../src/cliproxy/session-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,kCAAkC;AAClC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD,yEAAyE;AACzE,iBAAS,mBAAmB,IAAI,MAAM,CAErC;AAGD,OAAO,EAAE,mBAAmB,IAAI,kBAAkB,EAAE,CAAC;AAGrD,OAAO,EAAE,wBAAwB,EAAE,CAAC;AAwCpC,iDAAiD;AACjD,iBAAS,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASpD;AAwBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAmBjE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBtE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CA6C3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAA8B,GAAG,MAAM,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAA8B,GAAG,OAAO,CAa/E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAe1D;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAA8B,GAAG,OAAO,CAAC;IAC7E,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAyDD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAA8B,GAAG;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAoBA"}
|
|
@@ -38,7 +38,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
38
38
|
return result;
|
|
39
39
|
};
|
|
40
40
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
exports.getProxyStatus = exports.stopProxy = exports.cleanupOrphanedSessions = exports.hasActiveSessions = exports.getSessionCount = exports.unregisterSession = exports.registerSession = exports.getExistingProxy = void 0;
|
|
41
|
+
exports.getProxyStatus = exports.stopProxy = exports.cleanupOrphanedSessions = exports.hasActiveSessions = exports.getSessionCount = exports.unregisterSession = exports.registerSession = exports.getExistingProxy = exports.deleteSessionLockForPort = exports.getSessionLockPath = void 0;
|
|
42
42
|
const fs = __importStar(require("fs"));
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
44
|
const crypto = __importStar(require("crypto"));
|
|
@@ -49,13 +49,21 @@ const config_generator_2 = require("./config-generator");
|
|
|
49
49
|
function generateSessionId() {
|
|
50
50
|
return crypto.randomBytes(8).toString('hex');
|
|
51
51
|
}
|
|
52
|
-
/** Get path to session lock file */
|
|
53
|
-
function
|
|
54
|
-
|
|
52
|
+
/** Get path to session lock file for specific port */
|
|
53
|
+
function getSessionLockPathForPort(port) {
|
|
54
|
+
if (port === config_generator_2.CLIPROXY_DEFAULT_PORT) {
|
|
55
|
+
return path.join((0, config_generator_1.getCliproxyDir)(), 'sessions.json');
|
|
56
|
+
}
|
|
57
|
+
return path.join((0, config_generator_1.getCliproxyDir)(), `sessions-${port}.json`);
|
|
55
58
|
}
|
|
56
|
-
/**
|
|
57
|
-
function
|
|
58
|
-
|
|
59
|
+
/** Get path to session lock file (default port) - kept for future use */
|
|
60
|
+
function _getSessionLockPath() {
|
|
61
|
+
return getSessionLockPathForPort(config_generator_2.CLIPROXY_DEFAULT_PORT);
|
|
62
|
+
}
|
|
63
|
+
exports.getSessionLockPath = _getSessionLockPath;
|
|
64
|
+
/** Read session lock file for specific port (returns null if not exists or invalid) */
|
|
65
|
+
function readSessionLockForPort(port) {
|
|
66
|
+
const lockPath = getSessionLockPathForPort(port);
|
|
59
67
|
try {
|
|
60
68
|
if (!fs.existsSync(lockPath)) {
|
|
61
69
|
return null;
|
|
@@ -74,18 +82,22 @@ function readSessionLock() {
|
|
|
74
82
|
return null;
|
|
75
83
|
}
|
|
76
84
|
}
|
|
77
|
-
/**
|
|
78
|
-
function
|
|
79
|
-
|
|
85
|
+
/** Read session lock file (default port, returns null if not exists or invalid) */
|
|
86
|
+
function readSessionLock() {
|
|
87
|
+
return readSessionLockForPort(config_generator_2.CLIPROXY_DEFAULT_PORT);
|
|
88
|
+
}
|
|
89
|
+
/** Write session lock file for specific port */
|
|
90
|
+
function writeSessionLockForPort(lock) {
|
|
91
|
+
const lockPath = getSessionLockPathForPort(lock.port);
|
|
80
92
|
const dir = path.dirname(lockPath);
|
|
81
93
|
if (!fs.existsSync(dir)) {
|
|
82
94
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
83
95
|
}
|
|
84
96
|
fs.writeFileSync(lockPath, JSON.stringify(lock, null, 2), { mode: 0o600 });
|
|
85
97
|
}
|
|
86
|
-
/** Delete session lock file */
|
|
87
|
-
function
|
|
88
|
-
const lockPath =
|
|
98
|
+
/** Delete session lock file for specific port */
|
|
99
|
+
function deleteSessionLockForPort(port) {
|
|
100
|
+
const lockPath = getSessionLockPathForPort(port);
|
|
89
101
|
try {
|
|
90
102
|
if (fs.existsSync(lockPath)) {
|
|
91
103
|
fs.unlinkSync(lockPath);
|
|
@@ -95,6 +107,11 @@ function deleteSessionLock() {
|
|
|
95
107
|
// Ignore errors on cleanup
|
|
96
108
|
}
|
|
97
109
|
}
|
|
110
|
+
exports.deleteSessionLockForPort = deleteSessionLockForPort;
|
|
111
|
+
/** Delete session lock file (default port) */
|
|
112
|
+
function deleteSessionLock() {
|
|
113
|
+
deleteSessionLockForPort(config_generator_2.CLIPROXY_DEFAULT_PORT);
|
|
114
|
+
}
|
|
98
115
|
/** Check if a PID is still running */
|
|
99
116
|
function isProcessRunning(pid) {
|
|
100
117
|
try {
|
|
@@ -102,7 +119,13 @@ function isProcessRunning(pid) {
|
|
|
102
119
|
process.kill(pid, 0);
|
|
103
120
|
return true;
|
|
104
121
|
}
|
|
105
|
-
catch {
|
|
122
|
+
catch (err) {
|
|
123
|
+
const e = err;
|
|
124
|
+
// EPERM means process exists but we don't have permission to signal it
|
|
125
|
+
if (e.code === 'EPERM') {
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
// ESRCH means no such process
|
|
106
129
|
return false;
|
|
107
130
|
}
|
|
108
131
|
}
|
|
@@ -111,7 +134,7 @@ function isProcessRunning(pid) {
|
|
|
111
134
|
* Returns the existing lock if proxy is healthy, null otherwise.
|
|
112
135
|
*/
|
|
113
136
|
function getExistingProxy(port) {
|
|
114
|
-
const lock =
|
|
137
|
+
const lock = readSessionLockForPort(port);
|
|
115
138
|
if (!lock) {
|
|
116
139
|
return null;
|
|
117
140
|
}
|
|
@@ -122,7 +145,7 @@ function getExistingProxy(port) {
|
|
|
122
145
|
// Verify proxy process is still running
|
|
123
146
|
if (!isProcessRunning(lock.pid)) {
|
|
124
147
|
// Proxy crashed - clean up stale lock
|
|
125
|
-
|
|
148
|
+
deleteSessionLockForPort(port);
|
|
126
149
|
return null;
|
|
127
150
|
}
|
|
128
151
|
return lock;
|
|
@@ -135,11 +158,11 @@ exports.getExistingProxy = getExistingProxy;
|
|
|
135
158
|
*/
|
|
136
159
|
function registerSession(port, proxyPid) {
|
|
137
160
|
const sessionId = generateSessionId();
|
|
138
|
-
const existingLock =
|
|
161
|
+
const existingLock = readSessionLockForPort(port);
|
|
139
162
|
if (existingLock && existingLock.port === port && existingLock.pid === proxyPid) {
|
|
140
163
|
// Add to existing sessions
|
|
141
164
|
existingLock.sessions.push(sessionId);
|
|
142
|
-
|
|
165
|
+
writeSessionLockForPort(existingLock);
|
|
143
166
|
}
|
|
144
167
|
else {
|
|
145
168
|
// Create new lock (first session for this proxy)
|
|
@@ -149,16 +172,36 @@ function registerSession(port, proxyPid) {
|
|
|
149
172
|
sessions: [sessionId],
|
|
150
173
|
startedAt: new Date().toISOString(),
|
|
151
174
|
};
|
|
152
|
-
|
|
175
|
+
writeSessionLockForPort(newLock);
|
|
153
176
|
}
|
|
154
177
|
return sessionId;
|
|
155
178
|
}
|
|
156
179
|
exports.registerSession = registerSession;
|
|
157
180
|
/**
|
|
158
181
|
* Unregister a session from the proxy.
|
|
182
|
+
* @param sessionId Session ID to unregister
|
|
183
|
+
* @param port Port to unregister from (optional, searches default port if not provided)
|
|
159
184
|
* @returns true if this was the last session (proxy should be killed)
|
|
160
185
|
*/
|
|
161
|
-
function unregisterSession(sessionId) {
|
|
186
|
+
function unregisterSession(sessionId, port) {
|
|
187
|
+
// If port provided, use port-specific lookup
|
|
188
|
+
if (port !== undefined) {
|
|
189
|
+
const lock = readSessionLockForPort(port);
|
|
190
|
+
if (!lock) {
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
const index = lock.sessions.indexOf(sessionId);
|
|
194
|
+
if (index !== -1) {
|
|
195
|
+
lock.sessions.splice(index, 1);
|
|
196
|
+
}
|
|
197
|
+
if (lock.sessions.length === 0) {
|
|
198
|
+
deleteSessionLockForPort(port);
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
writeSessionLockForPort(lock);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
// Fallback: search default port (backward compat)
|
|
162
205
|
const lock = readSessionLock();
|
|
163
206
|
if (!lock) {
|
|
164
207
|
// No lock file - assume we're the only session
|
|
@@ -176,15 +219,16 @@ function unregisterSession(sessionId) {
|
|
|
176
219
|
return true;
|
|
177
220
|
}
|
|
178
221
|
// Other sessions still active - keep proxy running
|
|
179
|
-
|
|
222
|
+
writeSessionLockForPort(lock);
|
|
180
223
|
return false;
|
|
181
224
|
}
|
|
182
225
|
exports.unregisterSession = unregisterSession;
|
|
183
226
|
/**
|
|
184
227
|
* Get current session count for the proxy.
|
|
228
|
+
* @param port Port to check (defaults to CLIPROXY_DEFAULT_PORT)
|
|
185
229
|
*/
|
|
186
|
-
function getSessionCount() {
|
|
187
|
-
const lock =
|
|
230
|
+
function getSessionCount(port = config_generator_2.CLIPROXY_DEFAULT_PORT) {
|
|
231
|
+
const lock = readSessionLockForPort(port);
|
|
188
232
|
if (!lock) {
|
|
189
233
|
return 0;
|
|
190
234
|
}
|
|
@@ -194,15 +238,16 @@ exports.getSessionCount = getSessionCount;
|
|
|
194
238
|
/**
|
|
195
239
|
* Check if proxy has any active sessions.
|
|
196
240
|
* Used to determine if a "zombie" proxy should be killed.
|
|
241
|
+
* @param port Port to check (defaults to CLIPROXY_DEFAULT_PORT)
|
|
197
242
|
*/
|
|
198
|
-
function hasActiveSessions() {
|
|
199
|
-
const lock =
|
|
243
|
+
function hasActiveSessions(port = config_generator_2.CLIPROXY_DEFAULT_PORT) {
|
|
244
|
+
const lock = readSessionLockForPort(port);
|
|
200
245
|
if (!lock) {
|
|
201
246
|
return false;
|
|
202
247
|
}
|
|
203
248
|
// Verify proxy is still running
|
|
204
249
|
if (!isProcessRunning(lock.pid)) {
|
|
205
|
-
|
|
250
|
+
deleteSessionLockForPort(port);
|
|
206
251
|
return false;
|
|
207
252
|
}
|
|
208
253
|
return lock.sessions.length > 0;
|
|
@@ -213,37 +258,38 @@ exports.hasActiveSessions = hasActiveSessions;
|
|
|
213
258
|
* Called on startup to ensure clean state.
|
|
214
259
|
*/
|
|
215
260
|
function cleanupOrphanedSessions(port) {
|
|
216
|
-
const lock =
|
|
261
|
+
const lock = readSessionLockForPort(port);
|
|
217
262
|
if (!lock) {
|
|
218
263
|
return;
|
|
219
264
|
}
|
|
220
|
-
// If port doesn't match, this
|
|
265
|
+
// If port doesn't match, this shouldn't happen with port-specific files
|
|
221
266
|
if (lock.port !== port) {
|
|
222
267
|
return;
|
|
223
268
|
}
|
|
224
269
|
// If proxy is dead, clean up lock
|
|
225
270
|
if (!isProcessRunning(lock.pid)) {
|
|
226
|
-
|
|
271
|
+
deleteSessionLockForPort(port);
|
|
227
272
|
}
|
|
228
273
|
}
|
|
229
274
|
exports.cleanupOrphanedSessions = cleanupOrphanedSessions;
|
|
230
275
|
/**
|
|
231
276
|
* Stop the CLIProxy process and clean up session lock.
|
|
232
277
|
* Falls back to port-based detection if no session lock exists.
|
|
278
|
+
* @param port Port to stop (defaults to CLIPROXY_DEFAULT_PORT)
|
|
233
279
|
* @returns Object with success status and details
|
|
234
280
|
*/
|
|
235
|
-
async function stopProxy() {
|
|
236
|
-
const lock =
|
|
281
|
+
async function stopProxy(port = config_generator_2.CLIPROXY_DEFAULT_PORT) {
|
|
282
|
+
const lock = readSessionLockForPort(port);
|
|
237
283
|
if (!lock) {
|
|
238
284
|
// No session lock - try to find process by port (legacy/untracked proxy)
|
|
239
|
-
const portProcess = await (0, port_utils_1.getPortProcess)(
|
|
285
|
+
const portProcess = await (0, port_utils_1.getPortProcess)(port);
|
|
240
286
|
if (!portProcess) {
|
|
241
287
|
return { stopped: false, error: 'No active CLIProxy session found' };
|
|
242
288
|
}
|
|
243
289
|
if (!(0, port_utils_1.isCLIProxyProcess)(portProcess)) {
|
|
244
290
|
return {
|
|
245
291
|
stopped: false,
|
|
246
|
-
error: `Port ${
|
|
292
|
+
error: `Port ${port} is in use by ${portProcess.processName}, not CLIProxy`,
|
|
247
293
|
};
|
|
248
294
|
}
|
|
249
295
|
// Found CLIProxy running without session lock - kill it
|
|
@@ -261,7 +307,7 @@ async function stopProxy() {
|
|
|
261
307
|
}
|
|
262
308
|
// Check if proxy is running
|
|
263
309
|
if (!isProcessRunning(lock.pid)) {
|
|
264
|
-
|
|
310
|
+
deleteSessionLockForPort(port);
|
|
265
311
|
return { stopped: false, error: 'CLIProxy was not running (cleaned up stale lock)' };
|
|
266
312
|
}
|
|
267
313
|
const sessionCount = lock.sessions.length;
|
|
@@ -270,14 +316,14 @@ async function stopProxy() {
|
|
|
270
316
|
// Kill the proxy process
|
|
271
317
|
process.kill(pid, 'SIGTERM');
|
|
272
318
|
// Clean up session lock
|
|
273
|
-
|
|
319
|
+
deleteSessionLockForPort(port);
|
|
274
320
|
return { stopped: true, pid, sessionCount };
|
|
275
321
|
}
|
|
276
322
|
catch (err) {
|
|
277
323
|
const error = err;
|
|
278
324
|
if (error.code === 'ESRCH') {
|
|
279
325
|
// Process already gone
|
|
280
|
-
|
|
326
|
+
deleteSessionLockForPort(port);
|
|
281
327
|
return { stopped: false, error: 'CLIProxy process already terminated' };
|
|
282
328
|
}
|
|
283
329
|
return { stopped: false, pid, error: `Failed to stop: ${error.message}` };
|
|
@@ -285,16 +331,16 @@ async function stopProxy() {
|
|
|
285
331
|
}
|
|
286
332
|
exports.stopProxy = stopProxy;
|
|
287
333
|
/**
|
|
288
|
-
* Get proxy status information.
|
|
334
|
+
* Get proxy status information for specific port.
|
|
289
335
|
*/
|
|
290
|
-
function getProxyStatus() {
|
|
291
|
-
const lock =
|
|
336
|
+
function getProxyStatus(port = config_generator_2.CLIPROXY_DEFAULT_PORT) {
|
|
337
|
+
const lock = readSessionLockForPort(port);
|
|
292
338
|
if (!lock) {
|
|
293
339
|
return { running: false };
|
|
294
340
|
}
|
|
295
341
|
// Verify proxy is still running
|
|
296
342
|
if (!isProcessRunning(lock.pid)) {
|
|
297
|
-
|
|
343
|
+
deleteSessionLockForPort(port);
|
|
298
344
|
return { running: false };
|
|
299
345
|
}
|
|
300
346
|
return {
|