@abhinav2203/coderag 0.1.1

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 (84) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +196 -0
  3. package/dist/adapters/codeflow-core.d.ts +10 -0
  4. package/dist/adapters/codeflow-core.js +212 -0
  5. package/dist/adapters/codeflow-core.js.map +1 -0
  6. package/dist/cli.d.ts +4 -0
  7. package/dist/cli.js +179 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/errors/index.d.ts +17 -0
  10. package/dist/errors/index.js +35 -0
  11. package/dist/errors/index.js.map +1 -0
  12. package/dist/index.d.ts +15 -0
  13. package/dist/index.js +15 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/indexer/documents.d.ts +16 -0
  16. package/dist/indexer/documents.js +148 -0
  17. package/dist/indexer/documents.js.map +1 -0
  18. package/dist/indexer/embedder.d.ts +7 -0
  19. package/dist/indexer/embedder.js +12 -0
  20. package/dist/indexer/embedder.js.map +1 -0
  21. package/dist/indexer/git-hook.d.ts +2 -0
  22. package/dist/indexer/git-hook.js +53 -0
  23. package/dist/indexer/git-hook.js.map +1 -0
  24. package/dist/indexer/indexer.d.ts +22 -0
  25. package/dist/indexer/indexer.js +108 -0
  26. package/dist/indexer/indexer.js.map +1 -0
  27. package/dist/llm/context-builder.d.ts +7 -0
  28. package/dist/llm/context-builder.js +93 -0
  29. package/dist/llm/context-builder.js.map +1 -0
  30. package/dist/llm/prompt.d.ts +3 -0
  31. package/dist/llm/prompt.js +80 -0
  32. package/dist/llm/prompt.js.map +1 -0
  33. package/dist/llm/transports.d.ts +23 -0
  34. package/dist/llm/transports.js +271 -0
  35. package/dist/llm/transports.js.map +1 -0
  36. package/dist/mcp/server.d.ts +10 -0
  37. package/dist/mcp/server.js +70 -0
  38. package/dist/mcp/server.js.map +1 -0
  39. package/dist/retrieval/page-index.d.ts +3 -0
  40. package/dist/retrieval/page-index.js +26 -0
  41. package/dist/retrieval/page-index.js.map +1 -0
  42. package/dist/retrieval/search.d.ts +20 -0
  43. package/dist/retrieval/search.js +164 -0
  44. package/dist/retrieval/search.js.map +1 -0
  45. package/dist/retrieval/traversal.d.ts +6 -0
  46. package/dist/retrieval/traversal.js +29 -0
  47. package/dist/retrieval/traversal.js.map +1 -0
  48. package/dist/service/coderag.d.ts +58 -0
  49. package/dist/service/coderag.js +208 -0
  50. package/dist/service/coderag.js.map +1 -0
  51. package/dist/service/config.d.ts +13 -0
  52. package/dist/service/config.js +130 -0
  53. package/dist/service/config.js.map +1 -0
  54. package/dist/service/http-metrics.d.ts +8 -0
  55. package/dist/service/http-metrics.js +36 -0
  56. package/dist/service/http-metrics.js.map +1 -0
  57. package/dist/service/http.d.ts +11 -0
  58. package/dist/service/http.js +262 -0
  59. package/dist/service/http.js.map +1 -0
  60. package/dist/store/file-cache.d.ts +6 -0
  61. package/dist/store/file-cache.js +24 -0
  62. package/dist/store/file-cache.js.map +1 -0
  63. package/dist/store/index-lock.d.ts +14 -0
  64. package/dist/store/index-lock.js +112 -0
  65. package/dist/store/index-lock.js.map +1 -0
  66. package/dist/store/manifest-store.d.ts +16 -0
  67. package/dist/store/manifest-store.js +49 -0
  68. package/dist/store/manifest-store.js.map +1 -0
  69. package/dist/store/vector-store.d.ts +18 -0
  70. package/dist/store/vector-store.js +140 -0
  71. package/dist/store/vector-store.js.map +1 -0
  72. package/dist/types.d.ts +251 -0
  73. package/dist/types.js +63 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/utils/filesystem.d.ts +8 -0
  76. package/dist/utils/filesystem.js +38 -0
  77. package/dist/utils/filesystem.js.map +1 -0
  78. package/dist/utils/logger.d.ts +2 -0
  79. package/dist/utils/logger.js +19 -0
  80. package/dist/utils/logger.js.map +1 -0
  81. package/dist/utils/text.d.ts +8 -0
  82. package/dist/utils/text.js +151 -0
  83. package/dist/utils/text.js.map +1 -0
  84. package/package.json +74 -0
@@ -0,0 +1,13 @@
1
+ import type { CodeRagConfig, SerializableCodeRagConfig } from "../types.js";
2
+ /**
3
+ * Loads the serializable CodeRag config from disk and environment overrides.
4
+ */
5
+ export declare const loadSerializableConfig: (cwd: string, configPath?: string) => Promise<SerializableCodeRagConfig>;
6
+ /**
7
+ * Resolves the runtime dependencies needed to execute CodeRag.
8
+ */
9
+ export declare const resolveRuntimeConfig: (config: SerializableCodeRagConfig, cwd: string) => CodeRagConfig;
10
+ /**
11
+ * Loads and validates the full runtime config for the current working directory.
12
+ */
13
+ export declare const loadCodeRagConfig: (cwd: string, configPath?: string) => Promise<CodeRagConfig>;
@@ -0,0 +1,130 @@
1
+ import path from "node:path";
2
+ import { CodeflowCoreGraphProvider } from "../adapters/codeflow-core.js";
3
+ import { ConfigurationError } from "../errors/index.js";
4
+ import { LocalHashEmbeddingProvider } from "../indexer/embedder.js";
5
+ import { CustomHttpTransport, OpenAiCompatibleTransport } from "../llm/transports.js";
6
+ import { LanceVectorStore } from "../store/vector-store.js";
7
+ import { fileExists, readJson, resolveWithin } from "../utils/filesystem.js";
8
+ import { createConsoleLogger } from "../utils/logger.js";
9
+ import { llmConfigSchema, lockingConfigSchema, serializableConfigSchema, serviceConfigSchema } from "../types.js";
10
+ const CONFIG_FILES = ["coderag.config.json", ".coderag.json"];
11
+ const parseBoolean = (value) => {
12
+ if (value === undefined) {
13
+ return undefined;
14
+ }
15
+ return value === "1" || value.toLowerCase() === "true";
16
+ };
17
+ const parseNumber = (value) => {
18
+ if (!value) {
19
+ return undefined;
20
+ }
21
+ const parsed = Number(value);
22
+ return Number.isFinite(parsed) ? parsed : undefined;
23
+ };
24
+ const parseJsonRecord = (value) => {
25
+ if (!value) {
26
+ return undefined;
27
+ }
28
+ const parsed = JSON.parse(value);
29
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
30
+ throw new ConfigurationError("CODERAG_LLM_HEADERS must be a JSON object.");
31
+ }
32
+ return Object.fromEntries(Object.entries(parsed).map(([key, entryValue]) => [key, String(entryValue)]));
33
+ };
34
+ const resolveConfigPath = async (cwd, configPath) => {
35
+ if (configPath) {
36
+ return path.resolve(cwd, configPath);
37
+ }
38
+ const existingConfig = await Promise.all(CONFIG_FILES.map(async (candidate) => (await fileExists(path.join(cwd, candidate)) ? candidate : null)));
39
+ const matchedConfig = existingConfig.find(Boolean);
40
+ return matchedConfig ? path.resolve(cwd, matchedConfig) : undefined;
41
+ };
42
+ /**
43
+ * Loads the serializable CodeRag config from disk and environment overrides.
44
+ */
45
+ export const loadSerializableConfig = async (cwd, configPath) => {
46
+ const resolvedConfigPath = await resolveConfigPath(cwd, configPath);
47
+ const baseConfig = resolvedConfigPath
48
+ ? serializableConfigSchema.parse(await readJson(resolvedConfigPath))
49
+ : serializableConfigSchema.parse({ repoPath: cwd });
50
+ const envHeaders = parseJsonRecord(process.env.CODERAG_LLM_HEADERS);
51
+ return serializableConfigSchema.parse({
52
+ ...baseConfig,
53
+ repoPath: process.env.CODERAG_REPO_PATH ?? baseConfig.repoPath,
54
+ storageRoot: process.env.CODERAG_STORAGE_ROOT ?? baseConfig.storageRoot,
55
+ retrieval: {
56
+ ...baseConfig.retrieval,
57
+ topK: parseNumber(process.env.CODERAG_TOP_K) ?? baseConfig.retrieval.topK,
58
+ rerankK: parseNumber(process.env.CODERAG_RERANK_K) ?? baseConfig.retrieval.rerankK,
59
+ maxContextChars: parseNumber(process.env.CODERAG_MAX_CONTEXT_CHARS) ?? baseConfig.retrieval.maxContextChars
60
+ },
61
+ traversal: {
62
+ ...baseConfig.traversal,
63
+ defaultDepth: parseNumber(process.env.CODERAG_DEFAULT_DEPTH) ?? baseConfig.traversal.defaultDepth,
64
+ maxDepth: parseNumber(process.env.CODERAG_MAX_DEPTH) ?? baseConfig.traversal.maxDepth
65
+ },
66
+ locking: lockingConfigSchema.parse({
67
+ ...baseConfig.locking,
68
+ timeoutMs: parseNumber(process.env.CODERAG_LOCK_TIMEOUT_MS) ?? baseConfig.locking.timeoutMs,
69
+ pollMs: parseNumber(process.env.CODERAG_LOCK_POLL_MS) ?? baseConfig.locking.pollMs,
70
+ staleMs: parseNumber(process.env.CODERAG_LOCK_STALE_MS) ?? baseConfig.locking.staleMs
71
+ }),
72
+ service: serviceConfigSchema.parse({
73
+ ...baseConfig.service,
74
+ host: process.env.CODERAG_SERVICE_HOST ?? baseConfig.service.host,
75
+ port: parseNumber(process.env.CODERAG_SERVICE_PORT) ?? baseConfig.service.port,
76
+ apiKey: process.env.CODERAG_SERVICE_API_KEY ?? baseConfig.service.apiKey
77
+ }),
78
+ llm: llmConfigSchema.parse({
79
+ ...baseConfig.llm,
80
+ enabled: parseBoolean(process.env.CODERAG_LLM_ENABLED) ?? baseConfig.llm.enabled,
81
+ transport: process.env.CODERAG_LLM_TRANSPORT ?? baseConfig.llm.transport,
82
+ baseUrl: process.env.CODERAG_LLM_BASE_URL ?? baseConfig.llm.baseUrl,
83
+ model: process.env.CODERAG_LLM_MODEL ?? baseConfig.llm.model,
84
+ apiKey: process.env.CODERAG_LLM_API_KEY ?? baseConfig.llm.apiKey,
85
+ timeoutMs: parseNumber(process.env.CODERAG_LLM_TIMEOUT_MS) ?? baseConfig.llm.timeoutMs,
86
+ customHttpFormat: process.env.CODERAG_CUSTOM_HTTP_FORMAT ?? baseConfig.llm.customHttpFormat,
87
+ headers: envHeaders ?? baseConfig.llm.headers
88
+ })
89
+ });
90
+ };
91
+ /**
92
+ * Resolves the runtime dependencies needed to execute CodeRag.
93
+ */
94
+ export const resolveRuntimeConfig = (config, cwd) => {
95
+ const repoPath = resolveWithin(cwd, config.repoPath);
96
+ const storageRoot = resolveWithin(repoPath, config.storageRoot);
97
+ const graphProvider = new CodeflowCoreGraphProvider();
98
+ const embeddingProvider = new LocalHashEmbeddingProvider();
99
+ const vectorStore = new LanceVectorStore(storageRoot);
100
+ const llmTransport = config.llm.enabled && config.llm.baseUrl
101
+ ? config.llm.transport === "custom-http"
102
+ ? new CustomHttpTransport(config.llm)
103
+ : new OpenAiCompatibleTransport(config.llm)
104
+ : undefined;
105
+ return {
106
+ ...config,
107
+ repoPath,
108
+ storageRoot,
109
+ logger: createConsoleLogger(),
110
+ graphProvider,
111
+ embeddingProvider,
112
+ vectorStore,
113
+ llmTransport
114
+ };
115
+ };
116
+ /**
117
+ * Loads and validates the full runtime config for the current working directory.
118
+ */
119
+ export const loadCodeRagConfig = async (cwd, configPath) => {
120
+ const serializableConfig = await loadSerializableConfig(cwd, configPath);
121
+ const runtimeConfig = resolveRuntimeConfig(serializableConfig, cwd);
122
+ if (runtimeConfig.retrieval.rerankK > runtimeConfig.retrieval.topK) {
123
+ throw new ConfigurationError("retrieval.rerankK must be less than or equal to retrieval.topK.");
124
+ }
125
+ if (runtimeConfig.traversal.defaultDepth > runtimeConfig.traversal.maxDepth) {
126
+ throw new ConfigurationError("traversal.defaultDepth must be less than or equal to traversal.maxDepth.");
127
+ }
128
+ return runtimeConfig;
129
+ };
130
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/service/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Collects lightweight request metrics for the built-in HTTP service.
3
+ */
4
+ export declare class HttpMetricsCollector {
5
+ private readonly metricsByRoute;
6
+ record(route: string, durationMs: number, isError: boolean): void;
7
+ render(): string;
8
+ }
@@ -0,0 +1,36 @@
1
+ const formatRouteLabel = (route) => route.replace(/[^a-zA-Z0-9_:]/g, "_");
2
+ /**
3
+ * Collects lightweight request metrics for the built-in HTTP service.
4
+ */
5
+ export class HttpMetricsCollector {
6
+ metricsByRoute = new Map();
7
+ record(route, durationMs, isError) {
8
+ const metrics = this.metricsByRoute.get(route) ?? {
9
+ count: 0,
10
+ errorCount: 0,
11
+ totalDurationMs: 0
12
+ };
13
+ metrics.count += 1;
14
+ metrics.errorCount += isError ? 1 : 0;
15
+ metrics.totalDurationMs += durationMs;
16
+ this.metricsByRoute.set(route, metrics);
17
+ }
18
+ render() {
19
+ const lines = [
20
+ "# HELP coderag_http_requests_total Total HTTP requests handled by CodeRag.",
21
+ "# TYPE coderag_http_requests_total counter",
22
+ "# HELP coderag_http_request_errors_total Total failed HTTP requests handled by CodeRag.",
23
+ "# TYPE coderag_http_request_errors_total counter",
24
+ "# HELP coderag_http_request_duration_ms_total Total request handling time in milliseconds.",
25
+ "# TYPE coderag_http_request_duration_ms_total counter"
26
+ ];
27
+ for (const [route, metrics] of [...this.metricsByRoute.entries()].sort(([left], [right]) => left.localeCompare(right))) {
28
+ const label = formatRouteLabel(route);
29
+ lines.push(`coderag_http_requests_total{route="${label}"} ${metrics.count}`);
30
+ lines.push(`coderag_http_request_errors_total{route="${label}"} ${metrics.errorCount}`);
31
+ lines.push(`coderag_http_request_duration_ms_total{route="${label}"} ${metrics.totalDurationMs.toFixed(2)}`);
32
+ }
33
+ return `${lines.join("\n")}\n`;
34
+ }
35
+ }
36
+ //# sourceMappingURL=http-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-metrics.js","sourceRoot":"","sources":["../../src/service/http-metrics.ts"],"names":[],"mappings":"AAMA,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAE1F;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACd,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;IAElE,MAAM,CAAC,KAAa,EAAE,UAAkB,EAAE,OAAgB;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI;YAChD,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;YACb,eAAe,EAAE,CAAC;SACnB,CAAC;QACF,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QACnB,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,eAAe,IAAI,UAAU,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG;YACZ,4EAA4E;YAC5E,4CAA4C;YAC5C,yFAAyF;YACzF,kDAAkD;YAClD,4FAA4F;YAC5F,uDAAuD;SACxD,CAAC;QAEF,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvH,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,sCAAsC,KAAK,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7E,KAAK,CAAC,IAAI,CAAC,4CAA4C,KAAK,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACxF,KAAK,CAAC,IAAI,CAAC,iDAAiD,KAAK,MAAM,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/G,CAAC;QAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import http from "node:http";
2
+ import type { CodeRag } from "./coderag.js";
3
+ import type { CodeRagConfig } from "../types.js";
4
+ /**
5
+ * Creates the built-in HTTP API server for CodeRag.
6
+ */
7
+ export declare const createHttpServer: (coderag: CodeRag, config: CodeRagConfig) => http.Server;
8
+ /**
9
+ * Starts the built-in HTTP API server and resolves once it is listening.
10
+ */
11
+ export declare const serveHttpServer: (coderag: CodeRag, config: CodeRagConfig) => Promise<http.Server>;
@@ -0,0 +1,262 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import http from "node:http";
3
+ import { z } from "zod";
4
+ import { CodeRagError, NotFoundError } from "../errors/index.js";
5
+ import { HttpMetricsCollector } from "./http-metrics.js";
6
+ const MAX_REQUEST_BYTES = 1024 * 1024;
7
+ const JSON_CONTENT_TYPE = "application/json";
8
+ const depthSchema = z.number().int().min(0).optional();
9
+ const queryBodySchema = z.object({
10
+ question: z.string().min(1),
11
+ depth: depthSchema,
12
+ includeAnswer: z.boolean().optional()
13
+ });
14
+ const identifierBodySchema = z.object({
15
+ identifier: z.string().min(1),
16
+ depth: depthSchema
17
+ });
18
+ const reindexBodySchema = z.object({
19
+ full: z.boolean().optional()
20
+ });
21
+ const applySecurityHeaders = (request, response) => {
22
+ response.setHeader("content-security-policy", "default-src 'none'");
23
+ response.setHeader("x-frame-options", "DENY");
24
+ response.setHeader("x-content-type-options", "nosniff");
25
+ response.setHeader("referrer-policy", "no-referrer");
26
+ response.setHeader("cache-control", "no-store");
27
+ if ("encrypted" in request.socket && request.socket.encrypted) {
28
+ response.setHeader("strict-transport-security", "max-age=31536000; includeSubDomains");
29
+ }
30
+ };
31
+ const writeJson = (request, response, statusCode, requestId, payload) => {
32
+ applySecurityHeaders(request, response);
33
+ response.writeHead(statusCode, {
34
+ "content-type": "application/json; charset=utf-8",
35
+ "x-request-id": requestId
36
+ });
37
+ response.end(`${JSON.stringify(payload)}\n`);
38
+ };
39
+ const writeText = (request, response, statusCode, requestId, payload) => {
40
+ applySecurityHeaders(request, response);
41
+ response.writeHead(statusCode, {
42
+ "content-type": "text/plain; version=0.0.4; charset=utf-8",
43
+ "x-request-id": requestId
44
+ });
45
+ response.end(payload);
46
+ };
47
+ const requiresAuth = (pathname) => pathname.startsWith("/v1/");
48
+ const isAuthorized = (request, apiKey) => {
49
+ if (!apiKey) {
50
+ return true;
51
+ }
52
+ const authorization = request.headers.authorization;
53
+ return authorization === `Bearer ${apiKey}`;
54
+ };
55
+ const hasJsonContentType = (request) => {
56
+ const contentType = request.headers["content-type"];
57
+ return typeof contentType === "string" && contentType.toLowerCase().includes(JSON_CONTENT_TYPE);
58
+ };
59
+ const readRequestBody = async (request) => {
60
+ const chunks = [];
61
+ let totalBytes = 0;
62
+ for await (const chunk of request) {
63
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
64
+ totalBytes += buffer.byteLength;
65
+ if (totalBytes > MAX_REQUEST_BYTES) {
66
+ throw new CodeRagError("Request body exceeded the maximum allowed size.", "REQUEST_TOO_LARGE");
67
+ }
68
+ chunks.push(buffer);
69
+ }
70
+ return Buffer.concat(chunks).toString("utf8");
71
+ };
72
+ const readJsonBody = async (request, schema) => {
73
+ if (!hasJsonContentType(request)) {
74
+ throw new CodeRagError("Requests must use application/json content-type.", "UNSUPPORTED_MEDIA_TYPE");
75
+ }
76
+ const rawBody = await readRequestBody(request);
77
+ let parsed;
78
+ try {
79
+ parsed = JSON.parse(rawBody);
80
+ }
81
+ catch (error) {
82
+ if (error instanceof SyntaxError) {
83
+ throw new CodeRagError("Request body must contain valid JSON.", "INVALID_REQUEST");
84
+ }
85
+ throw error;
86
+ }
87
+ return schema.parse(parsed);
88
+ };
89
+ const errorStatusCode = (error) => {
90
+ if (error instanceof NotFoundError) {
91
+ return 404;
92
+ }
93
+ if (error instanceof z.ZodError) {
94
+ return 400;
95
+ }
96
+ if (error instanceof CodeRagError) {
97
+ if (error.code === "UNSUPPORTED_MEDIA_TYPE") {
98
+ return 415;
99
+ }
100
+ if (error.code === "REQUEST_TOO_LARGE") {
101
+ return 413;
102
+ }
103
+ return 400;
104
+ }
105
+ return 500;
106
+ };
107
+ const errorResponse = (error) => {
108
+ if (error instanceof z.ZodError) {
109
+ return {
110
+ code: "INVALID_REQUEST",
111
+ message: "Request validation failed.",
112
+ details: error.flatten()
113
+ };
114
+ }
115
+ if (error instanceof CodeRagError) {
116
+ return {
117
+ code: error.code,
118
+ message: error.message,
119
+ details: error.details
120
+ };
121
+ }
122
+ return {
123
+ code: "INTERNAL_SERVER_ERROR",
124
+ message: "An error occurred."
125
+ };
126
+ };
127
+ const createQueryHandler = (coderag) => async (request, response, requestId) => {
128
+ const body = await readJsonBody(request, queryBodySchema);
129
+ const result = await coderag.query(body.question, {
130
+ depth: body.depth,
131
+ includeAnswer: body.includeAnswer
132
+ });
133
+ writeJson(request, response, 200, requestId, { data: result, requestId });
134
+ };
135
+ const createLookupHandler = (coderag) => async (request, response, requestId) => {
136
+ const body = await readJsonBody(request, identifierBodySchema.pick({ identifier: true }));
137
+ writeJson(request, response, 200, requestId, { data: await coderag.lookup(body.identifier), requestId });
138
+ };
139
+ const createExplainHandler = (coderag) => async (request, response, requestId) => {
140
+ const body = await readJsonBody(request, identifierBodySchema);
141
+ writeJson(request, response, 200, requestId, { data: await coderag.explain(body.identifier, body.depth), requestId });
142
+ };
143
+ const createImpactHandler = (coderag) => async (request, response, requestId) => {
144
+ const body = await readJsonBody(request, identifierBodySchema);
145
+ writeJson(request, response, 200, requestId, { data: await coderag.impact(body.identifier, body.depth), requestId });
146
+ };
147
+ const createIndexHandler = (coderag) => async (request, response, requestId) => {
148
+ const body = await readJsonBody(request, reindexBodySchema);
149
+ const result = body.full ? await coderag.index() : await coderag.reindex({ full: false });
150
+ writeJson(request, response, 200, requestId, { data: result, requestId });
151
+ };
152
+ const createReindexHandler = (coderag) => async (request, response, requestId) => {
153
+ const body = await readJsonBody(request, reindexBodySchema);
154
+ writeJson(request, response, 200, requestId, {
155
+ data: await coderag.reindex({ full: body.full }),
156
+ requestId
157
+ });
158
+ };
159
+ const createStatusHandler = (coderag) => async (request, response, requestId) => {
160
+ writeJson(request, response, 200, requestId, { data: await coderag.status(), requestId });
161
+ };
162
+ const createHealthHandler = (coderag) => async (request, response, requestId) => {
163
+ writeJson(request, response, 200, requestId, { data: { ok: true, status: await coderag.status() }, requestId });
164
+ };
165
+ const createReadyHandler = (coderag) => async (request, response, requestId) => {
166
+ const status = await coderag.status();
167
+ writeJson(request, response, 200, requestId, {
168
+ data: { ready: true, status },
169
+ requestId
170
+ });
171
+ };
172
+ const createMetricsHandler = (metrics) => async (request, response, requestId) => {
173
+ writeText(request, response, 200, requestId, metrics.render());
174
+ };
175
+ const notFoundHandler = async (request, response, requestId) => {
176
+ writeJson(request, response, 404, requestId, {
177
+ error: {
178
+ code: "NOT_FOUND",
179
+ message: "The requested route does not exist."
180
+ },
181
+ requestId
182
+ });
183
+ };
184
+ const getRouteHandler = (coderag, metrics) => new Map([
185
+ ["POST /v1/query", createQueryHandler(coderag)],
186
+ ["POST /v1/lookup", createLookupHandler(coderag)],
187
+ ["POST /v1/explain", createExplainHandler(coderag)],
188
+ ["POST /v1/impact", createImpactHandler(coderag)],
189
+ ["POST /v1/index", createIndexHandler(coderag)],
190
+ ["POST /v1/reindex", createReindexHandler(coderag)],
191
+ ["GET /v1/status", createStatusHandler(coderag)],
192
+ ["GET /health", createHealthHandler(coderag)],
193
+ ["GET /healthz", createHealthHandler(coderag)],
194
+ ["GET /ready", createReadyHandler(coderag)],
195
+ ["GET /readyz", createReadyHandler(coderag)],
196
+ ["GET /metrics", createMetricsHandler(metrics)]
197
+ ]);
198
+ const createRouteKey = (method, pathname) => `${method ?? "GET"} ${pathname}`;
199
+ /**
200
+ * Creates the built-in HTTP API server for CodeRag.
201
+ */
202
+ export const createHttpServer = (coderag, config) => {
203
+ const metrics = new HttpMetricsCollector();
204
+ const routeHandlers = getRouteHandler(coderag, metrics);
205
+ return http.createServer(async (request, response) => {
206
+ const requestId = randomUUID();
207
+ const startTime = Date.now();
208
+ const url = new URL(request.url ?? "/", "http://127.0.0.1");
209
+ const routeKey = createRouteKey(request.method, url.pathname);
210
+ const routeHandler = routeHandlers.get(routeKey) ?? notFoundHandler;
211
+ try {
212
+ if (requiresAuth(url.pathname) && !isAuthorized(request, config.service.apiKey)) {
213
+ writeJson(request, response, 401, requestId, {
214
+ error: {
215
+ code: "UNAUTHORIZED",
216
+ message: "Missing or invalid bearer token."
217
+ },
218
+ requestId
219
+ });
220
+ metrics.record(routeKey, Date.now() - startTime, true);
221
+ return;
222
+ }
223
+ await routeHandler(request, response, requestId);
224
+ metrics.record(routeKey, Date.now() - startTime, false);
225
+ }
226
+ catch (error) {
227
+ const statusCode = errorStatusCode(error);
228
+ const serializedError = errorResponse(error);
229
+ config.logger?.error("CodeRag HTTP request failed.", {
230
+ requestId,
231
+ method: request.method,
232
+ pathname: url.pathname,
233
+ statusCode,
234
+ errorCode: serializedError.code
235
+ });
236
+ writeJson(request, response, statusCode, requestId, {
237
+ error: serializedError,
238
+ requestId
239
+ });
240
+ metrics.record(routeKey, Date.now() - startTime, true);
241
+ }
242
+ });
243
+ };
244
+ /**
245
+ * Starts the built-in HTTP API server and resolves once it is listening.
246
+ */
247
+ export const serveHttpServer = async (coderag, config) => {
248
+ const server = createHttpServer(coderag, config);
249
+ await new Promise((resolve, reject) => {
250
+ server.once("error", reject);
251
+ server.listen(config.service.port, config.service.host, () => {
252
+ server.off("error", reject);
253
+ config.logger?.info("CodeRag HTTP server started.", {
254
+ host: config.service.host,
255
+ port: config.service.port
256
+ });
257
+ resolve();
258
+ });
259
+ });
260
+ return server;
261
+ };
262
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/service/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class FileCache {
2
+ private readonly cache;
3
+ read(filePath: string): Promise<string>;
4
+ invalidate(filePath: string): void;
5
+ clear(): void;
6
+ }
@@ -0,0 +1,24 @@
1
+ import fs from "node:fs/promises";
2
+ export class FileCache {
3
+ cache = new Map();
4
+ async read(filePath) {
5
+ const stats = await fs.stat(filePath);
6
+ const cached = this.cache.get(filePath);
7
+ if (cached && cached.mtimeMs === stats.mtimeMs) {
8
+ return cached.content;
9
+ }
10
+ const content = await fs.readFile(filePath, "utf8");
11
+ this.cache.set(filePath, {
12
+ content,
13
+ mtimeMs: stats.mtimeMs
14
+ });
15
+ return content;
16
+ }
17
+ invalidate(filePath) {
18
+ this.cache.delete(filePath);
19
+ }
20
+ clear() {
21
+ this.cache.clear();
22
+ }
23
+ }
24
+ //# sourceMappingURL=file-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-cache.js","sourceRoot":"","sources":["../../src/store/file-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAOlC,MAAM,OAAO,SAAS;IACH,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEvD,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YAC/C,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YACvB,OAAO;YACP,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { LockingConfig, Logger } from "../types.js";
2
+ /**
3
+ * Coordinates access to the shared on-disk index state across processes.
4
+ */
5
+ export declare class IndexLock {
6
+ private readonly config;
7
+ private readonly logger?;
8
+ private readonly lockFilePath;
9
+ constructor(storageRoot: string, config: LockingConfig, logger?: Logger | undefined);
10
+ withLock<Value>(reason: string, action: () => Promise<Value>): Promise<Value>;
11
+ waitForRelease(): Promise<boolean>;
12
+ private acquire;
13
+ private clearStaleLock;
14
+ }