@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.
Files changed (127) hide show
  1. package/dist/auth/profile-registry.d.ts +11 -0
  2. package/dist/auth/profile-registry.d.ts.map +1 -1
  3. package/dist/auth/profile-registry.js +30 -0
  4. package/dist/auth/profile-registry.js.map +1 -1
  5. package/dist/ccs.js +12 -0
  6. package/dist/ccs.js.map +1 -1
  7. package/dist/cliproxy/auth-token-manager.d.ts +82 -0
  8. package/dist/cliproxy/auth-token-manager.d.ts.map +1 -0
  9. package/dist/cliproxy/auth-token-manager.js +187 -0
  10. package/dist/cliproxy/auth-token-manager.js.map +1 -0
  11. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -1
  12. package/dist/cliproxy/cliproxy-executor.js +5 -3
  13. package/dist/cliproxy/cliproxy-executor.js.map +1 -1
  14. package/dist/cliproxy/config-generator.d.ts +13 -4
  15. package/dist/cliproxy/config-generator.d.ts.map +1 -1
  16. package/dist/cliproxy/config-generator.js +37 -15
  17. package/dist/cliproxy/config-generator.js.map +1 -1
  18. package/dist/cliproxy/index.d.ts +1 -0
  19. package/dist/cliproxy/index.d.ts.map +1 -1
  20. package/dist/cliproxy/index.js +12 -1
  21. package/dist/cliproxy/index.js.map +1 -1
  22. package/dist/cliproxy/model-config.d.ts.map +1 -1
  23. package/dist/cliproxy/model-config.js +4 -3
  24. package/dist/cliproxy/model-config.js.map +1 -1
  25. package/dist/cliproxy/services/variant-config-adapter.d.ts +12 -2
  26. package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -1
  27. package/dist/cliproxy/services/variant-config-adapter.js +49 -6
  28. package/dist/cliproxy/services/variant-config-adapter.js.map +1 -1
  29. package/dist/cliproxy/services/variant-service.d.ts +10 -0
  30. package/dist/cliproxy/services/variant-service.d.ts.map +1 -1
  31. package/dist/cliproxy/services/variant-service.js +63 -6
  32. package/dist/cliproxy/services/variant-service.js.map +1 -1
  33. package/dist/cliproxy/services/variant-settings.d.ts +6 -2
  34. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
  35. package/dist/cliproxy/services/variant-settings.js +36 -8
  36. package/dist/cliproxy/services/variant-settings.js.map +1 -1
  37. package/dist/cliproxy/session-tracker.d.ts +17 -7
  38. package/dist/cliproxy/session-tracker.d.ts.map +1 -1
  39. package/dist/cliproxy/session-tracker.js +86 -40
  40. package/dist/cliproxy/session-tracker.js.map +1 -1
  41. package/dist/cliproxy/stats-fetcher.js +6 -6
  42. package/dist/cliproxy/stats-fetcher.js.map +1 -1
  43. package/dist/commands/cliproxy-command.d.ts.map +1 -1
  44. package/dist/commands/cliproxy-command.js +8 -3
  45. package/dist/commands/cliproxy-command.js.map +1 -1
  46. package/dist/commands/tokens-command.d.ts +19 -0
  47. package/dist/commands/tokens-command.d.ts.map +1 -0
  48. package/dist/commands/tokens-command.js +173 -0
  49. package/dist/commands/tokens-command.js.map +1 -0
  50. package/dist/config/unified-config-loader.d.ts.map +1 -1
  51. package/dist/config/unified-config-loader.js +4 -26
  52. package/dist/config/unified-config-loader.js.map +1 -1
  53. package/dist/config/unified-config-types.d.ts +18 -1
  54. package/dist/config/unified-config-types.d.ts.map +1 -1
  55. package/dist/config/unified-config-types.js +2 -1
  56. package/dist/config/unified-config-types.js.map +1 -1
  57. package/dist/management/checks/config-check.d.ts +12 -1
  58. package/dist/management/checks/config-check.d.ts.map +1 -1
  59. package/dist/management/checks/config-check.js +97 -41
  60. package/dist/management/checks/config-check.js.map +1 -1
  61. package/dist/management/checks/profile-check.d.ts +5 -1
  62. package/dist/management/checks/profile-check.d.ts.map +1 -1
  63. package/dist/management/checks/profile-check.js +56 -25
  64. package/dist/management/checks/profile-check.js.map +1 -1
  65. package/dist/management/recovery-manager.d.ts +0 -12
  66. package/dist/management/recovery-manager.d.ts.map +1 -1
  67. package/dist/management/recovery-manager.js +0 -92
  68. package/dist/management/recovery-manager.js.map +1 -1
  69. package/dist/types/config.d.ts +2 -0
  70. package/dist/types/config.d.ts.map +1 -1
  71. package/dist/types/config.js.map +1 -1
  72. package/dist/ui/assets/{accounts-BMhHiKKx.js → accounts-SAhf2aVn.js} +1 -1
  73. package/dist/ui/assets/{api-OCBlXCQa.js → api-DgjYmgeK.js} +1 -1
  74. package/dist/ui/assets/auth-section-c488oSia.js +1 -0
  75. package/dist/ui/assets/{card-CLsl42We.js → card-BrSGmssG.js} +1 -1
  76. package/dist/ui/assets/cliproxy-DagVtdBM.js +3 -0
  77. package/dist/ui/assets/cliproxy-control-panel-CqFvwaNM.js +1 -0
  78. package/dist/ui/assets/{confirm-dialog-BtYM09Tb.js → confirm-dialog-B0FsZkP6.js} +1 -1
  79. package/dist/ui/assets/{copilot-7MWkGdns.js → copilot-Bccuuvux.js} +2 -2
  80. package/dist/ui/assets/{globalenv-section-Co6qbs3V.js → globalenv-section-Bli-EFPP.js} +1 -1
  81. package/dist/ui/assets/{health-Bh1b5210.js → health-mnF1gWAc.js} +1 -1
  82. package/dist/ui/assets/icons-DBie6Tez.js +1 -0
  83. package/dist/ui/assets/{index-B_TRzkFq.js → index-B38yaYR3.js} +1 -1
  84. package/dist/ui/assets/{index-C8KcL2cj.js → index-Buv2h9oP.js} +1 -1
  85. package/dist/ui/assets/index-CytnH70K.css +1 -0
  86. package/dist/ui/assets/{index-CXVq9xuH.js → index-mn6heIpP.js} +1 -1
  87. package/dist/ui/assets/{index-CApIIy9d.js → index-t5yDkLoB.js} +12 -12
  88. package/dist/ui/assets/{shared-Ckt5nAjF.js → shared-B9w3h6Sd.js} +1 -1
  89. package/dist/ui/assets/{switch-BCFPnHGe.js → switch-CRxPpAN8.js} +1 -1
  90. package/dist/ui/index.html +3 -3
  91. package/dist/web-server/file-watcher.d.ts.map +1 -1
  92. package/dist/web-server/file-watcher.js +3 -2
  93. package/dist/web-server/file-watcher.js.map +1 -1
  94. package/dist/web-server/health/config-checks.d.ts +3 -2
  95. package/dist/web-server/health/config-checks.d.ts.map +1 -1
  96. package/dist/web-server/health/config-checks.js +40 -2
  97. package/dist/web-server/health/config-checks.js.map +1 -1
  98. package/dist/web-server/health/profile-checks.d.ts +2 -1
  99. package/dist/web-server/health/profile-checks.d.ts.map +1 -1
  100. package/dist/web-server/health/profile-checks.js +33 -1
  101. package/dist/web-server/health/profile-checks.js.map +1 -1
  102. package/dist/web-server/health-service.d.ts.map +1 -1
  103. package/dist/web-server/health-service.js +14 -0
  104. package/dist/web-server/health-service.js.map +1 -1
  105. package/dist/web-server/overview-routes.d.ts.map +1 -1
  106. package/dist/web-server/overview-routes.js +10 -29
  107. package/dist/web-server/overview-routes.js.map +1 -1
  108. package/dist/web-server/routes/account-routes.d.ts +3 -2
  109. package/dist/web-server/routes/account-routes.d.ts.map +1 -1
  110. package/dist/web-server/routes/account-routes.js +43 -46
  111. package/dist/web-server/routes/account-routes.js.map +1 -1
  112. package/dist/web-server/routes/route-helpers.d.ts +0 -6
  113. package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
  114. package/dist/web-server/routes/route-helpers.js +1 -24
  115. package/dist/web-server/routes/route-helpers.js.map +1 -1
  116. package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
  117. package/dist/web-server/routes/settings-routes.js +161 -13
  118. package/dist/web-server/routes/settings-routes.js.map +1 -1
  119. package/dist/web-server/routes/variant-routes.d.ts +2 -0
  120. package/dist/web-server/routes/variant-routes.d.ts.map +1 -1
  121. package/dist/web-server/routes/variant-routes.js +44 -98
  122. package/dist/web-server/routes/variant-routes.js.map +1 -1
  123. package/package.json +1 -1
  124. package/dist/ui/assets/cliproxy-C09j9zae.js +0 -3
  125. package/dist/ui/assets/cliproxy-control-panel-CM6pDYK8.js +0 -1
  126. package/dist/ui/assets/icons-B9mnOvwW.js +0 -1
  127. 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":"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"}
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;AAoDlE;;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,GACZ,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,MAAM,GACZ,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAOhE"}
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, config_generator_1.CLIPROXY_DEFAULT_PORT);
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 = path.join(os.homedir(), '.ccs');
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,CAAC,QAA6B,EAAE,KAAa;IACpE,MAAM,OAAO,GAAG,IAAA,mCAAgB,EAAC,QAA4B,EAAE,wCAAqB,CAAC,CAAC;IAEtF,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,EAAE;QACpD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,EAAE;QACxD,eAAe,EAAE,KAAK;QACtB,4BAA4B,EAAE,KAAK;QACnC,8BAA8B,EAAE,KAAK;QACrC,6BAA6B,EAAE,OAAO,CAAC,6BAA6B,IAAI,KAAK;KAC9E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,QAAgB,EAAE,QAAsB;IAC7D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAA6B,EAAE,IAAY;IAC7E,MAAM,MAAM,GAAG,IAAA,0BAAS,GAAE,CAAC;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,IAAI,IAAI,gBAAgB,CAAC,CAAC;AAChE,CAAC;AAHD,kDAGC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAA6B,EAAE,IAAY;IAC7E,OAAO,GAAG,QAAQ,IAAI,IAAI,gBAAgB,CAAC;AAC7C,CAAC;AAFD,kDAEC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,QAA6B,EAAE,IAAY;IACjF,OAAO,UAAU,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;AACzD,CAAC;AAFD,0DAEC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,IAAY,EACZ,QAA6B,EAC7B,KAAa;IAEb,MAAM,MAAM,GAAG,IAAA,0BAAS,GAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAiB;QAC7B,GAAG,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;KACvC,CAAC;IAEF,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEtC,OAAO,YAAY,CAAC;AACtB,CAAC;AAhBD,gDAgBC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CACvC,IAAY,EACZ,QAA6B,EAC7B,KAAa;IAEb,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAiB;QAC7B,GAAG,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;KACvC,CAAC;IAEF,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEtC,OAAO,YAAY,CAAC;AACtB,CAAC;AAhBD,8DAgBC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,YAAoB;IACrD,MAAM,YAAY,GAAG,IAAA,oBAAU,EAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAPD,gDAOC"}
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;AAoED;;;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;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAuB5D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAe1D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC;IACzC,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,IAAI;IAChC,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"}
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 getSessionLockPath() {
54
- return path.join((0, config_generator_1.getCliproxyDir)(), 'sessions.json');
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
- /** Read session lock file (returns null if not exists or invalid) */
57
- function readSessionLock() {
58
- const lockPath = getSessionLockPath();
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
- /** Write session lock file */
78
- function writeSessionLock(lock) {
79
- const lockPath = getSessionLockPath();
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 deleteSessionLock() {
88
- const lockPath = getSessionLockPath();
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 = readSessionLock();
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
- deleteSessionLock();
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 = readSessionLock();
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
- writeSessionLock(existingLock);
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
- writeSessionLock(newLock);
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
- writeSessionLock(lock);
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 = readSessionLock();
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 = readSessionLock();
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
- deleteSessionLock();
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 = readSessionLock();
261
+ const lock = readSessionLockForPort(port);
217
262
  if (!lock) {
218
263
  return;
219
264
  }
220
- // If port doesn't match, this lock is for a different proxy
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
- deleteSessionLock();
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 = readSessionLock();
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)(config_generator_2.CLIPROXY_DEFAULT_PORT);
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 ${config_generator_2.CLIPROXY_DEFAULT_PORT} is in use by ${portProcess.processName}, not CLIProxy`,
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
- deleteSessionLock();
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
- deleteSessionLock();
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
- deleteSessionLock();
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 = readSessionLock();
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
- deleteSessionLock();
343
+ deleteSessionLockForPort(port);
298
344
  return { running: false };
299
345
  }
300
346
  return {