@codeguide/core 0.0.33 → 0.0.36

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 (72) hide show
  1. package/__tests__/services/usage/usage-service.test.ts +53 -29
  2. package/codeguide.ts +9 -0
  3. package/dist/codeguide.d.ts +4 -1
  4. package/dist/codeguide.js +3 -0
  5. package/dist/index.d.ts +2 -1
  6. package/dist/services/chat/chat-service.d.ts +44 -0
  7. package/dist/services/chat/chat-service.js +85 -0
  8. package/dist/services/chat/chat-types.d.ts +88 -0
  9. package/dist/services/chat/chat-types.js +5 -0
  10. package/dist/services/chat/index.d.ts +2 -0
  11. package/dist/services/chat/index.js +20 -0
  12. package/dist/services/data-management/data-management-service.d.ts +53 -0
  13. package/dist/services/data-management/data-management-service.js +66 -0
  14. package/dist/services/data-management/data-management-types.d.ts +149 -0
  15. package/dist/services/data-management/data-management-types.js +7 -0
  16. package/dist/services/data-management/index.d.ts +2 -0
  17. package/dist/services/data-management/index.js +20 -0
  18. package/dist/services/generation/generation-service.d.ts +7 -1
  19. package/dist/services/generation/generation-service.js +18 -0
  20. package/dist/services/generation/generation-types.d.ts +123 -0
  21. package/dist/services/index.d.ts +8 -0
  22. package/dist/services/index.js +13 -1
  23. package/dist/services/projects/project-service.d.ts +3 -1
  24. package/dist/services/projects/project-service.js +13 -1
  25. package/dist/services/projects/project-types.d.ts +85 -8
  26. package/dist/services/prompt-generations/index.d.ts +2 -0
  27. package/dist/services/prompt-generations/index.js +20 -0
  28. package/dist/services/prompt-generations/prompt-generations-service.d.ts +47 -0
  29. package/dist/services/prompt-generations/prompt-generations-service.js +58 -0
  30. package/dist/services/prompt-generations/prompt-generations-types.d.ts +94 -0
  31. package/dist/services/prompt-generations/prompt-generations-types.js +2 -0
  32. package/dist/services/streaming/index.d.ts +2 -0
  33. package/dist/services/streaming/index.js +20 -0
  34. package/dist/services/streaming/streaming-service.d.ts +30 -0
  35. package/dist/services/streaming/streaming-service.js +107 -0
  36. package/dist/services/streaming/streaming-types.d.ts +14 -0
  37. package/dist/services/streaming/streaming-types.js +2 -0
  38. package/dist/services/tasks/task-service.d.ts +3 -1
  39. package/dist/services/tasks/task-service.js +8 -0
  40. package/dist/services/tasks/task-types.d.ts +15 -0
  41. package/dist/services/usage/usage-service.d.ts +35 -1
  42. package/dist/services/usage/usage-service.js +68 -0
  43. package/dist/services/usage/usage-types.d.ts +109 -33
  44. package/dist/services/users/user-service.d.ts +9 -1
  45. package/dist/services/users/user-service.js +10 -0
  46. package/dist/services/users/user-types.d.ts +14 -0
  47. package/index.ts +10 -0
  48. package/package.json +1 -1
  49. package/services/chat/chat-service.ts +110 -0
  50. package/services/chat/chat-types.ts +145 -0
  51. package/services/chat/index.ts +2 -0
  52. package/services/data-management/data-management-service.ts +74 -0
  53. package/services/data-management/data-management-types.ts +163 -0
  54. package/services/data-management/index.ts +2 -0
  55. package/services/generation/generation-service.ts +40 -0
  56. package/services/generation/generation-types.ts +140 -0
  57. package/services/index.ts +8 -0
  58. package/services/projects/README.md +54 -0
  59. package/services/projects/project-service.ts +20 -1
  60. package/services/projects/project-types.ts +88 -8
  61. package/services/prompt-generations/index.ts +2 -0
  62. package/services/prompt-generations/prompt-generations-service.ts +75 -0
  63. package/services/prompt-generations/prompt-generations-types.ts +101 -0
  64. package/services/streaming/index.ts +2 -0
  65. package/services/streaming/streaming-service.ts +123 -0
  66. package/services/streaming/streaming-types.ts +15 -0
  67. package/services/tasks/task-service.ts +30 -2
  68. package/services/tasks/task-types.ts +19 -1
  69. package/services/usage/usage-service.ts +81 -0
  70. package/services/usage/usage-types.ts +117 -36
  71. package/services/users/user-service.ts +15 -1
  72. package/services/users/user-types.ts +16 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Persona types for prompt generation
3
+ */
4
+ export type PersonaType = 'expert' | 'assistant' | 'teacher' | 'analyst' | 'creative'
5
+
6
+ /**
7
+ * Output format types for generated prompts
8
+ */
9
+ export type OutputFormatType = 'markdown' | 'json' | 'xml' | 'plain' | 'code'
10
+
11
+ /**
12
+ * Request body for creating a new prompt generation
13
+ */
14
+ export interface CreatePromptGenerationRequest {
15
+ /** User's description of their AI assistant */
16
+ input: string
17
+ /** Persona type: expert, assistant, teacher, analyst, creative */
18
+ persona?: PersonaType
19
+ /** Format: markdown, json, xml, plain, code */
20
+ output_format?: OutputFormatType
21
+ /** Creativity level (0-2) */
22
+ temperature?: number
23
+ /** Response length (256-8192) */
24
+ max_tokens?: number
25
+ /** Include examples in prompt */
26
+ include_examples?: boolean
27
+ /** Add constraints to prompt */
28
+ include_constraints?: boolean
29
+ /** Include error handling guidance */
30
+ include_error_handling?: boolean
31
+ /** Enable chain of thought */
32
+ chain_of_thought?: boolean
33
+ /** Use JSON output schema */
34
+ structured_output?: boolean
35
+ }
36
+
37
+ /**
38
+ * Prompt generation data model
39
+ */
40
+ export interface PromptGeneration {
41
+ /** Unique identifier (UUID v4) */
42
+ id: string
43
+ /** User ID who owns this generation */
44
+ user_id: string
45
+ /** User's original input */
46
+ input: string
47
+ /** Persona type used */
48
+ persona: PersonaType
49
+ /** Output format */
50
+ output_format: OutputFormatType
51
+ /** Temperature value */
52
+ temperature: number
53
+ /** Max tokens setting */
54
+ max_tokens: number
55
+ /** Include examples flag */
56
+ include_examples: boolean
57
+ /** Include constraints flag */
58
+ include_constraints: boolean
59
+ /** Include error handling flag */
60
+ include_error_handling: boolean
61
+ /** Chain of thought flag */
62
+ chain_of_thought: boolean
63
+ /** Structured output flag */
64
+ structured_output: boolean
65
+ /** The generated AI system prompt */
66
+ generated_prompt: string
67
+ /** Creation timestamp (ISO 8601 UTC) */
68
+ created_at: string
69
+ }
70
+
71
+ /**
72
+ * Response for creating a prompt generation
73
+ */
74
+ export interface CreatePromptGenerationResponse {
75
+ /** The created prompt generation */
76
+ data: PromptGeneration
77
+ }
78
+
79
+ /**
80
+ * Response for listing prompt generations
81
+ */
82
+ export interface ListPromptGenerationsResponse {
83
+ /** Array of prompt generations */
84
+ data: PromptGeneration[]
85
+ }
86
+
87
+ /**
88
+ * Response for getting a single prompt generation
89
+ */
90
+ export interface GetPromptGenerationResponse {
91
+ /** The requested prompt generation */
92
+ data: PromptGeneration
93
+ }
94
+
95
+ /**
96
+ * Response for deleting a prompt generation
97
+ */
98
+ export interface DeletePromptGenerationResponse {
99
+ /** The deleted prompt generation */
100
+ data: PromptGeneration
101
+ }
@@ -0,0 +1,2 @@
1
+ export { StreamingService } from './streaming-service'
2
+ export * from './streaming-types'
@@ -0,0 +1,123 @@
1
+ import { BaseService } from '../base/base-service'
2
+ import { StreamTechSpecRequest, StreamChunk } from './streaming-types'
3
+
4
+ export class StreamingService extends BaseService {
5
+ /**
6
+ * Stream a tech-spec document for the given project.
7
+ *
8
+ * This method connects to the `/chat/tech-spec` endpoint and streams the response
9
+ * using Server-Sent Events (SSE) format. Each chunk is passed to the `onChunk`
10
+ * callback as it arrives, allowing for incremental UI updates.
11
+ *
12
+ * @param request - The request containing the project_id
13
+ * @param onChunk - Callback function invoked with each content chunk as it arrives
14
+ * @param onError - Optional callback function for handling errors
15
+ * @returns Promise that resolves to the full accumulated content when streaming completes
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const streamingService = new StreamingService(config);
20
+ * let fullContent = '';
21
+ *
22
+ * fullContent = await streamingService.streamTechSpec(
23
+ * { project_id: 'project-123' },
24
+ * (chunk) => {
25
+ * setContent(prev => prev + chunk); // Update UI incrementally
26
+ * }
27
+ * );
28
+ * ```
29
+ */
30
+ async streamTechSpec(
31
+ request: StreamTechSpecRequest,
32
+ onChunk: (content: string) => void,
33
+ onError?: (error: Error) => void
34
+ ): Promise<string> {
35
+ return new Promise<string>(async (resolve, reject) => {
36
+ let fullContent = ''
37
+
38
+ const fullUrl = `${this.client.defaults.baseURL}/chat/tech-spec`
39
+
40
+ try {
41
+ const response = await fetch(fullUrl, {
42
+ method: 'POST',
43
+ headers: {
44
+ ...Object.fromEntries(
45
+ Object.entries(this.client.defaults.headers).filter(
46
+ ([_, v]) => typeof v === 'string'
47
+ ) as [string, string][]
48
+ ),
49
+ Accept: 'text/event-stream',
50
+ 'Cache-Control': 'no-cache',
51
+ },
52
+ body: JSON.stringify(request),
53
+ })
54
+
55
+ if (!response.ok) {
56
+ const errorText = await response.text()
57
+ const error = new Error(`HTTP ${response.status}: ${errorText || response.statusText}`)
58
+ onError?.(error)
59
+ reject(error)
60
+ return
61
+ }
62
+
63
+ const reader = response.body?.getReader()
64
+ if (!reader) {
65
+ const error = new Error('Response body is not readable')
66
+ onError?.(error)
67
+ reject(error)
68
+ return
69
+ }
70
+
71
+ const decoder = new TextDecoder()
72
+ let buffer = ''
73
+
74
+ while (true) {
75
+ const { done, value } = await reader.read()
76
+
77
+ if (done) {
78
+ resolve(fullContent)
79
+ break
80
+ }
81
+
82
+ buffer += decoder.decode(value, { stream: true })
83
+ const lines = buffer.split('\n')
84
+ buffer = lines.pop() || '' // Keep incomplete line in buffer
85
+
86
+ for (const line of lines) {
87
+ if (line.startsWith('data: ')) {
88
+ const jsonStr = line.slice(6) // Remove 'data: ' prefix
89
+ if (jsonStr.trim()) {
90
+ try {
91
+ const chunk: StreamChunk = JSON.parse(jsonStr)
92
+
93
+ if (chunk.error) {
94
+ const error = new Error(chunk.error)
95
+ onError?.(error)
96
+ reject(error)
97
+ return
98
+ }
99
+
100
+ if (chunk.done) {
101
+ resolve(fullContent)
102
+ return
103
+ }
104
+
105
+ if (chunk.content) {
106
+ fullContent += chunk.content
107
+ onChunk(chunk.content)
108
+ }
109
+ } catch (parseError) {
110
+ console.warn('Failed to parse SSE data:', jsonStr, parseError)
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
116
+ } catch (error) {
117
+ const err = error instanceof Error ? error : new Error(String(error))
118
+ onError?.(err)
119
+ reject(err)
120
+ }
121
+ })
122
+ }
123
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Request type for streaming a tech-spec
3
+ */
4
+ export interface StreamTechSpecRequest {
5
+ project_id: string
6
+ }
7
+
8
+ /**
9
+ * A single chunk from the SSE stream
10
+ */
11
+ export interface StreamChunk {
12
+ content: string
13
+ done: boolean
14
+ error?: string
15
+ }
@@ -20,6 +20,10 @@ import {
20
20
  GetTasksByProjectResponse,
21
21
  UpdateTaskRequest,
22
22
  UpdateTaskResponse,
23
+ GenerateTasksCustomBackgroundRequest,
24
+ GenerateTasksCustomBackgroundResponse,
25
+ GeneratePromptRequest,
26
+ GeneratePromptResponse,
23
27
  } from './task-types'
24
28
 
25
29
  export class TaskService extends BaseService {
@@ -84,7 +88,10 @@ export class TaskService extends BaseService {
84
88
  })
85
89
  taskGroup = updateResponse
86
90
  } catch (error) {
87
- console.warn('Failed to create codespace task, but task group was created successfully:', error)
91
+ console.warn(
92
+ 'Failed to create codespace task, but task group was created successfully:',
93
+ error
94
+ )
88
95
  // Continue without codespace task if it fails
89
96
  }
90
97
  }
@@ -93,7 +100,10 @@ export class TaskService extends BaseService {
93
100
  }
94
101
 
95
102
  async updateTaskGroup(taskGroupId: string, request: UpdateTaskGroupRequest): Promise<TaskGroup> {
96
- const response = await this.put<TaskGroupResponse>(`/project-tasks/task-groups/${taskGroupId}`, request)
103
+ const response = await this.put<TaskGroupResponse>(
104
+ `/project-tasks/task-groups/${taskGroupId}`,
105
+ request
106
+ )
97
107
  return response.data
98
108
  }
99
109
 
@@ -158,6 +168,16 @@ export class TaskService extends BaseService {
158
168
  return this.post<GenerateTasksResponse>('/project-tasks/generate-tasks', request)
159
169
  }
160
170
 
171
+ // Generate Tasks Custom (Background)
172
+ async generateTasksCustomBackground(
173
+ request: GenerateTasksCustomBackgroundRequest
174
+ ): Promise<GenerateTasksCustomBackgroundResponse> {
175
+ return this.post<GenerateTasksCustomBackgroundResponse>(
176
+ '/project-tasks/generate-tasks-custom/background',
177
+ request
178
+ )
179
+ }
180
+
161
181
  // Get Tasks by Project
162
182
  async getTasksByProject(request: GetTasksByProjectRequest): Promise<GetTasksByProjectResponse> {
163
183
  const queryParams = new URLSearchParams()
@@ -183,4 +203,12 @@ export class TaskService extends BaseService {
183
203
  const url = `/project-tasks/by-codespace/${codespaceTaskId}`
184
204
  return this.get<ProjectTaskListResponse>(url)
185
205
  }
206
+
207
+ // Generate Prompt for a Project Task
208
+ async generatePrompt(
209
+ taskId: string,
210
+ request: GeneratePromptRequest = {}
211
+ ): Promise<GeneratePromptResponse> {
212
+ return this.post<GeneratePromptResponse>(`/project-tasks/${taskId}/generate-prompt`, request)
213
+ }
186
214
  }
@@ -179,7 +179,6 @@ export interface GetTasksByProjectResponse {
179
179
  }
180
180
  }
181
181
 
182
-
183
182
  export interface UpdateTaskRequest {
184
183
  status?: string
185
184
  ai_result?: string
@@ -194,3 +193,22 @@ export interface UpdateTaskResponse {
194
193
  task: ProjectTask
195
194
  }
196
195
  }
196
+
197
+ export interface GenerateTasksCustomBackgroundRequest {
198
+ project_id: string
199
+ }
200
+
201
+ export interface GenerateTasksCustomBackgroundResponse {
202
+ status: string
203
+ job_id: string
204
+ message: string
205
+ }
206
+
207
+ export interface GeneratePromptRequest {
208
+ additional_context?: string
209
+ }
210
+
211
+ export interface GeneratePromptResponse {
212
+ status: string
213
+ prompt: string
214
+ }
@@ -21,6 +21,14 @@ import {
21
21
  UsageDetailsResponse,
22
22
  ServiceBreakdownRequest,
23
23
  ServiceBreakdownResponse,
24
+ // Activity Heatmap types
25
+ ActivityHeatmapRequest,
26
+ ActivityHeatmapResponse,
27
+ // Repository Analysis types
28
+ RepositoryAnalysisSummaryRequest,
29
+ RepositoryAnalysisSummaryResponse,
30
+ RepositoryAnalysisTimelineRequest,
31
+ RepositoryAnalysisTimelineResponse,
24
32
  } from './usage-types'
25
33
 
26
34
  export class UsageService extends BaseService {
@@ -142,4 +150,77 @@ export class UsageService extends BaseService {
142
150
  const url = `/usage/dashboard/services${queryParams.toString() ? `?${queryParams.toString()}` : ''}`
143
151
  return this.get<ServiceBreakdownResponse>(url)
144
152
  }
153
+
154
+ // Activity Heatmap Methods
155
+
156
+ /**
157
+ * Get activity heatmap data based on codespace tasks created.
158
+ * Similar to GitHub's contribution graph.
159
+ *
160
+ * @param params - Optional request parameters
161
+ * @param params.period - Time period: '3m', '6m', '1y' (default: '3m')
162
+ * @param params.start_date - Custom start date in YYYY-MM-DD format
163
+ * @param params.end_date - Custom end date in YYYY-MM-DD format
164
+ * @returns Activity heatmap data with daily counts and levels
165
+ */
166
+ async getActivityHeatmap(params?: ActivityHeatmapRequest): Promise<ActivityHeatmapResponse> {
167
+ const queryParams = new URLSearchParams()
168
+
169
+ if (params?.period) queryParams.append('period', params.period)
170
+ if (params?.start_date) queryParams.append('start_date', params.start_date)
171
+ if (params?.end_date) queryParams.append('end_date', params.end_date)
172
+
173
+ const url = `/usage/dashboard/activity-heatmap${queryParams.toString() ? `?${queryParams.toString()}` : ''}`
174
+ return this.get<ActivityHeatmapResponse>(url)
175
+ }
176
+
177
+ // Repository Analysis Stats Methods
178
+
179
+ /**
180
+ * Get summary statistics for repository analysis.
181
+ * Provides aggregated metrics across all analyzed repositories.
182
+ *
183
+ * @param params - Optional request parameters
184
+ * @param params.period - Time period: '7d', '1w', '1m', '3m', '6m', '1y' (optional - defaults to all-time)
185
+ * @param params.start_date - Custom start date in YYYY-MM-DD format
186
+ * @param params.end_date - Custom end date in YYYY-MM-DD format
187
+ * @returns Summary statistics including total repos, lines, files, etc.
188
+ */
189
+ async getRepositoryAnalysisSummary(
190
+ params?: RepositoryAnalysisSummaryRequest
191
+ ): Promise<RepositoryAnalysisSummaryResponse> {
192
+ const queryParams = new URLSearchParams()
193
+
194
+ if (params?.period) queryParams.append('period', params.period)
195
+ if (params?.start_date) queryParams.append('start_date', params.start_date)
196
+ if (params?.end_date) queryParams.append('end_date', params.end_date)
197
+
198
+ const url = `/usage/dashboard/repo-analysis/summary${queryParams.toString() ? `?${queryParams.toString()}` : ''}`
199
+ return this.get<RepositoryAnalysisSummaryResponse>(url)
200
+ }
201
+
202
+ /**
203
+ * Get timeline data for repository analysis suitable for line graphs.
204
+ * Provides time-series data for visualization.
205
+ *
206
+ * @param params - Optional request parameters
207
+ * @param params.period - Time period: '7d', '1w', '1m', '3m', '6m', '1y' (default: '1m')
208
+ * @param params.start_date - Custom start date in YYYY-MM-DD format
209
+ * @param params.end_date - Custom end date in YYYY-MM-DD format
210
+ * @param params.granularity - Data granularity: 'daily', 'weekly', 'monthly' (default: 'daily')
211
+ * @returns Timeline data with repos analyzed, lines, files per period
212
+ */
213
+ async getRepositoryAnalysisTimeline(
214
+ params?: RepositoryAnalysisTimelineRequest
215
+ ): Promise<RepositoryAnalysisTimelineResponse> {
216
+ const queryParams = new URLSearchParams()
217
+
218
+ if (params?.period) queryParams.append('period', params.period)
219
+ if (params?.start_date) queryParams.append('start_date', params.start_date)
220
+ if (params?.end_date) queryParams.append('end_date', params.end_date)
221
+ if (params?.granularity) queryParams.append('granularity', params.granularity)
222
+
223
+ const url = `/usage/dashboard/repo-analysis/timeline${queryParams.toString() ? `?${queryParams.toString()}` : ''}`
224
+ return this.get<RepositoryAnalysisTimelineResponse>(url)
225
+ }
145
226
  }
@@ -51,8 +51,8 @@ export interface CreditBalance {
51
51
  remaining_credits: number
52
52
  is_over_limit: boolean
53
53
  utilization_percentage: number
54
- billing_cycle_start: string
55
- billing_cycle_end: string
54
+ billing_cycle_start?: string
55
+ billing_cycle_end?: string
56
56
  }
57
57
 
58
58
  export interface LimitInfo {
@@ -77,18 +77,19 @@ export interface PlanLimits {
77
77
  storage_gb: LimitInfo
78
78
  projects: LimitInfo
79
79
  collaborators: LimitInfo
80
+ softwarev2_access?: LimitInfo
80
81
  }
81
82
  }
82
83
 
83
84
  export interface AuthorizationSubscription {
84
- id: string
85
- status: string
86
- interval: string
87
- current_period_start: string
88
- current_period_end: string
89
- price_id: string
90
- product_name: string | null
91
- plan_name: string
85
+ id?: string
86
+ status?: string
87
+ interval?: string
88
+ current_period_start?: string
89
+ current_period_end?: string
90
+ price_id?: string
91
+ product_name?: string | null
92
+ plan_name?: string
92
93
  }
93
94
 
94
95
  export interface AuthorizationData {
@@ -103,7 +104,7 @@ export interface AuthorizationData {
103
104
  can_create_tasks: boolean
104
105
  can_analyze_repos: boolean
105
106
  can_access_previous_projects: boolean
106
- plan_limits: PlanLimits
107
+ plan_limits?: PlanLimits | null
107
108
  codespace_task_limit: LimitInfo | null
108
109
  }
109
110
 
@@ -291,34 +292,13 @@ export interface UsageSummaryRequest {
291
292
  end_date?: string
292
293
  }
293
294
 
294
- export interface CurrentPeriodUsage {
295
- credits_consumed: number
296
- cost_usd: number
297
- requests_count: number
298
- }
299
-
300
- export interface PreviousPeriodUsage {
301
- credits_consumed: number
302
- cost_usd: number
303
- requests_count: number
304
- }
305
-
306
- export interface BillingCycleInfo {
307
- total_allotted: number
308
- total_consumed: number
309
- remaining_credits: number
310
- }
311
-
312
295
  export interface UsageSummaryResponse {
313
296
  status: string
314
297
  data: {
315
- current_period: CurrentPeriodUsage
316
- previous_period: PreviousPeriodUsage
317
- billing_cycle: BillingCycleInfo
318
- utilization_percentage: number
319
- remaining_credits: number
320
- daily_average: number
321
- projected_monthly: number
298
+ period: { start?: string; end?: string }
299
+ usage: { [key: string]: number }
300
+ breakdown: { [key: string]: number }
301
+ service_breakdown: Array<{ service_type: string; [key: string]: any }>
322
302
  }
323
303
  }
324
304
 
@@ -349,3 +329,104 @@ export interface ServiceBreakdownResponse {
349
329
  status: string
350
330
  data: ServiceBreakdownData
351
331
  }
332
+
333
+ // Activity Heatmap Types (GitHub-style contribution graph)
334
+ export type HeatmapPeriodType = '3m' | '6m' | '1y'
335
+ export type ActivityLevel = 0 | 1 | 2 | 3 | 4
336
+
337
+ export interface ActivityHeatmapRequest {
338
+ period?: HeatmapPeriodType
339
+ start_date?: string
340
+ end_date?: string
341
+ }
342
+
343
+ export interface HeatmapDayData {
344
+ date: string
345
+ count: number
346
+ level: ActivityLevel
347
+ }
348
+
349
+ export interface ActivityHeatmapData {
350
+ period: PeriodInfo
351
+ days: HeatmapDayData[]
352
+ total_tasks: number
353
+ most_active_day: string | null
354
+ max_daily_count: number
355
+ average_daily: number
356
+ active_days: number
357
+ }
358
+
359
+ export interface ActivityHeatmapResponse {
360
+ status: string
361
+ data: ActivityHeatmapData
362
+ }
363
+
364
+ // Repository Analysis Summary Types
365
+ export type RepoAnalysisPeriodType = '7d' | '1w' | '1m' | '3m' | '6m' | '1y'
366
+
367
+ export interface RepositoryAnalysisSummaryRequest {
368
+ period?: RepoAnalysisPeriodType
369
+ start_date?: string
370
+ end_date?: string
371
+ }
372
+
373
+ export interface RepositoryAnalysisSummaryData {
374
+ total_repositories: number
375
+ total_lines: number
376
+ total_files_processed: number
377
+ total_files_found: number
378
+ total_directories: number
379
+ total_characters: number
380
+ estimated_tokens_total: number
381
+ total_size_bytes: number
382
+ binary_files_skipped: number
383
+ large_files_skipped: number
384
+ encoding_errors: number
385
+ average_lines_per_repo: number
386
+ average_files_per_repo: number
387
+ period: PeriodInfo | null
388
+ }
389
+
390
+ export interface RepositoryAnalysisSummaryResponse {
391
+ status: string
392
+ data: RepositoryAnalysisSummaryData
393
+ }
394
+
395
+ // Repository Analysis Timeline Types
396
+ export type TimelineGranularity = 'daily' | 'weekly' | 'monthly'
397
+
398
+ export interface RepositoryAnalysisTimelineRequest {
399
+ period?: RepoAnalysisPeriodType
400
+ start_date?: string
401
+ end_date?: string
402
+ granularity?: TimelineGranularity
403
+ }
404
+
405
+ export interface RepositoryAnalysisTimelineItem {
406
+ date: string
407
+ repos_analyzed: number
408
+ total_lines: number
409
+ total_files: number
410
+ total_characters: number
411
+ estimated_tokens: number
412
+ }
413
+
414
+ export interface RepositoryAnalysisTimelineTotals {
415
+ repos_analyzed: number
416
+ total_lines: number
417
+ total_files: number
418
+ total_characters: number
419
+ estimated_tokens: number
420
+ }
421
+
422
+ export interface RepositoryAnalysisTimelineData {
423
+ period: PeriodInfo
424
+ granularity: TimelineGranularity
425
+ timeline: RepositoryAnalysisTimelineItem[]
426
+ totals: RepositoryAnalysisTimelineTotals
427
+ }
428
+
429
+ export interface RepositoryAnalysisTimelineResponse {
430
+ status: string
431
+ data: RepositoryAnalysisTimelineData
432
+ }
@@ -1,5 +1,8 @@
1
1
  import { BaseService } from '../base/base-service'
2
- import { GetCurrentClerkUserResponse } from './user-types'
2
+ import {
3
+ GetCurrentClerkUserResponse,
4
+ CheckAdminStatusResponse,
5
+ } from './user-types'
3
6
 
4
7
  export class UserService extends BaseService {
5
8
  /**
@@ -12,4 +15,15 @@ export class UserService extends BaseService {
12
15
  async getCurrentClerkUser(): Promise<GetCurrentClerkUserResponse> {
13
16
  return this.get<GetCurrentClerkUserResponse>('/users/me/clerk')
14
17
  }
18
+
19
+ /**
20
+ * Check if the current authenticated user has admin role
21
+ *
22
+ * GET /users/me/admin
23
+ *
24
+ * @returns Promise resolving to admin status data
25
+ */
26
+ async checkAdminStatus(): Promise<CheckAdminStatusResponse> {
27
+ return this.get<CheckAdminStatusResponse>('/users/me/admin')
28
+ }
15
29
  }
@@ -57,3 +57,19 @@ export interface GetCurrentClerkUserResponse {
57
57
  status: 'success' | 'error'
58
58
  data: ClerkUserData
59
59
  }
60
+
61
+ /**
62
+ * Admin status check data
63
+ */
64
+ export interface AdminStatusData {
65
+ is_admin: boolean
66
+ user_id: string
67
+ }
68
+
69
+ /**
70
+ * Response for checking if current user is admin
71
+ */
72
+ export interface CheckAdminStatusResponse {
73
+ status: 'success' | 'error'
74
+ data: AdminStatusData
75
+ }