kiri-mcp-server 0.2.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 +399 -0
- package/config/default.example.yml +12 -0
- package/config/denylist.yml +15 -0
- package/config/scoring-profiles.yml +37 -0
- package/config/security.yml +10 -0
- package/dist/client/cli.js +68 -0
- package/dist/client/cli.js.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/config/default.example.yml +12 -0
- package/dist/config/denylist.yml +15 -0
- package/dist/config/scoring-profiles.yml +37 -0
- package/dist/config/security.yml +10 -0
- package/dist/eval/metrics.js +47 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/indexer/cli.js +362 -0
- package/dist/indexer/cli.js.map +1 -0
- package/dist/indexer/codeintel.js +182 -0
- package/dist/indexer/codeintel.js.map +1 -0
- package/dist/indexer/git.js +30 -0
- package/dist/indexer/git.js.map +1 -0
- package/dist/indexer/language.js +34 -0
- package/dist/indexer/language.js.map +1 -0
- package/dist/indexer/pipeline/filters/denylist.js +71 -0
- package/dist/indexer/pipeline/filters/denylist.js.map +1 -0
- package/dist/indexer/schema.js +101 -0
- package/dist/indexer/schema.js.map +1 -0
- package/dist/package.json +93 -0
- package/dist/server/bootstrap.js +19 -0
- package/dist/server/bootstrap.js.map +1 -0
- package/dist/server/context.js +2 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fallbacks/degradeController.js +69 -0
- package/dist/server/fallbacks/degradeController.js.map +1 -0
- package/dist/server/handlers.js +800 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/main.js +151 -0
- package/dist/server/main.js.map +1 -0
- package/dist/server/observability/metrics.js +56 -0
- package/dist/server/observability/metrics.js.map +1 -0
- package/dist/server/observability/tracing.js +58 -0
- package/dist/server/observability/tracing.js.map +1 -0
- package/dist/server/rpc.js +477 -0
- package/dist/server/rpc.js.map +1 -0
- package/dist/server/runtime.js +47 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/scoring.js +111 -0
- package/dist/server/scoring.js.map +1 -0
- package/dist/server/stdio.js +76 -0
- package/dist/server/stdio.js.map +1 -0
- package/dist/shared/duckdb.js +121 -0
- package/dist/shared/duckdb.js.map +1 -0
- package/dist/shared/embedding.js +85 -0
- package/dist/shared/embedding.js.map +1 -0
- package/dist/shared/index.js +9 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/security/config.js +64 -0
- package/dist/shared/security/config.js.map +1 -0
- package/dist/shared/security/masker.js +56 -0
- package/dist/shared/security/masker.js.map +1 -0
- package/dist/shared/tokenizer.js +5 -0
- package/dist/shared/tokenizer.js.map +1 -0
- package/dist/shared/utils/simpleYaml.js +90 -0
- package/dist/shared/utils/simpleYaml.js.map +1 -0
- package/dist/sql/schema.sql +6 -0
- package/dist/src/client/cli.d.ts +3 -0
- package/dist/src/client/cli.d.ts.map +1 -0
- package/dist/src/client/cli.js +68 -0
- package/dist/src/client/cli.js.map +1 -0
- package/dist/src/client/index.d.ts +5 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +5 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/client/proxy.d.ts +9 -0
- package/dist/src/client/proxy.d.ts.map +1 -0
- package/dist/src/client/proxy.js +198 -0
- package/dist/src/client/proxy.js.map +1 -0
- package/dist/src/client/start-daemon.d.ts +30 -0
- package/dist/src/client/start-daemon.d.ts.map +1 -0
- package/dist/src/client/start-daemon.js +175 -0
- package/dist/src/client/start-daemon.js.map +1 -0
- package/dist/src/daemon/daemon.d.ts +9 -0
- package/dist/src/daemon/daemon.d.ts.map +1 -0
- package/dist/src/daemon/daemon.js +149 -0
- package/dist/src/daemon/daemon.js.map +1 -0
- package/dist/src/daemon/lifecycle.d.ts +101 -0
- package/dist/src/daemon/lifecycle.d.ts.map +1 -0
- package/dist/src/daemon/lifecycle.js +266 -0
- package/dist/src/daemon/lifecycle.js.map +1 -0
- package/dist/src/daemon/socket.d.ts +26 -0
- package/dist/src/daemon/socket.d.ts.map +1 -0
- package/dist/src/daemon/socket.js +132 -0
- package/dist/src/daemon/socket.js.map +1 -0
- package/dist/src/eval/metrics.d.ts +23 -0
- package/dist/src/eval/metrics.d.ts.map +1 -0
- package/dist/src/eval/metrics.js +47 -0
- package/dist/src/eval/metrics.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/indexer/cli.d.ts +9 -0
- package/dist/src/indexer/cli.d.ts.map +1 -0
- package/dist/src/indexer/cli.js +402 -0
- package/dist/src/indexer/cli.js.map +1 -0
- package/dist/src/indexer/codeintel.d.ts +28 -0
- package/dist/src/indexer/codeintel.d.ts.map +1 -0
- package/dist/src/indexer/codeintel.js +451 -0
- package/dist/src/indexer/codeintel.js.map +1 -0
- package/dist/src/indexer/git.d.ts +4 -0
- package/dist/src/indexer/git.d.ts.map +1 -0
- package/dist/src/indexer/git.js +30 -0
- package/dist/src/indexer/git.js.map +1 -0
- package/dist/src/indexer/language.d.ts +2 -0
- package/dist/src/indexer/language.d.ts.map +1 -0
- package/dist/src/indexer/language.js +34 -0
- package/dist/src/indexer/language.js.map +1 -0
- package/dist/src/indexer/pipeline/filters/denylist.d.ts +10 -0
- package/dist/src/indexer/pipeline/filters/denylist.d.ts.map +1 -0
- package/dist/src/indexer/pipeline/filters/denylist.js +71 -0
- package/dist/src/indexer/pipeline/filters/denylist.js.map +1 -0
- package/dist/src/indexer/schema.d.ts +9 -0
- package/dist/src/indexer/schema.d.ts.map +1 -0
- package/dist/src/indexer/schema.js +125 -0
- package/dist/src/indexer/schema.js.map +1 -0
- package/dist/src/indexer/watch.d.ts +97 -0
- package/dist/src/indexer/watch.d.ts.map +1 -0
- package/dist/src/indexer/watch.js +264 -0
- package/dist/src/indexer/watch.js.map +1 -0
- package/dist/src/server/bootstrap.d.ts +11 -0
- package/dist/src/server/bootstrap.d.ts.map +1 -0
- package/dist/src/server/bootstrap.js +19 -0
- package/dist/src/server/bootstrap.js.map +1 -0
- package/dist/src/server/context.d.ts +9 -0
- package/dist/src/server/context.d.ts.map +1 -0
- package/dist/src/server/context.js +2 -0
- package/dist/src/server/context.js.map +1 -0
- package/dist/src/server/fallbacks/degradeController.d.ts +24 -0
- package/dist/src/server/fallbacks/degradeController.d.ts.map +1 -0
- package/dist/src/server/fallbacks/degradeController.js +135 -0
- package/dist/src/server/fallbacks/degradeController.js.map +1 -0
- package/dist/src/server/handlers.d.ts +105 -0
- package/dist/src/server/handlers.d.ts.map +1 -0
- package/dist/src/server/handlers.js +954 -0
- package/dist/src/server/handlers.js.map +1 -0
- package/dist/src/server/indexBootstrap.d.ts +13 -0
- package/dist/src/server/indexBootstrap.d.ts.map +1 -0
- package/dist/src/server/indexBootstrap.js +109 -0
- package/dist/src/server/indexBootstrap.js.map +1 -0
- package/dist/src/server/main.d.ts +10 -0
- package/dist/src/server/main.d.ts.map +1 -0
- package/dist/src/server/main.js +217 -0
- package/dist/src/server/main.js.map +1 -0
- package/dist/src/server/observability/metrics.d.ts +35 -0
- package/dist/src/server/observability/metrics.d.ts.map +1 -0
- package/dist/src/server/observability/metrics.js +70 -0
- package/dist/src/server/observability/metrics.js.map +1 -0
- package/dist/src/server/observability/tracing.d.ts +3 -0
- package/dist/src/server/observability/tracing.d.ts.map +1 -0
- package/dist/src/server/observability/tracing.js +58 -0
- package/dist/src/server/observability/tracing.js.map +1 -0
- package/dist/src/server/rpc.d.ts +39 -0
- package/dist/src/server/rpc.d.ts.map +1 -0
- package/dist/src/server/rpc.js +551 -0
- package/dist/src/server/rpc.js.map +1 -0
- package/dist/src/server/runtime.d.ts +21 -0
- package/dist/src/server/runtime.d.ts.map +1 -0
- package/dist/src/server/runtime.js +59 -0
- package/dist/src/server/runtime.js.map +1 -0
- package/dist/src/server/scoring.d.ts +20 -0
- package/dist/src/server/scoring.d.ts.map +1 -0
- package/dist/src/server/scoring.js +112 -0
- package/dist/src/server/scoring.js.map +1 -0
- package/dist/src/server/stdio.d.ts +4 -0
- package/dist/src/server/stdio.d.ts.map +1 -0
- package/dist/src/server/stdio.js +88 -0
- package/dist/src/server/stdio.js.map +1 -0
- package/dist/src/shared/duckdb.d.ts +16 -0
- package/dist/src/shared/duckdb.d.ts.map +1 -0
- package/dist/src/shared/duckdb.js +121 -0
- package/dist/src/shared/duckdb.js.map +1 -0
- package/dist/src/shared/embedding.d.ts +19 -0
- package/dist/src/shared/embedding.d.ts.map +1 -0
- package/dist/src/shared/embedding.js +85 -0
- package/dist/src/shared/embedding.js.map +1 -0
- package/dist/src/shared/index.d.ts +3 -0
- package/dist/src/shared/index.d.ts.map +1 -0
- package/dist/src/shared/index.js +9 -0
- package/dist/src/shared/index.js.map +1 -0
- package/dist/src/shared/security/config.d.ts +23 -0
- package/dist/src/shared/security/config.d.ts.map +1 -0
- package/dist/src/shared/security/config.js +66 -0
- package/dist/src/shared/security/config.js.map +1 -0
- package/dist/src/shared/security/masker.d.ts +10 -0
- package/dist/src/shared/security/masker.d.ts.map +1 -0
- package/dist/src/shared/security/masker.js +56 -0
- package/dist/src/shared/security/masker.js.map +1 -0
- package/dist/src/shared/tokenizer.d.ts +2 -0
- package/dist/src/shared/tokenizer.d.ts.map +1 -0
- package/dist/src/shared/tokenizer.js +5 -0
- package/dist/src/shared/tokenizer.js.map +1 -0
- package/dist/src/shared/utils/lockfile.d.ts +46 -0
- package/dist/src/shared/utils/lockfile.d.ts.map +1 -0
- package/dist/src/shared/utils/lockfile.js +136 -0
- package/dist/src/shared/utils/lockfile.js.map +1 -0
- package/dist/src/shared/utils/simpleYaml.d.ts +6 -0
- package/dist/src/shared/utils/simpleYaml.d.ts.map +1 -0
- package/dist/src/shared/utils/simpleYaml.js +90 -0
- package/dist/src/shared/utils/simpleYaml.js.map +1 -0
- package/package.json +91 -0
- package/sql/schema.sql +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"denylist.d.ts","sourceRoot":"","sources":["../../../../../src/indexer/pipeline/filters/denylist.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,IAAI,MAAM,EAAE,CAAC;CAClB;AA6CD,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAWtE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAgB1F"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { parseSimpleYaml } from "../../../shared/utils/simpleYaml.js";
|
|
4
|
+
/**
|
|
5
|
+
* Globććæć¼ć³ćę£č¦č”Øē¾ć«å¤ęļ¼ReDoS対ēęøćæļ¼
|
|
6
|
+
* @param pattern Globććæć¼ć³ęåå
|
|
7
|
+
* @returns ć³ć³ćć¤ć«ęøćæę£č¦č”Øē¾
|
|
8
|
+
* @throws ććæć¼ć³ćé·ććććć¾ććÆč¤éćććå “å
|
|
9
|
+
*/
|
|
10
|
+
function toRegex(pattern) {
|
|
11
|
+
// ReDoS対ē: ććæć¼ć³é·ć®å¶é
|
|
12
|
+
if (pattern.length > 500) {
|
|
13
|
+
throw new Error("Denylist pattern exceeds maximum length. Simplify the pattern.");
|
|
14
|
+
}
|
|
15
|
+
const normalized = pattern.endsWith("/") ? pattern.slice(0, -1) : pattern;
|
|
16
|
+
const escaped = normalized
|
|
17
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
18
|
+
.replace(/\*\*/g, "::DOUBLESTAR::");
|
|
19
|
+
const withWildcards = escaped
|
|
20
|
+
.replace(/::DOUBLESTAR::/g, ".*")
|
|
21
|
+
.replace(/\*/g, "[^/]*")
|
|
22
|
+
.replace(/\?/g, ".");
|
|
23
|
+
const suffix = pattern.endsWith("/") ? "(?:/.*)?" : "";
|
|
24
|
+
// ReDoS対ē: ęēµććæć¼ć³ć®č¤éåŗ¦ćć§ććÆļ¼ćć¹ćććéęå®åļ¼
|
|
25
|
+
const finalPattern = `^${withWildcards}${suffix}$`;
|
|
26
|
+
if (/(\*|\+|\{).*(\*|\+|\{).*(\*|\+|\{)/.test(finalPattern)) {
|
|
27
|
+
throw new Error("Denylist pattern is too complex. Use simpler glob patterns.");
|
|
28
|
+
}
|
|
29
|
+
return new RegExp(finalPattern);
|
|
30
|
+
}
|
|
31
|
+
function loadGitignore(repoRoot) {
|
|
32
|
+
try {
|
|
33
|
+
const raw = readFileSync(resolve(repoRoot, ".gitignore"), "utf8");
|
|
34
|
+
return raw
|
|
35
|
+
.split(/\r?\n/)
|
|
36
|
+
.map((line) => line.trim())
|
|
37
|
+
.filter((line) => line.length > 0 && !line.startsWith("#"));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function loadDenylistConfig(configPath) {
|
|
44
|
+
const path = resolve(configPath ?? "config/denylist.yml");
|
|
45
|
+
const content = readFileSync(path, "utf8");
|
|
46
|
+
const parsed = parseSimpleYaml(content);
|
|
47
|
+
const patterns = Array.isArray(parsed.patterns)
|
|
48
|
+
? parsed.patterns.filter((value) => typeof value === "string")
|
|
49
|
+
: [];
|
|
50
|
+
if (patterns.length === 0) {
|
|
51
|
+
throw new Error("config/denylist.yml must contain patterns array");
|
|
52
|
+
}
|
|
53
|
+
return { patterns };
|
|
54
|
+
}
|
|
55
|
+
export function createDenylistFilter(repoRoot, configPath) {
|
|
56
|
+
const { patterns } = loadDenylistConfig(configPath);
|
|
57
|
+
const gitignorePatterns = loadGitignore(repoRoot);
|
|
58
|
+
const combined = Array.from(new Set([...patterns, ...gitignorePatterns]));
|
|
59
|
+
const regexList = combined.map(toRegex);
|
|
60
|
+
const diffEntries = gitignorePatterns.filter((pattern) => !patterns.includes(pattern));
|
|
61
|
+
return {
|
|
62
|
+
isDenied(path) {
|
|
63
|
+
const normalized = path.startsWith("/") ? path.slice(1) : path;
|
|
64
|
+
return regexList.some((regex) => regex.test(normalized));
|
|
65
|
+
},
|
|
66
|
+
diff() {
|
|
67
|
+
return diffEntries;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=denylist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"denylist.js","sourceRoot":"","sources":["../../../../../src/indexer/pipeline/filters/denylist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DuckDBClient } from "../shared/duckdb.js";
|
|
2
|
+
export declare function ensureBaseSchema(db: DuckDBClient): Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* FTSļ¼å
Øęę¤ē“¢ļ¼ć¤ć³ćććÆć¹ć®ä½ęć試č”
|
|
5
|
+
* @param db - DuckDBćÆć©ć¤ć¢ć³ć
|
|
6
|
+
* @returns FTSę”å¼µćå©ēØåÆč½ćŖå “åtrueććć仄å¤false
|
|
7
|
+
*/
|
|
8
|
+
export declare function tryCreateFTSIndex(db: DuckDBClient): Promise<boolean>;
|
|
9
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/indexer/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8GtE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB1E"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export async function ensureBaseSchema(db) {
|
|
2
|
+
await db.run(`
|
|
3
|
+
CREATE SEQUENCE IF NOT EXISTS repo_id_seq START 1
|
|
4
|
+
`);
|
|
5
|
+
await db.run(`
|
|
6
|
+
CREATE TABLE IF NOT EXISTS repo (
|
|
7
|
+
id INTEGER PRIMARY KEY DEFAULT nextval('repo_id_seq'),
|
|
8
|
+
root TEXT NOT NULL UNIQUE,
|
|
9
|
+
default_branch TEXT,
|
|
10
|
+
indexed_at TIMESTAMP
|
|
11
|
+
)
|
|
12
|
+
`);
|
|
13
|
+
await db.run(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS blob (
|
|
15
|
+
hash TEXT PRIMARY KEY,
|
|
16
|
+
size_bytes INTEGER,
|
|
17
|
+
line_count INTEGER,
|
|
18
|
+
content TEXT
|
|
19
|
+
)
|
|
20
|
+
`);
|
|
21
|
+
await db.run(`
|
|
22
|
+
CREATE TABLE IF NOT EXISTS tree (
|
|
23
|
+
repo_id INTEGER,
|
|
24
|
+
commit_hash TEXT,
|
|
25
|
+
path TEXT,
|
|
26
|
+
blob_hash TEXT,
|
|
27
|
+
ext TEXT,
|
|
28
|
+
lang TEXT,
|
|
29
|
+
is_binary BOOLEAN,
|
|
30
|
+
mtime TIMESTAMP,
|
|
31
|
+
PRIMARY KEY (repo_id, commit_hash, path)
|
|
32
|
+
)
|
|
33
|
+
`);
|
|
34
|
+
await db.run(`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS file (
|
|
36
|
+
repo_id INTEGER,
|
|
37
|
+
path TEXT,
|
|
38
|
+
blob_hash TEXT,
|
|
39
|
+
ext TEXT,
|
|
40
|
+
lang TEXT,
|
|
41
|
+
is_binary BOOLEAN,
|
|
42
|
+
mtime TIMESTAMP,
|
|
43
|
+
PRIMARY KEY (repo_id, path)
|
|
44
|
+
)
|
|
45
|
+
`);
|
|
46
|
+
await db.run(`
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_file_lang ON file(repo_id, lang)
|
|
48
|
+
`);
|
|
49
|
+
await db.run(`
|
|
50
|
+
CREATE TABLE IF NOT EXISTS symbol (
|
|
51
|
+
repo_id INTEGER,
|
|
52
|
+
path TEXT,
|
|
53
|
+
symbol_id BIGINT,
|
|
54
|
+
name TEXT,
|
|
55
|
+
kind TEXT,
|
|
56
|
+
range_start_line INTEGER,
|
|
57
|
+
range_end_line INTEGER,
|
|
58
|
+
signature TEXT,
|
|
59
|
+
doc TEXT,
|
|
60
|
+
PRIMARY KEY (repo_id, path, symbol_id)
|
|
61
|
+
)
|
|
62
|
+
`);
|
|
63
|
+
await db.run(`
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_symbol_name ON symbol(repo_id, name)
|
|
65
|
+
`);
|
|
66
|
+
await db.run(`
|
|
67
|
+
CREATE TABLE IF NOT EXISTS snippet (
|
|
68
|
+
repo_id INTEGER,
|
|
69
|
+
path TEXT,
|
|
70
|
+
snippet_id BIGINT,
|
|
71
|
+
start_line INTEGER,
|
|
72
|
+
end_line INTEGER,
|
|
73
|
+
symbol_id BIGINT NULL,
|
|
74
|
+
PRIMARY KEY (repo_id, path, snippet_id)
|
|
75
|
+
)
|
|
76
|
+
`);
|
|
77
|
+
await db.run(`
|
|
78
|
+
CREATE TABLE IF NOT EXISTS dependency (
|
|
79
|
+
repo_id INTEGER,
|
|
80
|
+
src_path TEXT,
|
|
81
|
+
dst_kind TEXT,
|
|
82
|
+
dst TEXT,
|
|
83
|
+
rel TEXT,
|
|
84
|
+
PRIMARY KEY (repo_id, src_path, dst_kind, dst, rel)
|
|
85
|
+
)
|
|
86
|
+
`);
|
|
87
|
+
await db.run(`
|
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_dep_src ON dependency(repo_id, src_path)
|
|
89
|
+
`);
|
|
90
|
+
await db.run(`
|
|
91
|
+
CREATE TABLE IF NOT EXISTS file_embedding (
|
|
92
|
+
repo_id INTEGER,
|
|
93
|
+
path TEXT,
|
|
94
|
+
dims INTEGER NOT NULL,
|
|
95
|
+
vector_json TEXT NOT NULL,
|
|
96
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
97
|
+
PRIMARY KEY (repo_id, path)
|
|
98
|
+
)
|
|
99
|
+
`);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* FTSļ¼å
Øęę¤ē“¢ļ¼ć¤ć³ćććÆć¹ć®ä½ęć試č”
|
|
103
|
+
* @param db - DuckDBćÆć©ć¤ć¢ć³ć
|
|
104
|
+
* @returns FTSę”å¼µćå©ēØåÆč½ćŖå “åtrueććć仄å¤false
|
|
105
|
+
*/
|
|
106
|
+
export async function tryCreateFTSIndex(db) {
|
|
107
|
+
try {
|
|
108
|
+
// FTSę”å¼µć®å©ēØåÆč½ę§ć確čŖ
|
|
109
|
+
await db.run(`
|
|
110
|
+
INSTALL fts;
|
|
111
|
+
LOAD fts;
|
|
112
|
+
`);
|
|
113
|
+
// blob.content ć« FTS ć¤ć³ćććÆć¹ćä½ę
|
|
114
|
+
await db.run(`
|
|
115
|
+
PRAGMA create_fts_index('blob', 'hash', 'content', overwrite=1);
|
|
116
|
+
`);
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// FTSę”å¼µćå©ēØć§ććŖćå “åćÆč¦åćåŗćć¦falsećčæć
|
|
121
|
+
console.warn("FTS extension unavailable, using ILIKE fallback:", error);
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/indexer/schema.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAgB;IACrD,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;GAOZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;GAOZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;GAYZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;GAWZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;;GAaZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;GAUZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;GASZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;GAEZ,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,GAAG,CAAC;;;;;;;;;GASZ,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAgB;IACtD,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,EAAE,CAAC,GAAG,CAAC;;;KAGZ,CAAC,CAAC;QAEH,+BAA+B;QAC/B,MAAM,EAAE,CAAC,GAAG,CAAC;;KAEZ,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gCAAgC;QAChC,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration options for IndexWatcher.
|
|
3
|
+
*/
|
|
4
|
+
export interface IndexWatcherOptions {
|
|
5
|
+
/** Absolute path to repository root */
|
|
6
|
+
repoRoot: string;
|
|
7
|
+
/** Absolute path to DuckDB database file */
|
|
8
|
+
databasePath: string;
|
|
9
|
+
/** Debounce time in milliseconds (default: 500ms) */
|
|
10
|
+
debounceMs?: number;
|
|
11
|
+
/** Optional path to denylist config */
|
|
12
|
+
configPath?: string;
|
|
13
|
+
/** Optional AbortSignal for graceful shutdown */
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Statistics tracked by the file watcher.
|
|
18
|
+
*/
|
|
19
|
+
export interface WatcherStatistics {
|
|
20
|
+
/** Total number of reindex operations completed */
|
|
21
|
+
reindexCount: number;
|
|
22
|
+
/** Duration of last reindex in milliseconds */
|
|
23
|
+
lastReindexDuration: number;
|
|
24
|
+
/** Number of file events currently queued */
|
|
25
|
+
queueDepth: number;
|
|
26
|
+
/** Timestamp of last reindex start */
|
|
27
|
+
lastReindexStart: number | null;
|
|
28
|
+
/** Timestamp of watcher start */
|
|
29
|
+
watcherStartTime: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* IndexWatcher monitors filesystem changes and triggers automatic reindexing.
|
|
33
|
+
*
|
|
34
|
+
* Features:
|
|
35
|
+
* - Debouncing: Aggregates rapid consecutive changes to minimize reindex operations
|
|
36
|
+
* - Denylist Integration: Respects both denylist.yml and .gitignore patterns
|
|
37
|
+
* - Lock Management: Prevents concurrent indexing using lock files
|
|
38
|
+
* - Graceful Shutdown: Supports AbortSignal for clean process termination
|
|
39
|
+
* - Statistics: Tracks reindex count, duration, and queue depth
|
|
40
|
+
*
|
|
41
|
+
* Implementation Note:
|
|
42
|
+
* Uses full reindex (not incremental) for simplicity and consistency.
|
|
43
|
+
* This approach ensures no stale data or broken dependencies.
|
|
44
|
+
*/
|
|
45
|
+
export declare class IndexWatcher {
|
|
46
|
+
private readonly options;
|
|
47
|
+
private watcher;
|
|
48
|
+
private reindexTimer;
|
|
49
|
+
private isReindexing;
|
|
50
|
+
private reindexPromise;
|
|
51
|
+
private pendingReindex;
|
|
52
|
+
private pendingFiles;
|
|
53
|
+
private readonly stats;
|
|
54
|
+
private readonly lockfilePath;
|
|
55
|
+
private isStopping;
|
|
56
|
+
constructor(options: IndexWatcherOptions);
|
|
57
|
+
/**
|
|
58
|
+
* Starts the file watcher and begins monitoring for changes.
|
|
59
|
+
*
|
|
60
|
+
* @throws {Error} If the watcher is already running
|
|
61
|
+
*/
|
|
62
|
+
start(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Schedules a reindex operation with debouncing.
|
|
65
|
+
*
|
|
66
|
+
* Multiple rapid changes are aggregated into a single reindex operation.
|
|
67
|
+
*
|
|
68
|
+
* @param event - Type of file event (add/change/unlink)
|
|
69
|
+
* @param path - Absolute path to the changed file
|
|
70
|
+
*/
|
|
71
|
+
private scheduleReindex;
|
|
72
|
+
/**
|
|
73
|
+
* Executes a full reindex operation.
|
|
74
|
+
*
|
|
75
|
+
* If a reindex is already in progress, marks a pending flag to trigger
|
|
76
|
+
* another reindex after the current one completes.
|
|
77
|
+
*/
|
|
78
|
+
private executeReindex;
|
|
79
|
+
/**
|
|
80
|
+
* Stops the file watcher and cleans up resources.
|
|
81
|
+
*
|
|
82
|
+
* Waits for any ongoing reindex to complete before stopping.
|
|
83
|
+
* Uses the reindex promise to ensure proper synchronization.
|
|
84
|
+
*/
|
|
85
|
+
stop(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Returns current watcher statistics.
|
|
88
|
+
*
|
|
89
|
+
* Useful for monitoring and diagnostics.
|
|
90
|
+
*/
|
|
91
|
+
getStatistics(): Readonly<WatcherStatistics>;
|
|
92
|
+
/**
|
|
93
|
+
* Checks if the watcher is currently running.
|
|
94
|
+
*/
|
|
95
|
+
isRunning(): boolean;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/indexer/watch.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAMtB;IACF,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,mBAAmB;IAiCxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C5B;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAmCvB;;;;;OAKG;YACW,cAAc;IAiG5B;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC3B;;;;OAIG;IACH,aAAa,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IAI5C;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { performance } from "node:perf_hooks";
|
|
3
|
+
import { watch } from "chokidar";
|
|
4
|
+
import { acquireLock, releaseLock, getLockOwner, LockfileError } from "../shared/utils/lockfile.js";
|
|
5
|
+
import { runIndexer } from "./cli.js";
|
|
6
|
+
import { createDenylistFilter } from "./pipeline/filters/denylist.js";
|
|
7
|
+
/**
|
|
8
|
+
* IndexWatcher monitors filesystem changes and triggers automatic reindexing.
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Debouncing: Aggregates rapid consecutive changes to minimize reindex operations
|
|
12
|
+
* - Denylist Integration: Respects both denylist.yml and .gitignore patterns
|
|
13
|
+
* - Lock Management: Prevents concurrent indexing using lock files
|
|
14
|
+
* - Graceful Shutdown: Supports AbortSignal for clean process termination
|
|
15
|
+
* - Statistics: Tracks reindex count, duration, and queue depth
|
|
16
|
+
*
|
|
17
|
+
* Implementation Note:
|
|
18
|
+
* Uses full reindex (not incremental) for simplicity and consistency.
|
|
19
|
+
* This approach ensures no stale data or broken dependencies.
|
|
20
|
+
*/
|
|
21
|
+
export class IndexWatcher {
|
|
22
|
+
options;
|
|
23
|
+
watcher = null;
|
|
24
|
+
reindexTimer = null;
|
|
25
|
+
isReindexing = false;
|
|
26
|
+
reindexPromise = null;
|
|
27
|
+
pendingReindex = false;
|
|
28
|
+
pendingFiles = new Set();
|
|
29
|
+
stats;
|
|
30
|
+
lockfilePath;
|
|
31
|
+
isStopping = false; // Flag to prevent new reindexes during shutdown
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.options = {
|
|
34
|
+
repoRoot: resolve(options.repoRoot),
|
|
35
|
+
databasePath: resolve(options.databasePath),
|
|
36
|
+
debounceMs: options.debounceMs ?? 500,
|
|
37
|
+
};
|
|
38
|
+
if (options.configPath) {
|
|
39
|
+
this.options.configPath = options.configPath;
|
|
40
|
+
}
|
|
41
|
+
if (options.signal) {
|
|
42
|
+
this.options.signal = options.signal;
|
|
43
|
+
}
|
|
44
|
+
this.lockfilePath = `${this.options.databasePath}.lock`;
|
|
45
|
+
this.stats = {
|
|
46
|
+
reindexCount: 0,
|
|
47
|
+
lastReindexDuration: 0,
|
|
48
|
+
queueDepth: 0,
|
|
49
|
+
lastReindexStart: null,
|
|
50
|
+
watcherStartTime: performance.now(),
|
|
51
|
+
};
|
|
52
|
+
// Handle abort signal if provided
|
|
53
|
+
if (this.options.signal) {
|
|
54
|
+
this.options.signal.addEventListener("abort", () => {
|
|
55
|
+
void this.stop();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Starts the file watcher and begins monitoring for changes.
|
|
61
|
+
*
|
|
62
|
+
* @throws {Error} If the watcher is already running
|
|
63
|
+
*/
|
|
64
|
+
async start() {
|
|
65
|
+
if (this.watcher !== null) {
|
|
66
|
+
throw new Error("IndexWatcher is already running. Call stop() before starting again.");
|
|
67
|
+
}
|
|
68
|
+
// Load denylist patterns
|
|
69
|
+
const denylistFilter = createDenylistFilter(this.options.repoRoot, this.options.configPath);
|
|
70
|
+
// Configure chokidar with denylist and editor-specific options
|
|
71
|
+
this.watcher = watch(this.options.repoRoot, {
|
|
72
|
+
persistent: true,
|
|
73
|
+
ignoreInitial: true, // Don't trigger on existing files
|
|
74
|
+
ignored: (path) => {
|
|
75
|
+
const relativePath = path.replace(this.options.repoRoot + "/", "");
|
|
76
|
+
return denylistFilter.isDenied(relativePath);
|
|
77
|
+
},
|
|
78
|
+
// Editor-specific handling
|
|
79
|
+
awaitWriteFinish: {
|
|
80
|
+
stabilityThreshold: 200, // Wait 200ms for file to stabilize
|
|
81
|
+
pollInterval: 100,
|
|
82
|
+
},
|
|
83
|
+
// Performance tuning
|
|
84
|
+
usePolling: false, // Use native OS events (faster)
|
|
85
|
+
// depth option omitted for no depth limit
|
|
86
|
+
});
|
|
87
|
+
// Register event handlers
|
|
88
|
+
this.watcher
|
|
89
|
+
.on("add", (path) => this.scheduleReindex("add", path))
|
|
90
|
+
.on("change", (path) => this.scheduleReindex("change", path))
|
|
91
|
+
.on("unlink", (path) => this.scheduleReindex("unlink", path))
|
|
92
|
+
.on("error", (error) => {
|
|
93
|
+
process.stderr.write(`ā File watcher error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
94
|
+
})
|
|
95
|
+
.on("ready", () => {
|
|
96
|
+
process.stderr.write(`šļø Watch mode started. Monitoring ${this.options.repoRoot} for changes...\n`);
|
|
97
|
+
process.stderr.write(` Debounce: ${this.options.debounceMs}ms\n`);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Schedules a reindex operation with debouncing.
|
|
102
|
+
*
|
|
103
|
+
* Multiple rapid changes are aggregated into a single reindex operation.
|
|
104
|
+
*
|
|
105
|
+
* @param event - Type of file event (add/change/unlink)
|
|
106
|
+
* @param path - Absolute path to the changed file
|
|
107
|
+
*/
|
|
108
|
+
scheduleReindex(event, path) {
|
|
109
|
+
// Don't schedule new reindexes if watcher is stopping
|
|
110
|
+
if (this.isStopping) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const relativePath = path.replace(this.options.repoRoot + "/", "");
|
|
114
|
+
this.pendingFiles.add(relativePath);
|
|
115
|
+
// Clear existing timer if present
|
|
116
|
+
if (this.reindexTimer !== null) {
|
|
117
|
+
clearTimeout(this.reindexTimer);
|
|
118
|
+
}
|
|
119
|
+
// Set new timer with debounce
|
|
120
|
+
this.reindexTimer = setTimeout(() => {
|
|
121
|
+
this.reindexTimer = null;
|
|
122
|
+
this.stats.queueDepth = this.pendingFiles.size;
|
|
123
|
+
// Log aggregated changes
|
|
124
|
+
const fileList = Array.from(this.pendingFiles).slice(0, 5).join(", ");
|
|
125
|
+
const moreCount = Math.max(0, this.pendingFiles.size - 5);
|
|
126
|
+
const summary = moreCount > 0 ? `${fileList} (+${moreCount} more)` : fileList;
|
|
127
|
+
process.stderr.write(`\nš File changes detected: ${summary}\n`);
|
|
128
|
+
// Clear pending files and trigger reindex
|
|
129
|
+
this.pendingFiles.clear();
|
|
130
|
+
void this.executeReindex();
|
|
131
|
+
}, this.options.debounceMs);
|
|
132
|
+
// Mark pending flag (used if reindex is already running)
|
|
133
|
+
this.pendingReindex = true;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Executes a full reindex operation.
|
|
137
|
+
*
|
|
138
|
+
* If a reindex is already in progress, marks a pending flag to trigger
|
|
139
|
+
* another reindex after the current one completes.
|
|
140
|
+
*/
|
|
141
|
+
async executeReindex() {
|
|
142
|
+
// Don't start reindex if watcher is stopping
|
|
143
|
+
if (this.isStopping) {
|
|
144
|
+
process.stderr.write(`š Watcher stopping. Skipping reindex.\n`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Check if already reindexing
|
|
148
|
+
if (this.isReindexing) {
|
|
149
|
+
process.stderr.write(`ā³ Reindex already in progress. Will reindex again after completion.\n`);
|
|
150
|
+
this.pendingReindex = true;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
this.isReindexing = true;
|
|
154
|
+
this.pendingReindex = false;
|
|
155
|
+
this.stats.lastReindexStart = performance.now();
|
|
156
|
+
// Create and store the reindex promise for proper shutdown handling
|
|
157
|
+
this.reindexPromise = (async () => {
|
|
158
|
+
try {
|
|
159
|
+
// Double-check stopping flag before acquiring lock
|
|
160
|
+
if (this.isStopping) {
|
|
161
|
+
process.stderr.write(`š Watcher stopping. Skipping reindex.\n`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// Acquire lock to prevent concurrent indexing
|
|
165
|
+
try {
|
|
166
|
+
acquireLock(this.lockfilePath);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error instanceof LockfileError) {
|
|
170
|
+
const ownerPid = error.ownerPid ?? getLockOwner(this.lockfilePath);
|
|
171
|
+
const ownerInfo = ownerPid ? ` (PID: ${ownerPid})` : "";
|
|
172
|
+
process.stderr.write(`ā ļø Another indexing process${ownerInfo} holds the lock. Skipping this reindex.\n`);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
// Run full reindex
|
|
178
|
+
const start = performance.now();
|
|
179
|
+
process.stderr.write(`š Reindexing ${this.options.repoRoot}...\n`);
|
|
180
|
+
await runIndexer({
|
|
181
|
+
repoRoot: this.options.repoRoot,
|
|
182
|
+
databasePath: this.options.databasePath,
|
|
183
|
+
full: true,
|
|
184
|
+
});
|
|
185
|
+
const duration = performance.now() - start;
|
|
186
|
+
this.stats.reindexCount++;
|
|
187
|
+
this.stats.lastReindexDuration = duration;
|
|
188
|
+
this.stats.queueDepth = 0;
|
|
189
|
+
process.stderr.write(`ā
Reindex complete in ${Math.round(duration)}ms\n`);
|
|
190
|
+
// Periodic statistics (every 10 reindexes)
|
|
191
|
+
if (this.stats.reindexCount % 10 === 0) {
|
|
192
|
+
const uptime = Math.round((performance.now() - this.stats.watcherStartTime) / 1000);
|
|
193
|
+
process.stderr.write(`š Watcher stats: ${this.stats.reindexCount} reindexes, ${uptime}s uptime\n`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
process.stderr.write(`ā Reindex failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
198
|
+
process.stderr.write(` Watch mode continues. Next change will trigger reindex.\n`);
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
this.isReindexing = false;
|
|
202
|
+
releaseLock(this.lockfilePath);
|
|
203
|
+
this.reindexPromise = null;
|
|
204
|
+
// Clear timer to prevent resource leak
|
|
205
|
+
if (this.reindexTimer !== null) {
|
|
206
|
+
clearTimeout(this.reindexTimer);
|
|
207
|
+
this.reindexTimer = null;
|
|
208
|
+
}
|
|
209
|
+
// If more changes occurred during reindex, schedule another one
|
|
210
|
+
if (this.pendingReindex) {
|
|
211
|
+
process.stderr.write(`š New changes detected during reindex. Scheduling another reindex...\n`);
|
|
212
|
+
this.scheduleReindex("batch", "(multiple files)");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
})();
|
|
216
|
+
await this.reindexPromise;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Stops the file watcher and cleans up resources.
|
|
220
|
+
*
|
|
221
|
+
* Waits for any ongoing reindex to complete before stopping.
|
|
222
|
+
* Uses the reindex promise to ensure proper synchronization.
|
|
223
|
+
*/
|
|
224
|
+
async stop() {
|
|
225
|
+
if (this.watcher === null) {
|
|
226
|
+
return; // Already stopped
|
|
227
|
+
}
|
|
228
|
+
process.stderr.write(`\nš Stopping watch mode...\n`);
|
|
229
|
+
// Set stopping flag FIRST to prevent new reindex operations
|
|
230
|
+
this.isStopping = true;
|
|
231
|
+
// Clear pending timer
|
|
232
|
+
if (this.reindexTimer !== null) {
|
|
233
|
+
clearTimeout(this.reindexTimer);
|
|
234
|
+
this.reindexTimer = null;
|
|
235
|
+
}
|
|
236
|
+
// Wait for ongoing reindex to complete using the promise
|
|
237
|
+
// This is more reliable than polling isReindexing flag
|
|
238
|
+
if (this.reindexPromise !== null) {
|
|
239
|
+
await this.reindexPromise;
|
|
240
|
+
}
|
|
241
|
+
// Close watcher
|
|
242
|
+
await this.watcher.close();
|
|
243
|
+
this.watcher = null;
|
|
244
|
+
// Print final statistics
|
|
245
|
+
const uptime = Math.round((performance.now() - this.stats.watcherStartTime) / 1000);
|
|
246
|
+
process.stderr.write(`š Final stats: ${this.stats.reindexCount} reindexes, ${uptime}s uptime\n`);
|
|
247
|
+
process.stderr.write(`ā
Watch mode stopped.\n`);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Returns current watcher statistics.
|
|
251
|
+
*
|
|
252
|
+
* Useful for monitoring and diagnostics.
|
|
253
|
+
*/
|
|
254
|
+
getStatistics() {
|
|
255
|
+
return { ...this.stats };
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Checks if the watcher is currently running.
|
|
259
|
+
*/
|
|
260
|
+
isRunning() {
|
|
261
|
+
return this.watcher !== null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/indexer/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEpG,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAkCtE;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,YAAY;IACN,OAAO,CAMtB;IACM,OAAO,GAAqB,IAAI,CAAC;IACjC,YAAY,GAA0B,IAAI,CAAC;IAC3C,YAAY,GAAG,KAAK,CAAC;IACrB,cAAc,GAAyB,IAAI,CAAC;IAC5C,cAAc,GAAG,KAAK,CAAC;IACvB,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACxB,KAAK,CAAoB;IACzB,YAAY,CAAS;IAC9B,UAAU,GAAG,KAAK,CAAC,CAAC,gDAAgD;IAE5E,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;YAC3C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,GAAG;SACtC,CAAC;QAEF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAC/C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,OAAO,CAAC;QAExD,IAAI,CAAC,KAAK,GAAG;YACX,YAAY,EAAE,CAAC;YACf,mBAAmB,EAAE,CAAC;YACtB,UAAU,EAAE,CAAC;YACb,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,WAAW,CAAC,GAAG,EAAE;SACpC,CAAC;QAEF,kCAAkC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACjD,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACzF,CAAC;QAED,yBAAyB;QACzB,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE5F,+DAA+D;QAC/D,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC1C,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI,EAAE,kCAAkC;YACvD,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;gBACxB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;gBACnE,OAAO,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC/C,CAAC;YACD,2BAA2B;YAC3B,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG,EAAE,mCAAmC;gBAC5D,YAAY,EAAE,GAAG;aAClB;YACD,qBAAqB;YACrB,UAAU,EAAE,KAAK,EAAE,gCAAgC;YACnD,0CAA0C;SAC3C,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,CAAC,OAAO;aACT,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aACtD,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;aAC5D,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;aAC5D,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CACpF,CAAC;QACJ,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,IAAI,CAAC,OAAO,CAAC,QAAQ,mBAAmB,CAChF,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,UAAU,MAAM,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;OAOG;IACK,eAAe,CAAC,KAAa,EAAE,IAAY;QACjD,sDAAsD;QACtD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAEpC,kCAAkC;QAClC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAE/C,yBAAyB;YACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,SAAS,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YAE9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,OAAO,IAAI,CAAC,CAAC;YAEjE,0CAA0C;YAC1C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE5B,yDAAyD;QACzD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,cAAc;QAC1B,6CAA6C;QAC7C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uEAAuE,CACxE,CAAC;YACF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEhD,oEAAoE;QACpE,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC;gBACH,mDAAmD;gBACnD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBACjE,OAAO;gBACT,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,CAAC;oBACH,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACjC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;wBACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBACnE,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+BAA+B,SAAS,2CAA2C,CACpF,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,mBAAmB;gBACnB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,QAAQ,OAAO,CAAC,CAAC;gBAEpE,MAAM,UAAU,CAAC;oBACf,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;oBAC/B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;oBACvC,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;gBAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,QAAQ,CAAC;gBAC1C,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;gBAE1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAE1E,2CAA2C;gBAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;oBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC;oBACpF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,IAAI,CAAC,KAAK,CAAC,YAAY,eAAe,MAAM,YAAY,CAC9E,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAChF,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YACvF,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAE3B,uCAAuC;gBACvC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;oBAC/B,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC3B,CAAC;gBAED,gEAAgE;gBAChE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yEAAyE,CAC1E,CAAC;oBACF,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,kBAAkB;QAC5B,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAEtD,4DAA4D;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,sBAAsB;QACtB,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,yDAAyD;QACzD,uDAAuD;QACvD,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,cAAc,CAAC;QAC5B,CAAC;QAED,gBAAgB;QAChB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,yBAAyB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC;QACpF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mBAAmB,IAAI,CAAC,KAAK,CAAC,YAAY,eAAe,MAAM,YAAY,CAC5E,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAClD,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { evaluateSecurityStatus } from "../shared/security/config.js";
|
|
2
|
+
export interface BootstrapOptions {
|
|
3
|
+
securityConfigPath?: string;
|
|
4
|
+
securityLockPath?: string;
|
|
5
|
+
allowWriteLock?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface BootstrapReport {
|
|
8
|
+
security: ReturnType<typeof evaluateSecurityStatus>;
|
|
9
|
+
}
|
|
10
|
+
export declare function bootstrapServer(options?: BootstrapOptions): BootstrapReport;
|
|
11
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/server/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAEvB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CACrD;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAgB/E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { assertSecurityBaseline, evaluateSecurityStatus, updateSecurityLock, } from "../shared/security/config.js";
|
|
2
|
+
export function bootstrapServer(options = {}) {
|
|
3
|
+
const security = evaluateSecurityStatus(options.securityConfigPath, options.securityLockPath);
|
|
4
|
+
if (!security.matches) {
|
|
5
|
+
if (!security.lockHash && options.allowWriteLock) {
|
|
6
|
+
updateSecurityLock(security.hash, options.securityLockPath);
|
|
7
|
+
return {
|
|
8
|
+
security: {
|
|
9
|
+
...security,
|
|
10
|
+
lockHash: security.hash,
|
|
11
|
+
matches: true,
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
assertSecurityBaseline(options.securityConfigPath, options.securityLockPath);
|
|
16
|
+
}
|
|
17
|
+
return { security };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/server/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAYtC,MAAM,UAAU,eAAe,CAAC,UAA4B,EAAE;IAC5D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9F,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACjD,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC5D,OAAO;gBACL,QAAQ,EAAE;oBACR,GAAG,QAAQ;oBACX,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,OAAO,EAAE,IAAI;iBACd;aACF,CAAC;QACJ,CAAC;QACD,sBAAsB,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,YAAY,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH"}
|