@code-rag/api-server 0.1.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/dashboard/data-collector.d.ts +61 -0
  4. package/dist/dashboard/data-collector.js +244 -0
  5. package/dist/dashboard/data-collector.js.map +1 -0
  6. package/dist/dashboard/data-collector.test.d.ts +1 -0
  7. package/dist/dashboard/data-collector.test.js +334 -0
  8. package/dist/dashboard/data-collector.test.js.map +1 -0
  9. package/dist/dashboard/index.d.ts +10 -0
  10. package/dist/dashboard/index.js +6 -0
  11. package/dist/dashboard/index.js.map +1 -0
  12. package/dist/dashboard/routes.d.ts +18 -0
  13. package/dist/dashboard/routes.js +150 -0
  14. package/dist/dashboard/routes.js.map +1 -0
  15. package/dist/dashboard/templates.d.ts +47 -0
  16. package/dist/dashboard/templates.js +591 -0
  17. package/dist/dashboard/templates.js.map +1 -0
  18. package/dist/dashboard/templates.test.d.ts +1 -0
  19. package/dist/dashboard/templates.test.js +408 -0
  20. package/dist/dashboard/templates.test.js.map +1 -0
  21. package/dist/dashboard/types.d.ts +119 -0
  22. package/dist/dashboard/types.js +4 -0
  23. package/dist/dashboard/types.js.map +1 -0
  24. package/dist/index.d.ts +21 -0
  25. package/dist/index.js +36 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/middleware/auth.d.ts +37 -0
  28. package/dist/middleware/auth.js +92 -0
  29. package/dist/middleware/auth.js.map +1 -0
  30. package/dist/middleware/rate-limit.d.ts +26 -0
  31. package/dist/middleware/rate-limit.js +79 -0
  32. package/dist/middleware/rate-limit.js.map +1 -0
  33. package/dist/openapi.d.ts +14 -0
  34. package/dist/openapi.js +363 -0
  35. package/dist/openapi.js.map +1 -0
  36. package/dist/routes/context.d.ts +15 -0
  37. package/dist/routes/context.js +84 -0
  38. package/dist/routes/context.js.map +1 -0
  39. package/dist/routes/history.d.ts +56 -0
  40. package/dist/routes/history.js +308 -0
  41. package/dist/routes/history.js.map +1 -0
  42. package/dist/routes/index-trigger.d.ts +21 -0
  43. package/dist/routes/index-trigger.js +47 -0
  44. package/dist/routes/index-trigger.js.map +1 -0
  45. package/dist/routes/search.d.ts +24 -0
  46. package/dist/routes/search.js +85 -0
  47. package/dist/routes/search.js.map +1 -0
  48. package/dist/routes/status.d.ts +14 -0
  49. package/dist/routes/status.js +37 -0
  50. package/dist/routes/status.js.map +1 -0
  51. package/dist/routes/team.d.ts +62 -0
  52. package/dist/routes/team.js +129 -0
  53. package/dist/routes/team.js.map +1 -0
  54. package/dist/routes/viewer.d.ts +78 -0
  55. package/dist/routes/viewer.js +387 -0
  56. package/dist/routes/viewer.js.map +1 -0
  57. package/dist/routes/viewer.test.d.ts +1 -0
  58. package/dist/routes/viewer.test.js +509 -0
  59. package/dist/routes/viewer.test.js.map +1 -0
  60. package/dist/server.d.ts +45 -0
  61. package/dist/server.js +227 -0
  62. package/dist/server.js.map +1 -0
  63. package/dist/server.test.d.ts +1 -0
  64. package/dist/server.test.js +620 -0
  65. package/dist/server.test.js.map +1 -0
  66. package/package.json +62 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CodeRAG Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # @code-rag/api-server
2
+
3
+ REST API server for CodeRAG -- Express-based server with authentication (OIDC/SAML), rate limiting, RBAC, team collaboration, and OpenAPI documentation.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @code-rag/api-server
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - REST API with OpenAPI/Swagger docs
14
+ - Authentication via OIDC and SAML providers
15
+ - Role-based access control (RBAC)
16
+ - Rate limiting and audit logging
17
+ - Team collaboration with shared indexes
18
+ - Cloud storage providers (S3, Azure Blob, GCS)
19
+
20
+ ## Documentation
21
+
22
+ See the [main repository](https://dev.azure.com/momc-pl/CodeRAG/_git/CodeRAG) for full documentation.
23
+
24
+ ## License
25
+
26
+ MIT
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Dashboard data collector — aggregates index health, search analytics,
3
+ * user info, and usage statistics from in-memory counters.
4
+ */
5
+ import type { LanceDBStore, CodeRAGConfig } from '@code-rag/core';
6
+ import type { ApiKeyEntry } from '../middleware/auth.js';
7
+ import type { IndexOverview, SearchAnalytics, UserInfo, UsageStats, DashboardConfig } from './types.js';
8
+ export interface DashboardDataCollectorDeps {
9
+ readonly getStore: () => LanceDBStore | null;
10
+ readonly getConfig: () => CodeRAGConfig | null;
11
+ readonly apiKeys: ReadonlyArray<ApiKeyEntry>;
12
+ }
13
+ export declare class DashboardDataCollector {
14
+ private readonly deps;
15
+ private readonly config;
16
+ private readonly searchRecords;
17
+ private readonly requestRecords;
18
+ private readonly userActivity;
19
+ private lastIndexedTimestamp;
20
+ constructor(deps: DashboardDataCollectorDeps, config?: Partial<DashboardConfig>);
21
+ /**
22
+ * Record an incoming HTTP request for usage tracking.
23
+ */
24
+ recordRequest(method: string, path: string, apiKeyId: string | null): void;
25
+ /**
26
+ * Record a search query for analytics.
27
+ */
28
+ recordSearch(query: string, latencyMs: number, success: boolean, apiKeyId?: string | null): void;
29
+ /**
30
+ * Mark the last indexing timestamp.
31
+ */
32
+ setLastIndexed(timestamp: string): void;
33
+ /**
34
+ * Get index overview by querying the LanceDB store.
35
+ */
36
+ getIndexOverview(): Promise<IndexOverview>;
37
+ /**
38
+ * Get search analytics for the last N days.
39
+ */
40
+ getSearchAnalytics(days?: number): SearchAnalytics;
41
+ /**
42
+ * Get user info from configured API keys + tracked activity.
43
+ */
44
+ getUsers(): ReadonlyArray<UserInfo>;
45
+ /**
46
+ * Get overall usage statistics.
47
+ */
48
+ getUsageStats(): UsageStats;
49
+ /**
50
+ * Get the current dashboard configuration.
51
+ */
52
+ getConfig(): DashboardConfig;
53
+ /**
54
+ * Get the number of search records currently stored.
55
+ */
56
+ getSearchRecordCount(): number;
57
+ /**
58
+ * Get the number of request records currently stored.
59
+ */
60
+ getRequestRecordCount(): number;
61
+ }
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Dashboard data collector — aggregates index health, search analytics,
3
+ * user info, and usage statistics from in-memory counters.
4
+ */
5
+ const DEFAULT_CONFIG = {
6
+ maxSearchRecords: 10_000,
7
+ maxRequestRecords: 50_000,
8
+ topQueriesLimit: 20,
9
+ };
10
+ const MS_PER_DAY = 86_400_000;
11
+ export class DashboardDataCollector {
12
+ deps;
13
+ config;
14
+ searchRecords = [];
15
+ requestRecords = [];
16
+ userActivity = new Map();
17
+ lastIndexedTimestamp = null;
18
+ constructor(deps, config) {
19
+ this.deps = deps;
20
+ this.config = { ...DEFAULT_CONFIG, ...config };
21
+ }
22
+ /**
23
+ * Record an incoming HTTP request for usage tracking.
24
+ */
25
+ recordRequest(method, path, apiKeyId) {
26
+ this.requestRecords.push({
27
+ method,
28
+ path,
29
+ apiKeyId,
30
+ timestamp: Date.now(),
31
+ });
32
+ // Evict oldest records if we exceed the limit
33
+ if (this.requestRecords.length > this.config.maxRequestRecords) {
34
+ this.requestRecords.splice(0, this.requestRecords.length - this.config.maxRequestRecords);
35
+ }
36
+ }
37
+ /**
38
+ * Record a search query for analytics.
39
+ */
40
+ recordSearch(query, latencyMs, success, apiKeyId) {
41
+ this.searchRecords.push({
42
+ query,
43
+ latencyMs,
44
+ success,
45
+ timestamp: Date.now(),
46
+ });
47
+ // Evict oldest records if we exceed the limit
48
+ if (this.searchRecords.length > this.config.maxSearchRecords) {
49
+ this.searchRecords.splice(0, this.searchRecords.length - this.config.maxSearchRecords);
50
+ }
51
+ // Update per-user activity
52
+ if (apiKeyId) {
53
+ const existing = this.userActivity.get(apiKeyId);
54
+ if (existing) {
55
+ existing.lastActive = Date.now();
56
+ existing.queryCount += 1;
57
+ }
58
+ else {
59
+ this.userActivity.set(apiKeyId, { lastActive: Date.now(), queryCount: 1 });
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Mark the last indexing timestamp.
65
+ */
66
+ setLastIndexed(timestamp) {
67
+ this.lastIndexedTimestamp = timestamp;
68
+ }
69
+ /**
70
+ * Get index overview by querying the LanceDB store.
71
+ */
72
+ async getIndexOverview() {
73
+ const store = this.deps.getStore();
74
+ const config = this.deps.getConfig();
75
+ if (!store) {
76
+ return {
77
+ chunkCount: 0,
78
+ fileCount: 0,
79
+ languages: [],
80
+ lastIndexed: this.lastIndexedTimestamp,
81
+ storageBytes: 0,
82
+ health: 'not_initialized',
83
+ };
84
+ }
85
+ let chunkCount = 0;
86
+ let health = 'degraded';
87
+ const countResult = await store.count();
88
+ if (countResult.isOk()) {
89
+ chunkCount = countResult.value;
90
+ health = chunkCount > 0 ? 'healthy' : 'degraded';
91
+ }
92
+ const languages = Array.isArray(config?.project.languages)
93
+ ? [...config.project.languages]
94
+ : [];
95
+ return {
96
+ chunkCount,
97
+ fileCount: estimateFileCount(chunkCount),
98
+ languages,
99
+ lastIndexed: this.lastIndexedTimestamp,
100
+ storageBytes: estimateStorageBytes(chunkCount),
101
+ health,
102
+ };
103
+ }
104
+ /**
105
+ * Get search analytics for the last N days.
106
+ */
107
+ getSearchAnalytics(days = 30) {
108
+ const cutoff = Date.now() - days * MS_PER_DAY;
109
+ const relevant = this.searchRecords.filter((r) => r.timestamp >= cutoff);
110
+ const totalQueries = relevant.length;
111
+ // Per-day counts
112
+ const dayCounts = new Map();
113
+ for (const record of relevant) {
114
+ const dateStr = new Date(record.timestamp).toISOString().slice(0, 10);
115
+ dayCounts.set(dateStr, (dayCounts.get(dateStr) ?? 0) + 1);
116
+ }
117
+ const queriesPerDay = [];
118
+ for (const [date, count] of dayCounts.entries()) {
119
+ queriesPerDay.push({ date, count });
120
+ }
121
+ queriesPerDay.sort((a, b) => a.date.localeCompare(b.date));
122
+ // Top queries
123
+ const queryCounts = new Map();
124
+ for (const record of relevant) {
125
+ const normalizedQuery = record.query.toLowerCase().trim();
126
+ queryCounts.set(normalizedQuery, (queryCounts.get(normalizedQuery) ?? 0) + 1);
127
+ }
128
+ const topQueries = [];
129
+ for (const [query, count] of queryCounts.entries()) {
130
+ topQueries.push({ query, count });
131
+ }
132
+ topQueries.sort((a, b) => b.count - a.count);
133
+ const limitedTopQueries = topQueries.slice(0, this.config.topQueriesLimit);
134
+ // Average latency
135
+ const avgResponseTimeMs = totalQueries > 0
136
+ ? relevant.reduce((sum, r) => sum + r.latencyMs, 0) / totalQueries
137
+ : 0;
138
+ // Error rate
139
+ const errorCount = relevant.filter((r) => !r.success).length;
140
+ const errorRate = totalQueries > 0 ? errorCount / totalQueries : 0;
141
+ return {
142
+ totalQueries,
143
+ queriesPerDay,
144
+ topQueries: limitedTopQueries,
145
+ avgResponseTimeMs: Math.round(avgResponseTimeMs * 100) / 100,
146
+ errorRate: Math.round(errorRate * 10000) / 10000,
147
+ };
148
+ }
149
+ /**
150
+ * Get user info from configured API keys + tracked activity.
151
+ */
152
+ getUsers() {
153
+ return this.deps.apiKeys.map((keyEntry) => {
154
+ const truncatedKey = truncateApiKey(keyEntry.key);
155
+ const activity = this.userActivity.get(keyEntry.key);
156
+ return {
157
+ userId: truncatedKey,
158
+ role: keyEntry.admin ? 'admin' : 'user',
159
+ lastActive: activity ? new Date(activity.lastActive).toISOString() : null,
160
+ queryCount: activity?.queryCount ?? 0,
161
+ };
162
+ });
163
+ }
164
+ /**
165
+ * Get overall usage statistics.
166
+ */
167
+ getUsageStats() {
168
+ const now = Date.now();
169
+ const oneDayAgo = now - MS_PER_DAY;
170
+ const oneWeekAgo = now - 7 * MS_PER_DAY;
171
+ const oneMonthAgo = now - 30 * MS_PER_DAY;
172
+ const apiCallsToday = this.requestRecords.filter((r) => r.timestamp >= oneDayAgo).length;
173
+ const apiCallsWeek = this.requestRecords.filter((r) => r.timestamp >= oneWeekAgo).length;
174
+ const apiCallsMonth = this.requestRecords.filter((r) => r.timestamp >= oneMonthAgo).length;
175
+ const store = this.deps.getStore();
176
+ const storageBytes = store ? estimateStorageBytes(this.requestRecords.length) : 0;
177
+ const costEstimate = formatCostEstimate(apiCallsMonth);
178
+ return {
179
+ apiCallsToday,
180
+ apiCallsWeek,
181
+ apiCallsMonth,
182
+ storageBytes,
183
+ costEstimate,
184
+ };
185
+ }
186
+ /**
187
+ * Get the current dashboard configuration.
188
+ */
189
+ getConfig() {
190
+ return { ...this.config };
191
+ }
192
+ /**
193
+ * Get the number of search records currently stored.
194
+ */
195
+ getSearchRecordCount() {
196
+ return this.searchRecords.length;
197
+ }
198
+ /**
199
+ * Get the number of request records currently stored.
200
+ */
201
+ getRequestRecordCount() {
202
+ return this.requestRecords.length;
203
+ }
204
+ }
205
+ /**
206
+ * Truncate an API key to show only the first 8 chars + ellipsis.
207
+ */
208
+ function truncateApiKey(key) {
209
+ if (key.length <= 8) {
210
+ return key;
211
+ }
212
+ return `${key.slice(0, 8)}...`;
213
+ }
214
+ /**
215
+ * Rough estimate of file count from chunk count.
216
+ * Assumes ~5 chunks per file on average.
217
+ */
218
+ function estimateFileCount(chunkCount) {
219
+ if (chunkCount === 0)
220
+ return 0;
221
+ return Math.max(1, Math.ceil(chunkCount / 5));
222
+ }
223
+ /**
224
+ * Rough estimate of storage bytes from chunk count.
225
+ * Assumes ~4KB per chunk (content + embedding + metadata).
226
+ */
227
+ function estimateStorageBytes(chunkCount) {
228
+ return chunkCount * 4096;
229
+ }
230
+ /**
231
+ * Format a simple cost estimate string based on API call volume.
232
+ * Local-first = free. Shows informational estimate only.
233
+ */
234
+ function formatCostEstimate(monthlyApiCalls) {
235
+ if (monthlyApiCalls === 0) {
236
+ return 'Free (local-first, no API calls)';
237
+ }
238
+ // Very rough estimate: $0.001 per API call for embedding APIs
239
+ const estimatedCost = monthlyApiCalls * 0.001;
240
+ if (estimatedCost < 0.01) {
241
+ return `~$0.01/month (${monthlyApiCalls} API calls)`;
242
+ }
243
+ return `~$${estimatedCost.toFixed(2)}/month (${monthlyApiCalls} API calls)`;
244
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-collector.js","sourceRoot":"","sources":["../../src/dashboard/data-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};