@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.
- package/LICENSE +201 -0
- package/README.md +196 -0
- package/dist/adapters/codeflow-core.d.ts +10 -0
- package/dist/adapters/codeflow-core.js +212 -0
- package/dist/adapters/codeflow-core.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +179 -0
- package/dist/cli.js.map +1 -0
- package/dist/errors/index.d.ts +17 -0
- package/dist/errors/index.js +35 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/documents.d.ts +16 -0
- package/dist/indexer/documents.js +148 -0
- package/dist/indexer/documents.js.map +1 -0
- package/dist/indexer/embedder.d.ts +7 -0
- package/dist/indexer/embedder.js +12 -0
- package/dist/indexer/embedder.js.map +1 -0
- package/dist/indexer/git-hook.d.ts +2 -0
- package/dist/indexer/git-hook.js +53 -0
- package/dist/indexer/git-hook.js.map +1 -0
- package/dist/indexer/indexer.d.ts +22 -0
- package/dist/indexer/indexer.js +108 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/llm/context-builder.d.ts +7 -0
- package/dist/llm/context-builder.js +93 -0
- package/dist/llm/context-builder.js.map +1 -0
- package/dist/llm/prompt.d.ts +3 -0
- package/dist/llm/prompt.js +80 -0
- package/dist/llm/prompt.js.map +1 -0
- package/dist/llm/transports.d.ts +23 -0
- package/dist/llm/transports.js +271 -0
- package/dist/llm/transports.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.js +70 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/retrieval/page-index.d.ts +3 -0
- package/dist/retrieval/page-index.js +26 -0
- package/dist/retrieval/page-index.js.map +1 -0
- package/dist/retrieval/search.d.ts +20 -0
- package/dist/retrieval/search.js +164 -0
- package/dist/retrieval/search.js.map +1 -0
- package/dist/retrieval/traversal.d.ts +6 -0
- package/dist/retrieval/traversal.js +29 -0
- package/dist/retrieval/traversal.js.map +1 -0
- package/dist/service/coderag.d.ts +58 -0
- package/dist/service/coderag.js +208 -0
- package/dist/service/coderag.js.map +1 -0
- package/dist/service/config.d.ts +13 -0
- package/dist/service/config.js +130 -0
- package/dist/service/config.js.map +1 -0
- package/dist/service/http-metrics.d.ts +8 -0
- package/dist/service/http-metrics.js +36 -0
- package/dist/service/http-metrics.js.map +1 -0
- package/dist/service/http.d.ts +11 -0
- package/dist/service/http.js +262 -0
- package/dist/service/http.js.map +1 -0
- package/dist/store/file-cache.d.ts +6 -0
- package/dist/store/file-cache.js +24 -0
- package/dist/store/file-cache.js.map +1 -0
- package/dist/store/index-lock.d.ts +14 -0
- package/dist/store/index-lock.js +112 -0
- package/dist/store/index-lock.js.map +1 -0
- package/dist/store/manifest-store.d.ts +16 -0
- package/dist/store/manifest-store.js +49 -0
- package/dist/store/manifest-store.js.map +1 -0
- package/dist/store/vector-store.d.ts +18 -0
- package/dist/store/vector-store.js +140 -0
- package/dist/store/vector-store.js.map +1 -0
- package/dist/types.d.ts +251 -0
- package/dist/types.js +63 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/filesystem.d.ts +8 -0
- package/dist/utils/filesystem.js +38 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +19 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.js +151 -0
- package/dist/utils/text.js.map +1 -0
- 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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,YAAY,GAAG,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC;AAE9D,MAAM,YAAY,GAAG,CAAC,KAAyB,EAAuB,EAAE;IACtE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAyB,EAAsB,EAAE;IACpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAyB,EAAsC,EAAE;IACxF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,kBAAkB,CAAC,4CAA4C,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAC7E,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAW,EAAE,UAAmB,EAA+B,EAAE;IAChG,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CACtC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CACxG,CAAC;IACF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,GAAW,EAAE,UAAmB,EAAsC,EAAE;IACnH,MAAM,kBAAkB,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,kBAAkB;QACnC,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAA4B,kBAAkB,CAAC,CAAC;QAC/F,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEpE,OAAO,wBAAwB,CAAC,KAAK,CAAC;QACpC,GAAG,UAAU;QACb,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU,CAAC,QAAQ;QAC9D,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU,CAAC,WAAW;QACvE,SAAS,EAAE;YACT,GAAG,UAAU,CAAC,SAAS;YACvB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI;YACzE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,OAAO;YAClF,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,eAAe;SAC5G;QACD,SAAS,EAAE;YACT,GAAG,UAAU,CAAC,SAAS;YACvB,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY;YACjG,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ;SACtF;QACD,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC;YACjC,GAAG,UAAU,CAAC,OAAO;YACrB,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS;YAC3F,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM;YAClF,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO;SACtF,CAAC;QACF,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC;YACjC,GAAG,UAAU,CAAC,OAAO;YACrB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI;YACjE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI;YAC9E,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM;SACzE,CAAC;QACF,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC;YACzB,GAAG,UAAU,CAAC,GAAG;YACjB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO;YAChF,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS;YACxE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO;YACnE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK;YAC5D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM;YAChE,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS;YACtF,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,UAAU,CAAC,GAAG,CAAC,gBAAgB;YAC3F,OAAO,EAAE,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO;SAC9C,CAAC;KACH,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAiC,EAAE,GAAW,EAAiB,EAAE;IACpG,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,yBAAyB,EAAE,CAAC;IACtD,MAAM,iBAAiB,GAAG,IAAI,0BAA0B,EAAE,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,YAAY,GAChB,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO;QACtC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,KAAK,aAAa;YACtC,CAAC,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC;YACrC,CAAC,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,GAAG,CAAC;QAC7C,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,GAAG,MAAM;QACT,QAAQ;QACR,WAAW;QACX,MAAM,EAAE,mBAAmB,EAAE;QAC7B,aAAa;QACb,iBAAiB;QACjB,WAAW;QACX,YAAY;KACb,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAW,EAAE,UAAmB,EAA0B,EAAE;IAClG,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,oBAAoB,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAEpE,IAAI,aAAa,CAAC,SAAS,CAAC,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACnE,MAAM,IAAI,kBAAkB,CAAC,iEAAiE,CAAC,CAAC;IAClG,CAAC;IAED,IAAI,aAAa,CAAC,SAAS,CAAC,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC5E,MAAM,IAAI,kBAAkB,CAAC,0EAA0E,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC"}
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAmD,MAAM,WAAW,CAAC;AAE5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;AACtC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAE7C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACvD,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,KAAK,EAAE,WAAW;IAClB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,WAAW;CACnB,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAQH,MAAM,oBAAoB,GAAG,CAAC,OAAwB,EAAE,QAAwB,EAAQ,EAAE;IACxF,QAAQ,CAAC,SAAS,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;IACpE,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACxD,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,WAAW,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC9D,QAAQ,CAAC,SAAS,CAAC,2BAA2B,EAAE,qCAAqC,CAAC,CAAC;IACzF,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAChB,OAAwB,EACxB,QAAwB,EACxB,UAAkB,EAClB,SAAiB,EACjB,OAAgC,EAC1B,EAAE;IACR,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE;QAC7B,cAAc,EAAE,iCAAiC;QACjD,cAAc,EAAE,SAAS;KAC1B,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAChB,OAAwB,EACxB,QAAwB,EACxB,UAAkB,EAClB,SAAiB,EACjB,OAAe,EACT,EAAE;IACR,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE;QAC7B,cAAc,EAAE,0CAA0C;QAC1D,cAAc,EAAE,SAAS;KAC1B,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAEhF,MAAM,YAAY,GAAG,CAAC,OAAwB,EAAE,MAA0B,EAAW,EAAE;IACrF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;IACpD,OAAO,aAAa,KAAK,UAAU,MAAM,EAAE,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,OAAwB,EAAW,EAAE;IAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpD,OAAO,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,OAAwB,EAAmB,EAAE;IAC1E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;QAChC,IAAI,UAAU,GAAG,iBAAiB,EAAE,CAAC;YACnC,MAAM,IAAI,YAAY,CAAC,iDAAiD,EAAE,mBAAmB,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EACxB,OAAwB,EACxB,MAA0B,EACV,EAAE;IAClB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,YAAY,CAAC,kDAAkD,EAAE,wBAAwB,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,YAAY,CAAC,uCAAuC,EAAE,iBAAiB,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAU,EAAE;IACjD,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC5C,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACvC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAc,EAAwD,EAAE;IAC7F,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,oBAAoB;KAC9B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACxG,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;QAChD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,aAAa,EAAE,IAAI,CAAC,aAAa;KAClC,CAAC,CAAC;IACH,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACzG,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1F,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3G,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAC1G,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC/D,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AACxH,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACzG,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC/D,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AACvH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACxG,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1F,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAC1G,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC5D,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE;QAC3C,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAChD,SAAS;KACV,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACzG,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AAC5F,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACzG,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AAClH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACxG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IACtC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE;QAC3C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;QAC7B,SAAS;KACV,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAA6B,EAAoB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IACvH,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,eAAe,GAAqB,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAC/E,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE;QAC3C,KAAK,EAAE;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,qCAAqC;SAC/C;QACD,SAAS;KACV,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAE,OAA6B,EAAiC,EAAE,CACzG,IAAI,GAAG,CAA2B;IAChC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC,aAAa,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,cAAc,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,YAAY,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,cAAc,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;CAChD,CAAC,CAAC;AAEL,MAAM,cAAc,GAAG,CAAC,MAA0B,EAAE,QAAgB,EAAU,EAAE,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;AAElH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAE,MAAqB,EAAe,EAAE;IACvF,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAExD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QACnD,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC;QAEpE,IAAI,CAAC;YACH,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChF,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE;oBAC3C,KAAK,EAAE;wBACL,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,kCAAkC;qBAC5C;oBACD,SAAS;iBACV,CAAC,CAAC;gBACH,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YAED,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAE7C,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,8BAA8B,EAAE;gBACnD,SAAS;gBACT,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,UAAU;gBACV,SAAS,EAAE,eAAe,CAAC,IAAI;aAChC,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE;gBAClD,KAAK,EAAE,eAAe;gBACtB,SAAS;aACV,CAAC,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAAgB,EAAE,MAAqB,EAAwB,EAAE;IACrG,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEjD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,8BAA8B,EAAE;gBAClD,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;gBACzB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;aAC1B,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -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
|
+
}
|