@codeguide/core 0.0.24 → 0.0.25
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/__tests__/services/codespace/codespace-models.test.ts +458 -0
- package/__tests__/services/security-keys.test.ts +587 -0
- package/codeguide.ts +3 -1
- package/dist/codeguide.d.ts +2 -1
- package/dist/codeguide.js +1 -0
- package/dist/services/codespace/codespace-service.d.ts +52 -1
- package/dist/services/codespace/codespace-service.js +87 -0
- package/dist/services/codespace/codespace-types.d.ts +45 -0
- package/dist/services/codespace/index.d.ts +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +4 -1
- package/dist/services/security-keys/index.d.ts +3 -0
- package/dist/services/security-keys/index.js +21 -0
- package/dist/services/security-keys/security-keys-service.d.ts +111 -0
- package/dist/services/security-keys/security-keys-service.js +190 -0
- package/dist/services/security-keys/security-keys-types.d.ts +105 -0
- package/dist/services/security-keys/security-keys-types.js +8 -0
- package/package.json +1 -1
- package/services/codespace/codespace-service.ts +104 -0
- package/services/codespace/codespace-types.ts +65 -1
- package/services/codespace/index.ts +12 -1
- package/services/index.ts +2 -0
- package/services/security-keys/index.ts +25 -0
- package/services/security-keys/security-keys-service.ts +229 -0
- package/services/security-keys/security-keys-types.ts +187 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseService } from '../base/base-service';
|
|
2
|
-
import { GenerateTaskTitleRequest, GenerateTaskTitleResponse, CreateCodespaceTaskRequest, CreateCodespaceTaskResponse, CreateCodespaceTaskRequestV2, CreateCodespaceTaskResponseV2, CreateBackgroundCodespaceTaskRequest, CreateBackgroundCodespaceTaskResponse, GetCodespaceTaskResponse, GetProjectTasksByCodespaceResponse, GetCodespaceTasksByProjectRequest, GetCodespaceTasksByProjectResponse, CodespaceTaskDetailedResponse, CodespaceQuestionnaireRequest, CodespaceQuestionnaireResponse } from './codespace-types';
|
|
2
|
+
import { GenerateTaskTitleRequest, GenerateTaskTitleResponse, CreateCodespaceTaskRequest, CreateCodespaceTaskResponse, CreateCodespaceTaskRequestV2, CreateCodespaceTaskResponseV2, CreateBackgroundCodespaceTaskRequest, CreateBackgroundCodespaceTaskResponse, GetCodespaceTaskResponse, GetProjectTasksByCodespaceResponse, GetCodespaceTasksByProjectRequest, GetCodespaceTasksByProjectResponse, CodespaceTaskDetailedResponse, CodespaceQuestionnaireRequest, CodespaceQuestionnaireResponse, GetCodespaceModelsQuery, GetCodespaceModelsResponse, GetCodespaceModelResponse, GetLLMModelProvidersResponse, GetLLMModelProviderResponse, GetModelsByProviderResponse } from './codespace-types';
|
|
3
3
|
export declare class CodespaceService extends BaseService {
|
|
4
4
|
generateTaskTitle(request: GenerateTaskTitleRequest): Promise<GenerateTaskTitleResponse>;
|
|
5
5
|
generateQuestionnaire(request: CodespaceQuestionnaireRequest): Promise<CodespaceQuestionnaireResponse>;
|
|
@@ -10,6 +10,57 @@ export declare class CodespaceService extends BaseService {
|
|
|
10
10
|
getProjectTasksByCodespace(codespaceTaskId: string): Promise<GetProjectTasksByCodespaceResponse>;
|
|
11
11
|
getCodespaceTasksByProject(params: GetCodespaceTasksByProjectRequest): Promise<GetCodespaceTasksByProjectResponse>;
|
|
12
12
|
getCodespaceTaskDetailed(codespaceTaskId: string): Promise<CodespaceTaskDetailedResponse>;
|
|
13
|
+
/**
|
|
14
|
+
* Get all codespace models with optional filtering
|
|
15
|
+
*
|
|
16
|
+
* GET /api/codespace-models/models
|
|
17
|
+
*
|
|
18
|
+
* @param query - Optional query parameters for filtering
|
|
19
|
+
* @returns Promise resolving to array of codespace models with provider info
|
|
20
|
+
*/
|
|
21
|
+
getCodespaceModels(query?: GetCodespaceModelsQuery): Promise<GetCodespaceModelsResponse>;
|
|
22
|
+
/**
|
|
23
|
+
* Get a specific codespace model by ID
|
|
24
|
+
*
|
|
25
|
+
* GET /api/codespace-models/models/{model_id}
|
|
26
|
+
*
|
|
27
|
+
* @param modelId - The UUID of the model
|
|
28
|
+
* @returns Promise resolving to the codespace model with provider info
|
|
29
|
+
*/
|
|
30
|
+
getCodespaceModel(modelId: string): Promise<GetCodespaceModelResponse>;
|
|
31
|
+
/**
|
|
32
|
+
* Get all LLM model providers
|
|
33
|
+
*
|
|
34
|
+
* GET /api/codespace-models/providers
|
|
35
|
+
*
|
|
36
|
+
* @returns Promise resolving to array of LLM model providers
|
|
37
|
+
*/
|
|
38
|
+
getLLMModelProviders(): Promise<GetLLMModelProvidersResponse>;
|
|
39
|
+
/**
|
|
40
|
+
* Get a specific LLM model provider by ID
|
|
41
|
+
*
|
|
42
|
+
* GET /api/codespace-models/providers/{provider_id}
|
|
43
|
+
*
|
|
44
|
+
* @param providerId - The UUID of the provider
|
|
45
|
+
* @returns Promise resolving to the LLM model provider
|
|
46
|
+
*/
|
|
47
|
+
getLLMModelProvider(providerId: string): Promise<GetLLMModelProviderResponse>;
|
|
48
|
+
/**
|
|
49
|
+
* Get models by provider
|
|
50
|
+
*
|
|
51
|
+
* GET /api/codespace-models/providers/{provider_id}/models
|
|
52
|
+
*
|
|
53
|
+
* @param providerId - The UUID of the provider
|
|
54
|
+
* @returns Promise resolving to array of models from the specified provider
|
|
55
|
+
*/
|
|
56
|
+
getModelsByProvider(providerId: string): Promise<GetModelsByProviderResponse>;
|
|
57
|
+
/**
|
|
58
|
+
* Build URL query parameters from an object
|
|
59
|
+
*
|
|
60
|
+
* @param params - The parameters object
|
|
61
|
+
* @returns URL query string
|
|
62
|
+
*/
|
|
63
|
+
private buildQueryParams;
|
|
13
64
|
private validateCodespaceTaskRequest;
|
|
14
65
|
private validateQuestionnaireRequest;
|
|
15
66
|
}
|
|
@@ -57,6 +57,93 @@ class CodespaceService extends base_service_1.BaseService {
|
|
|
57
57
|
}
|
|
58
58
|
return this.get(`/codespace/task/${codespaceTaskId}/detailed`);
|
|
59
59
|
}
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Codespace Models Methods
|
|
62
|
+
// ============================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Get all codespace models with optional filtering
|
|
65
|
+
*
|
|
66
|
+
* GET /api/codespace-models/models
|
|
67
|
+
*
|
|
68
|
+
* @param query - Optional query parameters for filtering
|
|
69
|
+
* @returns Promise resolving to array of codespace models with provider info
|
|
70
|
+
*/
|
|
71
|
+
async getCodespaceModels(query) {
|
|
72
|
+
const params = this.buildQueryParams(query);
|
|
73
|
+
const url = params
|
|
74
|
+
? `/api/codespace-models/models?${params}`
|
|
75
|
+
: '/api/codespace-models/models';
|
|
76
|
+
return this.get(url);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get a specific codespace model by ID
|
|
80
|
+
*
|
|
81
|
+
* GET /api/codespace-models/models/{model_id}
|
|
82
|
+
*
|
|
83
|
+
* @param modelId - The UUID of the model
|
|
84
|
+
* @returns Promise resolving to the codespace model with provider info
|
|
85
|
+
*/
|
|
86
|
+
async getCodespaceModel(modelId) {
|
|
87
|
+
if (!modelId) {
|
|
88
|
+
throw new Error('model_id is required');
|
|
89
|
+
}
|
|
90
|
+
return this.get(`/api/codespace-models/models/${modelId}`);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all LLM model providers
|
|
94
|
+
*
|
|
95
|
+
* GET /api/codespace-models/providers
|
|
96
|
+
*
|
|
97
|
+
* @returns Promise resolving to array of LLM model providers
|
|
98
|
+
*/
|
|
99
|
+
async getLLMModelProviders() {
|
|
100
|
+
return this.get('/api/codespace-models/providers');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get a specific LLM model provider by ID
|
|
104
|
+
*
|
|
105
|
+
* GET /api/codespace-models/providers/{provider_id}
|
|
106
|
+
*
|
|
107
|
+
* @param providerId - The UUID of the provider
|
|
108
|
+
* @returns Promise resolving to the LLM model provider
|
|
109
|
+
*/
|
|
110
|
+
async getLLMModelProvider(providerId) {
|
|
111
|
+
if (!providerId) {
|
|
112
|
+
throw new Error('provider_id is required');
|
|
113
|
+
}
|
|
114
|
+
return this.get(`/api/codespace-models/providers/${providerId}`);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get models by provider
|
|
118
|
+
*
|
|
119
|
+
* GET /api/codespace-models/providers/{provider_id}/models
|
|
120
|
+
*
|
|
121
|
+
* @param providerId - The UUID of the provider
|
|
122
|
+
* @returns Promise resolving to array of models from the specified provider
|
|
123
|
+
*/
|
|
124
|
+
async getModelsByProvider(providerId) {
|
|
125
|
+
if (!providerId) {
|
|
126
|
+
throw new Error('provider_id is required');
|
|
127
|
+
}
|
|
128
|
+
return this.get(`/api/codespace-models/providers/${providerId}/models`);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build URL query parameters from an object
|
|
132
|
+
*
|
|
133
|
+
* @param params - The parameters object
|
|
134
|
+
* @returns URL query string
|
|
135
|
+
*/
|
|
136
|
+
buildQueryParams(params) {
|
|
137
|
+
if (!params)
|
|
138
|
+
return '';
|
|
139
|
+
const searchParams = new URLSearchParams();
|
|
140
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
141
|
+
if (value !== undefined && value !== null) {
|
|
142
|
+
searchParams.append(key, value.toString());
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return searchParams.toString();
|
|
146
|
+
}
|
|
60
147
|
validateCodespaceTaskRequest(request) {
|
|
61
148
|
if (!request.project_id) {
|
|
62
149
|
throw new Error('project_id is required');
|
|
@@ -163,3 +163,48 @@ export interface CodespaceQuestionnaireResponse {
|
|
|
163
163
|
questions: string[];
|
|
164
164
|
message: string;
|
|
165
165
|
}
|
|
166
|
+
export interface LLMModelProviderInDB {
|
|
167
|
+
id: string;
|
|
168
|
+
created_at: string;
|
|
169
|
+
name?: string;
|
|
170
|
+
key?: string;
|
|
171
|
+
logo_src?: string;
|
|
172
|
+
}
|
|
173
|
+
export interface CodespaceModelInDB {
|
|
174
|
+
id: string;
|
|
175
|
+
created_at: string;
|
|
176
|
+
key?: string;
|
|
177
|
+
name?: string;
|
|
178
|
+
provider_id?: string;
|
|
179
|
+
base_url?: string;
|
|
180
|
+
completion_base_url?: string;
|
|
181
|
+
execution_mode?: 'opencode' | 'claude-code' | 'docs-only' | 'implementation';
|
|
182
|
+
logo_src?: string;
|
|
183
|
+
}
|
|
184
|
+
export interface CodespaceModelWithProvider extends CodespaceModelInDB {
|
|
185
|
+
provider?: LLMModelProviderInDB;
|
|
186
|
+
}
|
|
187
|
+
export interface GetCodespaceModelsQuery {
|
|
188
|
+
provider_id?: string;
|
|
189
|
+
execution_mode?: string;
|
|
190
|
+
}
|
|
191
|
+
export interface GetCodespaceModelsResponse extends Array<CodespaceModelWithProvider> {
|
|
192
|
+
}
|
|
193
|
+
export interface GetCodespaceModelResponse extends CodespaceModelWithProvider {
|
|
194
|
+
}
|
|
195
|
+
export interface GetLLMModelProvidersResponse extends Array<LLMModelProviderInDB> {
|
|
196
|
+
}
|
|
197
|
+
export interface GetLLMModelProviderResponse extends LLMModelProviderInDB {
|
|
198
|
+
}
|
|
199
|
+
export interface GetModelsByProviderResponse extends Array<CodespaceModelInDB> {
|
|
200
|
+
}
|
|
201
|
+
export interface CodespaceModelNotFoundError {
|
|
202
|
+
detail: string;
|
|
203
|
+
}
|
|
204
|
+
export interface AuthenticationRequiredError {
|
|
205
|
+
detail: string;
|
|
206
|
+
}
|
|
207
|
+
export interface CodespaceModelsFetchError {
|
|
208
|
+
detail: string;
|
|
209
|
+
}
|
|
210
|
+
export type CodespaceModelsError = CodespaceModelNotFoundError | AuthenticationRequiredError | CodespaceModelsFetchError;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { CodespaceService } from './codespace-service';
|
|
2
2
|
export * from './codespace-types';
|
|
3
|
-
export type { CreateCodespaceTaskRequestV2 as CreateCodespaceTaskRequest, CreateCodespaceTaskResponseV2 as CreateCodespaceTaskResponse, CreateBackgroundCodespaceTaskRequest, CreateBackgroundCodespaceTaskResponse, ModelApiKey, Attachment, GetCodespaceTaskResponse, CodespaceTaskData, TechnicalDocument, GetProjectTasksByCodespaceResponse, CodespaceQuestionnaireRequest, CodespaceQuestionnaireResponse } from './codespace-types';
|
|
3
|
+
export type { CreateCodespaceTaskRequestV2 as CreateCodespaceTaskRequest, CreateCodespaceTaskResponseV2 as CreateCodespaceTaskResponse, CreateBackgroundCodespaceTaskRequest, CreateBackgroundCodespaceTaskResponse, ModelApiKey, Attachment, GetCodespaceTaskResponse, CodespaceTaskData, TechnicalDocument, GetProjectTasksByCodespaceResponse, CodespaceQuestionnaireRequest, CodespaceQuestionnaireResponse, LLMModelProviderInDB, CodespaceModelInDB, CodespaceModelWithProvider, GetCodespaceModelsQuery, GetCodespaceModelsResponse, GetCodespaceModelResponse, GetLLMModelProvidersResponse, GetLLMModelProviderResponse, GetModelsByProviderResponse, CodespaceModelsError } from './codespace-types';
|
package/dist/services/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export { SubscriptionService } from './subscriptions';
|
|
|
9
9
|
export { CancellationFunnelService } from './cancellation-funnel';
|
|
10
10
|
export { CodespaceService } from './codespace';
|
|
11
11
|
export { ExternalTokenService } from './external-tokens';
|
|
12
|
+
export { SecurityKeysService } from './security-keys';
|
|
12
13
|
export * from './generation';
|
|
13
14
|
export * from './projects';
|
|
14
15
|
export * from './usage';
|
|
@@ -19,3 +20,4 @@ export * from './subscriptions';
|
|
|
19
20
|
export * from './cancellation-funnel';
|
|
20
21
|
export * from './codespace';
|
|
21
22
|
export * from './external-tokens';
|
|
23
|
+
export * from './security-keys';
|
package/dist/services/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.ExternalTokenService = exports.CodespaceService = exports.CancellationFunnelService = exports.SubscriptionService = exports.ApiKeyEnhancedService = exports.TaskService = exports.RepositoryAnalysisService = exports.UsageService = exports.ProjectService = exports.GenerationService = exports.BaseService = void 0;
|
|
20
|
+
exports.SecurityKeysService = exports.ExternalTokenService = exports.CodespaceService = exports.CancellationFunnelService = exports.SubscriptionService = exports.ApiKeyEnhancedService = exports.TaskService = exports.RepositoryAnalysisService = exports.UsageService = exports.ProjectService = exports.GenerationService = exports.BaseService = void 0;
|
|
21
21
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
22
22
|
const path_1 = __importDefault(require("path"));
|
|
23
23
|
// Load environment variables from project root
|
|
@@ -47,6 +47,8 @@ var codespace_1 = require("./codespace");
|
|
|
47
47
|
Object.defineProperty(exports, "CodespaceService", { enumerable: true, get: function () { return codespace_1.CodespaceService; } });
|
|
48
48
|
var external_tokens_1 = require("./external-tokens");
|
|
49
49
|
Object.defineProperty(exports, "ExternalTokenService", { enumerable: true, get: function () { return external_tokens_1.ExternalTokenService; } });
|
|
50
|
+
var security_keys_1 = require("./security-keys");
|
|
51
|
+
Object.defineProperty(exports, "SecurityKeysService", { enumerable: true, get: function () { return security_keys_1.SecurityKeysService; } });
|
|
50
52
|
// Re-export all types for convenience
|
|
51
53
|
__exportStar(require("./generation"), exports);
|
|
52
54
|
__exportStar(require("./projects"), exports);
|
|
@@ -58,3 +60,4 @@ __exportStar(require("./subscriptions"), exports);
|
|
|
58
60
|
__exportStar(require("./cancellation-funnel"), exports);
|
|
59
61
|
__exportStar(require("./codespace"), exports);
|
|
60
62
|
__exportStar(require("./external-tokens"), exports);
|
|
63
|
+
__exportStar(require("./security-keys"), exports);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { SecurityKeysService } from './security-keys-service';
|
|
2
|
+
export * from './security-keys-types';
|
|
3
|
+
export type { SecurityKeyData, ProviderAPIKeyData, GitHubTokenData, CreateProviderAPIKeyRequest, CreateProviderAPIKeyResponse, GetProviderAPIKeyResponse, ListProviderAPIKeysResponse, RevokeProviderAPIKeyResponse, CreateGitHubTokenRequest, CreateGitHubTokenResponse, GetGitHubTokenResponse, RevokeGitHubTokenResponse, SuccessResponse, ErrorResponse, SecurityKeysError, ProviderAPIKeyResponse, GitHubTokenResponse } from './security-keys-types';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SecurityKeysService = void 0;
|
|
18
|
+
var security_keys_service_1 = require("./security-keys-service");
|
|
19
|
+
Object.defineProperty(exports, "SecurityKeysService", { enumerable: true, get: function () { return security_keys_service_1.SecurityKeysService; } });
|
|
20
|
+
// Export all types
|
|
21
|
+
__exportStar(require("./security-keys-types"), exports);
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { BaseService } from '../base/base-service';
|
|
2
|
+
import { APIServiceConfig } from '../../types';
|
|
3
|
+
import { CreateProviderAPIKeyRequest, CreateProviderAPIKeyResponse, GetProviderAPIKeyResponse, ListProviderAPIKeysResponse, RevokeProviderAPIKeyResponse, CreateGitHubTokenRequest, CreateGitHubTokenResponse, GetGitHubTokenResponse, RevokeGitHubTokenResponse } from './security-keys-types';
|
|
4
|
+
/**
|
|
5
|
+
* Security Keys Service
|
|
6
|
+
*
|
|
7
|
+
* This service provides methods for managing security keys including:
|
|
8
|
+
* - Provider API Keys (OpenAI, Anthropic, etc.)
|
|
9
|
+
* - GitHub Tokens
|
|
10
|
+
*
|
|
11
|
+
* API endpoints match the actual backend implementation:
|
|
12
|
+
* - POST /security-keys/provider-api-key
|
|
13
|
+
* - GET /security-keys/provider-api-key/{provider_key}
|
|
14
|
+
* - GET /security-keys/provider-api-keys
|
|
15
|
+
* - DELETE /security-keys/provider-api-key/{provider_key}
|
|
16
|
+
* - POST /security-keys/github-token
|
|
17
|
+
* - GET /security-keys/github-token
|
|
18
|
+
* - DELETE /security-keys/github-token
|
|
19
|
+
*/
|
|
20
|
+
export declare class SecurityKeysService extends BaseService {
|
|
21
|
+
constructor(config: APIServiceConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Save a new provider API key
|
|
24
|
+
*
|
|
25
|
+
* POST /security-keys/provider-api-key
|
|
26
|
+
*
|
|
27
|
+
* @param request - The provider API key creation request
|
|
28
|
+
* @returns Promise resolving to the created API key response
|
|
29
|
+
* @throws {Error} When provider_id or api_key is missing
|
|
30
|
+
*/
|
|
31
|
+
createProviderAPIKey(request: CreateProviderAPIKeyRequest): Promise<CreateProviderAPIKeyResponse>;
|
|
32
|
+
/**
|
|
33
|
+
* Get a provider API key by provider key
|
|
34
|
+
*
|
|
35
|
+
* GET /security-keys/provider-api-key/{provider_key}
|
|
36
|
+
*
|
|
37
|
+
* @param providerKey - The provider key (e.g., 'openai', 'anthropic')
|
|
38
|
+
* @param reveal - Whether to reveal the actual API key (default: false)
|
|
39
|
+
* @returns Promise resolving to the API key response
|
|
40
|
+
* @throws {Error} When provider_key is missing
|
|
41
|
+
*/
|
|
42
|
+
getProviderAPIKey(providerKey: string, reveal?: boolean): Promise<GetProviderAPIKeyResponse>;
|
|
43
|
+
/**
|
|
44
|
+
* List all provider API keys
|
|
45
|
+
*
|
|
46
|
+
* GET /security-keys/provider-api-keys
|
|
47
|
+
*
|
|
48
|
+
* @param reveal - Whether to reveal the actual API keys (default: false)
|
|
49
|
+
* @returns Promise resolving to the list of all provider API keys
|
|
50
|
+
*/
|
|
51
|
+
listProviderAPIKeys(reveal?: boolean): Promise<ListProviderAPIKeysResponse>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete a provider API key by provider key
|
|
54
|
+
*
|
|
55
|
+
* DELETE /security-keys/provider-api-key/{provider_key}
|
|
56
|
+
*
|
|
57
|
+
* @param providerKey - The provider key (e.g., 'openai', 'anthropic')
|
|
58
|
+
* @returns Promise resolving to the deletion response
|
|
59
|
+
* @throws {Error} When provider_key is missing
|
|
60
|
+
*/
|
|
61
|
+
revokeProviderAPIKey(providerKey: string): Promise<RevokeProviderAPIKeyResponse>;
|
|
62
|
+
/**
|
|
63
|
+
* Save a new GitHub token
|
|
64
|
+
*
|
|
65
|
+
* POST /security-keys/github-token
|
|
66
|
+
*
|
|
67
|
+
* @param request - The GitHub token creation request
|
|
68
|
+
* @returns Promise resolving to the created GitHub token response
|
|
69
|
+
* @throws {Error} When github_token is missing or invalid
|
|
70
|
+
*/
|
|
71
|
+
createGitHubToken(request: CreateGitHubTokenRequest): Promise<CreateGitHubTokenResponse>;
|
|
72
|
+
/**
|
|
73
|
+
* Get the GitHub token
|
|
74
|
+
*
|
|
75
|
+
* GET /security-keys/github-token
|
|
76
|
+
*
|
|
77
|
+
* @param reveal - Whether to reveal the actual token (default: false)
|
|
78
|
+
* @returns Promise resolving to the GitHub token response
|
|
79
|
+
*/
|
|
80
|
+
getGitHubToken(reveal?: boolean): Promise<GetGitHubTokenResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* Delete the GitHub token
|
|
83
|
+
*
|
|
84
|
+
* DELETE /security-keys/github-token
|
|
85
|
+
*
|
|
86
|
+
* @returns Promise resolving to the deletion response
|
|
87
|
+
*/
|
|
88
|
+
revokeGitHubToken(): Promise<RevokeGitHubTokenResponse>;
|
|
89
|
+
/**
|
|
90
|
+
* Validate provider API key creation request
|
|
91
|
+
*
|
|
92
|
+
* @param request - The request to validate
|
|
93
|
+
* @throws {Error} When validation fails
|
|
94
|
+
*/
|
|
95
|
+
private validateProviderAPIKeyRequest;
|
|
96
|
+
/**
|
|
97
|
+
* Validate GitHub token creation request
|
|
98
|
+
* Matches the API validation for GitHub token formats
|
|
99
|
+
*
|
|
100
|
+
* @param request - The request to validate
|
|
101
|
+
* @throws {Error} When validation fails
|
|
102
|
+
*/
|
|
103
|
+
private validateGitHubTokenRequest;
|
|
104
|
+
/**
|
|
105
|
+
* Handle API errors consistently
|
|
106
|
+
*
|
|
107
|
+
* @param error - The error response from the API
|
|
108
|
+
* @throws {Error} With the API error message
|
|
109
|
+
*/
|
|
110
|
+
private handleAPIError;
|
|
111
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SecurityKeysService = void 0;
|
|
4
|
+
const base_service_1 = require("../base/base-service");
|
|
5
|
+
/**
|
|
6
|
+
* Security Keys Service
|
|
7
|
+
*
|
|
8
|
+
* This service provides methods for managing security keys including:
|
|
9
|
+
* - Provider API Keys (OpenAI, Anthropic, etc.)
|
|
10
|
+
* - GitHub Tokens
|
|
11
|
+
*
|
|
12
|
+
* API endpoints match the actual backend implementation:
|
|
13
|
+
* - POST /security-keys/provider-api-key
|
|
14
|
+
* - GET /security-keys/provider-api-key/{provider_key}
|
|
15
|
+
* - GET /security-keys/provider-api-keys
|
|
16
|
+
* - DELETE /security-keys/provider-api-key/{provider_key}
|
|
17
|
+
* - POST /security-keys/github-token
|
|
18
|
+
* - GET /security-keys/github-token
|
|
19
|
+
* - DELETE /security-keys/github-token
|
|
20
|
+
*/
|
|
21
|
+
class SecurityKeysService extends base_service_1.BaseService {
|
|
22
|
+
constructor(config) {
|
|
23
|
+
super(config);
|
|
24
|
+
}
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Provider API Key Methods
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Save a new provider API key
|
|
30
|
+
*
|
|
31
|
+
* POST /security-keys/provider-api-key
|
|
32
|
+
*
|
|
33
|
+
* @param request - The provider API key creation request
|
|
34
|
+
* @returns Promise resolving to the created API key response
|
|
35
|
+
* @throws {Error} When provider_id or api_key is missing
|
|
36
|
+
*/
|
|
37
|
+
async createProviderAPIKey(request) {
|
|
38
|
+
this.validateProviderAPIKeyRequest(request);
|
|
39
|
+
return this.post('/security-keys/provider-api-key', request);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get a provider API key by provider key
|
|
43
|
+
*
|
|
44
|
+
* GET /security-keys/provider-api-key/{provider_key}
|
|
45
|
+
*
|
|
46
|
+
* @param providerKey - The provider key (e.g., 'openai', 'anthropic')
|
|
47
|
+
* @param reveal - Whether to reveal the actual API key (default: false)
|
|
48
|
+
* @returns Promise resolving to the API key response
|
|
49
|
+
* @throws {Error} When provider_key is missing
|
|
50
|
+
*/
|
|
51
|
+
async getProviderAPIKey(providerKey, reveal = false) {
|
|
52
|
+
if (!providerKey) {
|
|
53
|
+
throw new Error('provider_key is required');
|
|
54
|
+
}
|
|
55
|
+
const url = reveal
|
|
56
|
+
? `/security-keys/provider-api-key/${providerKey}?reveal=true`
|
|
57
|
+
: `/security-keys/provider-api-key/${providerKey}`;
|
|
58
|
+
return this.get(url);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* List all provider API keys
|
|
62
|
+
*
|
|
63
|
+
* GET /security-keys/provider-api-keys
|
|
64
|
+
*
|
|
65
|
+
* @param reveal - Whether to reveal the actual API keys (default: false)
|
|
66
|
+
* @returns Promise resolving to the list of all provider API keys
|
|
67
|
+
*/
|
|
68
|
+
async listProviderAPIKeys(reveal = false) {
|
|
69
|
+
const url = reveal
|
|
70
|
+
? '/security-keys/provider-api-keys?reveal=true'
|
|
71
|
+
: '/security-keys/provider-api-keys';
|
|
72
|
+
return this.get(url);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Delete a provider API key by provider key
|
|
76
|
+
*
|
|
77
|
+
* DELETE /security-keys/provider-api-key/{provider_key}
|
|
78
|
+
*
|
|
79
|
+
* @param providerKey - The provider key (e.g., 'openai', 'anthropic')
|
|
80
|
+
* @returns Promise resolving to the deletion response
|
|
81
|
+
* @throws {Error} When provider_key is missing
|
|
82
|
+
*/
|
|
83
|
+
async revokeProviderAPIKey(providerKey) {
|
|
84
|
+
if (!providerKey) {
|
|
85
|
+
throw new Error('provider_key is required');
|
|
86
|
+
}
|
|
87
|
+
return this.delete(`/security-keys/provider-api-key/${providerKey}`);
|
|
88
|
+
}
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// GitHub Token Methods
|
|
91
|
+
// ============================================================================
|
|
92
|
+
/**
|
|
93
|
+
* Save a new GitHub token
|
|
94
|
+
*
|
|
95
|
+
* POST /security-keys/github-token
|
|
96
|
+
*
|
|
97
|
+
* @param request - The GitHub token creation request
|
|
98
|
+
* @returns Promise resolving to the created GitHub token response
|
|
99
|
+
* @throws {Error} When github_token is missing or invalid
|
|
100
|
+
*/
|
|
101
|
+
async createGitHubToken(request) {
|
|
102
|
+
this.validateGitHubTokenRequest(request);
|
|
103
|
+
return this.post('/security-keys/github-token', request);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the GitHub token
|
|
107
|
+
*
|
|
108
|
+
* GET /security-keys/github-token
|
|
109
|
+
*
|
|
110
|
+
* @param reveal - Whether to reveal the actual token (default: false)
|
|
111
|
+
* @returns Promise resolving to the GitHub token response
|
|
112
|
+
*/
|
|
113
|
+
async getGitHubToken(reveal = false) {
|
|
114
|
+
const url = reveal
|
|
115
|
+
? '/security-keys/github-token?reveal=true'
|
|
116
|
+
: '/security-keys/github-token';
|
|
117
|
+
return this.get(url);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Delete the GitHub token
|
|
121
|
+
*
|
|
122
|
+
* DELETE /security-keys/github-token
|
|
123
|
+
*
|
|
124
|
+
* @returns Promise resolving to the deletion response
|
|
125
|
+
*/
|
|
126
|
+
async revokeGitHubToken() {
|
|
127
|
+
return this.delete('/security-keys/github-token');
|
|
128
|
+
}
|
|
129
|
+
// ============================================================================
|
|
130
|
+
// Utility Methods
|
|
131
|
+
// ============================================================================
|
|
132
|
+
/**
|
|
133
|
+
* Validate provider API key creation request
|
|
134
|
+
*
|
|
135
|
+
* @param request - The request to validate
|
|
136
|
+
* @throws {Error} When validation fails
|
|
137
|
+
*/
|
|
138
|
+
validateProviderAPIKeyRequest(request) {
|
|
139
|
+
if (!request.provider_key) {
|
|
140
|
+
throw new Error('provider_key is required');
|
|
141
|
+
}
|
|
142
|
+
if (!request.api_key) {
|
|
143
|
+
throw new Error('api_key is required');
|
|
144
|
+
}
|
|
145
|
+
if (request.api_key.length < 10) {
|
|
146
|
+
throw new Error('api_key must be at least 10 characters long');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Validate GitHub token creation request
|
|
151
|
+
* Matches the API validation for GitHub token formats
|
|
152
|
+
*
|
|
153
|
+
* @param request - The request to validate
|
|
154
|
+
* @throws {Error} When validation fails
|
|
155
|
+
*/
|
|
156
|
+
validateGitHubTokenRequest(request) {
|
|
157
|
+
if (!request.github_token) {
|
|
158
|
+
throw new Error('github_token is required');
|
|
159
|
+
}
|
|
160
|
+
// Valid GitHub token prefixes according to the API
|
|
161
|
+
const validPrefixes = ['ghp_', 'gho_', 'ghu_', 'ghs_', 'ghr_', 'github_pat_'];
|
|
162
|
+
const hasValidPrefix = validPrefixes.some(prefix => request.github_token.startsWith(prefix));
|
|
163
|
+
if (!hasValidPrefix) {
|
|
164
|
+
throw new Error('Invalid GitHub token format. Expected format: ghp_*, gho_*, ghu_*, ghs_*, or ghr_* followed by 36 characters');
|
|
165
|
+
}
|
|
166
|
+
// GitHub tokens should be at least 40 characters (prefix + 36 chars)
|
|
167
|
+
if (request.github_token.length < 40) {
|
|
168
|
+
throw new Error('GitHub token must be at least 40 characters long');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Handle API errors consistently
|
|
173
|
+
*
|
|
174
|
+
* @param error - The error response from the API
|
|
175
|
+
* @throws {Error} With the API error message
|
|
176
|
+
*/
|
|
177
|
+
handleAPIError(error) {
|
|
178
|
+
if (error.response?.data?.detail) {
|
|
179
|
+
throw new Error(error.response.data.detail);
|
|
180
|
+
}
|
|
181
|
+
if (error.response?.data?.message) {
|
|
182
|
+
throw new Error(error.response.data.message);
|
|
183
|
+
}
|
|
184
|
+
if (error.message) {
|
|
185
|
+
throw new Error(error.message);
|
|
186
|
+
}
|
|
187
|
+
throw new Error('An unexpected error occurred');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.SecurityKeysService = SecurityKeysService;
|