kiri-mcp-server 0.10.0 → 0.11.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.
Files changed (86) hide show
  1. package/README.md +10 -1
  2. package/config/scoring-profiles.yml +82 -35
  3. package/dist/config/scoring-profiles.yml +82 -35
  4. package/dist/package.json +9 -1
  5. package/dist/src/indexer/cli.d.ts.map +1 -1
  6. package/dist/src/indexer/cli.js +712 -98
  7. package/dist/src/indexer/cli.js.map +1 -1
  8. package/dist/src/indexer/git.d.ts.map +1 -1
  9. package/dist/src/indexer/git.js +41 -3
  10. package/dist/src/indexer/git.js.map +1 -1
  11. package/dist/src/indexer/migrations/repo-merger.d.ts +33 -0
  12. package/dist/src/indexer/migrations/repo-merger.d.ts.map +1 -0
  13. package/dist/src/indexer/migrations/repo-merger.js +67 -0
  14. package/dist/src/indexer/migrations/repo-merger.js.map +1 -0
  15. package/dist/src/indexer/schema.d.ts +66 -0
  16. package/dist/src/indexer/schema.d.ts.map +1 -1
  17. package/dist/src/indexer/schema.js +337 -0
  18. package/dist/src/indexer/schema.js.map +1 -1
  19. package/dist/src/server/boost-profiles.d.ts +1 -1
  20. package/dist/src/server/boost-profiles.d.ts.map +1 -1
  21. package/dist/src/server/boost-profiles.js +116 -0
  22. package/dist/src/server/boost-profiles.js.map +1 -1
  23. package/dist/src/server/config.d.ts +45 -0
  24. package/dist/src/server/config.d.ts.map +1 -0
  25. package/dist/src/server/config.js +146 -0
  26. package/dist/src/server/config.js.map +1 -0
  27. package/dist/src/server/context.d.ts +29 -0
  28. package/dist/src/server/context.d.ts.map +1 -1
  29. package/dist/src/server/context.js +26 -1
  30. package/dist/src/server/context.js.map +1 -1
  31. package/dist/src/server/handlers/snippets-get.d.ts +36 -0
  32. package/dist/src/server/handlers/snippets-get.d.ts.map +1 -0
  33. package/dist/src/server/handlers/snippets-get.js +120 -0
  34. package/dist/src/server/handlers/snippets-get.js.map +1 -0
  35. package/dist/src/server/handlers.d.ts +32 -20
  36. package/dist/src/server/handlers.d.ts.map +1 -1
  37. package/dist/src/server/handlers.js +1554 -338
  38. package/dist/src/server/handlers.js.map +1 -1
  39. package/dist/src/server/indexBootstrap.d.ts.map +1 -1
  40. package/dist/src/server/indexBootstrap.js +49 -2
  41. package/dist/src/server/indexBootstrap.js.map +1 -1
  42. package/dist/src/server/main.d.ts.map +1 -1
  43. package/dist/src/server/main.js +7 -0
  44. package/dist/src/server/main.js.map +1 -1
  45. package/dist/src/server/profile-selector.d.ts +33 -0
  46. package/dist/src/server/profile-selector.d.ts.map +1 -0
  47. package/dist/src/server/profile-selector.js +291 -0
  48. package/dist/src/server/profile-selector.js.map +1 -0
  49. package/dist/src/server/rpc.d.ts.map +1 -1
  50. package/dist/src/server/rpc.js +36 -6
  51. package/dist/src/server/rpc.js.map +1 -1
  52. package/dist/src/server/runtime.d.ts.map +1 -1
  53. package/dist/src/server/runtime.js +14 -4
  54. package/dist/src/server/runtime.js.map +1 -1
  55. package/dist/src/server/scoring.d.ts +7 -1
  56. package/dist/src/server/scoring.d.ts.map +1 -1
  57. package/dist/src/server/scoring.js +121 -21
  58. package/dist/src/server/scoring.js.map +1 -1
  59. package/dist/src/server/services/index.d.ts +24 -0
  60. package/dist/src/server/services/index.d.ts.map +1 -0
  61. package/dist/src/server/services/index.js +20 -0
  62. package/dist/src/server/services/index.js.map +1 -0
  63. package/dist/src/server/services/repo-repository.d.ts +61 -0
  64. package/dist/src/server/services/repo-repository.d.ts.map +1 -0
  65. package/dist/src/server/services/repo-repository.js +93 -0
  66. package/dist/src/server/services/repo-repository.js.map +1 -0
  67. package/dist/src/server/services/repo-resolver.d.ts +28 -0
  68. package/dist/src/server/services/repo-resolver.d.ts.map +1 -0
  69. package/dist/src/server/services/repo-resolver.js +62 -0
  70. package/dist/src/server/services/repo-resolver.js.map +1 -0
  71. package/dist/src/shared/duckdb.d.ts.map +1 -1
  72. package/dist/src/shared/duckdb.js +21 -1
  73. package/dist/src/shared/duckdb.js.map +1 -1
  74. package/dist/src/shared/fs/safePath.d.ts +7 -0
  75. package/dist/src/shared/fs/safePath.d.ts.map +1 -0
  76. package/dist/src/shared/fs/safePath.js +23 -0
  77. package/dist/src/shared/fs/safePath.js.map +1 -0
  78. package/dist/src/shared/utils/glob.d.ts +5 -0
  79. package/dist/src/shared/utils/glob.d.ts.map +1 -0
  80. package/dist/src/shared/utils/glob.js +22 -0
  81. package/dist/src/shared/utils/glob.js.map +1 -0
  82. package/dist/src/shared/utils/retry.d.ts +8 -0
  83. package/dist/src/shared/utils/retry.d.ts.map +1 -0
  84. package/dist/src/shared/utils/retry.js +20 -0
  85. package/dist/src/shared/utils/retry.js.map +1 -0
  86. package/package.json +28 -22
@@ -0,0 +1,146 @@
1
+ import process from "node:process";
2
+ let cachedConfig = null;
3
+ function envFlagEnabled(value, defaultEnabled) {
4
+ if (value === undefined) {
5
+ return defaultEnabled;
6
+ }
7
+ const normalized = value.trim().toLowerCase();
8
+ return normalized !== "0" && normalized !== "false" && normalized !== "off";
9
+ }
10
+ function parseEnvNumber(value, fallback) {
11
+ if (value === undefined) {
12
+ return fallback;
13
+ }
14
+ const parsed = Number.parseInt(value, 10);
15
+ if (Number.isFinite(parsed) && parsed >= 0) {
16
+ return parsed;
17
+ }
18
+ return fallback;
19
+ }
20
+ function parseEnvFloat(value, fallback) {
21
+ if (value === undefined) {
22
+ return fallback;
23
+ }
24
+ const parsed = Number.parseFloat(value);
25
+ if (Number.isFinite(parsed)) {
26
+ return parsed;
27
+ }
28
+ return fallback;
29
+ }
30
+ function validateServerConfig(config) {
31
+ const { features, hints, penalties } = config;
32
+ if (features.snippetWindow < 8) {
33
+ throw new Error("snippetWindow must be >= 8 to keep bundle context useful");
34
+ }
35
+ if (hints.priority.textMultiplier <= 0 || hints.priority.pathMultiplier <= 0) {
36
+ throw new Error("Hint priority multipliers must be positive numbers");
37
+ }
38
+ if (hints.priority.baseBonus <= 0) {
39
+ throw new Error("Hint priority base bonus must be positive");
40
+ }
41
+ if (hints.directory.limit < 0 || hints.directory.maxFiles < 1) {
42
+ throw new Error("Directory hint limits must be non-negative and maxFiles >= 1");
43
+ }
44
+ if (hints.dependency.outLimit < 0 || hints.dependency.inLimit < 0) {
45
+ throw new Error("Dependency hint limits must be non-negative");
46
+ }
47
+ if (hints.semantic.limit < 0 || hints.semantic.dirCandidateLimit < 1) {
48
+ throw new Error("Semantic hint limits must be non-negative and candidate limit >= 1");
49
+ }
50
+ if (hints.semantic.threshold <= 0 || hints.semantic.threshold > 1) {
51
+ throw new Error("Semantic hint threshold must be within (0, 1]");
52
+ }
53
+ if (hints.perHintLimit < 0) {
54
+ throw new Error("Per-hint limit must be >= 0");
55
+ }
56
+ if (hints.enabled && hints.perHintLimit < 1) {
57
+ throw new Error("Per-hint limit must be >= 1 when hints are enabled");
58
+ }
59
+ if (hints.dbQueryLimit < 0) {
60
+ throw new Error("Hint DB query budget must be >= 0");
61
+ }
62
+ if (hints.enabled && hints.dbQueryLimit < 1) {
63
+ throw new Error("Hint DB query budget must be >= 1 when hints are enabled");
64
+ }
65
+ if (hints.substring.limit < 0) {
66
+ throw new Error("Substring hint limit must be non-negative");
67
+ }
68
+ if (penalties.pathMissDelta > 0 || penalties.largeFileDelta > 0) {
69
+ throw new Error("Penalty deltas should be <= 0 (they reduce scores)");
70
+ }
71
+ }
72
+ export function loadServerConfig() {
73
+ if (cachedConfig) {
74
+ return cachedConfig;
75
+ }
76
+ const suppressNonCode = envFlagEnabled(process.env.KIRI_SUPPRESS_NON_CODE, true);
77
+ const suppressFinalResults = envFlagEnabled(process.env.KIRI_SUPPRESS_FINAL_RESULTS, true);
78
+ const clampSnippets = envFlagEnabled(process.env.KIRI_CLAMP_SNIPPETS, true);
79
+ const snippetWindow = Math.max(8, parseEnvNumber(process.env.KIRI_SNIPPET_WINDOW, 16));
80
+ const directoryEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_DIR, false);
81
+ const dependencyEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_DEP, false);
82
+ const semanticEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_SEM, false);
83
+ const substringEnabled = envFlagEnabled(process.env.KIRI_HINT_ENABLE_SUBSTRING, true);
84
+ const hintsEnabled = directoryEnabled || dependencyEnabled || semanticEnabled;
85
+ const config = {
86
+ features: {
87
+ suppressNonCode,
88
+ suppressFinalResults,
89
+ clampSnippets,
90
+ snippetWindow,
91
+ },
92
+ hints: {
93
+ enabled: hintsEnabled,
94
+ priority: {
95
+ textMultiplier: parseEnvFloat(process.env.KIRI_HINT_TEXT_MULTIPLIER, 6),
96
+ pathMultiplier: parseEnvFloat(process.env.KIRI_HINT_PATH_MULTIPLIER, 2),
97
+ baseBonus: parseEnvFloat(process.env.KIRI_HINT_BASE_BONUS, 5),
98
+ },
99
+ directory: {
100
+ enabled: directoryEnabled,
101
+ limit: directoryEnabled
102
+ ? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_NEAR_LIMIT_DIR, 2))
103
+ : 0,
104
+ maxFiles: Math.max(1, parseEnvNumber(process.env.KIRI_HINT_NEAR_MAX_FILES, 10)),
105
+ },
106
+ dependency: {
107
+ enabled: dependencyEnabled,
108
+ outLimit: dependencyEnabled
109
+ ? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_DEP_OUT_LIMIT, 1))
110
+ : 0,
111
+ inLimit: dependencyEnabled
112
+ ? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_DEP_IN_LIMIT, 1))
113
+ : 0,
114
+ },
115
+ semantic: {
116
+ enabled: semanticEnabled,
117
+ limit: semanticEnabled
118
+ ? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_SEM_LIMIT, 2))
119
+ : 0,
120
+ dirCandidateLimit: Math.max(1, parseEnvNumber(process.env.KIRI_HINT_SEM_DIR_CANDIDATES, 20)),
121
+ threshold: parseEnvFloat(process.env.KIRI_HINT_SEM_THRESHOLD, 0.65),
122
+ },
123
+ substring: {
124
+ enabled: substringEnabled,
125
+ limit: substringEnabled
126
+ ? Math.max(0, parseEnvNumber(process.env.KIRI_HINT_SUBSTRING_LIMIT, 3))
127
+ : 0,
128
+ boost: parseEnvFloat(process.env.KIRI_HINT_SUBSTRING_BOOST, 3),
129
+ },
130
+ perHintLimit: hintsEnabled
131
+ ? Math.max(1, parseEnvNumber(process.env.KIRI_HINT_PER_HINT_LIMIT, 6))
132
+ : 0,
133
+ dbQueryLimit: hintsEnabled
134
+ ? Math.max(1, parseEnvNumber(process.env.KIRI_HINT_DB_QUERY_LIMIT, 12))
135
+ : 0,
136
+ },
137
+ penalties: {
138
+ pathMissDelta: parseEnvFloat(process.env.KIRI_PATH_MISS_DELTA, -0.5),
139
+ largeFileDelta: parseEnvFloat(process.env.KIRI_LARGE_FILE_DELTA, -0.8),
140
+ },
141
+ };
142
+ validateServerConfig(config);
143
+ cachedConfig = config;
144
+ return config;
145
+ }
146
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/server/config.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,47 @@
1
1
  import { DuckDBClient } from "../shared/duckdb.js";
2
2
  import { WarningManager } from "./rpc.js";
3
+ import { ServerServices } from "./services/index.js";
3
4
  export interface FtsStatusCache {
4
5
  ready: boolean;
5
6
  schemaExists: boolean;
6
7
  anyDirty: boolean;
7
8
  lastChecked: number;
8
9
  }
10
+ export interface TableAvailability {
11
+ hasMetadataTables: boolean;
12
+ hasLinkTable: boolean;
13
+ hasHintLog: boolean;
14
+ hasHintDictionary: boolean;
15
+ }
9
16
  export interface ServerContext {
10
17
  db: DuckDBClient;
11
18
  repoId: number;
19
+ services: ServerServices;
12
20
  features?: {
13
21
  fts?: boolean;
14
22
  };
15
23
  ftsStatusCache?: FtsStatusCache;
24
+ tableAvailability: TableAvailability;
16
25
  warningManager: WarningManager;
17
26
  }
27
+ /**
28
+ * createServerContext
29
+ *
30
+ * ServerContext を生成するファクトリ関数。
31
+ * テストや複数のエントリポイントで共通の初期化パスを提供する。
32
+ *
33
+ * @param options - コンテキスト初期化オプション
34
+ * @returns 初期化された ServerContext
35
+ */
36
+ export declare function createServerContext(options: {
37
+ db: DuckDBClient;
38
+ repoId: number;
39
+ services: ServerServices;
40
+ features?: {
41
+ fts?: boolean;
42
+ };
43
+ ftsStatusCache?: FtsStatusCache;
44
+ tableAvailability: TableAvailability;
45
+ warningManager: WarningManager;
46
+ }): ServerContext;
18
47
  //# sourceMappingURL=context.d.ts.map
@@ -1 +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,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,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;IACF,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,EAAE,cAAc,CAAC;CAChC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,YAAY,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,cAAc,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,EAAE,EAAE,YAAY,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,cAAc,CAAC;CAChC,GAAG,aAAa,CAmBhB"}
@@ -1,2 +1,27 @@
1
- export {};
1
+ /**
2
+ * createServerContext
3
+ *
4
+ * ServerContext を生成するファクトリ関数。
5
+ * テストや複数のエントリポイントで共通の初期化パスを提供する。
6
+ *
7
+ * @param options - コンテキスト初期化オプション
8
+ * @returns 初期化された ServerContext
9
+ */
10
+ export function createServerContext(options) {
11
+ const context = {
12
+ db: options.db,
13
+ repoId: options.repoId,
14
+ services: options.services,
15
+ tableAvailability: options.tableAvailability,
16
+ warningManager: options.warningManager,
17
+ };
18
+ // exactOptionalPropertyTypes: true を満たすため、undefined の場合は代入しない
19
+ if (options.features !== undefined) {
20
+ context.features = options.features;
21
+ }
22
+ if (options.ftsStatusCache !== undefined) {
23
+ context.ftsStatusCache = options.ftsStatusCache;
24
+ }
25
+ return context;
26
+ }
2
27
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AA+BA;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAQnC;IACC,MAAM,OAAO,GAAkB;QAC7B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;IAEF,8DAA8D;IAC9D,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAClD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { ServerContext } from "../context.js";
2
+ /**
3
+ * snippets_get tool のパラメータ
4
+ */
5
+ export interface SnippetsGetParams {
6
+ path: string;
7
+ start_line?: number;
8
+ end_line?: number;
9
+ compact?: boolean;
10
+ includeLineNumbers?: boolean;
11
+ }
12
+ /**
13
+ * snippets_get tool のレスポンス
14
+ */
15
+ export interface SnippetResult {
16
+ path: string;
17
+ startLine: number;
18
+ endLine: number;
19
+ content?: string;
20
+ totalLines: number;
21
+ symbolName: string | null;
22
+ symbolKind: string | null;
23
+ }
24
+ /**
25
+ * snippets_get MCP Tool Handler
26
+ *
27
+ * 指定されたファイルパスから、シンボル境界を考慮したコードスニペットを取得する。
28
+ * start_line/end_line が指定されていない場合、最適なシンボル(関数、クラスなど)を自動選択する。
29
+ *
30
+ * @param context - サーバーコンテキスト(DB、repoId等)
31
+ * @param params - snippets_get パラメータ
32
+ * @returns スニペット結果
33
+ * @throws Error ファイルが見つからない、バイナリファイル、コンテンツが利用不可の場合
34
+ */
35
+ export declare function snippetsGet(context: ServerContext, params: SnippetsGetParams): Promise<SnippetResult>;
36
+ //# sourceMappingURL=snippets-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippets-get.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAmDD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,aAAa,CAAC,CAmHxB"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Constants
3
+ */
4
+ const DEFAULT_SNIPPET_WINDOW = 150;
5
+ /**
6
+ * 行番号をプレフィックスとして追加する(動的幅調整)
7
+ *
8
+ * @param snippet - スニペットの内容
9
+ * @param startLine - 開始行番号(1-indexed)
10
+ * @returns 行番号付きスニペット
11
+ */
12
+ function prependLineNumbers(snippet, startLine) {
13
+ const lines = snippet.split(/\r?\n/);
14
+ if (lines.length === 0) {
15
+ return snippet;
16
+ }
17
+ // Calculate required width from the last line number (dynamic sizing)
18
+ const endLine = startLine + lines.length - 1;
19
+ const width = String(endLine).length;
20
+ return lines
21
+ .map((line, index) => `${String(startLine + index).padStart(width, " ")}→${line}`)
22
+ .join("\n");
23
+ }
24
+ /**
25
+ * snippets_get MCP Tool Handler
26
+ *
27
+ * 指定されたファイルパスから、シンボル境界を考慮したコードスニペットを取得する。
28
+ * start_line/end_line が指定されていない場合、最適なシンボル(関数、クラスなど)を自動選択する。
29
+ *
30
+ * @param context - サーバーコンテキスト(DB、repoId等)
31
+ * @param params - snippets_get パラメータ
32
+ * @returns スニペット結果
33
+ * @throws Error ファイルが見つからない、バイナリファイル、コンテンツが利用不可の場合
34
+ */
35
+ export async function snippetsGet(context, params) {
36
+ const { db, repoId } = context;
37
+ if (!params.path) {
38
+ throw new Error("snippets_get requires a file path. Specify a tracked text file path to continue.");
39
+ }
40
+ const rows = await db.all(`
41
+ SELECT f.path, f.lang, f.ext, f.is_binary, b.content
42
+ FROM file f
43
+ JOIN blob b ON b.hash = f.blob_hash
44
+ WHERE f.repo_id = ? AND f.path = ?
45
+ LIMIT 1
46
+ `, [repoId, params.path]);
47
+ if (rows.length === 0) {
48
+ throw new Error(`Requested snippet file ${params.path} was not indexed. Re-run the indexer or choose another path.`);
49
+ }
50
+ const row = rows[0];
51
+ if (!row) {
52
+ throw new Error(`Requested snippet file ${params.path} was not indexed. Re-run the indexer or choose another path.`);
53
+ }
54
+ if (row.is_binary) {
55
+ throw new Error("Binary snippets are not supported. Choose a text file to preview its content.");
56
+ }
57
+ if (row.content === null) {
58
+ throw new Error(`Snippet content was NULL for ${params.path}. Re-run the indexer with --full to repopulate blob content.`);
59
+ }
60
+ const lines = row.content.split(/\r?\n/);
61
+ const totalLines = lines.length;
62
+ const snippetRows = await db.all(`
63
+ SELECT s.snippet_id, s.start_line, s.end_line, s.symbol_id, sym.name AS symbol_name, sym.kind AS symbol_kind
64
+ FROM snippet s
65
+ LEFT JOIN symbol sym
66
+ ON sym.repo_id = s.repo_id
67
+ AND sym.path = s.path
68
+ AND sym.symbol_id = s.symbol_id
69
+ WHERE s.repo_id = ? AND s.path = ?
70
+ ORDER BY s.start_line
71
+ `, [repoId, params.path]);
72
+ const requestedStart = params.start_line ?? 1;
73
+ const requestedEnd = params.end_line ?? Math.min(totalLines, requestedStart + DEFAULT_SNIPPET_WINDOW - 1);
74
+ const useSymbolSnippets = snippetRows.length > 0 && params.end_line === undefined;
75
+ let snippetSelection = null;
76
+ if (useSymbolSnippets) {
77
+ snippetSelection =
78
+ snippetRows.find((snippet) => requestedStart >= snippet.start_line && requestedStart <= snippet.end_line) ?? null;
79
+ if (!snippetSelection) {
80
+ const firstSnippet = snippetRows[0];
81
+ if (firstSnippet && requestedStart < firstSnippet.start_line) {
82
+ snippetSelection = firstSnippet;
83
+ }
84
+ else {
85
+ snippetSelection = snippetRows[snippetRows.length - 1] ?? null;
86
+ }
87
+ }
88
+ }
89
+ let startLine;
90
+ let endLine;
91
+ let symbolName = null;
92
+ let symbolKind = null;
93
+ if (snippetSelection) {
94
+ startLine = snippetSelection.start_line;
95
+ endLine = snippetSelection.end_line;
96
+ symbolName = snippetSelection.symbol_name;
97
+ symbolKind = snippetSelection.symbol_kind;
98
+ }
99
+ else {
100
+ startLine = Math.max(1, Math.min(totalLines, requestedStart));
101
+ endLine = Math.max(startLine, Math.min(totalLines, requestedEnd));
102
+ }
103
+ const isCompact = params.compact === true;
104
+ const addLineNumbers = params.includeLineNumbers === true && !isCompact;
105
+ let content;
106
+ if (!isCompact) {
107
+ const snippetContent = lines.slice(startLine - 1, endLine).join("\n");
108
+ content = addLineNumbers ? prependLineNumbers(snippetContent, startLine) : snippetContent;
109
+ }
110
+ return {
111
+ path: row.path,
112
+ startLine,
113
+ endLine,
114
+ ...(content !== undefined && { content }),
115
+ totalLines,
116
+ symbolName,
117
+ symbolKind,
118
+ };
119
+ }
120
+ //# sourceMappingURL=snippets-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippets-get.js","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"AAkDA;;GAEG;AACH,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,OAAe,EAAE,SAAiB;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,sEAAsE;IACtE,MAAM,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;SACjF,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAsB,EACtB,MAAyB;IAEzB,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,CACvB;;;;;;KAMC,EACD,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM,CAAC,IAAI,8DAA8D,CACpG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM,CAAC,IAAI,8DAA8D,CACpG,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,gCAAgC,MAAM,CAAC,IAAI,8DAA8D,CAC1G,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,GAAG,CAC9B;;;;;;;;;KASC,EACD,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAChB,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,GAAG,sBAAsB,GAAG,CAAC,CAAC,CAAC;IAEvF,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC;IAElF,IAAI,gBAAgB,GAAsB,IAAI,CAAC;IAC/C,IAAI,iBAAiB,EAAE,CAAC;QACtB,gBAAgB;YACd,WAAW,CAAC,IAAI,CACd,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,IAAI,OAAO,CAAC,UAAU,IAAI,cAAc,IAAI,OAAO,CAAC,QAAQ,CACxF,IAAI,IAAI,CAAC;QACZ,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,YAAY,IAAI,cAAc,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;gBAC7D,gBAAgB,GAAG,YAAY,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,SAAiB,CAAC;IACtB,IAAI,OAAe,CAAC;IACpB,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,IAAI,gBAAgB,EAAE,CAAC;QACrB,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC;QACxC,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC;QACpC,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC;QAC1C,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;QAC9D,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC;IAExE,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAC5F,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS;QACT,OAAO;QACP,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;QACzC,UAAU;QACV,UAAU;QACV,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -1,6 +1,21 @@
1
1
  import { DuckDBClient } from "../shared/duckdb.js";
2
2
  import { type BoostProfileName } from "./boost-profiles.js";
3
- import { ServerContext } from "./context.js";
3
+ import { ServerContext, TableAvailability } from "./context.js";
4
+ import { ServerServices } from "./services/index.js";
5
+ export { snippetsGet, type SnippetsGetParams, type SnippetResult, } from "./handlers/snippets-get.js";
6
+ /**
7
+ * checkTableAvailability
8
+ *
9
+ * 起動時にテーブルの存在を確認し、TableAvailabilityオブジェクトを生成する。
10
+ * これにより、グローバルミュータブル変数による競合状態を回避する。
11
+ *
12
+ * NOTE: スキーマ変更(テーブル追加)後はサーバーの再起動が必要です。
13
+ *
14
+ * @param db - DuckDBClient インスタンス
15
+ * @returns TableAvailability オブジェクト
16
+ * @throws データベース接続エラー等、テーブル不在以外のエラーが発生した場合
17
+ */
18
+ export declare function checkTableAvailability(db: DuckDBClient): Promise<TableAvailability>;
4
19
  export interface FilesSearchParams {
5
20
  query: string;
6
21
  lang?: string;
@@ -9,6 +24,7 @@ export interface FilesSearchParams {
9
24
  limit?: number;
10
25
  boost_profile?: BoostProfileName;
11
26
  compact?: boolean;
27
+ metadata_filters?: Record<string, string | string[]>;
12
28
  }
13
29
  export interface FilesSearchResult {
14
30
  path: string;
@@ -18,26 +34,11 @@ export interface FilesSearchResult {
18
34
  ext: string | null;
19
35
  score: number;
20
36
  }
21
- export interface SnippetsGetParams {
22
- path: string;
23
- start_line?: number;
24
- end_line?: number;
25
- compact?: boolean;
26
- includeLineNumbers?: boolean;
27
- }
28
- export interface SnippetResult {
29
- path: string;
30
- startLine: number;
31
- endLine: number;
32
- content?: string;
33
- totalLines: number;
34
- symbolName: string | null;
35
- symbolKind: string | null;
36
- }
37
37
  export interface ContextBundleArtifacts {
38
38
  editing_path?: string;
39
39
  failing_tests?: string[];
40
40
  last_diff?: string;
41
+ hints?: string[];
41
42
  }
42
43
  export interface ContextBundleParams {
43
44
  goal: string;
@@ -47,6 +48,7 @@ export interface ContextBundleParams {
47
48
  boost_profile?: BoostProfileName;
48
49
  compact?: boolean;
49
50
  includeTokensEstimate?: boolean;
51
+ metadata_filters?: Record<string, string | string[]>;
50
52
  }
51
53
  export interface ContextBundleItem {
52
54
  path: string;
@@ -104,9 +106,19 @@ export interface DepsClosureResult {
104
106
  edges: DepsClosureEdge[];
105
107
  }
106
108
  export declare function filesSearch(context: ServerContext, params: FilesSearchParams): Promise<FilesSearchResult[]>;
107
- export declare function snippetsGet(context: ServerContext, params: SnippetsGetParams): Promise<SnippetResult>;
108
- export declare function contextBundle(context: ServerContext, params: ContextBundleParams): Promise<ContextBundleResult>;
109
109
  export declare function semanticRerank(context: ServerContext, params: SemanticRerankParams): Promise<SemanticRerankResult>;
110
110
  export declare function depsClosure(context: ServerContext, params: DepsClosureParams): Promise<DepsClosureResult>;
111
- export declare function resolveRepoId(db: DuckDBClient, repoRoot: string): Promise<number>;
111
+ /**
112
+ * リポジトリのrootパスをデータベースIDに解決する。
113
+ *
114
+ * この関数は下位互換性のために保持されているが、内部的には新しいRepoResolverを使用する。
115
+ *
116
+ * @param db - DuckDBクライアント
117
+ * @param repoRoot - リポジトリのrootパス
118
+ * @param services - オプショナルなServerServices(指定がなければ新規作成される)
119
+ * @returns リポジトリID
120
+ * @throws Error リポジトリがインデックスされていない場合
121
+ */
122
+ export declare function resolveRepoId(db: DuckDBClient, repoRoot: string, services?: ServerServices): Promise<number>;
123
+ export declare function contextBundle(context: ServerContext, params: ContextBundleParams): Promise<ContextBundleResult>;
112
124
  //# sourceMappingURL=handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,aAAa,EAAE,MAAM,cAAc,CAAC;AA+P7D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,4BAA4B,EAAE,CAAC;IAC3C,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAwJD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAq+BD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4I9B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,aAAa,CAAC,CAiHxB;AAuSD,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAwe9B;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA+E/B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAuJ5B;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCvF"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers.ts"],"names":[],"mappings":"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"}