@kaitranntt/ccs 7.52.2 → 7.53.0-dev.2
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/README.md +9 -1
- package/config/base-claude.settings.json +3 -3
- package/config/base-codex.settings.json +1 -1
- package/config/base-llamacpp.settings.json +10 -0
- package/dist/api/services/index.d.ts +3 -1
- package/dist/api/services/index.d.ts.map +1 -1
- package/dist/api/services/index.js +10 -1
- package/dist/api/services/index.js.map +1 -1
- package/dist/api/services/profile-lifecycle-service.d.ts +24 -0
- package/dist/api/services/profile-lifecycle-service.d.ts.map +1 -0
- package/dist/api/services/profile-lifecycle-service.js +364 -0
- package/dist/api/services/profile-lifecycle-service.js.map +1 -0
- package/dist/api/services/profile-lifecycle-validation.d.ts +11 -0
- package/dist/api/services/profile-lifecycle-validation.d.ts.map +1 -0
- package/dist/api/services/profile-lifecycle-validation.js +87 -0
- package/dist/api/services/profile-lifecycle-validation.js.map +1 -0
- package/dist/api/services/profile-reader.js +1 -1
- package/dist/api/services/profile-reader.js.map +1 -1
- package/dist/api/services/profile-types.d.ts +66 -0
- package/dist/api/services/profile-types.d.ts.map +1 -1
- package/dist/api/services/profile-writer.d.ts.map +1 -1
- package/dist/api/services/profile-writer.js +23 -8
- package/dist/api/services/profile-writer.js.map +1 -1
- package/dist/auth/auth-commands.d.ts.map +1 -1
- package/dist/auth/auth-commands.js +4 -0
- package/dist/auth/auth-commands.js.map +1 -1
- package/dist/auth/commands/create-command.d.ts.map +1 -1
- package/dist/auth/commands/create-command.js +20 -7
- package/dist/auth/commands/create-command.js.map +1 -1
- package/dist/auth/commands/show-command.d.ts.map +1 -1
- package/dist/auth/commands/show-command.js +2 -0
- package/dist/auth/commands/show-command.js.map +1 -1
- package/dist/auth/commands/types.d.ts +2 -0
- package/dist/auth/commands/types.d.ts.map +1 -1
- package/dist/auth/commands/types.js +2 -0
- package/dist/auth/commands/types.js.map +1 -1
- package/dist/auth/profile-continuity-inheritance.d.ts.map +1 -1
- package/dist/auth/profile-continuity-inheritance.js +3 -1
- package/dist/auth/profile-continuity-inheritance.js.map +1 -1
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +1 -0
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/auth/profile-registry.d.ts +1 -0
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +3 -0
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/ccs.js +32 -4
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/auth/auth-types.d.ts +3 -0
- package/dist/cliproxy/auth/auth-types.d.ts.map +1 -1
- package/dist/cliproxy/auth/auth-types.js +18 -1
- package/dist/cliproxy/auth/auth-types.js.map +1 -1
- package/dist/cliproxy/auth/gemini-token-refresh.d.ts.map +1 -1
- package/dist/cliproxy/auth/gemini-token-refresh.js +42 -14
- package/dist/cliproxy/auth/gemini-token-refresh.js.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.d.ts +10 -0
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.js +60 -15
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
- package/dist/cliproxy/binary-manager.d.ts.map +1 -1
- package/dist/cliproxy/binary-manager.js +13 -14
- package/dist/cliproxy/binary-manager.js.map +1 -1
- package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
- package/dist/cliproxy/config/thinking-config.js +9 -0
- package/dist/cliproxy/config/thinking-config.js.map +1 -1
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +14 -1
- package/dist/cliproxy/model-catalog.js.map +1 -1
- package/dist/cliproxy/quota-fetcher-claude.d.ts.map +1 -1
- package/dist/cliproxy/quota-fetcher-claude.js +51 -8
- package/dist/cliproxy/quota-fetcher-claude.js.map +1 -1
- package/dist/cliproxy/quota-fetcher-codex.d.ts.map +1 -1
- package/dist/cliproxy/quota-fetcher-codex.js +199 -63
- package/dist/cliproxy/quota-fetcher-codex.js.map +1 -1
- package/dist/cliproxy/quota-fetcher.d.ts +12 -0
- package/dist/cliproxy/quota-fetcher.d.ts.map +1 -1
- package/dist/cliproxy/quota-fetcher.js +328 -260
- package/dist/cliproxy/quota-fetcher.js.map +1 -1
- package/dist/cliproxy/quota-manager.d.ts +1 -1
- package/dist/cliproxy/quota-manager.d.ts.map +1 -1
- package/dist/cliproxy/quota-manager.js +9 -7
- package/dist/cliproxy/quota-manager.js.map +1 -1
- package/dist/cliproxy/quota-types.d.ts +18 -4
- package/dist/cliproxy/quota-types.d.ts.map +1 -1
- package/dist/cliproxy/thinking-validator.js +20 -0
- package/dist/cliproxy/thinking-validator.js.map +1 -1
- package/dist/cliproxy/tool-sanitization-proxy.d.ts.map +1 -1
- package/dist/cliproxy/tool-sanitization-proxy.js +86 -2
- package/dist/cliproxy/tool-sanitization-proxy.js.map +1 -1
- package/dist/commands/api-command.d.ts.map +1 -1
- package/dist/commands/api-command.js +299 -13
- package/dist/commands/api-command.js.map +1 -1
- package/dist/commands/copilot-command.d.ts.map +1 -1
- package/dist/commands/copilot-command.js +38 -0
- package/dist/commands/copilot-command.js.map +1 -1
- package/dist/commands/env-command.js +1 -1
- package/dist/commands/env-command.js.map +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +7 -1
- package/dist/commands/help-command.js.map +1 -1
- package/dist/commands/sync-command.d.ts.map +1 -1
- package/dist/commands/sync-command.js +25 -0
- package/dist/commands/sync-command.js.map +1 -1
- package/dist/config/unified-config-types.d.ts +2 -0
- package/dist/config/unified-config-types.d.ts.map +1 -1
- package/dist/config/unified-config-types.js.map +1 -1
- package/dist/copilot/copilot-models.d.ts.map +1 -1
- package/dist/copilot/copilot-models.js +55 -13
- package/dist/copilot/copilot-models.js.map +1 -1
- package/dist/copilot/types.d.ts +10 -0
- package/dist/copilot/types.d.ts.map +1 -1
- package/dist/management/instance-manager.d.ts +9 -6
- package/dist/management/instance-manager.d.ts.map +1 -1
- package/dist/management/instance-manager.js +56 -34
- package/dist/management/instance-manager.js.map +1 -1
- package/dist/shared/provider-preset-catalog.d.ts +1 -1
- package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
- package/dist/shared/provider-preset-catalog.js +30 -0
- package/dist/shared/provider-preset-catalog.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/ui/assets/accounts-PwWppkAw.js +1 -0
- package/dist/ui/assets/{alert-dialog-DPdKlUG9.js → alert-dialog-BKNsxsSg.js} +1 -1
- package/dist/ui/assets/api-C9f0vP-J.js +4 -0
- package/dist/ui/assets/auth-section-D0XQSyo0.js +1 -0
- package/dist/ui/assets/backups-section-Dxj8M3n7.js +1 -0
- package/dist/ui/assets/{checkbox-CcX8-GfD.js → checkbox-mjr1O0jA.js} +1 -1
- package/dist/ui/assets/cliproxy-BwRuqd53.js +3 -0
- package/dist/ui/assets/cliproxy-control-panel-VThtggLh.js +1 -0
- package/dist/ui/assets/{confirm-dialog-BZj0PYFs.js → confirm-dialog-i-Sfbmcm.js} +1 -1
- package/dist/ui/assets/copilot-Bp6z4OCx.js +3 -0
- package/dist/ui/assets/{cursor-rS1S0i_y.js → cursor-CJP1tf06.js} +1 -1
- package/dist/ui/assets/{droid-Dfc2QwbE.js → droid-R1Tbhk5J.js} +1 -1
- package/dist/ui/assets/{form-utils-Cn_Uld6y.js → form-utils-Bcoyqxpq.js} +1 -1
- package/dist/ui/assets/globalenv-section-TvE1onaY.js +1 -0
- package/dist/ui/assets/{health-B0WQPDXb.js → health-Cyjkkaf-.js} +1 -1
- package/dist/ui/assets/{icons-BYZM_9Gm.js → icons-D2eEmpHv.js} +1 -1
- package/dist/ui/assets/index-1DQih7xp.js +1 -0
- package/dist/ui/assets/index-BlXbW1dV.js +1 -0
- package/dist/ui/assets/index-BusjPRWX.css +1 -0
- package/dist/ui/assets/index-CcjPykyr.js +1 -0
- package/dist/ui/assets/{index-LHbr_5SB.js → index-DfbkdLOb.js} +1 -1
- package/dist/ui/assets/index-WhofYWgJ.js +47 -0
- package/dist/ui/assets/proxy-status-widget-O38AQ1k4.js +1 -0
- package/dist/ui/assets/{separator-DtcqgZIS.js → separator-B66kRzAj.js} +1 -1
- package/dist/ui/assets/shared-BG19Chhy.js +8 -0
- package/dist/ui/assets/{switch-BL5xZtnr.js → switch-IqCO_Age.js} +1 -1
- package/dist/ui/assets/{updates-B3HKUp7y.js → updates-_5C-OO-6.js} +1 -1
- package/dist/ui/index.html +4 -4
- package/dist/utils/api-key-validator.d.ts +2 -0
- package/dist/utils/api-key-validator.d.ts.map +1 -1
- package/dist/utils/api-key-validator.js +64 -1
- package/dist/utils/api-key-validator.js.map +1 -1
- package/dist/utils/delegation-validator.d.ts.map +1 -1
- package/dist/utils/delegation-validator.js +4 -3
- package/dist/utils/delegation-validator.js.map +1 -1
- package/dist/utils/error-codes.d.ts +1 -1
- package/dist/utils/error-codes.d.ts.map +1 -1
- package/dist/utils/error-codes.js +11 -6
- package/dist/utils/error-codes.js.map +1 -1
- package/dist/web-server/routes/account-routes.d.ts.map +1 -1
- package/dist/web-server/routes/account-routes.js +2 -1
- package/dist/web-server/routes/account-routes.js.map +1 -1
- package/dist/web-server/routes/cliproxy-stats-routes.d.ts +12 -0
- package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cliproxy-stats-routes.js +22 -9
- package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -1
- package/dist/web-server/routes/profile-routes.d.ts.map +1 -1
- package/dist/web-server/routes/profile-routes.js +218 -18
- package/dist/web-server/routes/profile-routes.js.map +1 -1
- package/dist/web-server/routes/route-helpers.d.ts +1 -0
- package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
- package/dist/web-server/routes/route-helpers.js +51 -13
- package/dist/web-server/routes/route-helpers.js.map +1 -1
- package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
- package/dist/web-server/routes/settings-routes.js +3 -0
- package/dist/web-server/routes/settings-routes.js.map +1 -1
- package/dist/web-server/services/cliproxy-dashboard-install-service.d.ts +21 -0
- package/dist/web-server/services/cliproxy-dashboard-install-service.d.ts.map +1 -0
- package/dist/web-server/services/cliproxy-dashboard-install-service.js +51 -0
- package/dist/web-server/services/cliproxy-dashboard-install-service.js.map +1 -0
- package/lib/error-codes.ps1 +14 -4
- package/lib/error-codes.sh +10 -6
- package/lib/hooks/image-analyzer-transformer.cjs +51 -20
- package/package.json +2 -6
- package/dist/ui/assets/accounts-szAllF_0.js +0 -1
- package/dist/ui/assets/api-Bq7TnM0v.js +0 -1
- package/dist/ui/assets/auth-section-DYPWbNRj.js +0 -1
- package/dist/ui/assets/backups-section-gIWfCGmR.js +0 -1
- package/dist/ui/assets/cliproxy-SS8eRAX0.js +0 -3
- package/dist/ui/assets/cliproxy-control-panel-Bu0TtDft.js +0 -1
- package/dist/ui/assets/copilot-DnJj3frU.js +0 -3
- package/dist/ui/assets/globalenv-section-BrHb5lRq.js +0 -1
- package/dist/ui/assets/index-BFTIN2qO.js +0 -1
- package/dist/ui/assets/index-BVBXszJi.js +0 -1
- package/dist/ui/assets/index-DCQkhmoo.js +0 -47
- package/dist/ui/assets/index-DxKsP0Ke.js +0 -1
- package/dist/ui/assets/index-WBo504Wu.css +0 -1
- package/dist/ui/assets/proxy-status-widget-DPXgRGkB.js +0 -1
- package/dist/ui/assets/shared-DPJ_z23p.js +0 -8
- package/scripts/maintainability-baseline.js +0 -308
- package/scripts/maintainability-check.js +0 -163
package/README.md
CHANGED
|
@@ -55,7 +55,7 @@ ccs config
|
|
|
55
55
|
|
|
56
56
|
Dashboard updates hub: `http://localhost:3000/updates`
|
|
57
57
|
|
|
58
|
-
Want to run the dashboard in Docker? See `docker/README.md`.
|
|
58
|
+
Want to run the dashboard in Docker or pull the prebuilt image? See `docker/README.md`.
|
|
59
59
|
|
|
60
60
|
### 3. Configure Your Accounts
|
|
61
61
|
|
|
@@ -102,6 +102,7 @@ The dashboard provides visual management for all account types:
|
|
|
102
102
|
| **Antigravity** | OAuth | `ccs agy` | Alternative routing |
|
|
103
103
|
| **OpenRouter** | API Key | `ccs openrouter` | 300+ models, unified API |
|
|
104
104
|
| **Ollama** | Local | `ccs ollama` | Local open-source models, privacy |
|
|
105
|
+
| **llama.cpp** | Local | `ccs llamacpp` | Local GGUF inference via llama.cpp server |
|
|
105
106
|
| **Ollama Cloud** | API Key | `ccs ollama-cloud` | Cloud-hosted open-source models |
|
|
106
107
|
| **GLM** | API Key | `ccs glm` | Cost-optimized execution |
|
|
107
108
|
| **KM (Kimi API)** | API Key | `ccs km` | Long-context, thinking mode |
|
|
@@ -119,6 +120,8 @@ The dashboard provides visual management for all account types:
|
|
|
119
120
|
|
|
120
121
|
**Ollama Integration**: Run local open-source models (qwen3-coder, gpt-oss:20b) with full privacy. Use `ccs api create --preset ollama` - requires [Ollama v0.14.0+](https://ollama.com) installed. For cloud models, use `ccs api create --preset ollama-cloud`.
|
|
121
122
|
|
|
123
|
+
**llama.cpp Integration**: Run a local llama.cpp OpenAI-compatible server and create a profile with `ccs api create --preset llamacpp`. CCS defaults to `http://127.0.0.1:8080`, matching the standard llama.cpp server port.
|
|
124
|
+
|
|
122
125
|
**Azure Foundry**: Use `ccs api create --preset foundry` to set up Claude via Microsoft Azure AI Foundry. Requires Azure resource and API key from [ai.azure.com](https://ai.azure.com).
|
|
123
126
|
|
|
124
127
|

|
|
@@ -149,9 +152,14 @@ ccs ghcp # GitHub Copilot (OAuth device flow)
|
|
|
149
152
|
ccs agy # Antigravity (OAuth)
|
|
150
153
|
ccs qwen # Qwen Code (OAuth via CLIProxy)
|
|
151
154
|
ccs ollama # Local Ollama (no API key needed)
|
|
155
|
+
ccs llamacpp # Local llama.cpp (no API key needed)
|
|
152
156
|
ccs glm # GLM (API key)
|
|
153
157
|
ccs km # Kimi API profile (API key)
|
|
154
158
|
ccs api create --preset alibaba-coding-plan # Alibaba Coding Plan profile
|
|
159
|
+
ccs api discover --register # Auto-register orphan *.settings.json
|
|
160
|
+
ccs api copy glm glm-backup # Duplicate profile config + settings
|
|
161
|
+
ccs api export glm --out ./glm.ccs-profile.json # Export for cross-device transfer
|
|
162
|
+
ccs api import ./glm.ccs-profile.json # Import exported profile bundle
|
|
155
163
|
```
|
|
156
164
|
|
|
157
165
|
### Droid Alias (`argv[0]` pattern)
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"env": {
|
|
3
3
|
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/claude",
|
|
4
4
|
"ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed",
|
|
5
|
-
"ANTHROPIC_MODEL": "claude-sonnet-4-
|
|
6
|
-
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-
|
|
7
|
-
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-
|
|
5
|
+
"ANTHROPIC_MODEL": "claude-sonnet-4-6",
|
|
6
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-6",
|
|
7
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-6",
|
|
8
8
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5-20251001"
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"env": {
|
|
3
|
+
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8080",
|
|
4
|
+
"ANTHROPIC_AUTH_TOKEN": "llamacpp",
|
|
5
|
+
"ANTHROPIC_MODEL": "llama3-8b",
|
|
6
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL": "llama3-70b",
|
|
7
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "llama3-8b",
|
|
8
|
+
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "llama3-2b"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -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,
|
|
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;
|
|
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"}
|