@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.
- package/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/dashboard/data-collector.d.ts +61 -0
- package/dist/dashboard/data-collector.js +244 -0
- package/dist/dashboard/data-collector.js.map +1 -0
- package/dist/dashboard/data-collector.test.d.ts +1 -0
- package/dist/dashboard/data-collector.test.js +334 -0
- package/dist/dashboard/data-collector.test.js.map +1 -0
- package/dist/dashboard/index.d.ts +10 -0
- package/dist/dashboard/index.js +6 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +18 -0
- package/dist/dashboard/routes.js +150 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/templates.d.ts +47 -0
- package/dist/dashboard/templates.js +591 -0
- package/dist/dashboard/templates.js.map +1 -0
- package/dist/dashboard/templates.test.d.ts +1 -0
- package/dist/dashboard/templates.test.js +408 -0
- package/dist/dashboard/templates.test.js.map +1 -0
- package/dist/dashboard/types.d.ts +119 -0
- package/dist/dashboard/types.js +4 -0
- package/dist/dashboard/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +37 -0
- package/dist/middleware/auth.js +92 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +26 -0
- package/dist/middleware/rate-limit.js +79 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/openapi.d.ts +14 -0
- package/dist/openapi.js +363 -0
- package/dist/openapi.js.map +1 -0
- package/dist/routes/context.d.ts +15 -0
- package/dist/routes/context.js +84 -0
- package/dist/routes/context.js.map +1 -0
- package/dist/routes/history.d.ts +56 -0
- package/dist/routes/history.js +308 -0
- package/dist/routes/history.js.map +1 -0
- package/dist/routes/index-trigger.d.ts +21 -0
- package/dist/routes/index-trigger.js +47 -0
- package/dist/routes/index-trigger.js.map +1 -0
- package/dist/routes/search.d.ts +24 -0
- package/dist/routes/search.js +85 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/status.d.ts +14 -0
- package/dist/routes/status.js +37 -0
- package/dist/routes/status.js.map +1 -0
- package/dist/routes/team.d.ts +62 -0
- package/dist/routes/team.js +129 -0
- package/dist/routes/team.js.map +1 -0
- package/dist/routes/viewer.d.ts +78 -0
- package/dist/routes/viewer.js +387 -0
- package/dist/routes/viewer.js.map +1 -0
- package/dist/routes/viewer.test.d.ts +1 -0
- package/dist/routes/viewer.test.js +509 -0
- package/dist/routes/viewer.test.js.map +1 -0
- package/dist/server.d.ts +45 -0
- package/dist/server.js +227 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.d.ts +1 -0
- package/dist/server.test.js +620 -0
- package/dist/server.test.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse the CODERAG_API_KEYS env var.
|
|
3
|
+
*
|
|
4
|
+
* Format: comma-separated keys. Keys suffixed with `:admin` grant admin privileges.
|
|
5
|
+
* Example: "key1,key2:admin,key3"
|
|
6
|
+
*/
|
|
7
|
+
export function parseApiKeys(envValue) {
|
|
8
|
+
if (!envValue || envValue.trim() === '') {
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
return envValue
|
|
12
|
+
.split(',')
|
|
13
|
+
.map((entry) => entry.trim())
|
|
14
|
+
.filter((entry) => entry.length > 0)
|
|
15
|
+
.map((entry) => {
|
|
16
|
+
if (entry.endsWith(':admin')) {
|
|
17
|
+
return { key: entry.slice(0, -6), admin: true };
|
|
18
|
+
}
|
|
19
|
+
return { key: entry, admin: false };
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create an authentication middleware that validates API keys.
|
|
24
|
+
*
|
|
25
|
+
* Accepts keys from:
|
|
26
|
+
* - `Authorization: Bearer <key>` header
|
|
27
|
+
* - `X-API-Key: <key>` header
|
|
28
|
+
*
|
|
29
|
+
* When no API keys are configured (empty CODERAG_API_KEYS),
|
|
30
|
+
* authentication is disabled and all requests pass through.
|
|
31
|
+
*/
|
|
32
|
+
export function createAuthMiddleware(apiKeys) {
|
|
33
|
+
return (req, res, next) => {
|
|
34
|
+
// If no keys configured, auth is disabled (development mode)
|
|
35
|
+
if (apiKeys.length === 0) {
|
|
36
|
+
next();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const key = extractApiKey(req);
|
|
40
|
+
if (!key) {
|
|
41
|
+
res.status(401).json({
|
|
42
|
+
error: 'Unauthorized',
|
|
43
|
+
message: 'Missing API key. Provide via Authorization: Bearer <key> or X-API-Key: <key> header.',
|
|
44
|
+
});
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const entry = apiKeys.find((k) => k.key === key);
|
|
48
|
+
if (!entry) {
|
|
49
|
+
res.status(401).json({
|
|
50
|
+
error: 'Unauthorized',
|
|
51
|
+
message: 'Invalid API key.',
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Attach the validated key entry to the request
|
|
56
|
+
req.apiKey = entry;
|
|
57
|
+
next();
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Middleware that requires admin privileges on the API key.
|
|
62
|
+
* Must be used after createAuthMiddleware.
|
|
63
|
+
*/
|
|
64
|
+
export function requireAdmin(req, res, next) {
|
|
65
|
+
const authReq = req;
|
|
66
|
+
// If no apiKey is set, auth is disabled (development mode) — allow through
|
|
67
|
+
if (!authReq.apiKey && !res.headersSent) {
|
|
68
|
+
next();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!authReq.apiKey?.admin) {
|
|
72
|
+
res.status(403).json({
|
|
73
|
+
error: 'Forbidden',
|
|
74
|
+
message: 'Admin privileges required for this endpoint.',
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
next();
|
|
79
|
+
}
|
|
80
|
+
function extractApiKey(req) {
|
|
81
|
+
// Check Authorization: Bearer <key>
|
|
82
|
+
const authHeader = req.headers['authorization'];
|
|
83
|
+
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
84
|
+
return authHeader.slice(7).trim();
|
|
85
|
+
}
|
|
86
|
+
// Check X-API-Key: <key>
|
|
87
|
+
const apiKeyHeader = req.headers['x-api-key'];
|
|
88
|
+
if (typeof apiKeyHeader === 'string' && apiKeyHeader.trim().length > 0) {
|
|
89
|
+
return apiKeyHeader.trim();
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for rate limiting.
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitConfig {
|
|
6
|
+
/** Maximum requests per window. Default: 60 */
|
|
7
|
+
readonly maxRequests: number;
|
|
8
|
+
/** Window size in milliseconds. Default: 60_000 (1 minute) */
|
|
9
|
+
readonly windowMs: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse rate limit configuration from environment.
|
|
13
|
+
*
|
|
14
|
+
* - CODERAG_RATE_LIMIT: requests per minute (default: 60)
|
|
15
|
+
* - CODERAG_RATE_WINDOW_MS: window in ms (default: 60000)
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseRateLimitConfig(env: Record<string, string | undefined>): RateLimitConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Create a token-bucket rate limiter middleware.
|
|
20
|
+
*
|
|
21
|
+
* Each API key (or IP address for unauthenticated requests) gets its own bucket.
|
|
22
|
+
* The bucket is refilled at the configured rate.
|
|
23
|
+
*
|
|
24
|
+
* When the limit is exceeded, returns 429 with a Retry-After header.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createRateLimitMiddleware(config?: RateLimitConfig): (req: Request, res: Response, next: NextFunction) => void;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const DEFAULT_CONFIG = {
|
|
2
|
+
maxRequests: 60,
|
|
3
|
+
windowMs: 60_000,
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Parse rate limit configuration from environment.
|
|
7
|
+
*
|
|
8
|
+
* - CODERAG_RATE_LIMIT: requests per minute (default: 60)
|
|
9
|
+
* - CODERAG_RATE_WINDOW_MS: window in ms (default: 60000)
|
|
10
|
+
*/
|
|
11
|
+
export function parseRateLimitConfig(env) {
|
|
12
|
+
const maxRequests = parseInt(env['CODERAG_RATE_LIMIT'] ?? '', 10);
|
|
13
|
+
const windowMs = parseInt(env['CODERAG_RATE_WINDOW_MS'] ?? '', 10);
|
|
14
|
+
return {
|
|
15
|
+
maxRequests: Number.isFinite(maxRequests) && maxRequests > 0 ? maxRequests : DEFAULT_CONFIG.maxRequests,
|
|
16
|
+
windowMs: Number.isFinite(windowMs) && windowMs > 0 ? windowMs : DEFAULT_CONFIG.windowMs,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a token-bucket rate limiter middleware.
|
|
21
|
+
*
|
|
22
|
+
* Each API key (or IP address for unauthenticated requests) gets its own bucket.
|
|
23
|
+
* The bucket is refilled at the configured rate.
|
|
24
|
+
*
|
|
25
|
+
* When the limit is exceeded, returns 429 with a Retry-After header.
|
|
26
|
+
*/
|
|
27
|
+
export function createRateLimitMiddleware(config = DEFAULT_CONFIG) {
|
|
28
|
+
const buckets = new Map();
|
|
29
|
+
return (req, res, next) => {
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
const clientKey = getClientKey(req);
|
|
32
|
+
const bucket = getOrCreateBucket(buckets, clientKey, config, now);
|
|
33
|
+
// Refill tokens based on elapsed time
|
|
34
|
+
const elapsed = now - bucket.lastRefill;
|
|
35
|
+
const tokensToAdd = (elapsed / config.windowMs) * config.maxRequests;
|
|
36
|
+
bucket.tokens = Math.min(config.maxRequests, bucket.tokens + tokensToAdd);
|
|
37
|
+
bucket.lastRefill = now;
|
|
38
|
+
if (bucket.tokens < 1) {
|
|
39
|
+
const retryAfterMs = ((1 - bucket.tokens) / config.maxRequests) * config.windowMs;
|
|
40
|
+
const retryAfterSeconds = Math.ceil(retryAfterMs / 1000);
|
|
41
|
+
res.setHeader('Retry-After', String(retryAfterSeconds));
|
|
42
|
+
res.setHeader('X-RateLimit-Limit', String(config.maxRequests));
|
|
43
|
+
res.setHeader('X-RateLimit-Remaining', '0');
|
|
44
|
+
res.status(429).json({
|
|
45
|
+
error: 'Too Many Requests',
|
|
46
|
+
message: `Rate limit exceeded. Try again in ${retryAfterSeconds} second(s).`,
|
|
47
|
+
retry_after: retryAfterSeconds,
|
|
48
|
+
});
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Consume a token
|
|
52
|
+
bucket.tokens -= 1;
|
|
53
|
+
// Set rate limit headers
|
|
54
|
+
res.setHeader('X-RateLimit-Limit', String(config.maxRequests));
|
|
55
|
+
res.setHeader('X-RateLimit-Remaining', String(Math.floor(bucket.tokens)));
|
|
56
|
+
next();
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function getClientKey(req) {
|
|
60
|
+
const authReq = req;
|
|
61
|
+
if (authReq.apiKey) {
|
|
62
|
+
return `key:${authReq.apiKey.key}`;
|
|
63
|
+
}
|
|
64
|
+
// Fall back to IP address
|
|
65
|
+
const ip = req.ip ?? req.socket.remoteAddress ?? 'unknown';
|
|
66
|
+
return `ip:${ip}`;
|
|
67
|
+
}
|
|
68
|
+
function getOrCreateBucket(buckets, key, config, now) {
|
|
69
|
+
const existing = buckets.get(key);
|
|
70
|
+
if (existing) {
|
|
71
|
+
return existing;
|
|
72
|
+
}
|
|
73
|
+
const bucket = {
|
|
74
|
+
tokens: config.maxRequests,
|
|
75
|
+
lastRefill: now,
|
|
76
|
+
};
|
|
77
|
+
buckets.set(key, bucket);
|
|
78
|
+
return bucket;
|
|
79
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI 3.0 specification for the CodeRAG Cloud API.
|
|
3
|
+
*/
|
|
4
|
+
export interface OpenAPISpec {
|
|
5
|
+
readonly openapi: string;
|
|
6
|
+
readonly info: {
|
|
7
|
+
readonly title: string;
|
|
8
|
+
readonly version: string;
|
|
9
|
+
readonly description: string;
|
|
10
|
+
};
|
|
11
|
+
readonly paths: Record<string, unknown>;
|
|
12
|
+
readonly components: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export declare function createOpenAPISpec(): OpenAPISpec;
|
package/dist/openapi.js
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
export function createOpenAPISpec() {
|
|
2
|
+
return {
|
|
3
|
+
openapi: '3.0.3',
|
|
4
|
+
info: {
|
|
5
|
+
title: 'CodeRAG Cloud API',
|
|
6
|
+
version: '0.1.0',
|
|
7
|
+
description: 'REST API for CodeRAG — an intelligent codebase context engine for AI coding agents. ' +
|
|
8
|
+
'Provides semantic search, context assembly, and index management over shared code indices.',
|
|
9
|
+
},
|
|
10
|
+
paths: {
|
|
11
|
+
'/api/v1/search': {
|
|
12
|
+
post: {
|
|
13
|
+
summary: 'Search the codebase',
|
|
14
|
+
description: 'Search the indexed codebase using hybrid semantic + keyword search. ' +
|
|
15
|
+
'Returns matching code chunks with file paths, types, content, and relevance scores.',
|
|
16
|
+
operationId: 'searchCode',
|
|
17
|
+
tags: ['Search'],
|
|
18
|
+
security: [{ apiKeyAuth: [] }, { bearerAuth: [] }],
|
|
19
|
+
requestBody: {
|
|
20
|
+
required: true,
|
|
21
|
+
content: {
|
|
22
|
+
'application/json': {
|
|
23
|
+
schema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
required: ['query'],
|
|
26
|
+
properties: {
|
|
27
|
+
query: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
minLength: 1,
|
|
30
|
+
description: 'Natural language search query',
|
|
31
|
+
},
|
|
32
|
+
language: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'Filter results by programming language (e.g. "typescript", "python")',
|
|
35
|
+
},
|
|
36
|
+
file_path: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'Filter results by file path substring',
|
|
39
|
+
},
|
|
40
|
+
chunk_type: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
description: 'Filter by chunk type: function, method, class, module, interface, type_alias, config_block, import_block',
|
|
43
|
+
},
|
|
44
|
+
top_k: {
|
|
45
|
+
type: 'integer',
|
|
46
|
+
minimum: 1,
|
|
47
|
+
maximum: 100,
|
|
48
|
+
default: 10,
|
|
49
|
+
description: 'Maximum number of results to return',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
responses: {
|
|
57
|
+
'200': {
|
|
58
|
+
description: 'Search results',
|
|
59
|
+
content: {
|
|
60
|
+
'application/json': {
|
|
61
|
+
schema: {
|
|
62
|
+
type: 'object',
|
|
63
|
+
properties: {
|
|
64
|
+
results: {
|
|
65
|
+
type: 'array',
|
|
66
|
+
items: { $ref: '#/components/schemas/SearchResult' },
|
|
67
|
+
},
|
|
68
|
+
total: { type: 'integer' },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
'400': { $ref: '#/components/responses/ValidationError' },
|
|
75
|
+
'401': { $ref: '#/components/responses/Unauthorized' },
|
|
76
|
+
'429': { $ref: '#/components/responses/RateLimited' },
|
|
77
|
+
'503': { $ref: '#/components/responses/ServiceUnavailable' },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
'/api/v1/context': {
|
|
82
|
+
post: {
|
|
83
|
+
summary: 'Get file context',
|
|
84
|
+
description: 'Assemble rich context for a specific file, including primary code chunks, ' +
|
|
85
|
+
'related chunks from the dependency graph, and a dependency graph excerpt. Output is token-budgeted.',
|
|
86
|
+
operationId: 'getContext',
|
|
87
|
+
tags: ['Context'],
|
|
88
|
+
security: [{ apiKeyAuth: [] }, { bearerAuth: [] }],
|
|
89
|
+
requestBody: {
|
|
90
|
+
required: true,
|
|
91
|
+
content: {
|
|
92
|
+
'application/json': {
|
|
93
|
+
schema: {
|
|
94
|
+
type: 'object',
|
|
95
|
+
required: ['file_path'],
|
|
96
|
+
properties: {
|
|
97
|
+
file_path: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
minLength: 1,
|
|
100
|
+
description: 'Target file path to get context for',
|
|
101
|
+
},
|
|
102
|
+
include_tests: {
|
|
103
|
+
type: 'boolean',
|
|
104
|
+
default: true,
|
|
105
|
+
description: 'Include test files in context',
|
|
106
|
+
},
|
|
107
|
+
include_interfaces: {
|
|
108
|
+
type: 'boolean',
|
|
109
|
+
default: true,
|
|
110
|
+
description: 'Include interface/type chunks in context',
|
|
111
|
+
},
|
|
112
|
+
max_tokens: {
|
|
113
|
+
type: 'integer',
|
|
114
|
+
minimum: 1,
|
|
115
|
+
maximum: 128000,
|
|
116
|
+
default: 8000,
|
|
117
|
+
description: 'Maximum token budget for assembled context',
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
responses: {
|
|
125
|
+
'200': {
|
|
126
|
+
description: 'Assembled context',
|
|
127
|
+
content: {
|
|
128
|
+
'application/json': {
|
|
129
|
+
schema: { $ref: '#/components/schemas/ContextResponse' },
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
'400': { $ref: '#/components/responses/ValidationError' },
|
|
134
|
+
'401': { $ref: '#/components/responses/Unauthorized' },
|
|
135
|
+
'429': { $ref: '#/components/responses/RateLimited' },
|
|
136
|
+
'503': { $ref: '#/components/responses/ServiceUnavailable' },
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
'/api/v1/status': {
|
|
141
|
+
get: {
|
|
142
|
+
summary: 'Get index status',
|
|
143
|
+
description: 'Get the current status of the CodeRAG index, including total chunks, model info, and health.',
|
|
144
|
+
operationId: 'getStatus',
|
|
145
|
+
tags: ['Status'],
|
|
146
|
+
security: [{ apiKeyAuth: [] }, { bearerAuth: [] }],
|
|
147
|
+
responses: {
|
|
148
|
+
'200': {
|
|
149
|
+
description: 'Index status',
|
|
150
|
+
content: {
|
|
151
|
+
'application/json': {
|
|
152
|
+
schema: { $ref: '#/components/schemas/StatusResponse' },
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
'401': { $ref: '#/components/responses/Unauthorized' },
|
|
157
|
+
'429': { $ref: '#/components/responses/RateLimited' },
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
'/api/v1/index': {
|
|
162
|
+
post: {
|
|
163
|
+
summary: 'Trigger re-indexing (admin)',
|
|
164
|
+
description: 'Trigger re-indexing of the codebase. Requires admin API key.',
|
|
165
|
+
operationId: 'triggerIndex',
|
|
166
|
+
tags: ['Admin'],
|
|
167
|
+
security: [{ apiKeyAuth: [] }, { bearerAuth: [] }],
|
|
168
|
+
requestBody: {
|
|
169
|
+
content: {
|
|
170
|
+
'application/json': {
|
|
171
|
+
schema: {
|
|
172
|
+
type: 'object',
|
|
173
|
+
properties: {
|
|
174
|
+
root_dir: {
|
|
175
|
+
type: 'string',
|
|
176
|
+
description: 'Root directory to index (uses server default if omitted)',
|
|
177
|
+
},
|
|
178
|
+
force: {
|
|
179
|
+
type: 'boolean',
|
|
180
|
+
default: false,
|
|
181
|
+
description: 'Force full re-index even if files are unchanged',
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
responses: {
|
|
189
|
+
'200': {
|
|
190
|
+
description: 'Indexing result',
|
|
191
|
+
content: {
|
|
192
|
+
'application/json': {
|
|
193
|
+
schema: { $ref: '#/components/schemas/IndexResponse' },
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
'400': { $ref: '#/components/responses/ValidationError' },
|
|
198
|
+
'401': { $ref: '#/components/responses/Unauthorized' },
|
|
199
|
+
'403': { $ref: '#/components/responses/Forbidden' },
|
|
200
|
+
'429': { $ref: '#/components/responses/RateLimited' },
|
|
201
|
+
'503': { $ref: '#/components/responses/ServiceUnavailable' },
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
'/health': {
|
|
206
|
+
get: {
|
|
207
|
+
summary: 'Health check',
|
|
208
|
+
description: 'Simple health check endpoint. No authentication required.',
|
|
209
|
+
operationId: 'healthCheck',
|
|
210
|
+
tags: ['Health'],
|
|
211
|
+
responses: {
|
|
212
|
+
'200': {
|
|
213
|
+
description: 'Server is healthy',
|
|
214
|
+
content: {
|
|
215
|
+
'application/json': {
|
|
216
|
+
schema: {
|
|
217
|
+
type: 'object',
|
|
218
|
+
properties: {
|
|
219
|
+
status: { type: 'string', enum: ['ok'] },
|
|
220
|
+
timestamp: { type: 'string', format: 'date-time' },
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
components: {
|
|
231
|
+
securitySchemes: {
|
|
232
|
+
bearerAuth: {
|
|
233
|
+
type: 'http',
|
|
234
|
+
scheme: 'bearer',
|
|
235
|
+
description: 'API key passed as Bearer token in the Authorization header',
|
|
236
|
+
},
|
|
237
|
+
apiKeyAuth: {
|
|
238
|
+
type: 'apiKey',
|
|
239
|
+
in: 'header',
|
|
240
|
+
name: 'X-API-Key',
|
|
241
|
+
description: 'API key passed in the X-API-Key header',
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
schemas: {
|
|
245
|
+
SearchResult: {
|
|
246
|
+
type: 'object',
|
|
247
|
+
properties: {
|
|
248
|
+
file_path: { type: 'string' },
|
|
249
|
+
chunk_type: { type: 'string' },
|
|
250
|
+
name: { type: 'string' },
|
|
251
|
+
content: { type: 'string' },
|
|
252
|
+
nl_summary: { type: 'string' },
|
|
253
|
+
score: { type: 'number' },
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
ContextResponse: {
|
|
257
|
+
type: 'object',
|
|
258
|
+
properties: {
|
|
259
|
+
context: { type: 'string' },
|
|
260
|
+
token_count: { type: 'integer' },
|
|
261
|
+
truncated: { type: 'boolean' },
|
|
262
|
+
primary_chunks: { type: 'integer' },
|
|
263
|
+
related_chunks: { type: 'integer' },
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
StatusResponse: {
|
|
267
|
+
type: 'object',
|
|
268
|
+
properties: {
|
|
269
|
+
total_chunks: { type: 'integer' },
|
|
270
|
+
last_indexed: { type: 'string', nullable: true },
|
|
271
|
+
model: { type: 'string' },
|
|
272
|
+
languages: {
|
|
273
|
+
oneOf: [
|
|
274
|
+
{ type: 'array', items: { type: 'string' } },
|
|
275
|
+
{ type: 'string', enum: ['auto'] },
|
|
276
|
+
],
|
|
277
|
+
},
|
|
278
|
+
health: {
|
|
279
|
+
type: 'string',
|
|
280
|
+
enum: ['ok', 'degraded', 'not_initialized'],
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
IndexResponse: {
|
|
285
|
+
type: 'object',
|
|
286
|
+
properties: {
|
|
287
|
+
status: { type: 'string', enum: ['completed'] },
|
|
288
|
+
indexed_files: { type: 'integer' },
|
|
289
|
+
duration_ms: { type: 'integer' },
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
ErrorResponse: {
|
|
293
|
+
type: 'object',
|
|
294
|
+
properties: {
|
|
295
|
+
error: { type: 'string' },
|
|
296
|
+
message: { type: 'string' },
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
responses: {
|
|
301
|
+
ValidationError: {
|
|
302
|
+
description: 'Request validation error',
|
|
303
|
+
content: {
|
|
304
|
+
'application/json': {
|
|
305
|
+
schema: {
|
|
306
|
+
type: 'object',
|
|
307
|
+
properties: {
|
|
308
|
+
error: { type: 'string' },
|
|
309
|
+
details: { type: 'array', items: { type: 'object' } },
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
Unauthorized: {
|
|
316
|
+
description: 'Missing or invalid API key',
|
|
317
|
+
content: {
|
|
318
|
+
'application/json': {
|
|
319
|
+
schema: { $ref: '#/components/schemas/ErrorResponse' },
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
Forbidden: {
|
|
324
|
+
description: 'Insufficient permissions (admin required)',
|
|
325
|
+
content: {
|
|
326
|
+
'application/json': {
|
|
327
|
+
schema: { $ref: '#/components/schemas/ErrorResponse' },
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
RateLimited: {
|
|
332
|
+
description: 'Rate limit exceeded',
|
|
333
|
+
headers: {
|
|
334
|
+
'Retry-After': {
|
|
335
|
+
description: 'Seconds until the rate limit resets',
|
|
336
|
+
schema: { type: 'integer' },
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
content: {
|
|
340
|
+
'application/json': {
|
|
341
|
+
schema: {
|
|
342
|
+
type: 'object',
|
|
343
|
+
properties: {
|
|
344
|
+
error: { type: 'string' },
|
|
345
|
+
message: { type: 'string' },
|
|
346
|
+
retry_after: { type: 'integer' },
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
ServiceUnavailable: {
|
|
353
|
+
description: 'Service not initialized',
|
|
354
|
+
content: {
|
|
355
|
+
'application/json': {
|
|
356
|
+
schema: { $ref: '#/components/schemas/ErrorResponse' },
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { type HybridSearch, type ContextExpander } from '@code-rag/core';
|
|
4
|
+
export declare const contextRequestSchema: z.ZodObject<{
|
|
5
|
+
file_path: z.ZodString;
|
|
6
|
+
include_tests: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
7
|
+
include_interfaces: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
8
|
+
max_tokens: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type ContextRequest = z.infer<typeof contextRequestSchema>;
|
|
11
|
+
export interface ContextRouteDeps {
|
|
12
|
+
readonly hybridSearch: HybridSearch | null;
|
|
13
|
+
readonly contextExpander: ContextExpander | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function createContextRouter(deps: ContextRouteDeps): Router;
|