@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
package/dist/server.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { loadConfig, OllamaEmbeddingProvider, LanceDBStore, BM25Index, HybridSearch, DependencyGraph, ContextExpander, CrossEncoderReRanker, } from '@code-rag/core';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { join, resolve } from 'node:path';
|
|
6
|
+
import { parseApiKeys, createAuthMiddleware } from './middleware/auth.js';
|
|
7
|
+
import { createRateLimitMiddleware, parseRateLimitConfig } from './middleware/rate-limit.js';
|
|
8
|
+
import { createSearchRouter } from './routes/search.js';
|
|
9
|
+
import { createContextRouter } from './routes/context.js';
|
|
10
|
+
import { createStatusRouter } from './routes/status.js';
|
|
11
|
+
import { createIndexTriggerRouter } from './routes/index-trigger.js';
|
|
12
|
+
import { createTeamRouter, createTeamState } from './routes/team.js';
|
|
13
|
+
import { createHistoryRouter, HistoryStore } from './routes/history.js';
|
|
14
|
+
import { createOpenAPISpec } from './openapi.js';
|
|
15
|
+
import { DashboardDataCollector } from './dashboard/data-collector.js';
|
|
16
|
+
import { createDashboardRouter } from './dashboard/routes.js';
|
|
17
|
+
import { createViewerRouter } from './routes/viewer.js';
|
|
18
|
+
export const API_SERVER_VERSION = '0.1.0';
|
|
19
|
+
export class ApiServer {
|
|
20
|
+
app;
|
|
21
|
+
rootDir;
|
|
22
|
+
port;
|
|
23
|
+
httpServer = null;
|
|
24
|
+
// Core services (populated after initialize())
|
|
25
|
+
config = null;
|
|
26
|
+
store = null;
|
|
27
|
+
hybridSearch = null;
|
|
28
|
+
contextExpander = null;
|
|
29
|
+
reranker = null;
|
|
30
|
+
graph = null;
|
|
31
|
+
// Dashboard data collector
|
|
32
|
+
dataCollector;
|
|
33
|
+
constructor(options) {
|
|
34
|
+
this.rootDir = options.rootDir;
|
|
35
|
+
this.port = options.port;
|
|
36
|
+
const apiKeys = options.apiKeys ?? parseApiKeys(process.env['CODERAG_API_KEYS']);
|
|
37
|
+
const rateLimitConfig = parseRateLimitConfig(process.env);
|
|
38
|
+
const corsOrigin = options.corsOrigin ?? '*';
|
|
39
|
+
this.app = express();
|
|
40
|
+
// --- Global Middleware ---
|
|
41
|
+
// CORS
|
|
42
|
+
this.app.use((_req, res, next) => {
|
|
43
|
+
res.setHeader('Access-Control-Allow-Origin', corsOrigin);
|
|
44
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
45
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key');
|
|
46
|
+
if (_req.method === 'OPTIONS') {
|
|
47
|
+
res.status(204).end();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
next();
|
|
51
|
+
});
|
|
52
|
+
// JSON body parser
|
|
53
|
+
this.app.use(express.json());
|
|
54
|
+
// --- Unauthenticated Routes ---
|
|
55
|
+
// Health check (no auth required)
|
|
56
|
+
this.app.get('/health', (_req, res) => {
|
|
57
|
+
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
58
|
+
});
|
|
59
|
+
// OpenAPI spec (no auth required)
|
|
60
|
+
this.app.get('/api/openapi.json', (_req, res) => {
|
|
61
|
+
res.json(createOpenAPISpec());
|
|
62
|
+
});
|
|
63
|
+
// --- Authenticated Routes ---
|
|
64
|
+
// Auth middleware
|
|
65
|
+
this.app.use('/api/v1', createAuthMiddleware(apiKeys));
|
|
66
|
+
// Rate limiting (after auth so we can track per-key)
|
|
67
|
+
this.app.use('/api/v1', createRateLimitMiddleware(rateLimitConfig));
|
|
68
|
+
// Mount routes (deps are mutable references resolved at request time)
|
|
69
|
+
const searchDeps = {
|
|
70
|
+
get hybridSearch() { return self.hybridSearch; },
|
|
71
|
+
get reranker() { return self.reranker; },
|
|
72
|
+
};
|
|
73
|
+
const contextDeps = {
|
|
74
|
+
get hybridSearch() { return self.hybridSearch; },
|
|
75
|
+
get contextExpander() { return self.contextExpander; },
|
|
76
|
+
};
|
|
77
|
+
const statusDeps = {
|
|
78
|
+
get store() { return self.store; },
|
|
79
|
+
get config() { return self.config; },
|
|
80
|
+
};
|
|
81
|
+
const indexDeps = {
|
|
82
|
+
onIndex: options.onIndex ?? null,
|
|
83
|
+
};
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
85
|
+
const self = this;
|
|
86
|
+
this.app.use('/api/v1/search', createSearchRouter(searchDeps));
|
|
87
|
+
this.app.use('/api/v1/context', createContextRouter(contextDeps));
|
|
88
|
+
this.app.use('/api/v1/status', createStatusRouter(statusDeps));
|
|
89
|
+
this.app.use('/api/v1/index', createIndexTriggerRouter(indexDeps));
|
|
90
|
+
// Team shared context routes
|
|
91
|
+
const teamState = createTeamState();
|
|
92
|
+
this.app.use('/api/v1/team', createTeamRouter({
|
|
93
|
+
storageProvider: null,
|
|
94
|
+
teamState,
|
|
95
|
+
}));
|
|
96
|
+
// History and bookmarks routes
|
|
97
|
+
const historyStore = new HistoryStore();
|
|
98
|
+
this.app.use('/api/v1', createHistoryRouter({ historyStore }));
|
|
99
|
+
// Viewer routes (read-only visualization API)
|
|
100
|
+
this.app.use('/api/v1/viewer', createViewerRouter({
|
|
101
|
+
getStore: () => self.store,
|
|
102
|
+
getConfig: () => self.config,
|
|
103
|
+
getHybridSearch: () => self.hybridSearch,
|
|
104
|
+
getGraph: () => self.graph,
|
|
105
|
+
}));
|
|
106
|
+
// --- Dashboard ---
|
|
107
|
+
this.dataCollector = new DashboardDataCollector({
|
|
108
|
+
getStore: () => self.store,
|
|
109
|
+
getConfig: () => self.config,
|
|
110
|
+
apiKeys,
|
|
111
|
+
});
|
|
112
|
+
// Request tracking middleware (all routes)
|
|
113
|
+
this.app.use((req, _res, next) => {
|
|
114
|
+
const authReq = req;
|
|
115
|
+
this.dataCollector.recordRequest(req.method, req.path, authReq.apiKey?.key ?? null);
|
|
116
|
+
next();
|
|
117
|
+
});
|
|
118
|
+
// Mount dashboard (admin-only, handles its own auth)
|
|
119
|
+
this.app.use('/dashboard', createDashboardRouter({
|
|
120
|
+
dataCollector: this.dataCollector,
|
|
121
|
+
onIndex: options.onIndex ?? null,
|
|
122
|
+
getConfig: () => self.config,
|
|
123
|
+
apiKeys,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Initialize all core services: load config, connect LanceDB, build indices.
|
|
128
|
+
* The server still starts even if initialization errors occur.
|
|
129
|
+
*/
|
|
130
|
+
async initialize() {
|
|
131
|
+
try {
|
|
132
|
+
const configResult = await loadConfig(this.rootDir);
|
|
133
|
+
if (configResult.isErr()) {
|
|
134
|
+
// eslint-disable-next-line no-console
|
|
135
|
+
console.error(`[api-server] Config load failed: ${configResult.error.message}`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.config = configResult.value;
|
|
139
|
+
// Create embedding provider
|
|
140
|
+
const embeddingProvider = new OllamaEmbeddingProvider({
|
|
141
|
+
model: this.config.embedding.model,
|
|
142
|
+
dimensions: this.config.embedding.dimensions,
|
|
143
|
+
});
|
|
144
|
+
// Create LanceDB store
|
|
145
|
+
const storagePath = resolve(this.rootDir, this.config.storage.path);
|
|
146
|
+
if (!storagePath.startsWith(resolve(this.rootDir))) {
|
|
147
|
+
// eslint-disable-next-line no-console
|
|
148
|
+
console.error('[api-server] Storage path escapes project root');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
this.store = new LanceDBStore(storagePath, this.config.embedding.dimensions);
|
|
152
|
+
await this.store.connect();
|
|
153
|
+
// Load BM25 index
|
|
154
|
+
let bm25Index = new BM25Index();
|
|
155
|
+
const bm25Path = join(storagePath, 'bm25-index.json');
|
|
156
|
+
try {
|
|
157
|
+
const bm25Data = await readFile(bm25Path, 'utf-8');
|
|
158
|
+
bm25Index = BM25Index.deserialize(bm25Data);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// No saved BM25 index, start empty
|
|
162
|
+
}
|
|
163
|
+
// Create HybridSearch
|
|
164
|
+
this.hybridSearch = new HybridSearch(this.store, bm25Index, embeddingProvider, this.config.search);
|
|
165
|
+
// Create re-ranker if enabled
|
|
166
|
+
if (this.config.reranker?.enabled) {
|
|
167
|
+
this.reranker = new CrossEncoderReRanker({
|
|
168
|
+
model: this.config.reranker.model,
|
|
169
|
+
topN: this.config.reranker.topN,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Load dependency graph
|
|
173
|
+
let graph = new DependencyGraph();
|
|
174
|
+
const graphPath = join(storagePath, 'graph.json');
|
|
175
|
+
try {
|
|
176
|
+
const graphData = await readFile(graphPath, 'utf-8');
|
|
177
|
+
const parsed = JSON.parse(graphData);
|
|
178
|
+
graph = DependencyGraph.fromJSON(parsed);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// No saved graph, start empty
|
|
182
|
+
}
|
|
183
|
+
// Store graph for viewer API
|
|
184
|
+
this.graph = graph;
|
|
185
|
+
// Create context expander
|
|
186
|
+
const chunkLookup = (_chunkId) => undefined;
|
|
187
|
+
this.contextExpander = new ContextExpander(graph, chunkLookup);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
191
|
+
// eslint-disable-next-line no-console
|
|
192
|
+
console.error(`[api-server] Initialization failed: ${message}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Start listening on the configured port.
|
|
197
|
+
*/
|
|
198
|
+
async start() {
|
|
199
|
+
this.httpServer = createServer(this.app);
|
|
200
|
+
return new Promise((resolvePromise, reject) => {
|
|
201
|
+
this.httpServer.on('error', reject);
|
|
202
|
+
this.httpServer.listen(this.port, () => {
|
|
203
|
+
resolvePromise();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Gracefully shut down the HTTP server.
|
|
209
|
+
*/
|
|
210
|
+
async close() {
|
|
211
|
+
if (this.httpServer) {
|
|
212
|
+
await new Promise((resolvePromise, reject) => {
|
|
213
|
+
this.httpServer.close((closeErr) => {
|
|
214
|
+
if (closeErr)
|
|
215
|
+
reject(closeErr);
|
|
216
|
+
else
|
|
217
|
+
resolvePromise();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
this.httpServer = null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** Expose Express app for testing with supertest. */
|
|
224
|
+
getApp() {
|
|
225
|
+
return this.app;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|