claudegate 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/bin/cc.js +3 -0
  4. package/bin/claudegate.js +3 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +76 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/providers/index.d.ts +2 -0
  10. package/dist/providers/index.d.ts.map +1 -0
  11. package/dist/providers/index.js +2 -0
  12. package/dist/providers/index.js.map +1 -0
  13. package/dist/providers/registry.d.ts +10 -0
  14. package/dist/providers/registry.d.ts.map +1 -0
  15. package/dist/providers/registry.js +306 -0
  16. package/dist/providers/registry.js.map +1 -0
  17. package/dist/services/config.service.d.ts +11 -0
  18. package/dist/services/config.service.d.ts.map +1 -0
  19. package/dist/services/config.service.js +33 -0
  20. package/dist/services/config.service.js.map +1 -0
  21. package/dist/services/env-builder.service.d.ts +31 -0
  22. package/dist/services/env-builder.service.d.ts.map +1 -0
  23. package/dist/services/env-builder.service.js +73 -0
  24. package/dist/services/env-builder.service.js.map +1 -0
  25. package/dist/services/launcher.service.d.ts +7 -0
  26. package/dist/services/launcher.service.d.ts.map +1 -0
  27. package/dist/services/launcher.service.js +37 -0
  28. package/dist/services/launcher.service.js.map +1 -0
  29. package/dist/services/model.service.d.ts +46 -0
  30. package/dist/services/model.service.d.ts.map +1 -0
  31. package/dist/services/model.service.js +164 -0
  32. package/dist/services/model.service.js.map +1 -0
  33. package/dist/services/profile.service.d.ts +38 -0
  34. package/dist/services/profile.service.d.ts.map +1 -0
  35. package/dist/services/profile.service.js +107 -0
  36. package/dist/services/profile.service.js.map +1 -0
  37. package/dist/types/config.d.ts +42 -0
  38. package/dist/types/config.d.ts.map +1 -0
  39. package/dist/types/config.js +32 -0
  40. package/dist/types/config.js.map +1 -0
  41. package/dist/types/index.d.ts +4 -0
  42. package/dist/types/index.d.ts.map +1 -0
  43. package/dist/types/index.js +4 -0
  44. package/dist/types/index.js.map +1 -0
  45. package/dist/types/profile.d.ts +29 -0
  46. package/dist/types/profile.d.ts.map +1 -0
  47. package/dist/types/profile.js +2 -0
  48. package/dist/types/profile.js.map +1 -0
  49. package/dist/types/provider.d.ts +64 -0
  50. package/dist/types/provider.d.ts.map +1 -0
  51. package/dist/types/provider.js +24 -0
  52. package/dist/types/provider.js.map +1 -0
  53. package/dist/ui/add-profile.d.ts +7 -0
  54. package/dist/ui/add-profile.d.ts.map +1 -0
  55. package/dist/ui/add-profile.js +67 -0
  56. package/dist/ui/add-profile.js.map +1 -0
  57. package/dist/ui/components/banner.d.ts +5 -0
  58. package/dist/ui/components/banner.d.ts.map +1 -0
  59. package/dist/ui/components/banner.js +14 -0
  60. package/dist/ui/components/banner.js.map +1 -0
  61. package/dist/ui/components/status.d.ts +6 -0
  62. package/dist/ui/components/status.d.ts.map +1 -0
  63. package/dist/ui/components/status.js +17 -0
  64. package/dist/ui/components/status.js.map +1 -0
  65. package/dist/ui/manage-profiles.d.ts +6 -0
  66. package/dist/ui/manage-profiles.d.ts.map +1 -0
  67. package/dist/ui/manage-profiles.js +197 -0
  68. package/dist/ui/manage-profiles.js.map +1 -0
  69. package/dist/ui/model-selector.d.ts +19 -0
  70. package/dist/ui/model-selector.d.ts.map +1 -0
  71. package/dist/ui/model-selector.js +127 -0
  72. package/dist/ui/model-selector.js.map +1 -0
  73. package/dist/ui/profile-form.d.ts +10 -0
  74. package/dist/ui/profile-form.d.ts.map +1 -0
  75. package/dist/ui/profile-form.js +61 -0
  76. package/dist/ui/profile-form.js.map +1 -0
  77. package/dist/ui/profile-selector.d.ts +27 -0
  78. package/dist/ui/profile-selector.d.ts.map +1 -0
  79. package/dist/ui/profile-selector.js +129 -0
  80. package/dist/ui/profile-selector.js.map +1 -0
  81. package/dist/utils/logger.d.ts +7 -0
  82. package/dist/utils/logger.d.ts.map +1 -0
  83. package/dist/utils/logger.js +8 -0
  84. package/dist/utils/logger.js.map +1 -0
  85. package/dist/utils/paths.d.ts +10 -0
  86. package/dist/utils/paths.d.ts.map +1 -0
  87. package/dist/utils/paths.js +21 -0
  88. package/dist/utils/paths.js.map +1 -0
  89. package/package.json +109 -0
@@ -0,0 +1,33 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
2
+ import { getConfigPath, getConfigDir } from '../utils/paths.js';
3
+ import { DEFAULT_CONFIG } from '../types/index.js';
4
+ /**
5
+ * Load the application configuration from disk
6
+ * Returns default config if file doesn't exist
7
+ */
8
+ export function loadConfig() {
9
+ const configPath = getConfigPath();
10
+ if (!existsSync(configPath)) {
11
+ return { ...DEFAULT_CONFIG };
12
+ }
13
+ try {
14
+ const content = readFileSync(configPath, 'utf-8');
15
+ const config = JSON.parse(content);
16
+ return config;
17
+ }
18
+ catch {
19
+ return { ...DEFAULT_CONFIG };
20
+ }
21
+ }
22
+ /**
23
+ * Save the application configuration to disk
24
+ */
25
+ export function saveConfig(config) {
26
+ // Ensure config directory exists
27
+ getConfigDir();
28
+ const configPath = getConfigPath();
29
+ writeFileSync(configPath, JSON.stringify(config, null, 2), {
30
+ mode: 0o600,
31
+ });
32
+ }
33
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAa,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9D;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,iCAAiC;IACjC,YAAY,EAAE,CAAC;IAEf,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACzD,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @module Environment Builder Service
3
+ * @description Builds environment variables for Claude CLI based on profile configuration.
4
+ *
5
+ * This service is responsible for:
6
+ * - Applying provider default values
7
+ * - Merging profile-specific overrides
8
+ * - Clearing conflicting environment variables (e.g., ANTHROPIC_API_KEY)
9
+ *
10
+ * @example
11
+ * // Build env vars for a profile
12
+ * const envVars = buildEnvVars(profile);
13
+ * // { ANTHROPIC_BASE_URL: 'https://...', ANTHROPIC_AUTH_TOKEN: '...' }
14
+ *
15
+ * // Merge with process environment
16
+ * const fullEnv = mergeEnv(envVars);
17
+ * // Contains both system env and profile env
18
+ */
19
+ import type { Profile } from '../types/index.js';
20
+ /**
21
+ * Build environment variables from a profile
22
+ * Returns empty object for Anthropic (useExistingConfig) profiles
23
+ * For other providers, clears ANTHROPIC_API_KEY to force using the custom endpoint
24
+ */
25
+ export declare function buildEnvVars(profile: Profile): Record<string, string>;
26
+ /**
27
+ * Merge profile env vars with process env
28
+ * Profile env vars take precedence
29
+ */
30
+ export declare function mergeEnv(profileEnv: Record<string, string>): NodeJS.ProcessEnv;
31
+ //# sourceMappingURL=env-builder.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.service.d.ts","sourceRoot":"","sources":["../../src/services/env-builder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4CrE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,MAAM,CAAC,UAAU,CAKnB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @module Environment Builder Service
3
+ * @description Builds environment variables for Claude CLI based on profile configuration.
4
+ *
5
+ * This service is responsible for:
6
+ * - Applying provider default values
7
+ * - Merging profile-specific overrides
8
+ * - Clearing conflicting environment variables (e.g., ANTHROPIC_API_KEY)
9
+ *
10
+ * @example
11
+ * // Build env vars for a profile
12
+ * const envVars = buildEnvVars(profile);
13
+ * // { ANTHROPIC_BASE_URL: 'https://...', ANTHROPIC_AUTH_TOKEN: '...' }
14
+ *
15
+ * // Merge with process environment
16
+ * const fullEnv = mergeEnv(envVars);
17
+ * // Contains both system env and profile env
18
+ */
19
+ import { getProviderById } from '../providers/index.js';
20
+ /**
21
+ * Build environment variables from a profile
22
+ * Returns empty object for Anthropic (useExistingConfig) profiles
23
+ * For other providers, clears ANTHROPIC_API_KEY to force using the custom endpoint
24
+ */
25
+ export function buildEnvVars(profile) {
26
+ const provider = getProviderById(profile.providerId);
27
+ // For Anthropic native, don't set any env vars - use existing config
28
+ if (provider?.useExistingConfig) {
29
+ return {};
30
+ }
31
+ const env = {};
32
+ // IMPORTANT: Clear ANTHROPIC_API_KEY to force Claude to use custom endpoint
33
+ // Otherwise it will use the native Anthropic API even with ANTHROPIC_BASE_URL set
34
+ env['ANTHROPIC_API_KEY'] = '';
35
+ // First, apply provider defaults
36
+ if (provider) {
37
+ for (const spec of provider.envVars) {
38
+ if (spec.default !== undefined) {
39
+ env[spec.name] = String(spec.default);
40
+ }
41
+ }
42
+ }
43
+ // Then override with profile-specific values
44
+ for (const [key, value] of Object.entries(profile.envVars)) {
45
+ if (value !== undefined && value !== null && value !== '') {
46
+ env[key] = String(value);
47
+ }
48
+ }
49
+ // Apply selected models (if set)
50
+ if (profile.selectedModels) {
51
+ if (profile.selectedModels.haiku) {
52
+ env['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = profile.selectedModels.haiku.id;
53
+ }
54
+ if (profile.selectedModels.sonnet) {
55
+ env['ANTHROPIC_DEFAULT_SONNET_MODEL'] = profile.selectedModels.sonnet.id;
56
+ }
57
+ if (profile.selectedModels.opus) {
58
+ env['ANTHROPIC_DEFAULT_OPUS_MODEL'] = profile.selectedModels.opus.id;
59
+ }
60
+ }
61
+ return env;
62
+ }
63
+ /**
64
+ * Merge profile env vars with process env
65
+ * Profile env vars take precedence
66
+ */
67
+ export function mergeEnv(profileEnv) {
68
+ return {
69
+ ...process.env,
70
+ ...profileEnv,
71
+ };
72
+ }
73
+ //# sourceMappingURL=env-builder.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.service.js","sourceRoot":"","sources":["../../src/services/env-builder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAErD,qEAAqE;IACrE,IAAI,QAAQ,EAAE,iBAAiB,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,4EAA4E;IAC5E,kFAAkF;IAClF,GAAG,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC;IAE9B,iCAAiC;IACjC,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YACjC,GAAG,CAAC,+BAA+B,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAClC,GAAG,CAAC,gCAAgC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,8BAA8B,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,UAAkC;IAElC,OAAO;QACL,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,UAAU;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Profile } from '../types/index.js';
2
+ /**
3
+ * Launch Claude CLI with the given profile and args
4
+ * Returns the exit code
5
+ */
6
+ export declare function launchClaude(profile: Profile, args: string[]): Promise<number>;
7
+ //# sourceMappingURL=launcher.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.service.d.ts","sourceRoot":"","sources":["../../src/services/launcher.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -0,0 +1,37 @@
1
+ import { spawn } from 'child_process';
2
+ import { buildEnvVars, mergeEnv } from './env-builder.service.js';
3
+ import { loadConfig } from './config.service.js';
4
+ /**
5
+ * Launch Claude CLI with the given profile and args
6
+ * Returns the exit code
7
+ */
8
+ export async function launchClaude(profile, args) {
9
+ const config = loadConfig();
10
+ // Build environment variables from profile
11
+ const profileEnv = buildEnvVars(profile);
12
+ const env = mergeEnv(profileEnv);
13
+ // Get Claude CLI path (default to 'claude')
14
+ const claudePath = config.settings.claudeCliPath ?? 'claude';
15
+ // Spawn Claude CLI with inherited stdio
16
+ const child = spawn(claudePath, args, {
17
+ env,
18
+ stdio: 'inherit',
19
+ shell: true,
20
+ });
21
+ // Forward signals to child process
22
+ const handleSignal = (signal) => {
23
+ child.kill(signal);
24
+ };
25
+ process.on('SIGINT', () => handleSignal('SIGINT'));
26
+ process.on('SIGTERM', () => handleSignal('SIGTERM'));
27
+ // Wait for process to exit and return exit code
28
+ return new Promise((resolve, reject) => {
29
+ child.on('error', (err) => {
30
+ reject(new Error(`Failed to launch Claude: ${err.message}`));
31
+ });
32
+ child.on('exit', (code) => {
33
+ resolve(code ?? 0);
34
+ });
35
+ });
36
+ }
37
+ //# sourceMappingURL=launcher.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.service.js","sourceRoot":"","sources":["../../src/services/launcher.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAgB,EAChB,IAAc;IAEd,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,2CAA2C;IAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEjC,4CAA4C;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC;IAE7D,wCAAwC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;QACpC,GAAG;QACH,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,YAAY,GAAG,CAAC,MAAsB,EAAE,EAAE;QAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IAErD,gDAAgD;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { FallbackModel, ProviderDefinition } from '../types/index.js';
2
+ /**
3
+ * Represents a model available from a provider
4
+ */
5
+ export interface Model {
6
+ id: string;
7
+ name: string;
8
+ description?: string;
9
+ }
10
+ /**
11
+ * Result of fetching models from a provider
12
+ */
13
+ export interface ModelFetchResult {
14
+ success: boolean;
15
+ models: Model[];
16
+ error?: string;
17
+ }
18
+ /**
19
+ * Check if a provider supports dynamic model fetching
20
+ */
21
+ export declare function supportsModelFetching(providerId: string): boolean;
22
+ /**
23
+ * Check if a provider has fallback models
24
+ */
25
+ export declare function hasFallbackModels(providerId: string): boolean;
26
+ /**
27
+ * Get fallback models for a provider
28
+ */
29
+ export declare function getFallbackModels(providerId: string): FallbackModel[];
30
+ /**
31
+ * Get fallback models for a specific tier
32
+ */
33
+ export declare function getFallbackModelsForTier(providerId: string, tier: 'haiku' | 'sonnet' | 'opus'): Model[];
34
+ /**
35
+ * Get all unique fallback models for a provider (deduplicated)
36
+ */
37
+ export declare function getUniqueFallbackModels(providerId: string): Model[];
38
+ /**
39
+ * Fetch available models from a provider's API
40
+ */
41
+ export declare function fetchModels(providerId: string, apiKey: string): Promise<ModelFetchResult>;
42
+ /**
43
+ * Get models for a provider (fetches from API or returns fallbacks)
44
+ */
45
+ export declare function getModelsForProvider(provider: ProviderDefinition, apiKey: string): Promise<ModelFetchResult>;
46
+ //# sourceMappingURL=model.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.service.d.ts","sourceRoot":"","sources":["../../src/services/model.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAGrE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAChC,KAAK,EAAE,CAKT;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,EAAE,CAanE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CA4C3B;AAuDD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CA4B3B"}
@@ -0,0 +1,164 @@
1
+ import { getProviderById } from '../providers/index.js';
2
+ /**
3
+ * Check if a provider supports dynamic model fetching
4
+ */
5
+ export function supportsModelFetching(providerId) {
6
+ const provider = getProviderById(providerId);
7
+ return provider?.modelFetching?.supported === true;
8
+ }
9
+ /**
10
+ * Check if a provider has fallback models
11
+ */
12
+ export function hasFallbackModels(providerId) {
13
+ const provider = getProviderById(providerId);
14
+ return (provider?.fallbackModels?.length ?? 0) > 0;
15
+ }
16
+ /**
17
+ * Get fallback models for a provider
18
+ */
19
+ export function getFallbackModels(providerId) {
20
+ const provider = getProviderById(providerId);
21
+ return provider?.fallbackModels ?? [];
22
+ }
23
+ /**
24
+ * Get fallback models for a specific tier
25
+ */
26
+ export function getFallbackModelsForTier(providerId, tier) {
27
+ const fallbacks = getFallbackModels(providerId);
28
+ return fallbacks
29
+ .filter((m) => m.tier === tier)
30
+ .map((m) => ({ id: m.id, name: m.name }));
31
+ }
32
+ /**
33
+ * Get all unique fallback models for a provider (deduplicated)
34
+ */
35
+ export function getUniqueFallbackModels(providerId) {
36
+ const fallbacks = getFallbackModels(providerId);
37
+ const seen = new Set();
38
+ const unique = [];
39
+ for (const model of fallbacks) {
40
+ if (!seen.has(model.id)) {
41
+ seen.add(model.id);
42
+ unique.push({ id: model.id, name: model.name });
43
+ }
44
+ }
45
+ return unique;
46
+ }
47
+ /**
48
+ * Fetch available models from a provider's API
49
+ */
50
+ export async function fetchModels(providerId, apiKey) {
51
+ const provider = getProviderById(providerId);
52
+ if (!provider) {
53
+ return { success: false, models: [], error: 'Provider not found' };
54
+ }
55
+ if (!provider.modelFetching?.supported || !provider.modelFetching?.endpoint) {
56
+ // Return fallback models for providers without API
57
+ const fallbacks = getUniqueFallbackModels(providerId);
58
+ return { success: true, models: fallbacks };
59
+ }
60
+ try {
61
+ const response = await fetch(provider.modelFetching.endpoint, {
62
+ method: 'GET',
63
+ headers: {
64
+ Authorization: `Bearer ${apiKey}`,
65
+ 'Content-Type': 'application/json',
66
+ },
67
+ });
68
+ if (!response.ok) {
69
+ if (response.status === 401 || response.status === 403) {
70
+ return { success: false, models: [], error: 'Invalid API key' };
71
+ }
72
+ if (response.status === 429) {
73
+ return { success: false, models: [], error: 'Rate limited - try again later' };
74
+ }
75
+ return {
76
+ success: false,
77
+ models: [],
78
+ error: `API error: ${response.status} ${response.statusText}`,
79
+ };
80
+ }
81
+ const data = await response.json();
82
+ const models = parseModelsResponse(providerId, data);
83
+ return { success: true, models };
84
+ }
85
+ catch (error) {
86
+ const message = error instanceof Error ? error.message : 'Unknown error';
87
+ return { success: false, models: [], error: `Fetch failed: ${message}` };
88
+ }
89
+ }
90
+ /**
91
+ * Parse models response based on provider type
92
+ */
93
+ function parseModelsResponse(providerId, data) {
94
+ // OpenRouter format
95
+ if (providerId === 'openrouter') {
96
+ return parseOpenRouterModels(data);
97
+ }
98
+ // OpenAI-compatible format (DeepSeek, Moonshot, Novita)
99
+ return parseOpenAICompatibleModels(data);
100
+ }
101
+ /**
102
+ * Parse OpenRouter models response
103
+ */
104
+ function parseOpenRouterModels(data) {
105
+ if (!data || typeof data !== 'object')
106
+ return [];
107
+ const response = data;
108
+ if (!Array.isArray(response.data))
109
+ return [];
110
+ return response.data
111
+ .filter((m) => m.id)
112
+ .map((m) => ({
113
+ id: m.id,
114
+ name: m.name || m.id,
115
+ description: m.description,
116
+ }))
117
+ .slice(0, 100); // Limit to first 100 models
118
+ }
119
+ /**
120
+ * Parse OpenAI-compatible models response (DeepSeek, Moonshot, Novita)
121
+ */
122
+ function parseOpenAICompatibleModels(data) {
123
+ if (!data || typeof data !== 'object')
124
+ return [];
125
+ const response = data;
126
+ if (!Array.isArray(response.data))
127
+ return [];
128
+ return response.data
129
+ .filter((m) => m.id)
130
+ .map((m) => ({
131
+ id: m.id,
132
+ name: m.id,
133
+ description: m.owned_by ? `Owned by: ${m.owned_by}` : undefined,
134
+ }));
135
+ }
136
+ /**
137
+ * Get models for a provider (fetches from API or returns fallbacks)
138
+ */
139
+ export async function getModelsForProvider(provider, apiKey) {
140
+ // If provider has API support, try to fetch
141
+ if (provider.modelFetching?.supported) {
142
+ const result = await fetchModels(provider.id, apiKey);
143
+ // If fetch succeeded, return models
144
+ if (result.success && result.models.length > 0) {
145
+ return result;
146
+ }
147
+ // If fetch failed, return fallbacks with warning
148
+ const fallbacks = getUniqueFallbackModels(provider.id);
149
+ if (fallbacks.length > 0) {
150
+ return {
151
+ success: true,
152
+ models: fallbacks,
153
+ error: result.error
154
+ ? `${result.error} - showing fallback models`
155
+ : undefined,
156
+ };
157
+ }
158
+ return result;
159
+ }
160
+ // No API support, return fallback models
161
+ const fallbacks = getUniqueFallbackModels(provider.id);
162
+ return { success: true, models: fallbacks };
163
+ }
164
+ //# sourceMappingURL=model.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.service.js","sourceRoot":"","sources":["../../src/services/model.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAqBxD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,QAAQ,EAAE,aAAa,EAAE,SAAS,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,QAAQ,EAAE,cAAc,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAkB,EAClB,IAAiC;IAEjC,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,SAAS;SACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,MAAc;IAEd,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC5E,mDAAmD;QACnD,MAAM,SAAS,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC5D,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;YAClE,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;YACjF,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aAC9D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAErD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,IAAa;IAEb,oBAAoB;IACpB,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,wDAAwD;IACxD,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,IAAa;IAC1C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,QAAQ,GAAG,IAA6E,CAAC;IAC/F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,OAAO,QAAQ,CAAC,IAAI;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC,CAAC;SACF,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAAC,IAAa;IAChD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,QAAQ,GAAG,IAA2D,CAAC;IAC7E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,OAAO,QAAQ,CAAC,IAAI;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,EAAE;QACV,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KAChE,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAA4B,EAC5B,MAAc;IAEd,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEtD,oCAAoC;QACpC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,iDAAiD;QACjD,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACjB,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,4BAA4B;oBAC7C,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,yCAAyC;IACzC,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Profile, SelectedModels } from '../types/index.js';
2
+ /**
3
+ * Get all profiles
4
+ */
5
+ export declare function getAllProfiles(): Profile[];
6
+ /**
7
+ * Get the active profile ID
8
+ */
9
+ export declare function getActiveProfileId(): string | null;
10
+ /**
11
+ * Get the active profile
12
+ */
13
+ export declare function getActiveProfile(): Profile | null;
14
+ /**
15
+ * Get a profile by ID
16
+ */
17
+ export declare function getProfileById(id: string): Profile | null;
18
+ /**
19
+ * Get a profile by name
20
+ */
21
+ export declare function getProfileByName(name: string): Profile | null;
22
+ /**
23
+ * Create a new profile
24
+ */
25
+ export declare function createProfile(name: string, providerId: string, envVars: Record<string, string>, selectedModels?: SelectedModels): Profile;
26
+ /**
27
+ * Update an existing profile
28
+ */
29
+ export declare function updateProfile(id: string, updates: Partial<Pick<Profile, 'name' | 'envVars' | 'selectedModels'>>): Profile | null;
30
+ /**
31
+ * Delete a profile
32
+ */
33
+ export declare function deleteProfile(id: string): boolean;
34
+ /**
35
+ * Set the active profile
36
+ */
37
+ export declare function setActiveProfile(id: string): boolean;
38
+ //# sourceMappingURL=profile.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.service.d.ts","sourceRoot":"","sources":["../../src/services/profile.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,EAAE,CAG1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAIjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAGzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAiBT;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAAC,CAAC,GACrE,OAAO,GAAG,IAAI,CAkBhB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAcjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAUpD"}
@@ -0,0 +1,107 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { loadConfig, saveConfig } from './config.service.js';
3
+ /**
4
+ * Get all profiles
5
+ */
6
+ export function getAllProfiles() {
7
+ const config = loadConfig();
8
+ return config.profiles;
9
+ }
10
+ /**
11
+ * Get the active profile ID
12
+ */
13
+ export function getActiveProfileId() {
14
+ const config = loadConfig();
15
+ return config.activeProfileId;
16
+ }
17
+ /**
18
+ * Get the active profile
19
+ */
20
+ export function getActiveProfile() {
21
+ const config = loadConfig();
22
+ if (!config.activeProfileId)
23
+ return null;
24
+ return config.profiles.find((p) => p.id === config.activeProfileId) ?? null;
25
+ }
26
+ /**
27
+ * Get a profile by ID
28
+ */
29
+ export function getProfileById(id) {
30
+ const config = loadConfig();
31
+ return config.profiles.find((p) => p.id === id) ?? null;
32
+ }
33
+ /**
34
+ * Get a profile by name
35
+ */
36
+ export function getProfileByName(name) {
37
+ const config = loadConfig();
38
+ return config.profiles.find((p) => p.name === name) ?? null;
39
+ }
40
+ /**
41
+ * Create a new profile
42
+ */
43
+ export function createProfile(name, providerId, envVars, selectedModels) {
44
+ const config = loadConfig();
45
+ const profile = {
46
+ id: uuidv4(),
47
+ name,
48
+ providerId,
49
+ createdAt: new Date().toISOString(),
50
+ updatedAt: new Date().toISOString(),
51
+ envVars,
52
+ selectedModels,
53
+ };
54
+ config.profiles.push(profile);
55
+ saveConfig(config);
56
+ return profile;
57
+ }
58
+ /**
59
+ * Update an existing profile
60
+ */
61
+ export function updateProfile(id, updates) {
62
+ const config = loadConfig();
63
+ const index = config.profiles.findIndex((p) => p.id === id);
64
+ if (index === -1)
65
+ return null;
66
+ const profile = config.profiles[index];
67
+ if (updates.name)
68
+ profile.name = updates.name;
69
+ if (updates.envVars)
70
+ profile.envVars = updates.envVars;
71
+ if (updates.selectedModels !== undefined) {
72
+ profile.selectedModels = updates.selectedModels;
73
+ }
74
+ profile.updatedAt = new Date().toISOString();
75
+ config.profiles[index] = profile;
76
+ saveConfig(config);
77
+ return profile;
78
+ }
79
+ /**
80
+ * Delete a profile
81
+ */
82
+ export function deleteProfile(id) {
83
+ const config = loadConfig();
84
+ const initialLength = config.profiles.length;
85
+ config.profiles = config.profiles.filter((p) => p.id !== id);
86
+ if (config.profiles.length === initialLength)
87
+ return false;
88
+ // Clear active profile if it was deleted
89
+ if (config.activeProfileId === id) {
90
+ config.activeProfileId = null;
91
+ }
92
+ saveConfig(config);
93
+ return true;
94
+ }
95
+ /**
96
+ * Set the active profile
97
+ */
98
+ export function setActiveProfile(id) {
99
+ const config = loadConfig();
100
+ const profile = config.profiles.find((p) => p.id === id);
101
+ if (!profile)
102
+ return false;
103
+ config.activeProfileId = id;
104
+ saveConfig(config);
105
+ return true;
106
+ }
107
+ //# sourceMappingURL=profile.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.service.js","sourceRoot":"","sources":["../../src/services/profile.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @module Configuration Types
3
+ * @description Type definitions for application configuration.
4
+ *
5
+ * ClaudeGate stores its configuration in ~/.claudegate/config.json.
6
+ * The configuration includes:
7
+ * - Application version
8
+ * - Active profile ID
9
+ * - List of user-created profiles
10
+ * - Application settings
11
+ *
12
+ * @example
13
+ * // Configuration structure
14
+ * const config: AppConfig = {
15
+ * version: '1.0.0',
16
+ * activeProfileId: 'uuid-here',
17
+ * profiles: [...],
18
+ * settings: { timeout: 3000000 }
19
+ * };
20
+ */
21
+ import type { Profile } from './profile.js';
22
+ /**
23
+ * Application settings
24
+ */
25
+ export interface AppSettings {
26
+ claudeCliPath?: string;
27
+ timeout: number;
28
+ }
29
+ /**
30
+ * Main application configuration stored in ~/.claudegate/config.json
31
+ */
32
+ export interface AppConfig {
33
+ version: string;
34
+ activeProfileId: string | null;
35
+ profiles: Profile[];
36
+ settings: AppSettings;
37
+ }
38
+ /**
39
+ * Default configuration for new installations
40
+ */
41
+ export declare const DEFAULT_CONFIG: AppConfig;
42
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,SAO5B,CAAC"}