@kaitranntt/ccs 6.7.1-dev.6 → 6.7.1-dev.7
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/api/services/index.d.ts +3 -0
- package/dist/api/services/index.d.ts.map +1 -1
- package/dist/api/services/index.js +14 -1
- package/dist/api/services/index.js.map +1 -1
- package/dist/api/services/openrouter-catalog.d.ts +30 -0
- package/dist/api/services/openrouter-catalog.d.ts.map +1 -0
- package/dist/api/services/openrouter-catalog.js +130 -0
- package/dist/api/services/openrouter-catalog.js.map +1 -0
- package/dist/api/services/openrouter-picker.d.ts +15 -0
- package/dist/api/services/openrouter-picker.d.ts.map +1 -0
- package/dist/api/services/openrouter-picker.js +113 -0
- package/dist/api/services/openrouter-picker.js.map +1 -0
- package/dist/api/services/profile-reader.d.ts +3 -0
- package/dist/api/services/profile-reader.d.ts.map +1 -1
- package/dist/api/services/profile-reader.js +14 -9
- package/dist/api/services/profile-reader.js.map +1 -1
- package/dist/api/services/profile-writer.d.ts.map +1 -1
- package/dist/api/services/profile-writer.js +8 -3
- package/dist/api/services/profile-writer.js.map +1 -1
- package/dist/api/services/provider-presets.d.ts +36 -0
- package/dist/api/services/provider-presets.d.ts.map +1 -0
- package/dist/api/services/provider-presets.js +89 -0
- package/dist/api/services/provider-presets.js.map +1 -0
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +1 -4
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/commands/api-command.d.ts.map +1 -1
- package/dist/commands/api-command.js +82 -30
- package/dist/commands/api-command.js.map +1 -1
- package/dist/config/index.d.ts +0 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +0 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/migration-manager.d.ts.map +1 -1
- package/dist/config/migration-manager.js +0 -3
- package/dist/config/migration-manager.js.map +1 -1
- package/dist/config/unified-config-types.d.ts +1 -20
- package/dist/config/unified-config-types.d.ts.map +1 -1
- package/dist/config/unified-config-types.js +2 -22
- package/dist/config/unified-config-types.js.map +1 -1
- package/dist/management/recovery-manager.d.ts +3 -0
- package/dist/management/recovery-manager.d.ts.map +1 -1
- package/dist/management/recovery-manager.js +6 -11
- package/dist/management/recovery-manager.js.map +1 -1
- package/dist/ui/assets/{accounts-CveDKAVc.js → accounts-CseTPPSx.js} +1 -1
- package/dist/ui/assets/{analytics-D-bqA31W.js → analytics-CxcV9QVU.js} +1 -1
- package/dist/ui/assets/api-BW7rRy1o.js +1 -0
- package/dist/ui/assets/card-CLNWVVCT.js +1 -0
- package/dist/ui/assets/{cliproxy-BY70Tlxq.js → cliproxy-CU7ficOZ.js} +2 -2
- package/dist/ui/assets/{cliproxy-control-panel-CJ2CfYod.js → cliproxy-control-panel-CvVI3tSn.js} +1 -1
- package/dist/ui/assets/{code-editor-x2Bhd_zz.js → code-editor-BR3VZzGS.js} +2 -2
- package/dist/ui/assets/{confirm-dialog-BCZXbxwW.js → confirm-dialog-D4q_SQxy.js} +1 -1
- package/dist/ui/assets/copilot-nTRRDeje.js +4 -0
- package/dist/ui/assets/health-HdqPsZNE.js +1 -0
- package/dist/ui/assets/icons-DvvDkxaF.js +1 -0
- package/dist/ui/assets/index-Bd7UMLZU.js +46 -0
- package/dist/ui/assets/index-z58HV9Tm.css +1 -0
- package/dist/ui/assets/{settings-BTIPjkGQ.js → settings-CbO9TBgU.js} +1 -1
- package/dist/ui/assets/{shared-BlJYKD4s.js → shared-DoV2dJpJ.js} +1 -1
- package/dist/ui/assets/{switch-BR9MWG-V.js → switch-DiStdeQp.js} +1 -1
- package/dist/ui/icons/openrouter.svg +1 -0
- package/dist/ui/index.html +3 -3
- package/dist/utils/config-manager.d.ts +3 -1
- package/dist/utils/config-manager.d.ts.map +1 -1
- package/dist/utils/config-manager.js +41 -5
- package/dist/utils/config-manager.js.map +1 -1
- package/dist/web-server/routes/config-routes.d.ts.map +1 -1
- package/dist/web-server/routes/config-routes.js +0 -30
- package/dist/web-server/routes/config-routes.js.map +1 -1
- package/dist/web-server/routes/index.js +1 -2
- package/dist/web-server/routes/index.js.map +1 -1
- package/dist/web-server/routes/profile-routes.d.ts +2 -0
- package/dist/web-server/routes/profile-routes.d.ts.map +1 -1
- package/dist/web-server/routes/profile-routes.js +32 -32
- package/dist/web-server/routes/profile-routes.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +11 -220
- package/dist/config/secrets-manager.d.ts +0 -51
- package/dist/config/secrets-manager.d.ts.map +0 -1
- package/dist/config/secrets-manager.js +0 -194
- package/dist/config/secrets-manager.js.map +0 -1
- package/dist/ui/assets/api-A3IeN2JZ.js +0 -1
- package/dist/ui/assets/card-Dh2Mk43l.js +0 -1
- package/dist/ui/assets/copilot-BRJK1ZW-.js +0 -4
- package/dist/ui/assets/health-626qMQvS.js +0 -1
- package/dist/ui/assets/icons-ZmwVoUeR.js +0 -1
- package/dist/ui/assets/index-BJVyJi5-.js +0 -46
- package/dist/ui/assets/index-It66SkKf.css +0 -1
|
@@ -30,6 +30,7 @@ const os = __importStar(require("os"));
|
|
|
30
30
|
const types_1 = require("../types");
|
|
31
31
|
const helpers_1 = require("./helpers");
|
|
32
32
|
const ui_1 = require("./ui");
|
|
33
|
+
const unified_config_loader_1 = require("../config/unified-config-loader");
|
|
33
34
|
// TODO: Replace with proper imports after converting these files
|
|
34
35
|
// const { ErrorManager } = require('./error-manager');
|
|
35
36
|
// const RecoveryManager = require('./recovery-manager');
|
|
@@ -98,14 +99,49 @@ function readConfig() {
|
|
|
98
99
|
}
|
|
99
100
|
exports.readConfig = readConfig;
|
|
100
101
|
/**
|
|
101
|
-
* Get settings path for profile
|
|
102
|
+
* Get settings path for profile.
|
|
103
|
+
* In unified mode (config.yaml exists), reads from config.yaml first,
|
|
104
|
+
* then falls back to config.json for backward compatibility.
|
|
102
105
|
*/
|
|
103
106
|
function getSettingsPath(profile) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
let settingsPath;
|
|
108
|
+
let availableProfiles = [];
|
|
109
|
+
// Check unified config first (config.yaml)
|
|
110
|
+
if ((0, unified_config_loader_1.isUnifiedMode)()) {
|
|
111
|
+
const unifiedConfig = (0, unified_config_loader_1.loadOrCreateUnifiedConfig)();
|
|
112
|
+
// Check if profile exists in unified config
|
|
113
|
+
const profileConfig = unifiedConfig.profiles[profile];
|
|
114
|
+
if (profileConfig?.settings) {
|
|
115
|
+
settingsPath = profileConfig.settings;
|
|
116
|
+
}
|
|
117
|
+
// Collect available profiles from unified config
|
|
118
|
+
availableProfiles = Object.keys(unifiedConfig.profiles);
|
|
119
|
+
// If not found in unified config, try legacy config.json as fallback
|
|
120
|
+
if (!settingsPath) {
|
|
121
|
+
try {
|
|
122
|
+
const legacyConfig = loadConfig();
|
|
123
|
+
if (legacyConfig.profiles[profile]) {
|
|
124
|
+
settingsPath = legacyConfig.profiles[profile];
|
|
125
|
+
// Merge legacy profiles into available list (avoid duplicates)
|
|
126
|
+
for (const p of Object.keys(legacyConfig.profiles)) {
|
|
127
|
+
if (!availableProfiles.includes(p)) {
|
|
128
|
+
availableProfiles.push(p);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Legacy config doesn't exist or is invalid - that's OK in unified mode
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Legacy mode - read from config.json only
|
|
140
|
+
const config = readConfig();
|
|
141
|
+
settingsPath = config.profiles[profile];
|
|
142
|
+
availableProfiles = Object.keys(config.profiles);
|
|
143
|
+
}
|
|
107
144
|
if (!settingsPath) {
|
|
108
|
-
const availableProfiles = Object.keys(config.profiles);
|
|
109
145
|
const profileList = availableProfiles.map((p) => ` - ${p}`);
|
|
110
146
|
(0, helpers_1.error)(`Profile '${profile}' not found. Available profiles:\n${profileList.join('\n')}`);
|
|
111
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,oCAAkE;AAClE,uCAA8C;AAC9C,6BAA4B;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,oCAAkE;AAClE,uCAA8C;AAC9C,6BAA4B;AAC5B,2EAA2F;AAE3F,iEAAiE;AACjE,uDAAuD;AACvD,yDAAyD;AAEzD;;;GAGG;AACH,SAAgB,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AAC9C,CAAC;AAFD,gCAEC;AAED;;;GAGG;AACH,SAAgB,SAAS;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAFD,8BAEC;AAED;;GAEG;AACH,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AAClF,CAAC;AAFD,sCAEC;AAED;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,mCAAmC;QACnC,0CAA0C;QAC1C,+BAA+B;QAE/B,IAAA,eAAK,EAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE,CAAC;QACtB,IAAA,eAAK,EAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAnBD,gCAmBC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,YAAoB;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,IAAA,eAAK,EAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC,IAAA,kBAAU,EAAC,MAAM,CAAC,EAAE,CAAC;QACxB,IAAA,eAAK,EAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAbD,oCAaC;AAED;;GAEG;AACH,SAAgB,UAAU;IACxB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAFD,gCAEC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,OAAe;IAC7C,IAAI,YAAgC,CAAC;IACrC,IAAI,iBAAiB,GAAa,EAAE,CAAC;IAErC,2CAA2C;IAC3C,IAAI,IAAA,qCAAa,GAAE,EAAE,CAAC;QACpB,MAAM,aAAa,GAAG,IAAA,iDAAyB,GAAE,CAAC;QAElD,4CAA4C;QAC5C,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC;YAC5B,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC;QACxC,CAAC;QAED,iDAAiD;QACjD,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAExD,qEAAqE;QACrE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;gBAClC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC9C,+DAA+D;oBAC/D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACnD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;4BACnC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC5B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,2CAA2C;QAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxC,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAA,eAAK,EAAC,YAAY,OAAO,qCAAqC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,cAAc;IACd,MAAM,YAAY,GAAG,IAAA,oBAAU,EAAC,YAAY,CAAC,CAAC;IAE9C,gCAAgC;IAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,8CAA8C;QAC9C,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/E,mCAAmC;YACnC,0CAA0C;YAC1C,mCAAmC;YAEnC,OAAO,CAAC,GAAG,CAAC,IAAA,SAAI,EAAC,oCAAoC,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,IAAA,eAAK,EAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;YACvB,IAAA,eAAK,EAAC,kCAAkC,YAAY,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,IAAA,eAAK,EAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AA5ED,0CA4EC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-routes.d.ts","sourceRoot":"","sources":["../../../src/web-server/routes/config-routes.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"config-routes.d.ts","sourceRoot":"","sources":["../../../src/web-server/routes/config-routes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,QAAA,MAAM,MAAM,4CAAW,CAAC;AA2FxB,eAAe,MAAM,CAAC"}
|
|
@@ -30,7 +30,6 @@ const express_1 = require("express");
|
|
|
30
30
|
const fs = __importStar(require("fs"));
|
|
31
31
|
const unified_config_loader_1 = require("../../config/unified-config-loader");
|
|
32
32
|
const migration_manager_1 = require("../../config/migration-manager");
|
|
33
|
-
const secrets_manager_1 = require("../../config/secrets-manager");
|
|
34
33
|
const unified_config_types_1 = require("../../config/unified-config-types");
|
|
35
34
|
const router = (0, express_1.Router)();
|
|
36
35
|
/**
|
|
@@ -112,34 +111,5 @@ router.post('/rollback', async (req, res) => {
|
|
|
112
111
|
const success = await (0, migration_manager_1.rollback)(backupPath);
|
|
113
112
|
res.json({ success });
|
|
114
113
|
});
|
|
115
|
-
/**
|
|
116
|
-
* PUT /api/secrets/:profile - Update profile secrets (write-only)
|
|
117
|
-
*/
|
|
118
|
-
router.put('/secrets/:profile', (req, res) => {
|
|
119
|
-
const { profile } = req.params;
|
|
120
|
-
const secrets = req.body;
|
|
121
|
-
if (!secrets || typeof secrets !== 'object') {
|
|
122
|
-
res.status(400).json({ error: 'Invalid secrets format' });
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
try {
|
|
126
|
-
(0, secrets_manager_1.setProfileSecrets)(profile, secrets);
|
|
127
|
-
res.json({ success: true });
|
|
128
|
-
}
|
|
129
|
-
catch (err) {
|
|
130
|
-
res.status(500).json({ error: err.message });
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
/**
|
|
134
|
-
* GET /api/secrets/:profile/exists - Check if secrets exist (no values returned)
|
|
135
|
-
*/
|
|
136
|
-
router.get('/secrets/:profile/exists', (req, res) => {
|
|
137
|
-
const { profile } = req.params;
|
|
138
|
-
const secrets = (0, secrets_manager_1.getProfileSecrets)(profile);
|
|
139
|
-
res.json({
|
|
140
|
-
exists: Object.keys(secrets).length > 0,
|
|
141
|
-
keys: Object.keys(secrets), // Only key names, not values
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
114
|
exports.default = router;
|
|
145
115
|
//# sourceMappingURL=config-routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-routes.js","sourceRoot":"","sources":["../../../src/web-server/routes/config-routes.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,qCAAoD;AACpD,uCAAyB;AACzB,8EAM4C;AAC5C,sEAKwC;AACxC,
|
|
1
|
+
{"version":3,"file":"config-routes.js","sourceRoot":"","sources":["../../../src/web-server/routes/config-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,9 +32,8 @@ exports.apiRoutes.use('/profiles', profile_routes_1.default);
|
|
|
32
32
|
exports.apiRoutes.use('/settings', settings_routes_1.default);
|
|
33
33
|
exports.apiRoutes.use('/accounts', profile_routes_1.default);
|
|
34
34
|
// ==================== Unified Config ====================
|
|
35
|
-
// Config format, migration
|
|
35
|
+
// Config format, migration
|
|
36
36
|
exports.apiRoutes.use('/config', config_routes_1.default);
|
|
37
|
-
exports.apiRoutes.use('/secrets', config_routes_1.default);
|
|
38
37
|
// ==================== Health Checks ====================
|
|
39
38
|
exports.apiRoutes.use('/health', health_routes_1.default);
|
|
40
39
|
// ==================== CLIProxy ====================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web-server/routes/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,qCAAiC;AAEjC,wBAAwB;AACxB,sEAA6C;AAC7C,oEAA2C;AAC3C,oEAA2C;AAC3C,wEAA+C;AAC/C,sEAA6C;AAC7C,wEAA+C;AAC/C,0EAAiD;AACjD,kFAAwD;AACxD,oFAA0D;AAC1D,sEAA6C;AAC7C,gEAAuC;AACvC,kEAAkD;AAElD,6BAA6B;AAChB,QAAA,SAAS,GAAG,IAAA,gBAAM,GAAE,CAAC;AAElC,+DAA+D;AAC/D,uDAAuD;AACvD,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,wBAAa,CAAC,CAAC;AAC1C,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,yBAAc,CAAC,CAAC;AAC3C,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,wBAAa,CAAC,CAAC;AAE1C,2DAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/web-server/routes/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,qCAAiC;AAEjC,wBAAwB;AACxB,sEAA6C;AAC7C,oEAA2C;AAC3C,oEAA2C;AAC3C,wEAA+C;AAC/C,sEAA6C;AAC7C,wEAA+C;AAC/C,0EAAiD;AACjD,kFAAwD;AACxD,oFAA0D;AAC1D,sEAA6C;AAC7C,gEAAuC;AACvC,kEAAkD;AAElD,6BAA6B;AAChB,QAAA,SAAS,GAAG,IAAA,gBAAM,GAAE,CAAC;AAElC,+DAA+D;AAC/D,uDAAuD;AACvD,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,wBAAa,CAAC,CAAC;AAC1C,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,yBAAc,CAAC,CAAC;AAC3C,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,wBAAa,CAAC,CAAC;AAE1C,2DAA2D;AAC3D,2BAA2B;AAC3B,iBAAS,CAAC,GAAG,CAAC,SAAS,EAAE,uBAAY,CAAC,CAAC;AAEvC,0DAA0D;AAC1D,iBAAS,CAAC,GAAG,CAAC,SAAS,EAAE,uBAAY,CAAC,CAAC;AAEvC,qDAAqD;AACrD,8DAA8D;AAC9D,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,wBAAa,CAAC,CAAC;AAC1C,iBAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,8BAAkB,CAAC,CAAC;AACpD,iBAAS,CAAC,GAAG,CAAC,WAAW,EAAE,+BAAmB,CAAC,CAAC;AAChD,iBAAS,CAAC,GAAG,CAAC,yBAAyB,EAAE,yBAAc,CAAC,CAAC;AAEzD,sDAAsD;AACtD,iBAAS,CAAC,GAAG,CAAC,YAAY,EAAE,0BAAe,CAAC,CAAC;AAE7C,oDAAoD;AACpD,iBAAS,CAAC,GAAG,CAAC,UAAU,EAAE,wBAAa,CAAC,CAAC;AAEzC,qEAAqE;AACrE,iBAAS,CAAC,GAAG,CAAC,kBAAkB,EAAE,sBAAoB,CAAC,CAAC;AAExD,wEAAwE;AACxE,iBAAS,CAAC,GAAG,CAAC,GAAG,EAAE,qBAAU,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-routes.d.ts","sourceRoot":"","sources":["../../../src/web-server/routes/profile-routes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"profile-routes.d.ts","sourceRoot":"","sources":["../../../src/web-server/routes/profile-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAwJxB,eAAe,MAAM,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Profile Routes - CRUD operations for user profiles and accounts
|
|
4
|
+
*
|
|
5
|
+
* Uses unified config (config.yaml) when available, falls back to legacy (config.json).
|
|
4
6
|
*/
|
|
5
7
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
8
|
if (k2 === undefined) k2 = k;
|
|
@@ -31,6 +33,8 @@ const fs = __importStar(require("fs"));
|
|
|
31
33
|
const path = __importStar(require("path"));
|
|
32
34
|
const config_manager_1 = require("../../utils/config-manager");
|
|
33
35
|
const reserved_names_1 = require("../../config/reserved-names");
|
|
36
|
+
const profile_writer_1 = require("../../api/services/profile-writer");
|
|
37
|
+
const profile_reader_1 = require("../../api/services/profile-reader");
|
|
34
38
|
const route_helpers_1 = require("./route-helpers");
|
|
35
39
|
const router = (0, express_1.Router)();
|
|
36
40
|
// ==================== Profile CRUD ====================
|
|
@@ -38,11 +42,12 @@ const router = (0, express_1.Router)();
|
|
|
38
42
|
* GET /api/profiles - List all profiles
|
|
39
43
|
*/
|
|
40
44
|
router.get('/', (_req, res) => {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
const result = (0, profile_reader_1.listApiProfiles)();
|
|
46
|
+
// Map isConfigured -> configured for UI compatibility
|
|
47
|
+
const profiles = result.profiles.map((p) => ({
|
|
48
|
+
name: p.name,
|
|
49
|
+
settingsPath: p.settingsPath,
|
|
50
|
+
configured: p.isConfigured,
|
|
46
51
|
}));
|
|
47
52
|
res.json({ profiles });
|
|
48
53
|
});
|
|
@@ -63,26 +68,23 @@ router.post('/', (req, res) => {
|
|
|
63
68
|
});
|
|
64
69
|
return;
|
|
65
70
|
}
|
|
66
|
-
|
|
67
|
-
if (
|
|
71
|
+
// Check if profile already exists (uses unified config when available)
|
|
72
|
+
if ((0, profile_reader_1.apiProfileExists)(name)) {
|
|
68
73
|
res.status(409).json({ error: 'Profile already exists' });
|
|
69
74
|
return;
|
|
70
75
|
}
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
model,
|
|
78
|
-
opusModel,
|
|
79
|
-
sonnetModel,
|
|
80
|
-
haikuModel,
|
|
76
|
+
// Create profile using unified-config-aware service
|
|
77
|
+
const result = (0, profile_writer_1.createApiProfile)(name, baseUrl, apiKey, {
|
|
78
|
+
default: model || '',
|
|
79
|
+
opus: opusModel || model || '',
|
|
80
|
+
sonnet: sonnetModel || model || '',
|
|
81
|
+
haiku: haikuModel || model || '',
|
|
81
82
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
if (!result.success) {
|
|
84
|
+
res.status(500).json({ error: result.error || 'Failed to create profile' });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
res.status(201).json({ name, settingsPath: result.settingsFile });
|
|
86
88
|
});
|
|
87
89
|
/**
|
|
88
90
|
* PUT /api/profiles/:name - Update profile
|
|
@@ -90,8 +92,8 @@ router.post('/', (req, res) => {
|
|
|
90
92
|
router.put('/:name', (req, res) => {
|
|
91
93
|
const { name } = req.params;
|
|
92
94
|
const { baseUrl, apiKey, model, opusModel, sonnetModel, haikuModel } = req.body;
|
|
93
|
-
|
|
94
|
-
if (!
|
|
95
|
+
// Check if profile exists (uses unified config when available)
|
|
96
|
+
if (!(0, profile_reader_1.apiProfileExists)(name)) {
|
|
95
97
|
res.status(404).json({ error: 'Profile not found' });
|
|
96
98
|
return;
|
|
97
99
|
}
|
|
@@ -108,19 +110,17 @@ router.put('/:name', (req, res) => {
|
|
|
108
110
|
*/
|
|
109
111
|
router.delete('/:name', (req, res) => {
|
|
110
112
|
const { name } = req.params;
|
|
111
|
-
|
|
112
|
-
if (!
|
|
113
|
+
// Check if profile exists (uses unified config when available)
|
|
114
|
+
if (!(0, profile_reader_1.apiProfileExists)(name)) {
|
|
113
115
|
res.status(404).json({ error: 'Profile not found' });
|
|
114
116
|
return;
|
|
115
117
|
}
|
|
116
|
-
//
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
119
|
-
|
|
118
|
+
// Remove profile using unified-config-aware service
|
|
119
|
+
const result = (0, profile_writer_1.removeApiProfile)(name);
|
|
120
|
+
if (!result.success) {
|
|
121
|
+
res.status(500).json({ error: result.error || 'Failed to delete profile' });
|
|
122
|
+
return;
|
|
120
123
|
}
|
|
121
|
-
// Remove from config
|
|
122
|
-
delete config.profiles[name];
|
|
123
|
-
(0, route_helpers_1.writeConfig)(config);
|
|
124
124
|
res.json({ name, deleted: true });
|
|
125
125
|
});
|
|
126
126
|
// ==================== Accounts ====================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-routes.js","sourceRoot":"","sources":["../../../src/web-server/routes/profile-routes.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"profile-routes.js","sourceRoot":"","sources":["../../../src/web-server/routes/profile-routes.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/scripts/postinstall.js
CHANGED
|
@@ -68,12 +68,9 @@ function validateConfiguration() {
|
|
|
68
68
|
errors.push('~/.ccs/ directory not found');
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
// Check required files
|
|
71
|
+
// Check required files (GLM/GLMT/Kimi are now optional - created via presets)
|
|
72
72
|
const requiredFiles = [
|
|
73
|
-
{ path: path.join(ccsDir, 'config.json'), name: 'config.json' }
|
|
74
|
-
{ path: path.join(ccsDir, 'glm.settings.json'), name: 'glm.settings.json' },
|
|
75
|
-
{ path: path.join(ccsDir, 'glmt.settings.json'), name: 'glmt.settings.json' },
|
|
76
|
-
{ path: path.join(ccsDir, 'kimi.settings.json'), name: 'kimi.settings.json' }
|
|
73
|
+
{ path: path.join(ccsDir, 'config.json'), name: 'config.json' }
|
|
77
74
|
];
|
|
78
75
|
|
|
79
76
|
for (const file of requiredFiles) {
|
|
@@ -156,17 +153,15 @@ function createConfigFiles() {
|
|
|
156
153
|
// Create config.json if missing
|
|
157
154
|
// NOTE: gemini/codex profiles NOT included - they are added on-demand when user
|
|
158
155
|
// runs `ccs gemini` or `ccs codex` for first time (requires OAuth auth first)
|
|
156
|
+
// NOTE: GLM/GLMT/Kimi profiles are now created via UI/CLI presets, not auto-created
|
|
159
157
|
const configPath = path.join(ccsDir, 'config.json');
|
|
160
158
|
if (!fs.existsSync(configPath)) {
|
|
161
159
|
// NOTE: No 'default' entry - when no profile specified, CCS passes through
|
|
162
160
|
// to Claude's native auth without --settings flag. This prevents env var
|
|
163
161
|
// pollution from affecting the default profile.
|
|
162
|
+
// Profiles are empty by default - users create via `ccs api create --preset` or UI
|
|
164
163
|
const config = {
|
|
165
|
-
profiles: {
|
|
166
|
-
glm: '~/.ccs/glm.settings.json',
|
|
167
|
-
glmt: '~/.ccs/glmt.settings.json',
|
|
168
|
-
kimi: '~/.ccs/kimi.settings.json'
|
|
169
|
-
}
|
|
164
|
+
profiles: {}
|
|
170
165
|
};
|
|
171
166
|
|
|
172
167
|
// Atomic write: temp file → rename
|
|
@@ -213,216 +208,12 @@ function createConfigFiles() {
|
|
|
213
208
|
}
|
|
214
209
|
}
|
|
215
210
|
|
|
216
|
-
//
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
ANTHROPIC_AUTH_TOKEN: 'YOUR_GLM_API_KEY_HERE',
|
|
223
|
-
ANTHROPIC_MODEL: 'glm-4.6',
|
|
224
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL: 'glm-4.6',
|
|
225
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL: 'glm-4.6',
|
|
226
|
-
ANTHROPIC_DEFAULT_HAIKU_MODEL: 'glm-4.6'
|
|
227
|
-
}
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
// Atomic write
|
|
231
|
-
const tmpPath = `${glmSettingsPath}.tmp`;
|
|
232
|
-
fs.writeFileSync(tmpPath, JSON.stringify(glmSettings, null, 2) + '\n', 'utf8');
|
|
233
|
-
fs.renameSync(tmpPath, glmSettingsPath);
|
|
234
|
-
|
|
235
|
-
console.log('[OK] Created GLM profile: ~/.ccs/glm.settings.json');
|
|
236
|
-
console.log('');
|
|
237
|
-
console.log(' [!] Configure GLM API key:');
|
|
238
|
-
console.log(' 1. Get key from: https://api.z.ai');
|
|
239
|
-
console.log(' 2. Edit: ~/.ccs/glm.settings.json');
|
|
240
|
-
console.log(' 3. Replace: YOUR_GLM_API_KEY_HERE');
|
|
241
|
-
} else {
|
|
242
|
-
console.log('[OK] GLM profile exists: ~/.ccs/glm.settings.json (preserved)');
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Create glmt.settings.json if missing
|
|
246
|
-
const glmtSettingsPath = path.join(ccsDir, 'glmt.settings.json');
|
|
247
|
-
if (!fs.existsSync(glmtSettingsPath)) {
|
|
248
|
-
const glmtSettings = {
|
|
249
|
-
env: {
|
|
250
|
-
ANTHROPIC_BASE_URL: 'https://api.z.ai/api/coding/paas/v4/chat/completions',
|
|
251
|
-
ANTHROPIC_AUTH_TOKEN: 'YOUR_GLM_API_KEY_HERE',
|
|
252
|
-
ANTHROPIC_MODEL: 'glm-4.6',
|
|
253
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL: 'glm-4.6',
|
|
254
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL: 'glm-4.6',
|
|
255
|
-
ANTHROPIC_DEFAULT_HAIKU_MODEL: 'glm-4.6',
|
|
256
|
-
ANTHROPIC_TEMPERATURE: '0.2',
|
|
257
|
-
ANTHROPIC_MAX_TOKENS: '65536',
|
|
258
|
-
MAX_THINKING_TOKENS: '32768',
|
|
259
|
-
ENABLE_STREAMING: 'true',
|
|
260
|
-
ANTHROPIC_SAFE_MODE: 'false',
|
|
261
|
-
API_TIMEOUT_MS: '3000000'
|
|
262
|
-
},
|
|
263
|
-
alwaysThinkingEnabled: true
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
// Atomic write
|
|
267
|
-
const tmpPath = `${glmtSettingsPath}.tmp`;
|
|
268
|
-
fs.writeFileSync(tmpPath, JSON.stringify(glmtSettings, null, 2) + '\n', 'utf8');
|
|
269
|
-
fs.renameSync(tmpPath, glmtSettingsPath);
|
|
270
|
-
|
|
271
|
-
console.log('[OK] Created GLMT profile: ~/.ccs/glmt.settings.json');
|
|
272
|
-
console.log('');
|
|
273
|
-
console.log(' [!] Configure GLMT API key:');
|
|
274
|
-
console.log(' 1. Get key from: https://api.z.ai');
|
|
275
|
-
console.log(' 2. Edit: ~/.ccs/glmt.settings.json');
|
|
276
|
-
console.log(' 3. Replace: YOUR_GLM_API_KEY_HERE');
|
|
277
|
-
console.log(' Note: GLMT enables GLM thinking mode (reasoning)');
|
|
278
|
-
console.log(' Defaults: Temperature 0.2, thinking enabled, 50min timeout');
|
|
279
|
-
} else {
|
|
280
|
-
console.log('[OK] GLMT profile exists: ~/.ccs/glmt.settings.json (preserved)');
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Migrate existing GLMT configs to include new defaults (v3.3.0)
|
|
284
|
-
if (fs.existsSync(glmtSettingsPath)) {
|
|
285
|
-
try {
|
|
286
|
-
const existing = JSON.parse(fs.readFileSync(glmtSettingsPath, 'utf8'));
|
|
287
|
-
let updated = false;
|
|
288
|
-
|
|
289
|
-
// Ensure env object exists
|
|
290
|
-
if (!existing.env) {
|
|
291
|
-
existing.env = {};
|
|
292
|
-
updated = true;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// Add missing env vars (preserve existing values)
|
|
296
|
-
const envDefaults = {
|
|
297
|
-
ANTHROPIC_TEMPERATURE: '0.2',
|
|
298
|
-
ANTHROPIC_MAX_TOKENS: '65536',
|
|
299
|
-
MAX_THINKING_TOKENS: '32768',
|
|
300
|
-
ENABLE_STREAMING: 'true',
|
|
301
|
-
ANTHROPIC_SAFE_MODE: 'false',
|
|
302
|
-
API_TIMEOUT_MS: '3000000'
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
for (const [key, value] of Object.entries(envDefaults)) {
|
|
306
|
-
if (existing.env[key] === undefined) {
|
|
307
|
-
existing.env[key] = value;
|
|
308
|
-
updated = true;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Add alwaysThinkingEnabled if missing
|
|
313
|
-
if (existing.alwaysThinkingEnabled === undefined) {
|
|
314
|
-
existing.alwaysThinkingEnabled = true;
|
|
315
|
-
updated = true;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Write back if updated
|
|
319
|
-
if (updated) {
|
|
320
|
-
const tmpPath = `${glmtSettingsPath}.tmp`;
|
|
321
|
-
fs.writeFileSync(tmpPath, JSON.stringify(existing, null, 2) + '\n', 'utf8');
|
|
322
|
-
fs.renameSync(tmpPath, glmtSettingsPath);
|
|
323
|
-
console.log('[OK] Migrated GLMT config with new defaults (v3.3.0)');
|
|
324
|
-
console.log(' Added: temperature, max_tokens, thinking settings, alwaysThinkingEnabled');
|
|
325
|
-
}
|
|
326
|
-
} catch (err) {
|
|
327
|
-
console.warn('[!] GLMT config migration failed:', err.message);
|
|
328
|
-
console.warn(' Existing config preserved, may be missing new defaults');
|
|
329
|
-
console.warn(' You can manually add fields or delete file to regenerate');
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// Create kimi.settings.json if missing
|
|
334
|
-
const kimiSettingsPath = path.join(ccsDir, 'kimi.settings.json');
|
|
335
|
-
if (!fs.existsSync(kimiSettingsPath)) {
|
|
336
|
-
const kimiSettings = {
|
|
337
|
-
env: {
|
|
338
|
-
ANTHROPIC_BASE_URL: 'https://api.kimi.com/coding/',
|
|
339
|
-
ANTHROPIC_AUTH_TOKEN: 'YOUR_KIMI_API_KEY_HERE',
|
|
340
|
-
ANTHROPIC_MODEL: 'kimi-k2-thinking-turbo',
|
|
341
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL: 'kimi-k2-thinking-turbo',
|
|
342
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL: 'kimi-k2-thinking-turbo',
|
|
343
|
-
ANTHROPIC_DEFAULT_HAIKU_MODEL: 'kimi-k2-thinking-turbo'
|
|
344
|
-
},
|
|
345
|
-
alwaysThinkingEnabled: true
|
|
346
|
-
};
|
|
347
|
-
|
|
348
|
-
// Atomic write
|
|
349
|
-
const tmpPath = `${kimiSettingsPath}.tmp`;
|
|
350
|
-
fs.writeFileSync(tmpPath, JSON.stringify(kimiSettings, null, 2) + '\n', 'utf8');
|
|
351
|
-
fs.renameSync(tmpPath, kimiSettingsPath);
|
|
352
|
-
|
|
353
|
-
console.log('[OK] Created Kimi profile: ~/.ccs/kimi.settings.json');
|
|
354
|
-
console.log('');
|
|
355
|
-
console.log(' [!] Configure Kimi API key:');
|
|
356
|
-
console.log(' 1. Get key from: https://www.kimi.com/coding (membership page)');
|
|
357
|
-
console.log(' 2. Edit: ~/.ccs/kimi.settings.json');
|
|
358
|
-
console.log(' 3. Replace: YOUR_KIMI_API_KEY_HERE');
|
|
359
|
-
} else {
|
|
360
|
-
console.log('[OK] Kimi profile exists: ~/.ccs/kimi.settings.json (preserved)');
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// NOTE: gemini.settings.json and codex.settings.json are NOT created during install
|
|
364
|
-
// They are created on-demand when user runs `ccs gemini` or `ccs codex` for the first time
|
|
365
|
-
// This prevents confusion - users need to run `--auth` first anyway
|
|
366
|
-
|
|
367
|
-
// Migrate existing Kimi configs to use kimi-k2-thinking-turbo model (v5.5.0)
|
|
368
|
-
// Kimi API now supports model specification with thinking models
|
|
369
|
-
if (fs.existsSync(kimiSettingsPath)) {
|
|
370
|
-
try {
|
|
371
|
-
const existing = JSON.parse(fs.readFileSync(kimiSettingsPath, 'utf8'));
|
|
372
|
-
let updated = false;
|
|
373
|
-
const defaultModel = 'kimi-k2-thinking-turbo';
|
|
374
|
-
|
|
375
|
-
// Ensure env object exists
|
|
376
|
-
if (!existing.env) {
|
|
377
|
-
existing.env = {};
|
|
378
|
-
updated = true;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Add/update model fields to use kimi-k2-thinking-turbo
|
|
382
|
-
const modelFields = {
|
|
383
|
-
ANTHROPIC_MODEL: defaultModel,
|
|
384
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL: defaultModel,
|
|
385
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL: defaultModel,
|
|
386
|
-
ANTHROPIC_DEFAULT_HAIKU_MODEL: defaultModel
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
for (const [field, value] of Object.entries(modelFields)) {
|
|
390
|
-
if (existing.env[field] !== value) {
|
|
391
|
-
existing.env[field] = value;
|
|
392
|
-
updated = true;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Remove deprecated ANTHROPIC_SMALL_FAST_MODEL if present
|
|
397
|
-
if (existing.env.ANTHROPIC_SMALL_FAST_MODEL !== undefined) {
|
|
398
|
-
delete existing.env.ANTHROPIC_SMALL_FAST_MODEL;
|
|
399
|
-
updated = true;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// Ensure required fields exist
|
|
403
|
-
if (!existing.env.ANTHROPIC_BASE_URL) {
|
|
404
|
-
existing.env.ANTHROPIC_BASE_URL = 'https://api.kimi.com/coding/';
|
|
405
|
-
updated = true;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// Add alwaysThinkingEnabled if missing
|
|
409
|
-
if (existing.alwaysThinkingEnabled === undefined) {
|
|
410
|
-
existing.alwaysThinkingEnabled = true;
|
|
411
|
-
updated = true;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
// Write back if updated
|
|
415
|
-
if (updated) {
|
|
416
|
-
const tmpPath = `${kimiSettingsPath}.tmp`;
|
|
417
|
-
fs.writeFileSync(tmpPath, JSON.stringify(existing, null, 2) + '\n', 'utf8');
|
|
418
|
-
fs.renameSync(tmpPath, kimiSettingsPath);
|
|
419
|
-
console.log('[OK] Migrated Kimi config (v5.5.0): updated to kimi-k2-thinking-turbo model');
|
|
420
|
-
}
|
|
421
|
-
} catch (err) {
|
|
422
|
-
console.warn('[!] Kimi config migration failed:', err.message);
|
|
423
|
-
console.warn(' Existing config preserved');
|
|
424
|
-
}
|
|
425
|
-
}
|
|
211
|
+
// NOTE: GLM, GLMT, and Kimi profiles are NO LONGER auto-created during install
|
|
212
|
+
// Users can create these via:
|
|
213
|
+
// - UI: Profile Create Dialog → Provider Presets
|
|
214
|
+
// - CLI: ccs api create --preset glm|glmt|kimi
|
|
215
|
+
// This gives users control over which providers they want to use
|
|
216
|
+
// Existing profiles are preserved for backward compatibility
|
|
426
217
|
|
|
427
218
|
// Copy shell completion files to ~/.ccs/completions/
|
|
428
219
|
const completionsDir = path.join(ccsDir, 'completions');
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Secrets Manager
|
|
3
|
-
*
|
|
4
|
-
* Handles loading and saving secrets (API keys, tokens) in a separate file
|
|
5
|
-
* with restricted permissions (chmod 600).
|
|
6
|
-
*/
|
|
7
|
-
import { SecretsConfig } from './unified-config-types';
|
|
8
|
-
export { isSensitiveKey as isSecretKey } from '../utils/sensitive-keys';
|
|
9
|
-
/**
|
|
10
|
-
* Get path to secrets.yaml
|
|
11
|
-
*/
|
|
12
|
-
export declare function getSecretsPath(): string;
|
|
13
|
-
/**
|
|
14
|
-
* Check if secrets.yaml exists
|
|
15
|
-
*/
|
|
16
|
-
export declare function hasSecrets(): boolean;
|
|
17
|
-
/**
|
|
18
|
-
* Load secrets from YAML file.
|
|
19
|
-
* Returns empty secrets config if file doesn't exist.
|
|
20
|
-
*/
|
|
21
|
-
export declare function loadSecrets(): SecretsConfig;
|
|
22
|
-
/**
|
|
23
|
-
* Save secrets to YAML file with restricted permissions.
|
|
24
|
-
* Uses atomic write (temp file + rename) to prevent corruption.
|
|
25
|
-
*/
|
|
26
|
-
export declare function saveSecrets(secrets: SecretsConfig): void;
|
|
27
|
-
/**
|
|
28
|
-
* Get a secret value for a specific profile.
|
|
29
|
-
*/
|
|
30
|
-
export declare function getProfileSecret(profileName: string, key: string): string | undefined;
|
|
31
|
-
/**
|
|
32
|
-
* Set a secret value for a specific profile.
|
|
33
|
-
*/
|
|
34
|
-
export declare function setProfileSecret(profileName: string, key: string, value: string): void;
|
|
35
|
-
/**
|
|
36
|
-
* Delete a secret value for a specific profile.
|
|
37
|
-
*/
|
|
38
|
-
export declare function deleteProfileSecret(profileName: string, key: string): boolean;
|
|
39
|
-
/**
|
|
40
|
-
* Get all secrets for a profile.
|
|
41
|
-
*/
|
|
42
|
-
export declare function getProfileSecrets(profileName: string): Record<string, string>;
|
|
43
|
-
/**
|
|
44
|
-
* Set all secrets for a profile (replaces existing).
|
|
45
|
-
*/
|
|
46
|
-
export declare function setProfileSecrets(profileName: string, profileSecrets: Record<string, string>): void;
|
|
47
|
-
/**
|
|
48
|
-
* Delete all secrets for a profile.
|
|
49
|
-
*/
|
|
50
|
-
export declare function deleteAllProfileSecrets(profileName: string): boolean;
|
|
51
|
-
//# sourceMappingURL=secrets-manager.d.ts.map
|