kiri-mcp-server 0.25.7 → 0.26.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/config/stop-words.yml +3 -0
- package/dist/config/stop-words.yml +3 -0
- package/dist/package.json +1 -4
- package/dist/src/client/connection-manager.d.ts.map +1 -1
- package/dist/src/client/connection-manager.js +13 -9
- package/dist/src/client/connection-manager.js.map +1 -1
- package/dist/src/client/proxy.js +11 -6
- package/dist/src/client/proxy.js.map +1 -1
- package/dist/src/indexer/cli.d.ts +1 -0
- package/dist/src/indexer/cli.d.ts.map +1 -1
- package/dist/src/indexer/cli.js +167 -23
- package/dist/src/indexer/cli.js.map +1 -1
- package/dist/src/indexer/watch.d.ts +9 -0
- package/dist/src/indexer/watch.d.ts.map +1 -1
- package/dist/src/indexer/watch.js +122 -3
- package/dist/src/indexer/watch.js.map +1 -1
- package/dist/src/server/boost-profiles.d.ts.map +1 -1
- package/dist/src/server/boost-profiles.js +9 -4
- package/dist/src/server/boost-profiles.js.map +1 -1
- package/dist/src/server/compact-mode.d.ts +3 -0
- package/dist/src/server/compact-mode.d.ts.map +1 -0
- package/dist/src/server/compact-mode.js +5 -0
- package/dist/src/server/compact-mode.js.map +1 -0
- package/dist/src/server/handlers/snippets-get.d.ts +3 -0
- package/dist/src/server/handlers/snippets-get.d.ts.map +1 -1
- package/dist/src/server/handlers/snippets-get.js +23 -1
- package/dist/src/server/handlers/snippets-get.js.map +1 -1
- package/dist/src/server/handlers.d.ts +6 -2
- package/dist/src/server/handlers.d.ts.map +1 -1
- package/dist/src/server/handlers.js +64 -11
- package/dist/src/server/handlers.js.map +1 -1
- package/dist/src/server/output-schemas.d.ts +12 -2
- package/dist/src/server/output-schemas.d.ts.map +1 -1
- package/dist/src/server/output-schemas.js +5 -1
- package/dist/src/server/output-schemas.js.map +1 -1
- package/dist/src/server/rpc.d.ts.map +1 -1
- package/dist/src/server/rpc.js +43 -15
- package/dist/src/server/rpc.js.map +1 -1
- package/dist/src/shared/security/config.d.ts +1 -0
- package/dist/src/shared/security/config.d.ts.map +1 -1
- package/dist/src/shared/security/config.js +23 -5
- package/dist/src/shared/security/config.js.map +1 -1
- package/package.json +1 -4
- package/dist/src/eval/metrics.d.ts +0 -23
- package/dist/src/eval/metrics.d.ts.map +0 -1
- package/dist/src/eval/metrics.js +0 -47
- package/dist/src/eval/metrics.js.map +0 -1
|
@@ -10,6 +10,7 @@ import { ServerContext } from "../context.js";
|
|
|
10
10
|
* - "full": ファイル全体を返す(安全上限付き)
|
|
11
11
|
*/
|
|
12
12
|
export type SnippetsGetView = "auto" | "symbol" | "lines" | "full";
|
|
13
|
+
export type SnippetRangeSource = "symbol" | "clamped" | "window";
|
|
13
14
|
export interface SnippetsGetParams {
|
|
14
15
|
path: string;
|
|
15
16
|
start_line?: number;
|
|
@@ -17,6 +18,7 @@ export interface SnippetsGetParams {
|
|
|
17
18
|
compact?: boolean;
|
|
18
19
|
includeLineNumbers?: boolean;
|
|
19
20
|
view?: SnippetsGetView;
|
|
21
|
+
rangeSource?: SnippetRangeSource;
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
24
|
* snippets_get tool のレスポンス
|
|
@@ -29,6 +31,7 @@ export interface SnippetResult {
|
|
|
29
31
|
totalLines: number;
|
|
30
32
|
symbolName: string | null;
|
|
31
33
|
symbolKind: string | null;
|
|
34
|
+
rangeSource: SnippetRangeSource;
|
|
32
35
|
truncated?: boolean;
|
|
33
36
|
}
|
|
34
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snippets-get.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"snippets-get.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACnE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjE,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;IAC7B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;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;IAC1B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAiED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,aAAa,CAAC,CAkNxB"}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
import process from "node:process";
|
|
1
2
|
/**
|
|
2
3
|
* Constants
|
|
3
4
|
*/
|
|
4
5
|
const DEFAULT_SNIPPET_WINDOW = 150;
|
|
5
6
|
const MAX_SNIPPET_LINES = 500; // 全モード共通の安全上限
|
|
6
7
|
const MAX_SNIPPET_CHARS = 200_000; // 返却内容の安全上限(1レスポンスの最大文字数)
|
|
8
|
+
const VALID_SNIPPET_VIEWS = ["auto", "symbol", "lines", "full"];
|
|
9
|
+
function resolveDefaultSnippetsView() {
|
|
10
|
+
const envValue = process.env.KIRI_SNIPPETS_DEFAULT_VIEW;
|
|
11
|
+
if (typeof envValue === "string") {
|
|
12
|
+
const normalized = envValue.toLowerCase();
|
|
13
|
+
if (VALID_SNIPPET_VIEWS.includes(normalized)) {
|
|
14
|
+
return normalized;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return "symbol";
|
|
18
|
+
}
|
|
7
19
|
/**
|
|
8
20
|
* 行番号をプレフィックスとして追加する(動的幅調整)
|
|
9
21
|
*
|
|
@@ -71,7 +83,15 @@ export async function snippetsGet(context, params) {
|
|
|
71
83
|
WHERE s.repo_id = ? AND s.path = ?
|
|
72
84
|
ORDER BY s.start_line
|
|
73
85
|
`, [repoId, params.path]);
|
|
74
|
-
const
|
|
86
|
+
const explicitView = params.view;
|
|
87
|
+
let view = explicitView ?? resolveDefaultSnippetsView();
|
|
88
|
+
const rangeSource = params.rangeSource;
|
|
89
|
+
const hasExplicitRange = params.end_line !== undefined;
|
|
90
|
+
if (view === "symbol" &&
|
|
91
|
+
explicitView === undefined &&
|
|
92
|
+
(hasExplicitRange || rangeSource === "clamped" || rangeSource === "window")) {
|
|
93
|
+
view = "lines";
|
|
94
|
+
}
|
|
75
95
|
// view パラメータに基づいて取得戦略を決定
|
|
76
96
|
let useSymbolSnippets;
|
|
77
97
|
let requestedStart;
|
|
@@ -175,10 +195,12 @@ export async function snippetsGet(context, params) {
|
|
|
175
195
|
content = numberedContent;
|
|
176
196
|
}
|
|
177
197
|
}
|
|
198
|
+
const derivedRangeSource = rangeSource ?? (useSymbolSnippets ? "symbol" : "window");
|
|
178
199
|
return {
|
|
179
200
|
path: row.path,
|
|
180
201
|
startLine,
|
|
181
202
|
endLine,
|
|
203
|
+
rangeSource: derivedRangeSource,
|
|
182
204
|
...(content !== undefined && { content }),
|
|
183
205
|
totalLines,
|
|
184
206
|
symbolName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snippets-get.js","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"snippets-get.js","sourceRoot":"","sources":["../../../../src/server/handlers/snippets-get.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@ import { DuckDBClient } from "../shared/duckdb.js";
|
|
|
2
2
|
import { type BoostProfileName } from "./boost-profiles.js";
|
|
3
3
|
import { ServerContext, TableAvailability } from "./context.js";
|
|
4
4
|
import { ServerServices } from "./services/index.js";
|
|
5
|
-
|
|
5
|
+
import type { SnippetRangeSource } from "./handlers/snippets-get.js";
|
|
6
|
+
export { snippetsGet, type SnippetsGetParams, type SnippetsGetView, type SnippetResult, type SnippetRangeSource, } from "./handlers/snippets-get.js";
|
|
6
7
|
/**
|
|
7
8
|
* checkTableAvailability
|
|
8
9
|
*
|
|
@@ -47,17 +48,20 @@ export interface ContextBundleParams {
|
|
|
47
48
|
profile?: string;
|
|
48
49
|
boost_profile?: BoostProfileName;
|
|
49
50
|
compact?: boolean;
|
|
51
|
+
includeWhy?: boolean;
|
|
50
52
|
includeTokensEstimate?: boolean;
|
|
51
53
|
metadata_filters?: Record<string, string | string[]>;
|
|
52
54
|
requestId?: string;
|
|
53
55
|
path_prefix?: string;
|
|
54
56
|
category?: string;
|
|
57
|
+
why_mode?: "full" | "terse";
|
|
55
58
|
}
|
|
56
59
|
export interface ContextBundleItem {
|
|
57
60
|
path: string;
|
|
58
61
|
range: [number, number];
|
|
62
|
+
rangeSource: SnippetRangeSource;
|
|
59
63
|
preview?: string;
|
|
60
|
-
why
|
|
64
|
+
why?: string[];
|
|
61
65
|
score: number;
|
|
62
66
|
}
|
|
63
67
|
export interface ContextBundleResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAkB,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAIhF,OAAO,EAAwB,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/server/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -594,6 +594,30 @@ const DEFAULT_FILECACHE_MAX_BYTES = 64 * 1024 * 1024;
|
|
|
594
594
|
const PATH_MISS_DELTA = serverConfig.penalties.pathMissDelta;
|
|
595
595
|
const LARGE_FILE_DELTA = serverConfig.penalties.largeFileDelta;
|
|
596
596
|
const MAX_WHY_TAGS = 10;
|
|
597
|
+
const WHY_PREFIX_ABBREVIATIONS = {
|
|
598
|
+
artifact: "art",
|
|
599
|
+
dictionary: "dict",
|
|
600
|
+
phrase: "phr",
|
|
601
|
+
text: "txt",
|
|
602
|
+
metadata: "meta",
|
|
603
|
+
substring: "sub",
|
|
604
|
+
"path-phrase": "pphr",
|
|
605
|
+
structural: "str",
|
|
606
|
+
cochange: "co",
|
|
607
|
+
"path-segment": "pseg",
|
|
608
|
+
"path-keyword": "pkey",
|
|
609
|
+
dep: "dep",
|
|
610
|
+
near: "near",
|
|
611
|
+
boost: "boost",
|
|
612
|
+
recent: "recent",
|
|
613
|
+
symbol: "sym",
|
|
614
|
+
penalty: "pen",
|
|
615
|
+
keyword: "kw",
|
|
616
|
+
coverage: "cov",
|
|
617
|
+
fallback: "fb",
|
|
618
|
+
graph: "graph",
|
|
619
|
+
"abbr-path": "abbr",
|
|
620
|
+
};
|
|
597
621
|
// 項目3: whyタグの優先度マップ(低い数値ほど高優先度)
|
|
598
622
|
// All actual tag prefixes used in the codebase
|
|
599
623
|
const WHY_TAG_PRIORITY = {
|
|
@@ -638,7 +662,7 @@ function parseOutputOptions(params) {
|
|
|
638
662
|
*
|
|
639
663
|
* DoS protection: Limits processing to first 1000 reasons to prevent CPU exhaustion.
|
|
640
664
|
*/
|
|
641
|
-
function selectWhyTags(reasons) {
|
|
665
|
+
function selectWhyTags(reasons, mode = "full") {
|
|
642
666
|
// Protect against DoS: limit reasons processed
|
|
643
667
|
if (reasons.size > 1000) {
|
|
644
668
|
reasons = new Set(Array.from(reasons).slice(0, 1000));
|
|
@@ -677,7 +701,24 @@ function selectWhyTags(reasons) {
|
|
|
677
701
|
break;
|
|
678
702
|
selected.add(reason); // Set automatically deduplicates
|
|
679
703
|
}
|
|
680
|
-
return
|
|
704
|
+
return formatWhyTags(selected, mode);
|
|
705
|
+
}
|
|
706
|
+
function formatWhyTags(reasons, mode) {
|
|
707
|
+
if (mode === "full") {
|
|
708
|
+
return Array.from(reasons);
|
|
709
|
+
}
|
|
710
|
+
const formatted = [];
|
|
711
|
+
for (const reason of reasons) {
|
|
712
|
+
const [prefix = "", ...restParts] = reason.split(":");
|
|
713
|
+
const abbreviation = WHY_PREFIX_ABBREVIATIONS[prefix];
|
|
714
|
+
if (!abbreviation) {
|
|
715
|
+
formatted.push(reason);
|
|
716
|
+
continue;
|
|
717
|
+
}
|
|
718
|
+
const suffix = restParts.join(":");
|
|
719
|
+
formatted.push(suffix.length > 0 ? `${abbreviation}:${suffix}` : abbreviation);
|
|
720
|
+
}
|
|
721
|
+
return formatted;
|
|
681
722
|
}
|
|
682
723
|
/**
|
|
683
724
|
* ストップワードサービスの遅延初期化
|
|
@@ -736,19 +777,24 @@ function normalizeLimit(limit) {
|
|
|
736
777
|
}
|
|
737
778
|
return Math.min(Math.max(1, Math.floor(limit)), 100);
|
|
738
779
|
}
|
|
780
|
+
const PREVIEW_MATCH_WINDOW = 120;
|
|
781
|
+
const PREVIEW_MAX_LENGTH = 100;
|
|
739
782
|
function buildPreview(content, query) {
|
|
740
783
|
const lowerContent = content.toLowerCase();
|
|
741
784
|
const lowerQuery = query.toLowerCase();
|
|
742
785
|
const index = lowerContent.indexOf(lowerQuery);
|
|
743
786
|
if (index === -1) {
|
|
744
|
-
return { preview: content.slice(0,
|
|
787
|
+
return { preview: content.slice(0, PREVIEW_MAX_LENGTH), line: 1 };
|
|
745
788
|
}
|
|
746
789
|
const prefix = content.slice(0, index);
|
|
747
790
|
const prefixLines = prefix.split(/\r?\n/);
|
|
748
791
|
const matchLine = prefix.length === 0 ? 1 : prefixLines.length;
|
|
749
|
-
const snippetStart = Math.max(0, index -
|
|
750
|
-
const snippetEnd = Math.min(content.length, index + query.length +
|
|
751
|
-
const
|
|
792
|
+
const snippetStart = Math.max(0, index - PREVIEW_MATCH_WINDOW);
|
|
793
|
+
const snippetEnd = Math.min(content.length, index + query.length + PREVIEW_MATCH_WINDOW);
|
|
794
|
+
const previewSlice = content.slice(snippetStart, snippetEnd);
|
|
795
|
+
const preview = previewSlice.length > PREVIEW_MAX_LENGTH
|
|
796
|
+
? `${previewSlice.slice(0, PREVIEW_MAX_LENGTH - 1)}…`
|
|
797
|
+
: previewSlice;
|
|
752
798
|
return { preview, line: matchLine };
|
|
753
799
|
}
|
|
754
800
|
/**
|
|
@@ -1575,15 +1621,16 @@ function selectSnippet(snippets, matchLine) {
|
|
|
1575
1621
|
const lastSnippet = snippets[snippets.length - 1];
|
|
1576
1622
|
return lastSnippet ?? firstSnippet;
|
|
1577
1623
|
}
|
|
1624
|
+
const SNIPPET_PREVIEW_MAX_LENGTH = 240;
|
|
1578
1625
|
function buildSnippetPreview(content, startLine, endLine) {
|
|
1579
1626
|
const lines = content.split(/\r?\n/);
|
|
1580
1627
|
const startIndex = Math.max(0, Math.min(startLine - 1, lines.length));
|
|
1581
1628
|
const endIndex = Math.max(startIndex, Math.min(endLine, lines.length));
|
|
1582
1629
|
const snippet = lines.slice(startIndex, endIndex).join("\n");
|
|
1583
|
-
if (snippet.length <=
|
|
1630
|
+
if (snippet.length <= SNIPPET_PREVIEW_MAX_LENGTH) {
|
|
1584
1631
|
return snippet;
|
|
1585
1632
|
}
|
|
1586
|
-
return `${snippet.slice(0,
|
|
1633
|
+
return `${snippet.slice(0, SNIPPET_PREVIEW_MAX_LENGTH - 1)}…`;
|
|
1587
1634
|
}
|
|
1588
1635
|
/**
|
|
1589
1636
|
* トークン数を推定(コンテンツベース)
|
|
@@ -2981,6 +3028,7 @@ async function contextBundleImpl(context, params) {
|
|
|
2981
3028
|
const substringHints = hintBuckets.substringHints;
|
|
2982
3029
|
const includeTokensEstimate = params.includeTokensEstimate === true;
|
|
2983
3030
|
const isCompact = params.compact === true;
|
|
3031
|
+
const whyMode = params.why_mode ?? "full";
|
|
2984
3032
|
const pathPrefix = params.path_prefix && params.path_prefix.length > 0
|
|
2985
3033
|
? normalizePathPrefix(params.path_prefix)
|
|
2986
3034
|
: undefined;
|
|
@@ -3749,6 +3797,7 @@ async function contextBundleImpl(context, params) {
|
|
|
3749
3797
|
const selected = selectSnippet(snippets, candidate.matchLine);
|
|
3750
3798
|
let startLine;
|
|
3751
3799
|
let endLine;
|
|
3800
|
+
let rangeSource = selected ? "symbol" : "window";
|
|
3752
3801
|
if (selected) {
|
|
3753
3802
|
startLine = selected.start_line;
|
|
3754
3803
|
endLine = selected.end_line;
|
|
@@ -3775,6 +3824,7 @@ async function contextBundleImpl(context, params) {
|
|
|
3775
3824
|
}
|
|
3776
3825
|
startLine = clampedStart;
|
|
3777
3826
|
endLine = Math.max(clampedStart, clampedEnd);
|
|
3827
|
+
rangeSource = "clamped";
|
|
3778
3828
|
}
|
|
3779
3829
|
}
|
|
3780
3830
|
if (endLine < startLine) {
|
|
@@ -3786,14 +3836,17 @@ async function contextBundleImpl(context, params) {
|
|
|
3786
3836
|
}
|
|
3787
3837
|
const normalizedScore = maxScore > 0 ? candidate.score / maxScore : 0;
|
|
3788
3838
|
const roundedScore = Number.isFinite(normalizedScore) ? Number(normalizedScore.toFixed(3)) : 0;
|
|
3789
|
-
|
|
3790
|
-
const why = selectWhyTags(reasons);
|
|
3839
|
+
const shouldIncludeWhy = params.includeWhy ?? !isCompact;
|
|
3791
3840
|
const item = {
|
|
3792
3841
|
path: candidate.path,
|
|
3793
3842
|
range: [startLine, endLine],
|
|
3794
|
-
|
|
3843
|
+
rangeSource,
|
|
3795
3844
|
score: roundedScore,
|
|
3796
3845
|
};
|
|
3846
|
+
if (shouldIncludeWhy) {
|
|
3847
|
+
// Select why tags with diversity guarantee (reserves slots for dep/symbol/near)
|
|
3848
|
+
item.why = selectWhyTags(reasons, whyMode);
|
|
3849
|
+
}
|
|
3797
3850
|
// Add preview only if not in compact mode
|
|
3798
3851
|
if (!params.compact) {
|
|
3799
3852
|
item.preview = buildSnippetPreview(candidate.content, startLine, endLine);
|