@codeguide/core 0.0.23 → 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.
@@ -1,7 +1,8 @@
1
1
  import { BaseService } from '../base/base-service';
2
- import { GenerateTaskTitleRequest, GenerateTaskTitleResponse, CreateCodespaceTaskRequest, CreateCodespaceTaskResponse, CreateCodespaceTaskRequestV2, CreateCodespaceTaskResponseV2, CreateBackgroundCodespaceTaskRequest, CreateBackgroundCodespaceTaskResponse, GetCodespaceTaskResponse, GetProjectTasksByCodespaceResponse, GetCodespaceTasksByProjectRequest, GetCodespaceTasksByProjectResponse, CodespaceTaskDetailedResponse } 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
+ generateQuestionnaire(request: CodespaceQuestionnaireRequest): Promise<CodespaceQuestionnaireResponse>;
5
6
  createCodespaceTask(request: CreateCodespaceTaskRequest): Promise<CreateCodespaceTaskResponse>;
6
7
  createCodespaceTaskV2(request: CreateCodespaceTaskRequestV2): Promise<CreateCodespaceTaskResponseV2>;
7
8
  createBackgroundCodespaceTask(request: CreateBackgroundCodespaceTaskRequest): Promise<CreateBackgroundCodespaceTaskResponse>;
@@ -9,5 +10,57 @@ export declare class CodespaceService extends BaseService {
9
10
  getProjectTasksByCodespace(codespaceTaskId: string): Promise<GetProjectTasksByCodespaceResponse>;
10
11
  getCodespaceTasksByProject(params: GetCodespaceTasksByProjectRequest): Promise<GetCodespaceTasksByProjectResponse>;
11
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;
12
64
  private validateCodespaceTaskRequest;
65
+ private validateQuestionnaireRequest;
13
66
  }
@@ -6,6 +6,10 @@ class CodespaceService extends base_service_1.BaseService {
6
6
  async generateTaskTitle(request) {
7
7
  return this.post('/codespace/generate-task-title', request);
8
8
  }
9
+ async generateQuestionnaire(request) {
10
+ this.validateQuestionnaireRequest(request);
11
+ return this.post('/codespace/generate-questionnaire', request);
12
+ }
9
13
  async createCodespaceTask(request) {
10
14
  return this.post('/codespace/create-task', request);
11
15
  }
@@ -53,6 +57,93 @@ class CodespaceService extends base_service_1.BaseService {
53
57
  }
54
58
  return this.get(`/codespace/task/${codespaceTaskId}/detailed`);
55
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
+ }
56
147
  validateCodespaceTaskRequest(request) {
57
148
  if (!request.project_id) {
58
149
  throw new Error('project_id is required');
@@ -82,6 +173,51 @@ class CodespaceService extends base_service_1.BaseService {
82
173
  if (request.base_branch === undefined) {
83
174
  request.base_branch = 'main';
84
175
  }
176
+ // Validate ai_questionnaire if provided
177
+ if (request.ai_questionnaire) {
178
+ if (typeof request.ai_questionnaire !== 'object' || request.ai_questionnaire === null) {
179
+ throw new Error('ai_questionnaire must be an object');
180
+ }
181
+ // Check if it's a plain object with string keys and string values
182
+ for (const [key, value] of Object.entries(request.ai_questionnaire)) {
183
+ if (typeof key !== 'string') {
184
+ throw new Error('All ai_questionnaire keys must be strings');
185
+ }
186
+ if (typeof value !== 'string') {
187
+ throw new Error('All ai_questionnaire values must be strings');
188
+ }
189
+ }
190
+ }
191
+ }
192
+ validateQuestionnaireRequest(request) {
193
+ if (!request.task_description) {
194
+ throw new Error('task_description is required');
195
+ }
196
+ // Validate attachments if provided
197
+ if (request.attachments) {
198
+ if (!Array.isArray(request.attachments)) {
199
+ throw new Error('attachments must be an array');
200
+ }
201
+ for (const attachment of request.attachments) {
202
+ // Check required fields
203
+ if (!attachment.filename || typeof attachment.filename !== 'string') {
204
+ throw new Error('Each attachment must have a valid filename string');
205
+ }
206
+ if (!attachment.file_data || typeof attachment.file_data !== 'string') {
207
+ throw new Error('Each attachment must have valid file_data string');
208
+ }
209
+ if (!attachment.mime_type || typeof attachment.mime_type !== 'string') {
210
+ throw new Error('Each attachment must have a valid mime_type string');
211
+ }
212
+ if (typeof attachment.file_size !== 'number' || attachment.file_size < 0) {
213
+ throw new Error('Each attachment must have a valid file_size number (>= 0)');
214
+ }
215
+ // Validate optional description field
216
+ if (attachment.description && typeof attachment.description !== 'string') {
217
+ throw new Error('Attachment description must be a string if provided');
218
+ }
219
+ }
220
+ }
85
221
  }
86
222
  }
87
223
  exports.CodespaceService = CodespaceService;
@@ -44,6 +44,7 @@ export interface CreateCodespaceTaskRequestV2 {
44
44
  starter_kit_repo?: string;
45
45
  use_enhanced_summary?: boolean;
46
46
  attachments?: Attachment[];
47
+ ai_questionnaire?: Record<string, string>;
47
48
  }
48
49
  export interface CreateCodespaceTaskResponseV2 {
49
50
  success: boolean;
@@ -148,3 +149,62 @@ export interface CodespaceTaskDetailedResponse {
148
149
  };
149
150
  message: string;
150
151
  }
152
+ export interface CodespaceQuestionnaireRequest {
153
+ task_description: string;
154
+ project_context?: string;
155
+ repository_info?: {
156
+ name?: string;
157
+ description?: string;
158
+ };
159
+ attachments?: Attachment[];
160
+ }
161
+ export interface CodespaceQuestionnaireResponse {
162
+ success: boolean;
163
+ questions: string[];
164
+ message: string;
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 } 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';
@@ -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';
@@ -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;