@kaitranntt/ccs 7.52.2-dev.5 → 7.52.2-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.
Files changed (82) hide show
  1. package/README.md +4 -0
  2. package/dist/api/services/index.d.ts +3 -1
  3. package/dist/api/services/index.d.ts.map +1 -1
  4. package/dist/api/services/index.js +10 -1
  5. package/dist/api/services/index.js.map +1 -1
  6. package/dist/api/services/profile-lifecycle-service.d.ts +24 -0
  7. package/dist/api/services/profile-lifecycle-service.d.ts.map +1 -0
  8. package/dist/api/services/profile-lifecycle-service.js +364 -0
  9. package/dist/api/services/profile-lifecycle-service.js.map +1 -0
  10. package/dist/api/services/profile-lifecycle-validation.d.ts +11 -0
  11. package/dist/api/services/profile-lifecycle-validation.d.ts.map +1 -0
  12. package/dist/api/services/profile-lifecycle-validation.js +87 -0
  13. package/dist/api/services/profile-lifecycle-validation.js.map +1 -0
  14. package/dist/api/services/profile-types.d.ts +66 -0
  15. package/dist/api/services/profile-types.d.ts.map +1 -1
  16. package/dist/cliproxy/auth/gemini-token-refresh.d.ts.map +1 -1
  17. package/dist/cliproxy/auth/gemini-token-refresh.js +42 -14
  18. package/dist/cliproxy/auth/gemini-token-refresh.js.map +1 -1
  19. package/dist/cliproxy/quota-fetcher-codex.d.ts.map +1 -1
  20. package/dist/cliproxy/quota-fetcher-codex.js +199 -63
  21. package/dist/cliproxy/quota-fetcher-codex.js.map +1 -1
  22. package/dist/cliproxy/quota-fetcher.d.ts +12 -0
  23. package/dist/cliproxy/quota-fetcher.d.ts.map +1 -1
  24. package/dist/cliproxy/quota-fetcher.js +328 -260
  25. package/dist/cliproxy/quota-fetcher.js.map +1 -1
  26. package/dist/cliproxy/quota-types.d.ts +18 -4
  27. package/dist/cliproxy/quota-types.d.ts.map +1 -1
  28. package/dist/commands/api-command.d.ts.map +1 -1
  29. package/dist/commands/api-command.js +275 -1
  30. package/dist/commands/api-command.js.map +1 -1
  31. package/dist/commands/help-command.d.ts.map +1 -1
  32. package/dist/commands/help-command.js +4 -0
  33. package/dist/commands/help-command.js.map +1 -1
  34. package/dist/ui/assets/accounts-C19R3bH_.js +1 -0
  35. package/dist/ui/assets/{alert-dialog-Cua4nIwu.js → alert-dialog-HJSnKjIs.js} +1 -1
  36. package/dist/ui/assets/api-DSqH5CNY.js +4 -0
  37. package/dist/ui/assets/auth-section-CYKSK386.js +1 -0
  38. package/dist/ui/assets/backups-section-DG3ZbzbF.js +1 -0
  39. package/dist/ui/assets/{checkbox-BHwnoAEc.js → checkbox-Du_1Cq1z.js} +1 -1
  40. package/dist/ui/assets/cliproxy-CrhOC0jn.js +3 -0
  41. package/dist/ui/assets/cliproxy-control-panel-DLzDKBdd.js +1 -0
  42. package/dist/ui/assets/{confirm-dialog-sXvRWo2S.js → confirm-dialog-D5ln-pf7.js} +1 -1
  43. package/dist/ui/assets/{copilot-CpoZ-JIF.js → copilot-Bhp7sQwN.js} +2 -2
  44. package/dist/ui/assets/{cursor-DPNnilw3.js → cursor-Dfn3jHV4.js} +1 -1
  45. package/dist/ui/assets/{droid-DK_cjIrQ.js → droid-Vjl6_n7D.js} +1 -1
  46. package/dist/ui/assets/globalenv-section-CcmKdM4g.js +1 -0
  47. package/dist/ui/assets/{health-Den6iwHL.js → health-3zy8jvwf.js} +1 -1
  48. package/dist/ui/assets/{icons-BYZM_9Gm.js → icons-D2eEmpHv.js} +1 -1
  49. package/dist/ui/assets/index-BusjPRWX.css +1 -0
  50. package/dist/ui/assets/index-CP_OIR4n.js +1 -0
  51. package/dist/ui/assets/index-DbxzdeHz.js +1 -0
  52. package/dist/ui/assets/index-f_yPeQQQ.js +1 -0
  53. package/dist/ui/assets/{index-CHfQZxYq.js → index-iOpyYqld.js} +1 -1
  54. package/dist/ui/assets/index-uTmtgDew.js +47 -0
  55. package/dist/ui/assets/proxy-status-widget-1lHBE3f2.js +1 -0
  56. package/dist/ui/assets/{separator-CMSZsZ-K.js → separator-CsVbirkY.js} +1 -1
  57. package/dist/ui/assets/shared-DGq6uQfx.js +8 -0
  58. package/dist/ui/assets/{switch-BAw-ZttB.js → switch-BR0F3O9R.js} +1 -1
  59. package/dist/ui/assets/{updates-BsJ2V6_I.js → updates-ZSQz4CLF.js} +1 -1
  60. package/dist/ui/index.html +3 -3
  61. package/dist/web-server/routes/cliproxy-stats-routes.d.ts +12 -0
  62. package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -1
  63. package/dist/web-server/routes/cliproxy-stats-routes.js +14 -0
  64. package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -1
  65. package/dist/web-server/routes/profile-routes.d.ts.map +1 -1
  66. package/dist/web-server/routes/profile-routes.js +206 -9
  67. package/dist/web-server/routes/profile-routes.js.map +1 -1
  68. package/package.json +1 -1
  69. package/dist/ui/assets/accounts-BrujKA4_.js +0 -1
  70. package/dist/ui/assets/api-h_I7-lO7.js +0 -1
  71. package/dist/ui/assets/auth-section-DCxO2_eL.js +0 -1
  72. package/dist/ui/assets/backups-section-EE1TN60x.js +0 -1
  73. package/dist/ui/assets/cliproxy-Cccwn5Zy.js +0 -3
  74. package/dist/ui/assets/cliproxy-control-panel-CSWIAklH.js +0 -1
  75. package/dist/ui/assets/globalenv-section-hiOP8-EO.js +0 -1
  76. package/dist/ui/assets/index-7UOuuXPH.js +0 -1
  77. package/dist/ui/assets/index-BfTpnChw.js +0 -1
  78. package/dist/ui/assets/index-CWdqGG3Z.js +0 -1
  79. package/dist/ui/assets/index-DmXx1Pyv.js +0 -47
  80. package/dist/ui/assets/index-WBo504Wu.css +0 -1
  81. package/dist/ui/assets/proxy-status-widget-Cx62Adpq.js +0 -1
  82. package/dist/ui/assets/shared-Cjq_jPQd.js +0 -8
package/README.md CHANGED
@@ -152,6 +152,10 @@ ccs ollama # Local Ollama (no API key needed)
152
152
  ccs glm # GLM (API key)
153
153
  ccs km # Kimi API profile (API key)
154
154
  ccs api create --preset alibaba-coding-plan # Alibaba Coding Plan profile
155
+ ccs api discover --register # Auto-register orphan *.settings.json
156
+ ccs api copy glm glm-backup # Duplicate profile config + settings
157
+ ccs api export glm --out ./glm.ccs-profile.json # Export for cross-device transfer
158
+ ccs api import ./glm.ccs-profile.json # Import exported profile bundle
155
159
  ```
156
160
 
157
161
  ### Droid Alias (`argv[0]` pattern)
@@ -4,9 +4,11 @@
4
4
  * Barrel export for API-related business logic services.
5
5
  */
6
6
  export { validateApiName, validateUrl, getUrlWarning, sanitizeBaseUrl } from './validation-service';
7
- export { type ModelMapping, type ApiProfileInfo, type CliproxyVariantInfo, type ApiListResult, type CreateApiProfileResult, type RemoveApiProfileResult, type UpdateApiProfileTargetResult, } from './profile-types';
7
+ export { type ModelMapping, type ApiProfileInfo, type CliproxyVariantInfo, type ApiListResult, type CreateApiProfileResult, type RemoveApiProfileResult, type UpdateApiProfileTargetResult, type ProfileValidationIssue, type ProfileValidationSummary, type ApiProfileOrphanCandidate, type DiscoverApiProfileOrphansResult, type RegisterApiProfileOrphansResult, type CopyApiProfileResult, type ApiProfileExportBundle, type ExportApiProfileResult, type ImportApiProfileResult, } from './profile-types';
8
8
  export { apiProfileExists, isApiProfileConfigured, listApiProfiles, getApiProfileNames, isUsingUnifiedConfig, } from './profile-reader';
9
9
  export { createApiProfile, removeApiProfile, updateApiProfileTarget } from './profile-writer';
10
+ export { validateApiProfileSettingsPayload } from './profile-lifecycle-validation';
11
+ export { discoverApiProfileOrphans, registerApiProfileOrphans, copyApiProfile, exportApiProfile, importApiProfileBundle, } from './profile-lifecycle-service';
10
12
  export { isOpenRouterUrl, fetchOpenRouterModels, type OpenRouterModel } from './openrouter-catalog';
11
13
  export { pickOpenRouterModel, type OpenRouterSelection } from './openrouter-picker';
12
14
  export { PROVIDER_PRESETS, PRESET_ALIASES, OPENROUTER_BASE_URL, getPresetById, getPresetAliases, getPresetIds, isValidPresetId, type ProviderPreset, type PresetCategory, } from './provider-presets';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGpG,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,GAClC,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG9F,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGpG,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG9F,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * Barrel export for API-related business logic services.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.isValidPresetId = exports.getPresetIds = exports.getPresetAliases = exports.getPresetById = exports.OPENROUTER_BASE_URL = exports.PRESET_ALIASES = exports.PROVIDER_PRESETS = exports.pickOpenRouterModel = exports.fetchOpenRouterModels = exports.isOpenRouterUrl = exports.updateApiProfileTarget = exports.removeApiProfile = exports.createApiProfile = exports.isUsingUnifiedConfig = exports.getApiProfileNames = exports.listApiProfiles = exports.isApiProfileConfigured = exports.apiProfileExists = exports.sanitizeBaseUrl = exports.getUrlWarning = exports.validateUrl = exports.validateApiName = void 0;
8
+ exports.isValidPresetId = exports.getPresetIds = exports.getPresetAliases = exports.getPresetById = exports.OPENROUTER_BASE_URL = exports.PRESET_ALIASES = exports.PROVIDER_PRESETS = exports.pickOpenRouterModel = exports.fetchOpenRouterModels = exports.isOpenRouterUrl = exports.importApiProfileBundle = exports.exportApiProfile = exports.copyApiProfile = exports.registerApiProfileOrphans = exports.discoverApiProfileOrphans = exports.validateApiProfileSettingsPayload = exports.updateApiProfileTarget = exports.removeApiProfile = exports.createApiProfile = exports.isUsingUnifiedConfig = exports.getApiProfileNames = exports.listApiProfiles = exports.isApiProfileConfigured = exports.apiProfileExists = exports.sanitizeBaseUrl = exports.getUrlWarning = exports.validateUrl = exports.validateApiName = void 0;
9
9
  // Validation services
10
10
  var validation_service_1 = require("./validation-service");
11
11
  Object.defineProperty(exports, "validateApiName", { enumerable: true, get: function () { return validation_service_1.validateApiName; } });
@@ -24,6 +24,15 @@ var profile_writer_1 = require("./profile-writer");
24
24
  Object.defineProperty(exports, "createApiProfile", { enumerable: true, get: function () { return profile_writer_1.createApiProfile; } });
25
25
  Object.defineProperty(exports, "removeApiProfile", { enumerable: true, get: function () { return profile_writer_1.removeApiProfile; } });
26
26
  Object.defineProperty(exports, "updateApiProfileTarget", { enumerable: true, get: function () { return profile_writer_1.updateApiProfileTarget; } });
27
+ // Lifecycle validation and operations
28
+ var profile_lifecycle_validation_1 = require("./profile-lifecycle-validation");
29
+ Object.defineProperty(exports, "validateApiProfileSettingsPayload", { enumerable: true, get: function () { return profile_lifecycle_validation_1.validateApiProfileSettingsPayload; } });
30
+ var profile_lifecycle_service_1 = require("./profile-lifecycle-service");
31
+ Object.defineProperty(exports, "discoverApiProfileOrphans", { enumerable: true, get: function () { return profile_lifecycle_service_1.discoverApiProfileOrphans; } });
32
+ Object.defineProperty(exports, "registerApiProfileOrphans", { enumerable: true, get: function () { return profile_lifecycle_service_1.registerApiProfileOrphans; } });
33
+ Object.defineProperty(exports, "copyApiProfile", { enumerable: true, get: function () { return profile_lifecycle_service_1.copyApiProfile; } });
34
+ Object.defineProperty(exports, "exportApiProfile", { enumerable: true, get: function () { return profile_lifecycle_service_1.exportApiProfile; } });
35
+ Object.defineProperty(exports, "importApiProfileBundle", { enumerable: true, get: function () { return profile_lifecycle_service_1.importApiProfileBundle; } });
27
36
  // OpenRouter catalog and picker
28
37
  var openrouter_catalog_1 = require("./openrouter-catalog");
29
38
  Object.defineProperty(exports, "isOpenRouterUrl", { enumerable: true, get: function () { return openrouter_catalog_1.isOpenRouterUrl; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/services/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,sBAAsB;AACtB,2DAAoG;AAA3F,qHAAA,eAAe,OAAA;AAAE,iHAAA,WAAW,OAAA;AAAE,mHAAA,aAAa,OAAA;AAAE,qHAAA,eAAe,OAAA;AAarE,0BAA0B;AAC1B,mDAM0B;AALxB,kHAAA,gBAAgB,OAAA;AAChB,wHAAA,sBAAsB,OAAA;AACtB,iHAAA,eAAe,OAAA;AACf,oHAAA,kBAAkB,OAAA;AAClB,sHAAA,oBAAoB,OAAA;AAGtB,2BAA2B;AAC3B,mDAA8F;AAArF,kHAAA,gBAAgB,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AAAE,wHAAA,sBAAsB,OAAA;AAEnE,gCAAgC;AAChC,2DAAoG;AAA3F,qHAAA,eAAe,OAAA;AAAE,2HAAA,qBAAqB,OAAA;AAC/C,yDAAoF;AAA3E,wHAAA,mBAAmB,OAAA;AAE5B,2BAA2B;AAC3B,uDAU4B;AAT1B,oHAAA,gBAAgB,OAAA;AAChB,kHAAA,cAAc,OAAA;AACd,uHAAA,mBAAmB,OAAA;AACnB,iHAAA,aAAa,OAAA;AACb,oHAAA,gBAAgB,OAAA;AAChB,gHAAA,YAAY,OAAA;AACZ,mHAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/services/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,sBAAsB;AACtB,2DAAoG;AAA3F,qHAAA,eAAe,OAAA;AAAE,iHAAA,WAAW,OAAA;AAAE,mHAAA,aAAa,OAAA;AAAE,qHAAA,eAAe,OAAA;AAsBrE,0BAA0B;AAC1B,mDAM0B;AALxB,kHAAA,gBAAgB,OAAA;AAChB,wHAAA,sBAAsB,OAAA;AACtB,iHAAA,eAAe,OAAA;AACf,oHAAA,kBAAkB,OAAA;AAClB,sHAAA,oBAAoB,OAAA;AAGtB,2BAA2B;AAC3B,mDAA8F;AAArF,kHAAA,gBAAgB,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AAAE,wHAAA,sBAAsB,OAAA;AAEnE,sCAAsC;AACtC,+EAAmF;AAA1E,iJAAA,iCAAiC,OAAA;AAC1C,yEAMqC;AALnC,sIAAA,yBAAyB,OAAA;AACzB,sIAAA,yBAAyB,OAAA;AACzB,2HAAA,cAAc,OAAA;AACd,6HAAA,gBAAgB,OAAA;AAChB,mIAAA,sBAAsB,OAAA;AAGxB,gCAAgC;AAChC,2DAAoG;AAA3F,qHAAA,eAAe,OAAA;AAAE,2HAAA,qBAAqB,OAAA;AAC/C,yDAAoF;AAA3E,wHAAA,mBAAmB,OAAA;AAE5B,2BAA2B;AAC3B,uDAU4B;AAT1B,oHAAA,gBAAgB,OAAA;AAChB,kHAAA,cAAc,OAAA;AACd,uHAAA,mBAAmB,OAAA;AACnB,iHAAA,aAAa,OAAA;AACb,oHAAA,gBAAgB,OAAA;AAChB,gHAAA,YAAY,OAAA;AACZ,mHAAA,eAAe,OAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * API profile lifecycle service.
3
+ *
4
+ * Discovery, registration, copy, export, and import for API profiles.
5
+ */
6
+ import type { TargetType } from '../../targets/target-adapter';
7
+ import type { CopyApiProfileResult, DiscoverApiProfileOrphansResult, ExportApiProfileResult, ImportApiProfileResult, RegisterApiProfileOrphansResult } from './profile-types';
8
+ export declare function discoverApiProfileOrphans(): DiscoverApiProfileOrphansResult;
9
+ export declare function registerApiProfileOrphans(options?: {
10
+ names?: string[];
11
+ target?: TargetType;
12
+ force?: boolean;
13
+ }): RegisterApiProfileOrphansResult;
14
+ export declare function copyApiProfile(source: string, destination: string, options?: {
15
+ target?: TargetType;
16
+ force?: boolean;
17
+ }): CopyApiProfileResult;
18
+ export declare function exportApiProfile(name: string, includeSecrets?: boolean): ExportApiProfileResult;
19
+ export declare function importApiProfileBundle(bundle: unknown, options?: {
20
+ name?: string;
21
+ target?: TargetType;
22
+ force?: boolean;
23
+ }): ImportApiProfileResult;
24
+ //# sourceMappingURL=profile-lifecycle-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-lifecycle-service.d.ts","sourceRoot":"","sources":["../../../src/api/services/profile-lifecycle-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAa/D,OAAO,KAAK,EAEV,oBAAoB,EACpB,+BAA+B,EAC/B,sBAAsB,EACtB,sBAAsB,EACtB,+BAA+B,EAChC,MAAM,iBAAiB,CAAC;AAiHzB,wBAAgB,yBAAyB,IAAI,+BAA+B,CA+C3E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,+BAA+B,CAoClC;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD,oBAAoB,CAwDtB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,sBAAsB,CAqC7F;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,sBAAsB,CAuExB"}
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ /**
3
+ * API profile lifecycle service.
4
+ *
5
+ * Discovery, registration, copy, export, and import for API profiles.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || function (mod) {
24
+ if (mod && mod.__esModule) return mod;
25
+ var result = {};
26
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
27
+ __setModuleDefault(result, mod);
28
+ return result;
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.importApiProfileBundle = exports.exportApiProfile = exports.copyApiProfile = exports.registerApiProfileOrphans = exports.discoverApiProfileOrphans = void 0;
32
+ const fs = __importStar(require("fs"));
33
+ const path = __importStar(require("path"));
34
+ const config_manager_1 = require("../../utils/config-manager");
35
+ const profile_hook_injector_1 = require("../../utils/websearch/profile-hook-injector");
36
+ const sensitive_keys_1 = require("../../utils/sensitive-keys");
37
+ const reserved_names_1 = require("../../config/reserved-names");
38
+ const unified_config_loader_1 = require("../../config/unified-config-loader");
39
+ const validation_service_1 = require("./validation-service");
40
+ const profile_reader_1 = require("./profile-reader");
41
+ const profile_lifecycle_validation_1 = require("./profile-lifecycle-validation");
42
+ const SETTINGS_FILE_SUFFIX = '.settings.json';
43
+ const REDACTED_TOKEN_SENTINEL = '__CCS_REDACTED__';
44
+ function parseTargetValue(value) {
45
+ if (value === 'claude' || value === 'droid') {
46
+ return value;
47
+ }
48
+ return null;
49
+ }
50
+ function validateProfileNameForPath(name, label) {
51
+ const validationError = (0, validation_service_1.validateApiName)(name);
52
+ if (validationError) {
53
+ return `Invalid ${label} profile name "${name}": ${validationError}`;
54
+ }
55
+ return null;
56
+ }
57
+ function getProfileSettingsPath(name) {
58
+ return path.join((0, config_manager_1.getCcsDir)(), `${name}${SETTINGS_FILE_SUFFIX}`);
59
+ }
60
+ function writeJsonObjectAtomically(filePath, value) {
61
+ const dir = path.dirname(filePath);
62
+ if (!fs.existsSync(dir)) {
63
+ fs.mkdirSync(dir, { recursive: true });
64
+ }
65
+ const tempPath = `${filePath}.tmp`;
66
+ fs.writeFileSync(tempPath, JSON.stringify(value, null, 2) + '\n', 'utf8');
67
+ fs.renameSync(tempPath, filePath);
68
+ }
69
+ function registerApiProfileInConfig(name, target, force = false) {
70
+ if ((0, unified_config_loader_1.isUnifiedMode)()) {
71
+ const config = (0, unified_config_loader_1.loadOrCreateUnifiedConfig)();
72
+ if (config.profiles[name] && !force) {
73
+ throw new Error(`API profile already exists: ${name}`);
74
+ }
75
+ config.profiles[name] = {
76
+ type: 'api',
77
+ settings: `~/.ccs/${name}${SETTINGS_FILE_SUFFIX}`,
78
+ ...(target !== 'claude' && { target }),
79
+ };
80
+ (0, unified_config_loader_1.saveUnifiedConfig)(config);
81
+ return;
82
+ }
83
+ const configPath = (0, config_manager_1.getConfigPath)();
84
+ const config = (0, config_manager_1.loadConfigSafe)();
85
+ if (config.profiles[name] && !force) {
86
+ throw new Error(`API profile already exists: ${name}`);
87
+ }
88
+ config.profiles[name] = `~/.ccs/${name}${SETTINGS_FILE_SUFFIX}`;
89
+ config.profile_targets = config.profile_targets || {};
90
+ if (target === 'claude') {
91
+ delete config.profile_targets[name];
92
+ }
93
+ else {
94
+ config.profile_targets[name] = target;
95
+ }
96
+ writeJsonObjectAtomically(configPath, config);
97
+ }
98
+ function getRegisteredSettingsFileNames() {
99
+ const { profiles, variants } = (0, profile_reader_1.listApiProfiles)();
100
+ const names = new Set();
101
+ for (const profile of profiles) {
102
+ names.add(`${profile.name}${SETTINGS_FILE_SUFFIX}`);
103
+ }
104
+ for (const variant of variants) {
105
+ if (!variant.settings || variant.settings === '-')
106
+ continue;
107
+ names.add(path.basename(variant.settings.replace(/^~\/\.ccs\//, '')));
108
+ }
109
+ return names;
110
+ }
111
+ function getProfileTarget(name) {
112
+ const { profiles } = (0, profile_reader_1.listApiProfiles)();
113
+ return profiles.find((profile) => profile.name === name)?.target || 'claude';
114
+ }
115
+ function readJsonObject(filePath) {
116
+ const raw = fs.readFileSync(filePath, 'utf8');
117
+ const parsed = JSON.parse(raw);
118
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
119
+ throw new Error('Settings file must contain a JSON object.');
120
+ }
121
+ return parsed;
122
+ }
123
+ function rollbackSettingsFile(filePath, previousContent, existedBefore) {
124
+ if (existedBefore && previousContent !== null) {
125
+ fs.writeFileSync(filePath, previousContent, 'utf8');
126
+ return;
127
+ }
128
+ if (fs.existsSync(filePath)) {
129
+ fs.unlinkSync(filePath);
130
+ }
131
+ }
132
+ function discoverApiProfileOrphans() {
133
+ const ccsDir = (0, config_manager_1.getCcsDir)();
134
+ if (!fs.existsSync(ccsDir)) {
135
+ return { orphans: [] };
136
+ }
137
+ const registeredSettings = getRegisteredSettingsFileNames();
138
+ const files = fs.readdirSync(ccsDir).filter((file) => file.endsWith(SETTINGS_FILE_SUFFIX));
139
+ const ignoredNames = new Set(['cursor.settings.json']);
140
+ const orphans = files
141
+ .filter((file) => !registeredSettings.has(file))
142
+ .filter((file) => !file.startsWith('base-'))
143
+ .filter((file) => !ignoredNames.has(file))
144
+ .filter((file) => !(0, reserved_names_1.isReservedName)(file.slice(0, -SETTINGS_FILE_SUFFIX.length)))
145
+ .map((file) => {
146
+ const name = file.slice(0, -SETTINGS_FILE_SUFFIX.length);
147
+ const settingsPath = path.join(ccsDir, file);
148
+ try {
149
+ const settings = readJsonObject(settingsPath);
150
+ return {
151
+ name,
152
+ settingsPath,
153
+ validation: (0, profile_lifecycle_validation_1.validateApiProfileSettingsPayload)(settings),
154
+ };
155
+ }
156
+ catch (error) {
157
+ return {
158
+ name,
159
+ settingsPath,
160
+ validation: {
161
+ valid: false,
162
+ issues: [
163
+ {
164
+ level: 'error',
165
+ code: 'invalid_json',
166
+ message: error.message,
167
+ field: 'settings',
168
+ hint: 'Fix JSON syntax before registration.',
169
+ },
170
+ ],
171
+ },
172
+ };
173
+ }
174
+ });
175
+ return { orphans };
176
+ }
177
+ exports.discoverApiProfileOrphans = discoverApiProfileOrphans;
178
+ function registerApiProfileOrphans(options) {
179
+ const discovered = discoverApiProfileOrphans();
180
+ const selected = options?.names === undefined
181
+ ? discovered.orphans
182
+ : discovered.orphans.filter((orphan) => options.names?.includes(orphan.name));
183
+ const result = { registered: [], skipped: [] };
184
+ for (const orphan of selected) {
185
+ const nameError = (0, validation_service_1.validateApiName)(orphan.name);
186
+ if (nameError) {
187
+ result.skipped.push({
188
+ name: orphan.name,
189
+ reason: `Invalid profile name: ${nameError}`,
190
+ });
191
+ continue;
192
+ }
193
+ if (!options?.force && !orphan.validation.valid) {
194
+ result.skipped.push({
195
+ name: orphan.name,
196
+ reason: 'Validation failed. Use --force to register.',
197
+ });
198
+ continue;
199
+ }
200
+ try {
201
+ registerApiProfileInConfig(orphan.name, options?.target || 'claude', options?.force || false);
202
+ (0, profile_hook_injector_1.ensureProfileHooks)(orphan.name);
203
+ result.registered.push(orphan.name);
204
+ }
205
+ catch (error) {
206
+ result.skipped.push({ name: orphan.name, reason: error.message });
207
+ }
208
+ }
209
+ return result;
210
+ }
211
+ exports.registerApiProfileOrphans = registerApiProfileOrphans;
212
+ function copyApiProfile(source, destination, options) {
213
+ const sourceError = validateProfileNameForPath(source, 'source');
214
+ if (sourceError)
215
+ return { success: false, error: sourceError };
216
+ const destinationError = (0, validation_service_1.validateApiName)(destination);
217
+ if (destinationError)
218
+ return { success: false, error: destinationError };
219
+ const sourceSettingsPath = getProfileSettingsPath(source);
220
+ if (!fs.existsSync(sourceSettingsPath)) {
221
+ return { success: false, error: `Source profile settings not found: ${source}` };
222
+ }
223
+ const destinationSettingsPath = getProfileSettingsPath(destination);
224
+ if (fs.existsSync(destinationSettingsPath) && !options?.force) {
225
+ return { success: false, error: `Destination settings already exist: ${destination}` };
226
+ }
227
+ try {
228
+ const sourceSettings = readJsonObject(sourceSettingsPath);
229
+ const validation = (0, profile_lifecycle_validation_1.validateApiProfileSettingsPayload)(sourceSettings);
230
+ if (!validation.valid && !options?.force) {
231
+ return {
232
+ success: false,
233
+ error: 'Source profile has validation errors. Use --force to copy.',
234
+ };
235
+ }
236
+ const destinationExisted = fs.existsSync(destinationSettingsPath);
237
+ const previousDestinationContent = destinationExisted
238
+ ? fs.readFileSync(destinationSettingsPath, 'utf8')
239
+ : null;
240
+ writeJsonObjectAtomically(destinationSettingsPath, sourceSettings);
241
+ (0, profile_hook_injector_1.ensureProfileHooks)(destination);
242
+ try {
243
+ registerApiProfileInConfig(destination, options?.target || getProfileTarget(source), options?.force);
244
+ }
245
+ catch (registrationError) {
246
+ rollbackSettingsFile(destinationSettingsPath, previousDestinationContent, destinationExisted);
247
+ throw registrationError;
248
+ }
249
+ return {
250
+ success: true,
251
+ name: destination,
252
+ settingsPath: destinationSettingsPath,
253
+ warnings: validation.issues
254
+ .filter((issue) => issue.level === 'warning')
255
+ .map((issue) => issue.message),
256
+ };
257
+ }
258
+ catch (error) {
259
+ return { success: false, error: error.message };
260
+ }
261
+ }
262
+ exports.copyApiProfile = copyApiProfile;
263
+ function exportApiProfile(name, includeSecrets = false) {
264
+ const nameError = validateProfileNameForPath(name, 'profile');
265
+ if (nameError)
266
+ return { success: false, error: nameError };
267
+ const settingsPath = getProfileSettingsPath(name);
268
+ if (!fs.existsSync(settingsPath)) {
269
+ return { success: false, error: `Profile settings not found: ${name}` };
270
+ }
271
+ try {
272
+ const settings = readJsonObject(settingsPath);
273
+ let redacted = false;
274
+ if (!includeSecrets) {
275
+ const env = settings.env;
276
+ if (typeof env === 'object' && env !== null) {
277
+ for (const [key, value] of Object.entries(env)) {
278
+ if (!(0, sensitive_keys_1.isSensitiveKey)(key) || typeof value !== 'string')
279
+ continue;
280
+ env[key] = REDACTED_TOKEN_SENTINEL;
281
+ redacted = true;
282
+ }
283
+ }
284
+ }
285
+ const bundle = {
286
+ schemaVersion: 1,
287
+ exportedAt: new Date().toISOString(),
288
+ profile: {
289
+ name,
290
+ target: getProfileTarget(name),
291
+ },
292
+ settings,
293
+ };
294
+ return { success: true, bundle, redacted };
295
+ }
296
+ catch (error) {
297
+ return { success: false, error: error.message };
298
+ }
299
+ }
300
+ exports.exportApiProfile = exportApiProfile;
301
+ function importApiProfileBundle(bundle, options) {
302
+ if (typeof bundle !== 'object' || bundle === null || Array.isArray(bundle)) {
303
+ return { success: false, error: 'Import bundle must be a JSON object.' };
304
+ }
305
+ const input = bundle;
306
+ if (input.schemaVersion !== 1 || !input.profile || !input.settings) {
307
+ return {
308
+ success: false,
309
+ error: 'Invalid bundle schema. Expected schemaVersion=1 with profile and settings.',
310
+ };
311
+ }
312
+ const name = options?.name || input.profile.name;
313
+ const nameError = (0, validation_service_1.validateApiName)(name);
314
+ if (nameError)
315
+ return { success: false, error: nameError };
316
+ const bundleTarget = parseTargetValue(input.profile.target);
317
+ if (input.profile.target !== undefined && bundleTarget === null) {
318
+ return {
319
+ success: false,
320
+ error: 'Invalid bundle profile target. Expected: claude or droid.',
321
+ };
322
+ }
323
+ const settings = JSON.parse(JSON.stringify(input.settings));
324
+ const env = settings.env;
325
+ const warnings = [];
326
+ if (env) {
327
+ const redactedKeys = Object.entries(env)
328
+ .filter(([key, value]) => (0, sensitive_keys_1.isSensitiveKey)(key) && value === REDACTED_TOKEN_SENTINEL)
329
+ .map(([key]) => key);
330
+ if (redactedKeys.length > 0) {
331
+ for (const key of redactedKeys) {
332
+ env[key] = '';
333
+ }
334
+ warnings.push(`Imported bundle had redacted values for ${redactedKeys.join(', ')}. Set secrets before use.`);
335
+ }
336
+ }
337
+ const validation = (0, profile_lifecycle_validation_1.validateApiProfileSettingsPayload)(settings);
338
+ if (!validation.valid && !options?.force) {
339
+ return { success: false, error: 'Import validation failed.', validation };
340
+ }
341
+ const settingsPath = getProfileSettingsPath(name);
342
+ try {
343
+ const settingsExisted = fs.existsSync(settingsPath);
344
+ const previousSettingsContent = settingsExisted ? fs.readFileSync(settingsPath, 'utf8') : null;
345
+ writeJsonObjectAtomically(settingsPath, settings);
346
+ (0, profile_hook_injector_1.ensureProfileHooks)(name);
347
+ try {
348
+ registerApiProfileInConfig(name, options?.target || bundleTarget || 'claude', options?.force);
349
+ }
350
+ catch (registrationError) {
351
+ rollbackSettingsFile(settingsPath, previousSettingsContent, settingsExisted);
352
+ throw registrationError;
353
+ }
354
+ warnings.push(...validation.issues
355
+ .filter((issue) => issue.level === 'warning')
356
+ .map((issue) => issue.message));
357
+ return { success: true, name, warnings, validation };
358
+ }
359
+ catch (error) {
360
+ return { success: false, error: error.message, validation };
361
+ }
362
+ }
363
+ exports.importApiProfileBundle = importApiProfileBundle;
364
+ //# sourceMappingURL=profile-lifecycle-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-lifecycle-service.js","sourceRoot":"","sources":["../../../src/api/services/profile-lifecycle-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Profile lifecycle validation helpers.
3
+ *
4
+ * Shared by orphan discovery, copy, export/import, and dashboard routes.
5
+ */
6
+ import type { ProfileValidationSummary } from './profile-types';
7
+ /**
8
+ * Validate an API profile settings payload and return actionable diagnostics.
9
+ */
10
+ export declare function validateApiProfileSettingsPayload(settings: unknown): ProfileValidationSummary;
11
+ //# sourceMappingURL=profile-lifecycle-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-lifecycle-validation.d.ts","sourceRoot":"","sources":["../../../src/api/services/profile-lifecycle-validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAA0B,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AA+CxF;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,OAAO,GAAG,wBAAwB,CAuF7F"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /**
3
+ * Profile lifecycle validation helpers.
4
+ *
5
+ * Shared by orphan discovery, copy, export/import, and dashboard routes.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.validateApiProfileSettingsPayload = void 0;
9
+ const model_id_normalizer_1 = require("../../cliproxy/model-id-normalizer");
10
+ const provider_capabilities_1 = require("../../cliproxy/provider-capabilities");
11
+ const MODEL_ENV_KEYS = [
12
+ 'ANTHROPIC_MODEL',
13
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL',
14
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
15
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
16
+ ];
17
+ const ALLOWED_ANTHROPIC_ENV_KEYS = new Set([
18
+ 'ANTHROPIC_BASE_URL',
19
+ 'ANTHROPIC_AUTH_TOKEN',
20
+ 'ANTHROPIC_API_KEY',
21
+ ...MODEL_ENV_KEYS,
22
+ ]);
23
+ function resolveProviderFromBaseUrl(baseUrl) {
24
+ if (!baseUrl.trim())
25
+ return null;
26
+ try {
27
+ const parsed = new URL(baseUrl);
28
+ const extracted = (0, model_id_normalizer_1.extractProviderFromPathname)(parsed.pathname);
29
+ return extracted ? (0, provider_capabilities_1.mapExternalProviderName)(extracted) : null;
30
+ }
31
+ catch {
32
+ const extracted = (0, model_id_normalizer_1.extractProviderFromPathname)(baseUrl);
33
+ return extracted ? (0, provider_capabilities_1.mapExternalProviderName)(extracted) : null;
34
+ }
35
+ }
36
+ function pushIssue(issues, level, code, message, field, hint) {
37
+ issues.push({ level, code, message, field, hint });
38
+ }
39
+ function asObject(value) {
40
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
41
+ return null;
42
+ }
43
+ return value;
44
+ }
45
+ /**
46
+ * Validate an API profile settings payload and return actionable diagnostics.
47
+ */
48
+ function validateApiProfileSettingsPayload(settings) {
49
+ const issues = [];
50
+ const settingsObj = asObject(settings);
51
+ if (!settingsObj) {
52
+ pushIssue(issues, 'error', 'invalid_settings_type', 'Settings payload must be a JSON object.', 'settings', 'Expected object like { "env": { ... } }');
53
+ return { valid: false, issues };
54
+ }
55
+ const envObj = asObject(settingsObj.env);
56
+ if (!envObj) {
57
+ pushIssue(issues, 'error', 'missing_env_object', 'settings.env must be a JSON object.', 'settings.env', 'Add env keys such as ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN.');
58
+ return { valid: false, issues };
59
+ }
60
+ const baseUrl = typeof envObj.ANTHROPIC_BASE_URL === 'string' ? envObj.ANTHROPIC_BASE_URL.trim() : '';
61
+ if (!baseUrl) {
62
+ pushIssue(issues, 'error', 'missing_base_url', 'ANTHROPIC_BASE_URL is required.', 'env.ANTHROPIC_BASE_URL', 'Example: https://api.openai.com/v1 or provider-specific endpoint.');
63
+ }
64
+ const authToken = typeof envObj.ANTHROPIC_AUTH_TOKEN === 'string' ? envObj.ANTHROPIC_AUTH_TOKEN.trim() : '';
65
+ if (!authToken) {
66
+ pushIssue(issues, 'warning', 'missing_auth_token', 'ANTHROPIC_AUTH_TOKEN is empty; profile may not run until token is configured.', 'env.ANTHROPIC_AUTH_TOKEN', 'Set token after import if exported in redacted mode.');
67
+ }
68
+ const provider = resolveProviderFromBaseUrl(baseUrl);
69
+ for (const modelKey of MODEL_ENV_KEYS) {
70
+ const value = envObj[modelKey];
71
+ if (typeof value !== 'string' || value.trim().length === 0)
72
+ continue;
73
+ const denyReason = (0, model_id_normalizer_1.getDeniedModelIdReasonForProvider)(value, provider);
74
+ if (denyReason) {
75
+ pushIssue(issues, 'error', 'model_denylisted', `${modelKey}: ${denyReason}`, `env.${modelKey}`, 'Choose a supported model for the provider endpoint.');
76
+ }
77
+ }
78
+ for (const key of Object.keys(envObj)) {
79
+ if (key.startsWith('ANTHROPIC_') && !ALLOWED_ANTHROPIC_ENV_KEYS.has(key)) {
80
+ pushIssue(issues, 'warning', 'unknown_anthropic_env_key', `Unknown ANTHROPIC env key: ${key}`, `env.${key}`, 'Check for typos or provider-unsupported settings.');
81
+ }
82
+ }
83
+ const hasErrors = issues.some((issue) => issue.level === 'error');
84
+ return { valid: !hasErrors, issues };
85
+ }
86
+ exports.validateApiProfileSettingsPayload = validateApiProfileSettingsPayload;
87
+ //# sourceMappingURL=profile-lifecycle-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-lifecycle-validation.js","sourceRoot":"","sources":["../../../src/api/services/profile-lifecycle-validation.ts"],"names":[],"mappings":"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"}