@knowledgine/core 0.2.1 → 0.3.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 (94) hide show
  1. package/dist/config/config-loader.d.ts +13 -0
  2. package/dist/config/config-loader.d.ts.map +1 -1
  3. package/dist/config/config-loader.js +19 -11
  4. package/dist/config/config-loader.js.map +1 -1
  5. package/dist/extraction/causal-link-detector.d.ts +16 -0
  6. package/dist/extraction/causal-link-detector.d.ts.map +1 -0
  7. package/dist/extraction/causal-link-detector.js +142 -0
  8. package/dist/extraction/causal-link-detector.js.map +1 -0
  9. package/dist/extraction/incremental-extractor.d.ts +21 -0
  10. package/dist/extraction/incremental-extractor.d.ts.map +1 -0
  11. package/dist/extraction/incremental-extractor.js +113 -0
  12. package/dist/extraction/incremental-extractor.js.map +1 -0
  13. package/dist/extraction/psp-detector.d.ts +3 -3
  14. package/dist/extraction/psp-detector.d.ts.map +1 -1
  15. package/dist/extraction/psp-detector.js +51 -3
  16. package/dist/extraction/psp-detector.js.map +1 -1
  17. package/dist/graph/entity-extractor.d.ts +1 -0
  18. package/dist/graph/entity-extractor.d.ts.map +1 -1
  19. package/dist/graph/entity-extractor.js +24 -0
  20. package/dist/graph/entity-extractor.js.map +1 -1
  21. package/dist/graph/graph-repository.d.ts +5 -5
  22. package/dist/graph/graph-repository.d.ts.map +1 -1
  23. package/dist/graph/graph-repository.js +12 -12
  24. package/dist/graph/graph-repository.js.map +1 -1
  25. package/dist/index.d.ts +16 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +16 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/llm/errors.d.ts +8 -0
  30. package/dist/llm/errors.d.ts.map +1 -0
  31. package/dist/llm/errors.js +11 -0
  32. package/dist/llm/errors.js.map +1 -0
  33. package/dist/llm/index.d.ts +7 -0
  34. package/dist/llm/index.d.ts.map +1 -0
  35. package/dist/llm/index.js +5 -0
  36. package/dist/llm/index.js.map +1 -0
  37. package/dist/llm/ollama-provider.d.ts +13 -0
  38. package/dist/llm/ollama-provider.d.ts.map +1 -0
  39. package/dist/llm/ollama-provider.js +130 -0
  40. package/dist/llm/ollama-provider.js.map +1 -0
  41. package/dist/llm/openai-provider.d.ts +15 -0
  42. package/dist/llm/openai-provider.d.ts.map +1 -0
  43. package/dist/llm/openai-provider.js +143 -0
  44. package/dist/llm/openai-provider.js.map +1 -0
  45. package/dist/llm/provider-factory.d.ts +3 -0
  46. package/dist/llm/provider-factory.d.ts.map +1 -0
  47. package/dist/llm/provider-factory.js +25 -0
  48. package/dist/llm/provider-factory.js.map +1 -0
  49. package/dist/llm/types.d.ts +50 -0
  50. package/dist/llm/types.d.ts.map +1 -0
  51. package/dist/llm/types.js +2 -0
  52. package/dist/llm/types.js.map +1 -0
  53. package/dist/provenance/provenance-repository.d.ts +23 -22
  54. package/dist/provenance/provenance-repository.d.ts.map +1 -1
  55. package/dist/provenance/provenance-repository.js +82 -44
  56. package/dist/provenance/provenance-repository.js.map +1 -1
  57. package/dist/search/knowledge-searcher.d.ts +10 -1
  58. package/dist/search/knowledge-searcher.d.ts.map +1 -1
  59. package/dist/search/knowledge-searcher.js +78 -31
  60. package/dist/search/knowledge-searcher.js.map +1 -1
  61. package/dist/search/reasoning-reranker.d.ts +59 -0
  62. package/dist/search/reasoning-reranker.d.ts.map +1 -0
  63. package/dist/search/reasoning-reranker.js +334 -0
  64. package/dist/search/reasoning-reranker.js.map +1 -0
  65. package/dist/services/knowledge-service.d.ts +4 -0
  66. package/dist/services/knowledge-service.d.ts.map +1 -1
  67. package/dist/services/knowledge-service.js +6 -1
  68. package/dist/services/knowledge-service.js.map +1 -1
  69. package/dist/storage/database.d.ts.map +1 -1
  70. package/dist/storage/database.js +46 -6
  71. package/dist/storage/database.js.map +1 -1
  72. package/dist/storage/knowledge-repository.d.ts +49 -1
  73. package/dist/storage/knowledge-repository.d.ts.map +1 -1
  74. package/dist/storage/knowledge-repository.js +93 -7
  75. package/dist/storage/knowledge-repository.js.map +1 -1
  76. package/dist/storage/migrations/007_spec_alignment.d.ts +3 -0
  77. package/dist/storage/migrations/007_spec_alignment.d.ts.map +1 -0
  78. package/dist/storage/migrations/007_spec_alignment.js +116 -0
  79. package/dist/storage/migrations/007_spec_alignment.js.map +1 -0
  80. package/dist/storage/migrations/008_knowledge_versioning.d.ts +15 -0
  81. package/dist/storage/migrations/008_knowledge_versioning.d.ts.map +1 -0
  82. package/dist/storage/migrations/008_knowledge_versioning.js +69 -0
  83. package/dist/storage/migrations/008_knowledge_versioning.js.map +1 -0
  84. package/dist/storage/migrations/009_extraction_metadata.d.ts +12 -0
  85. package/dist/storage/migrations/009_extraction_metadata.d.ts.map +1 -0
  86. package/dist/storage/migrations/009_extraction_metadata.js +39 -0
  87. package/dist/storage/migrations/009_extraction_metadata.js.map +1 -0
  88. package/dist/storage/migrator.d.ts +3 -1
  89. package/dist/storage/migrator.d.ts.map +1 -1
  90. package/dist/storage/migrator.js +2 -1
  91. package/dist/storage/migrator.js.map +1 -1
  92. package/dist/types.d.ts +2 -0
  93. package/dist/types.d.ts.map +1 -1
  94. package/package.json +1 -1
@@ -1,54 +1,101 @@
1
1
  import { SemanticSearcher } from "./semantic-searcher.js";
2
2
  import { HybridSearcher } from "./hybrid-searcher.js";
3
+ import { ReasoningReranker } from "./reasoning-reranker.js";
3
4
  export class KnowledgeSearcher {
4
5
  repository;
5
6
  semanticSearcher;
6
7
  hybridSearcher;
7
- constructor(repository, embeddingProvider, hybridAlpha = 0.3) {
8
+ reranker;
9
+ agenticReranker;
10
+ constructor(repository, embeddingProvider, hybridAlpha = 0.3, llmProvider) {
8
11
  this.repository = repository;
9
12
  if (embeddingProvider) {
10
13
  this.semanticSearcher = new SemanticSearcher(repository, embeddingProvider);
11
14
  this.hybridSearcher = new HybridSearcher(repository, embeddingProvider, hybridAlpha);
12
15
  }
16
+ this.reranker = new ReasoningReranker(undefined, repository);
17
+ this.agenticReranker = new ReasoningReranker(llmProvider, repository);
13
18
  }
14
19
  async search(options) {
15
- const { query, limit = 50, mode = "keyword" } = options;
20
+ const { query, limit = 50, mode = "keyword", rerank = false, rerankWeights, includeDeprecated = false, agentic = false, } = options;
16
21
  if (!query) {
17
22
  return [];
18
23
  }
24
+ let results;
19
25
  if (mode === "semantic" && this.semanticSearcher) {
20
- return this.semanticSearcher.search(query, limit);
26
+ results = await this.semanticSearcher.search(query, limit);
21
27
  }
22
- if (mode === "hybrid" && this.hybridSearcher) {
23
- return this.hybridSearcher.search(query, limit);
28
+ else if (mode === "hybrid" && this.hybridSearcher) {
29
+ results = await this.hybridSearcher.search(query, limit);
24
30
  }
25
- // Fall back to keyword search when semantic/hybrid requested but provider unavailable
26
- const fellBack = mode !== "keyword" &&
27
- ((mode === "semantic" && !this.semanticSearcher) ||
28
- (mode === "hybrid" && !this.hybridSearcher));
29
- // keyword mode (デフォルト) — FTS5
30
- const rows = this.repository.searchNotesWithRank(query, limit);
31
- if (rows.length === 0) {
32
- return [];
33
- }
34
- // FTSスコアをmin-max正規化
35
- const rawRanks = rows.map((r) => Math.abs(r.rank));
36
- const minRank = Math.min(...rawRanks);
37
- const maxRank = Math.max(...rawRanks);
38
- const range = maxRank - minRank;
39
- return rows.map(({ note, rank }) => {
40
- const normalized = range > 0 ? (Math.abs(rank) - minRank) / range : 1.0;
41
- const score = 1 - normalized;
42
- const reasons = [`キーワード一致: "${query}"`];
43
- if (fellBack) {
44
- reasons.push(`Warning: ${mode} search is not available. Showing keyword results instead. Run 'knowledgine upgrade --semantic' to enable.`);
31
+ else {
32
+ // Fall back to keyword search when semantic/hybrid requested but provider unavailable
33
+ const fellBack = mode !== "keyword" &&
34
+ ((mode === "semantic" && !this.semanticSearcher) ||
35
+ (mode === "hybrid" && !this.hybridSearcher));
36
+ // keyword mode (デフォルト) — FTS5
37
+ const rows = this.repository.searchNotesWithRank(query, limit, includeDeprecated);
38
+ if (rows.length === 0) {
39
+ return [];
45
40
  }
46
- return {
47
- note,
48
- score,
49
- matchReason: reasons,
50
- };
51
- });
41
+ // FTSスコアをmin-max正規化
42
+ const rawRanks = rows.map((r) => Math.abs(r.rank));
43
+ const minRank = Math.min(...rawRanks);
44
+ const maxRank = Math.max(...rawRanks);
45
+ const range = maxRank - minRank;
46
+ const now = Date.now();
47
+ results = rows.map(({ note, rank }) => {
48
+ const normalized = range > 0 ? (Math.abs(rank) - minRank) / range : 1.0;
49
+ let score = 1 - normalized;
50
+ // valid_from スコアボーナス: 新しいほど高スコア (最大+0.5)
51
+ // yearsSinceNow が小さいほど (= より新しい) ボーナスが大きい
52
+ const validFrom = note.valid_from ?? note.created_at;
53
+ if (validFrom) {
54
+ const ageMs = now - new Date(validFrom).getTime();
55
+ const yearsSinceNow = ageMs / (1000 * 60 * 60 * 24 * 365);
56
+ // 新しさボーナス: 経過年数が少ないほど高い (上限0.5、最低0)
57
+ score += Math.max(0, 0.5 - yearsSinceNow * 0.1);
58
+ }
59
+ const reasons = [`キーワード一致: "${query}"`];
60
+ if (fellBack) {
61
+ reasons.push(`Warning: ${mode} search is not available. Showing keyword results instead. Run 'knowledgine upgrade --semantic' to enable.`);
62
+ }
63
+ return {
64
+ note,
65
+ score,
66
+ matchReason: reasons,
67
+ fellBack,
68
+ };
69
+ });
70
+ }
71
+ // agentic モード: LLMベース ReasoningReranker を使用
72
+ if (agentic && results.length > 0) {
73
+ const reranked = await this.agenticReranker.rerank(query, results);
74
+ return reranked.map((r) => ({
75
+ note: r.note,
76
+ score: r.score,
77
+ matchReason: [...r.matchReason, ...(r.reasoning ? [`LLM推論: ${r.reasoning}`] : [])],
78
+ fellBack: results.find((orig) => orig.note.id === r.note.id)?.fellBack,
79
+ }));
80
+ }
81
+ if (rerank && results.length > 0) {
82
+ const currentReranker = rerankWeights
83
+ ? new ReasoningReranker(undefined, this.repository, rerankWeights)
84
+ : this.reranker;
85
+ const rerankInputs = results.map((r) => ({
86
+ note: r.note,
87
+ baseScore: r.score,
88
+ matchReason: r.matchReason,
89
+ }));
90
+ const reranked = await currentReranker.rerankLegacy(rerankInputs, { query });
91
+ return reranked.map((r) => ({
92
+ note: r.note,
93
+ score: r.finalScore,
94
+ matchReason: r.matchReason,
95
+ fellBack: results.find((orig) => orig.note.id === r.note.id)?.fellBack,
96
+ }));
97
+ }
98
+ return results;
52
99
  }
53
100
  async searchByTag(tag, limit = 50) {
54
101
  return this.search({ tags: [tag], limit });
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-searcher.js","sourceRoot":"","sources":["../../src/search/knowledge-searcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-searcher.js","sourceRoot":"","sources":["../../src/search/knowledge-searcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { LLMProvider } from "../llm/types.js";
2
+ import type { KnowledgeRepository, KnowledgeNote } from "../storage/knowledge-repository.js";
3
+ import type { SearchResult } from "./knowledge-searcher.js";
4
+ export interface RerankOptions {
5
+ maxCandidates?: number;
6
+ maxResults?: number;
7
+ }
8
+ export interface RerankedResult {
9
+ note: KnowledgeNote;
10
+ score: number;
11
+ originalScore: number;
12
+ matchReason: string[];
13
+ reasoning?: string;
14
+ axes: {
15
+ temporal: number;
16
+ contextRelevance: number;
17
+ pspQuality: number;
18
+ };
19
+ }
20
+ export interface RerankInput {
21
+ note: KnowledgeNote;
22
+ baseScore: number;
23
+ matchReason: string[];
24
+ }
25
+ export interface AxisScores {
26
+ temporal: number;
27
+ context: number;
28
+ psp: number;
29
+ }
30
+ export interface RerankResult {
31
+ note: KnowledgeNote;
32
+ baseScore: number;
33
+ scores: AxisScores;
34
+ finalScore: number;
35
+ matchReason: string[];
36
+ }
37
+ export interface RerankerWeights {
38
+ temporalWeight?: number;
39
+ contextWeight?: number;
40
+ pspWeight?: number;
41
+ }
42
+ export declare class ReasoningReranker {
43
+ private llmProvider;
44
+ private repository;
45
+ private _legacyWeights?;
46
+ constructor(llmProvider: LLMProvider | undefined, repository: KnowledgeRepository, _legacyWeights?: RerankerWeights | undefined);
47
+ /**
48
+ * 新API: LLMベースのリランキング
49
+ */
50
+ rerank(query: string, candidates: SearchResult[], options?: RerankOptions): Promise<RerankedResult[]>;
51
+ /**
52
+ * 旧API後方互換: RerankInput[] を受け取り RerankResult[] を返す
53
+ * KnowledgeSearcher が既存実装で呼んでいる形式
54
+ */
55
+ rerankLegacy(inputs: RerankInput[], options: {
56
+ query: string;
57
+ }): Promise<RerankResult[]>;
58
+ }
59
+ //# sourceMappingURL=reasoning-reranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-reranker.d.ts","sourceRoot":"","sources":["../../src/search/reasoning-reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8JD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,UAAU;IAElB,OAAO,CAAC,cAAc,CAAC;gBAHf,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,UAAU,EAAE,mBAAmB,EAE/B,cAAc,CAAC,EAAE,eAAe,YAAA;IAG1C;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,YAAY,EAAE,EAC1B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC;IAwG5B;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA0C/F"}
@@ -0,0 +1,334 @@
1
+ // --- 内部実装ヘルパー ---
2
+ const TEMPORAL_BONUS_PER_YEAR = 0.1;
3
+ const DEPRECATED_PENALTY = -0.5;
4
+ const FINAL_SCORE_WEIGHTS = {
5
+ temporal: 0.3,
6
+ contextRelevance: 0.4,
7
+ pspQuality: 0.3,
8
+ };
9
+ function clamp(v, min = 0, max = 1) {
10
+ return Math.max(min, Math.min(max, v));
11
+ }
12
+ /**
13
+ * Temporal軸スコア計算
14
+ * - valid_fromの新しさボーナス: +0.1/年(基準0.5から加算)
15
+ * - deprecated=1なら -0.5ペナルティ
16
+ */
17
+ function scoreTemporalAxis(note) {
18
+ if (note.deprecated === 1) {
19
+ return clamp(0.5 + DEPRECATED_PENALTY);
20
+ }
21
+ const referenceDate = note.valid_from ?? note.updated_at ?? note.created_at;
22
+ const ageMs = Date.now() - new Date(referenceDate).getTime();
23
+ const ageYears = ageMs / (1000 * 60 * 60 * 24 * 365);
24
+ // 基準 0.5 から新しさに応じてボーナス(0以上の場合のみ)
25
+ const bonus = Math.max(0, -ageYears) * TEMPORAL_BONUS_PER_YEAR;
26
+ // 古い場合はボーナスなし(年数が正なのでbonusは0)、0.5をベースに経過年数で減衰
27
+ const score = 0.5 + bonus - ageYears * TEMPORAL_BONUS_PER_YEAR;
28
+ return clamp(score);
29
+ }
30
+ /**
31
+ * PSP quality軸スコア計算
32
+ * problem_solution_pairs の confidence 平均。PSPなしは0.5(中立)
33
+ */
34
+ function scorePspQuality(noteId, repository) {
35
+ try {
36
+ const pairs = repository.getProblemSolutionPairsByNoteId(noteId);
37
+ if (pairs.length === 0)
38
+ return 0.5;
39
+ const avg = pairs.reduce((sum, p) => sum + p.confidence, 0) / pairs.length;
40
+ return clamp(avg);
41
+ }
42
+ catch {
43
+ return 0.5;
44
+ }
45
+ }
46
+ /**
47
+ * Context relevance軸スコア(heuristic: originalScoreの正規化)
48
+ */
49
+ function normalizeScores(scores) {
50
+ const min = Math.min(...scores);
51
+ const max = Math.max(...scores);
52
+ const range = max - min;
53
+ if (range === 0)
54
+ return scores.map(() => 0.5);
55
+ return scores.map((s) => (s - min) / range);
56
+ }
57
+ function buildLLMPrompt(query, candidates) {
58
+ const system = `You are a knowledge relevance judge. Given a search query and a list of knowledge notes, rank the notes by relevance to the query. Consider the semantic meaning, context, and practical utility of each note.
59
+
60
+ Return a JSON object with a "rankings" array. Each element must have:
61
+ - noteId: the note's id (integer)
62
+ - relevance: relevance score from 0.0 to 1.0 (float)
63
+ - reasoning: brief explanation of why this note is relevant or not (string)
64
+
65
+ Example output:
66
+ {
67
+ "rankings": [
68
+ {"noteId": 42, "relevance": 0.95, "reasoning": "Directly addresses the query with specific solution steps"},
69
+ {"noteId": 7, "relevance": 0.60, "reasoning": "Related topic but lacks specifics about the query context"},
70
+ {"noteId": 13, "relevance": 0.20, "reasoning": "Only tangentially related through shared tags"}
71
+ ]
72
+ }`;
73
+ const candidateLines = candidates
74
+ .map((c) => {
75
+ const preview = c.note.content.slice(0, 200).replace(/\n/g, " ");
76
+ const fm = c.note.frontmatter_json ? JSON.parse(c.note.frontmatter_json) : {};
77
+ const tags = Array.isArray(fm.tags) ? fm.tags : [];
78
+ return JSON.stringify({
79
+ id: c.note.id,
80
+ title: c.note.title,
81
+ content: preview,
82
+ tags,
83
+ });
84
+ })
85
+ .join("\n");
86
+ const user = `Search query: "${query}"
87
+
88
+ Knowledge notes to rank:
89
+ ${candidateLines}
90
+
91
+ Return only the JSON object with rankings for all ${candidates.length} notes listed above.`;
92
+ return { system, user };
93
+ }
94
+ function parseLLMResponse(content) {
95
+ // 最初の { から最後の } を切り出す
96
+ const start = content.indexOf("{");
97
+ const end = content.lastIndexOf("}");
98
+ if (start === -1 || end === -1 || end <= start)
99
+ return null;
100
+ try {
101
+ const raw = JSON.parse(content.slice(start, end + 1));
102
+ if (typeof raw !== "object" || raw === null)
103
+ return null;
104
+ const obj = raw;
105
+ if (!Array.isArray(obj["rankings"]))
106
+ return null;
107
+ const rankings = [];
108
+ for (const item of obj["rankings"]) {
109
+ if (typeof item !== "object" || item === null)
110
+ return null;
111
+ const r = item;
112
+ if (typeof r["noteId"] !== "number" ||
113
+ typeof r["relevance"] !== "number" ||
114
+ typeof r["reasoning"] !== "string") {
115
+ return null;
116
+ }
117
+ rankings.push({
118
+ noteId: r["noteId"],
119
+ relevance: r["relevance"],
120
+ reasoning: r["reasoning"],
121
+ });
122
+ }
123
+ return { rankings };
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ // --- メインクラス ---
130
+ export class ReasoningReranker {
131
+ llmProvider;
132
+ repository;
133
+ _legacyWeights;
134
+ constructor(llmProvider, repository,
135
+ // 後方互換: 旧コードが ReasoningReranker(repository, weights) で呼ぶ場合
136
+ _legacyWeights) {
137
+ this.llmProvider = llmProvider;
138
+ this.repository = repository;
139
+ this._legacyWeights = _legacyWeights;
140
+ }
141
+ /**
142
+ * 新API: LLMベースのリランキング
143
+ */
144
+ async rerank(query, candidates, options) {
145
+ const maxCandidates = options?.maxCandidates ?? 20;
146
+ const maxResults = options?.maxResults ?? 5;
147
+ if (candidates.length === 0)
148
+ return [];
149
+ // maxCandidates に絞る(元スコア降順)
150
+ const limited = candidates
151
+ .slice()
152
+ .sort((a, b) => b.score - a.score)
153
+ .slice(0, maxCandidates);
154
+ // LLMに渡す上位 maxResults 件と残りを分ける
155
+ const forLLM = limited.slice(0, maxResults);
156
+ const _rest = limited.slice(maxResults);
157
+ // heuristic軸スコアを全件計算
158
+ const temporalScores = limited.map((c) => scoreTemporalAxis(c.note));
159
+ const pspScores = limited.map((c) => scorePspQuality(c.note.id, this.repository));
160
+ // LLMがいる場合: context relevanceをLLMに問う
161
+ const llmScoreMap = new Map();
162
+ const llmReasoningMap = new Map();
163
+ if (this.llmProvider && forLLM.length > 0) {
164
+ try {
165
+ const { system, user } = buildLLMPrompt(query, forLLM);
166
+ const result = await this.llmProvider.complete({
167
+ messages: [
168
+ { role: "system", content: system },
169
+ { role: "user", content: user },
170
+ ],
171
+ responseFormat: "json",
172
+ temperature: 0.0,
173
+ });
174
+ const parsed = parseLLMResponse(result.content);
175
+ if (parsed) {
176
+ for (const item of parsed.rankings) {
177
+ llmScoreMap.set(item.noteId, clamp(item.relevance));
178
+ llmReasoningMap.set(item.noteId, item.reasoning);
179
+ }
180
+ }
181
+ // パース失敗の場合は llmScoreMap が空のまま → フォールバック
182
+ }
183
+ catch {
184
+ // LLMエラー時はフォールバック
185
+ }
186
+ }
187
+ const llmSucceeded = llmScoreMap.size > 0;
188
+ // フォールバック時は originalScore を正規化して contextRelevance として使用
189
+ const originalScores = limited.map((c) => c.score);
190
+ const normalizedOriginal = normalizeScores(originalScores);
191
+ // 最終スコア計算
192
+ const results = limited.map((candidate, i) => {
193
+ const temporal = temporalScores[i];
194
+ const pspQuality = pspScores[i];
195
+ let contextRelevance;
196
+ let reasoning;
197
+ if (llmSucceeded) {
198
+ // LLMスコアがある場合(上位maxResults件のみ)
199
+ const llmScore = llmScoreMap.get(candidate.note.id);
200
+ if (llmScore !== undefined) {
201
+ contextRelevance = llmScore;
202
+ reasoning = llmReasoningMap.get(candidate.note.id);
203
+ }
204
+ else {
205
+ // LLMに渡されなかった残りの候補: originalScoreを正規化
206
+ contextRelevance = normalizedOriginal[i];
207
+ reasoning = undefined;
208
+ }
209
+ }
210
+ else {
211
+ // LLMなし or フォールバック: originalScoreを正規化
212
+ contextRelevance = normalizedOriginal[i];
213
+ reasoning = undefined;
214
+ }
215
+ const score = FINAL_SCORE_WEIGHTS.temporal * temporal +
216
+ FINAL_SCORE_WEIGHTS.contextRelevance * contextRelevance +
217
+ FINAL_SCORE_WEIGHTS.pspQuality * pspQuality;
218
+ return {
219
+ note: candidate.note,
220
+ score,
221
+ originalScore: candidate.score,
222
+ matchReason: [...candidate.matchReason],
223
+ reasoning,
224
+ axes: {
225
+ temporal,
226
+ contextRelevance,
227
+ pspQuality,
228
+ },
229
+ };
230
+ });
231
+ results.sort((a, b) => b.score - a.score);
232
+ return results.slice(0, maxResults);
233
+ }
234
+ /**
235
+ * 旧API後方互換: RerankInput[] を受け取り RerankResult[] を返す
236
+ * KnowledgeSearcher が既存実装で呼んでいる形式
237
+ */
238
+ async rerankLegacy(inputs, options) {
239
+ if (inputs.length === 0)
240
+ return [];
241
+ const queryTokens = tokenize(options.query);
242
+ const legacyWeights = {
243
+ temporalWeight: 0.2,
244
+ contextWeight: 0.2,
245
+ pspWeight: 0.1,
246
+ ...this._legacyWeights,
247
+ };
248
+ const results = inputs.map((input) => {
249
+ const temporal = scoreLegacyTemporalAxis(input.note);
250
+ const context = scoreLegacyContextAxis(input.note, queryTokens);
251
+ const psp = scoreLegacyPSPAxis(input.note, this.repository);
252
+ const finalScore = input.baseScore +
253
+ legacyWeights.temporalWeight * temporal +
254
+ legacyWeights.contextWeight * context +
255
+ legacyWeights.pspWeight * psp;
256
+ const matchReason = [
257
+ ...input.matchReason,
258
+ `時系列(temporal): ${(temporal * 100).toFixed(1)}%`,
259
+ `文脈(context): ${(context * 100).toFixed(1)}%`,
260
+ `PSP: ${(psp * 100).toFixed(1)}%`,
261
+ ];
262
+ return {
263
+ note: input.note,
264
+ baseScore: input.baseScore,
265
+ scores: { temporal, context, psp },
266
+ finalScore,
267
+ matchReason,
268
+ };
269
+ });
270
+ results.sort((a, b) => b.finalScore - a.finalScore);
271
+ return results;
272
+ }
273
+ }
274
+ // --- 旧API用ヘルパー関数 ---
275
+ const TEMPORAL_HALF_LIFE_DAYS = 90;
276
+ function tokenize(query) {
277
+ if (!query)
278
+ return [];
279
+ return query
280
+ .toLowerCase()
281
+ .split(/[\s,;]+/)
282
+ .filter((t) => t.length > 1);
283
+ }
284
+ function extractTags(frontmatterJson) {
285
+ if (!frontmatterJson)
286
+ return [];
287
+ try {
288
+ const fm = JSON.parse(frontmatterJson);
289
+ const tags = fm["tags"];
290
+ if (Array.isArray(tags))
291
+ return tags.map(String);
292
+ if (typeof tags === "string")
293
+ return [tags];
294
+ return [];
295
+ }
296
+ catch {
297
+ return [];
298
+ }
299
+ }
300
+ function scoreLegacyTemporalAxis(note) {
301
+ const referenceDate = note.updated_at ?? note.created_at;
302
+ const ageMs = Date.now() - new Date(referenceDate).getTime();
303
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
304
+ const lambda = Math.LN2 / TEMPORAL_HALF_LIFE_DAYS;
305
+ return Math.exp(-lambda * Math.max(0, ageDays));
306
+ }
307
+ function scoreLegacyContextAxis(note, queryTokens) {
308
+ if (queryTokens.length === 0)
309
+ return 0.5;
310
+ const tags = extractTags(note.frontmatter_json);
311
+ if (tags.length === 0)
312
+ return 0.3;
313
+ const matchCount = queryTokens.filter((token) => tags.some((tag) => tag.toLowerCase().includes(token) || token.includes(tag.toLowerCase()))).length;
314
+ return matchCount / queryTokens.length;
315
+ }
316
+ function scoreLegacyPSPAxis(note, repository) {
317
+ try {
318
+ const patterns = repository.getPatternsByNoteId(note.id);
319
+ if (patterns.length === 0)
320
+ return 0;
321
+ const pspPatterns = patterns.filter((p) => p.pattern_type === "problem" || p.pattern_type === "solution");
322
+ if (pspPatterns.length === 0)
323
+ return 0;
324
+ const avgConfidence = pspPatterns.reduce((sum, p) => sum + p.confidence, 0) / pspPatterns.length;
325
+ const hasProblem = pspPatterns.some((p) => p.pattern_type === "problem");
326
+ const hasSolution = pspPatterns.some((p) => p.pattern_type === "solution");
327
+ const completenessBonus = hasProblem && hasSolution ? 1.0 : 0.5;
328
+ return Math.min(1, avgConfidence * completenessBonus);
329
+ }
330
+ catch {
331
+ return 0;
332
+ }
333
+ }
334
+ //# sourceMappingURL=reasoning-reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-reranker.js","sourceRoot":"","sources":["../../src/search/reasoning-reranker.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export interface KnowledgeServiceOptions {
13
13
  export interface SearchKnowledgeResult {
14
14
  query: string;
15
15
  mode: "keyword" | "semantic" | "hybrid";
16
+ actualMode: "keyword" | "semantic" | "hybrid";
16
17
  totalResults: number;
17
18
  results: Array<{
18
19
  noteId: number;
@@ -89,6 +90,9 @@ export interface SearchInput {
89
90
  query: string;
90
91
  limit?: number;
91
92
  mode?: "keyword" | "semantic" | "hybrid";
93
+ /** エージェントモード: deprecated ノートも含む (includeDeprecated の糖衣構文) */
94
+ agentic?: boolean;
95
+ includeDeprecated?: boolean;
92
96
  }
93
97
  export interface FindRelatedInput {
94
98
  noteId?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-service.d.ts","sourceRoot":"","sources":["../../src/services/knowledge-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-service.d.ts","sourceRoot":"","sources":["../../src/services/knowledge-service.ts"],"names":[],"mappings":"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"}
@@ -13,10 +13,15 @@ export class KnowledgeService {
13
13
  }
14
14
  async search(input) {
15
15
  const { query, limit = 20, mode = "keyword" } = input;
16
- const results = await this.searcher.search({ query, limit, mode });
16
+ const includeDeprecated = input.agentic === true || input.includeDeprecated === true;
17
+ const results = await this.searcher.search({ query, limit, mode, includeDeprecated });
18
+ // フォールバック判定: semantic/hybrid 要求時にプロバイダーが利用不可なら発生
19
+ const didFallBack = (mode === "semantic" || mode === "hybrid") && !this.options.embeddingProvider;
20
+ const actualMode = didFallBack ? "keyword" : mode;
17
21
  return {
18
22
  query,
19
23
  mode,
24
+ actualMode,
20
25
  totalResults: results.length,
21
26
  results: results.map((r) => ({
22
27
  noteId: r.note.id,