@knowledgine/core 0.2.1 → 0.4.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 (130) hide show
  1. package/dist/agents/index.d.ts +7 -0
  2. package/dist/agents/index.d.ts.map +1 -0
  3. package/dist/agents/index.js +4 -0
  4. package/dist/agents/index.js.map +1 -0
  5. package/dist/agents/observer-agent.d.ts +31 -0
  6. package/dist/agents/observer-agent.d.ts.map +1 -0
  7. package/dist/agents/observer-agent.js +164 -0
  8. package/dist/agents/observer-agent.js.map +1 -0
  9. package/dist/agents/reflector-agent.d.ts +66 -0
  10. package/dist/agents/reflector-agent.d.ts.map +1 -0
  11. package/dist/agents/reflector-agent.js +420 -0
  12. package/dist/agents/reflector-agent.js.map +1 -0
  13. package/dist/agents/types.d.ts +47 -0
  14. package/dist/agents/types.d.ts.map +1 -0
  15. package/dist/agents/types.js +2 -0
  16. package/dist/agents/types.js.map +1 -0
  17. package/dist/agents/vector-classification-rules.d.ts +14 -0
  18. package/dist/agents/vector-classification-rules.d.ts.map +1 -0
  19. package/dist/agents/vector-classification-rules.js +229 -0
  20. package/dist/agents/vector-classification-rules.js.map +1 -0
  21. package/dist/config/config-loader.d.ts +13 -0
  22. package/dist/config/config-loader.d.ts.map +1 -1
  23. package/dist/config/config-loader.js +19 -11
  24. package/dist/config/config-loader.js.map +1 -1
  25. package/dist/extraction/causal-link-detector.d.ts +16 -0
  26. package/dist/extraction/causal-link-detector.d.ts.map +1 -0
  27. package/dist/extraction/causal-link-detector.js +142 -0
  28. package/dist/extraction/causal-link-detector.js.map +1 -0
  29. package/dist/extraction/incremental-extractor.d.ts +21 -0
  30. package/dist/extraction/incremental-extractor.d.ts.map +1 -0
  31. package/dist/extraction/incremental-extractor.js +113 -0
  32. package/dist/extraction/incremental-extractor.js.map +1 -0
  33. package/dist/extraction/psp-detector.d.ts +3 -3
  34. package/dist/extraction/psp-detector.d.ts.map +1 -1
  35. package/dist/extraction/psp-detector.js +51 -3
  36. package/dist/extraction/psp-detector.js.map +1 -1
  37. package/dist/graph/entity-extractor.d.ts +1 -0
  38. package/dist/graph/entity-extractor.d.ts.map +1 -1
  39. package/dist/graph/entity-extractor.js +36 -2
  40. package/dist/graph/entity-extractor.js.map +1 -1
  41. package/dist/graph/graph-repository.d.ts +37 -5
  42. package/dist/graph/graph-repository.d.ts.map +1 -1
  43. package/dist/graph/graph-repository.js +68 -12
  44. package/dist/graph/graph-repository.js.map +1 -1
  45. package/dist/graph/temporal-query.d.ts +69 -0
  46. package/dist/graph/temporal-query.d.ts.map +1 -0
  47. package/dist/graph/temporal-query.js +172 -0
  48. package/dist/graph/temporal-query.js.map +1 -0
  49. package/dist/index.d.ts +29 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +25 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/llm/errors.d.ts +8 -0
  54. package/dist/llm/errors.d.ts.map +1 -0
  55. package/dist/llm/errors.js +11 -0
  56. package/dist/llm/errors.js.map +1 -0
  57. package/dist/llm/index.d.ts +7 -0
  58. package/dist/llm/index.d.ts.map +1 -0
  59. package/dist/llm/index.js +5 -0
  60. package/dist/llm/index.js.map +1 -0
  61. package/dist/llm/ollama-provider.d.ts +13 -0
  62. package/dist/llm/ollama-provider.d.ts.map +1 -0
  63. package/dist/llm/ollama-provider.js +130 -0
  64. package/dist/llm/ollama-provider.js.map +1 -0
  65. package/dist/llm/openai-provider.d.ts +15 -0
  66. package/dist/llm/openai-provider.d.ts.map +1 -0
  67. package/dist/llm/openai-provider.js +143 -0
  68. package/dist/llm/openai-provider.js.map +1 -0
  69. package/dist/llm/provider-factory.d.ts +3 -0
  70. package/dist/llm/provider-factory.d.ts.map +1 -0
  71. package/dist/llm/provider-factory.js +25 -0
  72. package/dist/llm/provider-factory.js.map +1 -0
  73. package/dist/llm/types.d.ts +50 -0
  74. package/dist/llm/types.d.ts.map +1 -0
  75. package/dist/llm/types.js +2 -0
  76. package/dist/llm/types.js.map +1 -0
  77. package/dist/provenance/provenance-repository.d.ts +23 -22
  78. package/dist/provenance/provenance-repository.d.ts.map +1 -1
  79. package/dist/provenance/provenance-repository.js +82 -44
  80. package/dist/provenance/provenance-repository.js.map +1 -1
  81. package/dist/search/knowledge-searcher.d.ts +12 -1
  82. package/dist/search/knowledge-searcher.d.ts.map +1 -1
  83. package/dist/search/knowledge-searcher.js +93 -31
  84. package/dist/search/knowledge-searcher.js.map +1 -1
  85. package/dist/search/query-classifier.d.ts +17 -0
  86. package/dist/search/query-classifier.d.ts.map +1 -0
  87. package/dist/search/query-classifier.js +63 -0
  88. package/dist/search/query-classifier.js.map +1 -0
  89. package/dist/search/query-orchestrator.d.ts +39 -0
  90. package/dist/search/query-orchestrator.d.ts.map +1 -0
  91. package/dist/search/query-orchestrator.js +239 -0
  92. package/dist/search/query-orchestrator.js.map +1 -0
  93. package/dist/search/reasoning-reranker.d.ts +59 -0
  94. package/dist/search/reasoning-reranker.d.ts.map +1 -0
  95. package/dist/search/reasoning-reranker.js +334 -0
  96. package/dist/search/reasoning-reranker.js.map +1 -0
  97. package/dist/services/knowledge-service.d.ts +6 -0
  98. package/dist/services/knowledge-service.d.ts.map +1 -1
  99. package/dist/services/knowledge-service.js +7 -2
  100. package/dist/services/knowledge-service.js.map +1 -1
  101. package/dist/storage/database.d.ts.map +1 -1
  102. package/dist/storage/database.js +46 -6
  103. package/dist/storage/database.js.map +1 -1
  104. package/dist/storage/knowledge-repository.d.ts +65 -1
  105. package/dist/storage/knowledge-repository.d.ts.map +1 -1
  106. package/dist/storage/knowledge-repository.js +163 -9
  107. package/dist/storage/knowledge-repository.js.map +1 -1
  108. package/dist/storage/migrations/007_spec_alignment.d.ts +3 -0
  109. package/dist/storage/migrations/007_spec_alignment.d.ts.map +1 -0
  110. package/dist/storage/migrations/007_spec_alignment.js +116 -0
  111. package/dist/storage/migrations/007_spec_alignment.js.map +1 -0
  112. package/dist/storage/migrations/008_knowledge_versioning.d.ts +15 -0
  113. package/dist/storage/migrations/008_knowledge_versioning.d.ts.map +1 -0
  114. package/dist/storage/migrations/008_knowledge_versioning.js +69 -0
  115. package/dist/storage/migrations/008_knowledge_versioning.js.map +1 -0
  116. package/dist/storage/migrations/009_extraction_metadata.d.ts +12 -0
  117. package/dist/storage/migrations/009_extraction_metadata.d.ts.map +1 -0
  118. package/dist/storage/migrations/009_extraction_metadata.js +39 -0
  119. package/dist/storage/migrations/009_extraction_metadata.js.map +1 -0
  120. package/dist/storage/migrations/010_memory_protocol.d.ts +12 -0
  121. package/dist/storage/migrations/010_memory_protocol.d.ts.map +1 -0
  122. package/dist/storage/migrations/010_memory_protocol.js +26 -0
  123. package/dist/storage/migrations/010_memory_protocol.js.map +1 -0
  124. package/dist/storage/migrator.d.ts +3 -1
  125. package/dist/storage/migrator.d.ts.map +1 -1
  126. package/dist/storage/migrator.js +2 -1
  127. package/dist/storage/migrator.js.map +1 -1
  128. package/dist/types.d.ts +2 -0
  129. package/dist/types.d.ts.map +1 -1
  130. package/package.json +2 -2
@@ -1,54 +1,116 @@
1
1
  import { SemanticSearcher } from "./semantic-searcher.js";
2
2
  import { HybridSearcher } from "./hybrid-searcher.js";
3
+ import { ReasoningReranker } from "./reasoning-reranker.js";
4
+ import { QueryOrchestrator } from "./query-orchestrator.js";
3
5
  export class KnowledgeSearcher {
4
6
  repository;
5
7
  semanticSearcher;
6
8
  hybridSearcher;
7
- constructor(repository, embeddingProvider, hybridAlpha = 0.3) {
9
+ reranker;
10
+ agenticReranker;
11
+ orchestrator;
12
+ constructor(repository, embeddingProvider, hybridAlpha = 0.3, llmProvider, graphRepository) {
8
13
  this.repository = repository;
9
14
  if (embeddingProvider) {
10
15
  this.semanticSearcher = new SemanticSearcher(repository, embeddingProvider);
11
16
  this.hybridSearcher = new HybridSearcher(repository, embeddingProvider, hybridAlpha);
12
17
  }
18
+ this.reranker = new ReasoningReranker(undefined, repository);
19
+ this.agenticReranker = new ReasoningReranker(llmProvider, repository);
20
+ // graphRepositoryが提供された場合はQueryOrchestratorを使用
21
+ if (graphRepository) {
22
+ this.orchestrator = new QueryOrchestrator(repository, graphRepository, embeddingProvider, llmProvider);
23
+ }
13
24
  }
14
25
  async search(options) {
15
- const { query, limit = 50, mode = "keyword" } = options;
26
+ // orchestratorが利用可能な場合はQueryOrchestratorに委譲
27
+ if (this.orchestrator && options.query) {
28
+ const results = await this.orchestrator.query(options);
29
+ return results.map((r) => ({
30
+ note: r.note,
31
+ score: r.score,
32
+ matchReason: r.matchReason,
33
+ }));
34
+ }
35
+ const { query, limit = 50, mode = "keyword", rerank = false, rerankWeights, includeDeprecated = false, agentic = false, dateFrom, dateTo, } = options;
16
36
  if (!query) {
17
37
  return [];
18
38
  }
39
+ let results;
19
40
  if (mode === "semantic" && this.semanticSearcher) {
20
- return this.semanticSearcher.search(query, limit);
41
+ results = await this.semanticSearcher.search(query, limit);
21
42
  }
22
- if (mode === "hybrid" && this.hybridSearcher) {
23
- return this.hybridSearcher.search(query, limit);
24
- }
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 [];
43
+ else if (mode === "hybrid" && this.hybridSearcher) {
44
+ results = await this.hybridSearcher.search(query, limit);
33
45
  }
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.`);
46
+ else {
47
+ // Fall back to keyword search when semantic/hybrid requested but provider unavailable
48
+ const fellBack = mode !== "keyword" &&
49
+ ((mode === "semantic" && !this.semanticSearcher) ||
50
+ (mode === "hybrid" && !this.hybridSearcher));
51
+ // keyword mode (デフォルト) FTS5
52
+ const rows = this.repository.searchNotesWithRank(query, limit, includeDeprecated, dateFrom, dateTo);
53
+ if (rows.length === 0) {
54
+ return [];
45
55
  }
46
- return {
47
- note,
48
- score,
49
- matchReason: reasons,
50
- };
51
- });
56
+ // FTSスコアをmin-max正規化
57
+ const rawRanks = rows.map((r) => Math.abs(r.rank));
58
+ const minRank = Math.min(...rawRanks);
59
+ const maxRank = Math.max(...rawRanks);
60
+ const range = maxRank - minRank;
61
+ const now = Date.now();
62
+ results = rows.map(({ note, rank }) => {
63
+ const normalized = range > 0 ? (Math.abs(rank) - minRank) / range : 1.0;
64
+ let score = 1 - normalized;
65
+ // valid_from スコアボーナス: 新しいほど高スコア (最大+0.5)
66
+ // yearsSinceNow が小さいほど (= より新しい) ボーナスが大きい
67
+ const validFrom = note.valid_from ?? note.created_at;
68
+ if (validFrom) {
69
+ const ageMs = now - new Date(validFrom).getTime();
70
+ const yearsSinceNow = ageMs / (1000 * 60 * 60 * 24 * 365);
71
+ // 新しさボーナス: 経過年数が少ないほど高い (上限0.5、最低0)
72
+ score += Math.max(0, 0.5 - yearsSinceNow * 0.1);
73
+ }
74
+ const reasons = [`キーワード一致: "${query}"`];
75
+ if (fellBack) {
76
+ reasons.push(`Warning: ${mode} search is not available. Showing keyword results instead. Run 'knowledgine upgrade --semantic' to enable.`);
77
+ }
78
+ return {
79
+ note,
80
+ score,
81
+ matchReason: reasons,
82
+ fellBack,
83
+ };
84
+ });
85
+ }
86
+ // agentic モード: LLMベース ReasoningReranker を使用
87
+ if (agentic && results.length > 0) {
88
+ const reranked = await this.agenticReranker.rerank(query, results);
89
+ return reranked.map((r) => ({
90
+ note: r.note,
91
+ score: r.score,
92
+ matchReason: [...r.matchReason, ...(r.reasoning ? [`LLM推論: ${r.reasoning}`] : [])],
93
+ fellBack: results.find((orig) => orig.note.id === r.note.id)?.fellBack,
94
+ }));
95
+ }
96
+ if (rerank && results.length > 0) {
97
+ const currentReranker = rerankWeights
98
+ ? new ReasoningReranker(undefined, this.repository, rerankWeights)
99
+ : this.reranker;
100
+ const rerankInputs = results.map((r) => ({
101
+ note: r.note,
102
+ baseScore: r.score,
103
+ matchReason: r.matchReason,
104
+ }));
105
+ const reranked = await currentReranker.rerankLegacy(rerankInputs, { query });
106
+ return reranked.map((r) => ({
107
+ note: r.note,
108
+ score: r.finalScore,
109
+ matchReason: r.matchReason,
110
+ fellBack: results.find((orig) => orig.note.id === r.note.id)?.fellBack,
111
+ }));
112
+ }
113
+ return results;
52
114
  }
53
115
  async searchByTag(tag, limit = 50) {
54
116
  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,17 @@
1
+ export type QueryType = "factual" | "temporal" | "exploratory" | "procedural";
2
+ export interface QueryWeights {
3
+ vector: number;
4
+ graph: number;
5
+ agentic: number;
6
+ }
7
+ /**
8
+ * クエリ文字列を分析してクエリタイプを判定する。
9
+ * 優先順位: temporal > procedural > factual > exploratory
10
+ */
11
+ export declare function classifyQuery(query: string): QueryType;
12
+ /**
13
+ * クエリタイプに応じた検索層の重みを返す。
14
+ * vector + graph + agentic の合計が 1.0 になることが保証される。
15
+ */
16
+ export declare function getWeightsForQueryType(queryType: QueryType): QueryWeights;
17
+ //# sourceMappingURL=query-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-classifier.d.ts","sourceRoot":"","sources":["../../src/search/query-classifier.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAyBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CA4BtD;AASD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,CAEzE"}
@@ -0,0 +1,63 @@
1
+ // 時間表現のパターン(量指定子を上限付きにして ReDoS を防止)
2
+ const TEMPORAL_PATTERNS = [
3
+ /先週|昨日|今日|今週|先月|今月|最近|直近/,
4
+ /\d{4}[-/]\d{1,2}[-/]\d{1,2}/, // YYYY-MM-DD or YYYY/MM/DD
5
+ /\d{1,6}月|\d{1,4}年/,
6
+ /before|after|ago|yesterday|last\s+week|last\s+month|recently/i,
7
+ ];
8
+ // 手順・方法のパターン
9
+ const PROCEDURAL_PATTERNS = [
10
+ /手順|方法|やり方|やりかた|設定方法|デプロイ手順|インストール手順/,
11
+ /how\s+to|steps?|procedure|tutorial|guide|setup|configure|install/i,
12
+ ];
13
+ // 事実・固有名詞のパターン(量指定子を上限付きにして ReDoS を防止)
14
+ const FACTUAL_PATTERNS = [
15
+ /とは|って何|というのは|定義/,
16
+ /v\d{1,4}\.\d{1,4}(?:\.\d{1,4})?/, // バージョン番号 v1.2.3
17
+ /\d{1,8}\.\d{1,8}(?:\.\d{1,8})?/, // バージョン番号 1.2.3
18
+ /what\s+is|what's|definition|version|release/i,
19
+ /[A-Z][a-z]+[A-Z][a-zA-Z]+/, // キャメルケース固有名詞 (TypeScript, ReactHooks等)
20
+ ];
21
+ /**
22
+ * クエリ文字列を分析してクエリタイプを判定する。
23
+ * 優先順位: temporal > procedural > factual > exploratory
24
+ */
25
+ export function classifyQuery(query) {
26
+ if (!query || query.trim() === "") {
27
+ return "exploratory";
28
+ }
29
+ // temporal: 時間表現が含まれているか
30
+ for (const pattern of TEMPORAL_PATTERNS) {
31
+ if (pattern.test(query)) {
32
+ return "temporal";
33
+ }
34
+ }
35
+ // procedural: 手順・方法に関するクエリか
36
+ for (const pattern of PROCEDURAL_PATTERNS) {
37
+ if (pattern.test(query)) {
38
+ return "procedural";
39
+ }
40
+ }
41
+ // factual: 固有名詞・バージョン・定義クエリか
42
+ for (const pattern of FACTUAL_PATTERNS) {
43
+ if (pattern.test(query)) {
44
+ return "factual";
45
+ }
46
+ }
47
+ // デフォルト: 探索的クエリ
48
+ return "exploratory";
49
+ }
50
+ const WEIGHTS_BY_TYPE = {
51
+ factual: { vector: 0.3, graph: 0.5, agentic: 0.2 },
52
+ temporal: { vector: 0.2, graph: 0.3, agentic: 0.5 },
53
+ exploratory: { vector: 0.5, graph: 0.3, agentic: 0.2 },
54
+ procedural: { vector: 0.3, graph: 0.2, agentic: 0.5 },
55
+ };
56
+ /**
57
+ * クエリタイプに応じた検索層の重みを返す。
58
+ * vector + graph + agentic の合計が 1.0 になることが保証される。
59
+ */
60
+ export function getWeightsForQueryType(queryType) {
61
+ return WEIGHTS_BY_TYPE[queryType];
62
+ }
63
+ //# sourceMappingURL=query-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-classifier.js","sourceRoot":"","sources":["../../src/search/query-classifier.ts"],"names":[],"mappings":"AAQA,oCAAoC;AACpC,MAAM,iBAAiB,GAAG;IACxB,yBAAyB;IACzB,6BAA6B,EAAE,2BAA2B;IAC1D,mBAAmB;IACnB,+DAA+D;CAChE,CAAC;AAEF,aAAa;AACb,MAAM,mBAAmB,GAAG;IAC1B,qCAAqC;IACrC,mEAAmE;CACpE,CAAC;AAEF,uCAAuC;AACvC,MAAM,gBAAgB,GAAG;IACvB,iBAAiB;IACjB,iCAAiC,EAAE,iBAAiB;IACpD,gCAAgC,EAAE,gBAAgB;IAClD,8CAA8C;IAC9C,2BAA2B,EAAE,wCAAwC;CACtE,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,eAAe,GAAoC;IACvD,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IAClD,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IACnD,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;IACtD,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;CACtD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAoB;IACzD,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { KnowledgeNote, KnowledgeRepository } from "../storage/knowledge-repository.js";
2
+ import type { GraphRepository } from "../graph/graph-repository.js";
3
+ import type { EmbeddingProvider } from "../embedding/embedding-provider.js";
4
+ import type { LLMProvider } from "../llm/types.js";
5
+ import type { EntityWithGraph } from "../types.js";
6
+ import type { SearchOptions } from "./knowledge-searcher.js";
7
+ export interface OrchestratedResult {
8
+ note: KnowledgeNote;
9
+ score: number;
10
+ layerScores: Record<string, number>;
11
+ matchReason: string[];
12
+ graphContext?: EntityWithGraph[];
13
+ }
14
+ export interface QueryOrchestratorConfig {
15
+ defaultWeights?: Record<string, number>;
16
+ maxResults?: number;
17
+ timeoutMs?: number;
18
+ }
19
+ /**
20
+ * Vector(FTS5/semantic/hybrid) + Graph(entity traversal) + Agentic(ReasoningReranker)
21
+ * の3層統合検索エンジン。
22
+ */
23
+ export declare class QueryOrchestrator {
24
+ private repository;
25
+ private graphRepository;
26
+ private semanticSearcher?;
27
+ private hybridSearcher?;
28
+ private agenticReranker;
29
+ private maxResults;
30
+ private timeoutMs;
31
+ constructor(repository: KnowledgeRepository, graphRepository: GraphRepository, embeddingProvider?: EmbeddingProvider, llmProvider?: LLMProvider, config?: QueryOrchestratorConfig);
32
+ query(options: SearchOptions): Promise<OrchestratedResult[]>;
33
+ private fetchVectorResults;
34
+ private fetchGraphResults;
35
+ private calculateGraphScore;
36
+ private mergeLayerResults;
37
+ private applyAgenticLayer;
38
+ }
39
+ //# sourceMappingURL=query-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-orchestrator.d.ts","sourceRoot":"","sources":["../../src/search/query-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;GAGG;AACH,qBAAa,iBAAiB;IAQ1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,eAAe;IARzB,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAGhB,UAAU,EAAE,mBAAmB,EAC/B,eAAe,EAAE,eAAe,EACxC,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,WAAW,CAAC,EAAE,WAAW,EACzB,MAAM,CAAC,EAAE,uBAAuB;IAW5B,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAwBpD,kBAAkB;YAuClB,iBAAiB;IAyE/B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,iBAAiB;YA4DX,iBAAiB;CAgEhC"}
@@ -0,0 +1,239 @@
1
+ import { SemanticSearcher } from "./semantic-searcher.js";
2
+ import { HybridSearcher } from "./hybrid-searcher.js";
3
+ import { ReasoningReranker } from "./reasoning-reranker.js";
4
+ import { classifyQuery, getWeightsForQueryType } from "./query-classifier.js";
5
+ const DEFAULT_MAX_RESULTS = 20;
6
+ const DEFAULT_TIMEOUT_MS = 5000;
7
+ const GRAPH_CANDIDATE_LIMIT = 20;
8
+ /**
9
+ * Vector(FTS5/semantic/hybrid) + Graph(entity traversal) + Agentic(ReasoningReranker)
10
+ * の3層統合検索エンジン。
11
+ */
12
+ export class QueryOrchestrator {
13
+ repository;
14
+ graphRepository;
15
+ semanticSearcher;
16
+ hybridSearcher;
17
+ agenticReranker;
18
+ maxResults;
19
+ timeoutMs;
20
+ constructor(repository, graphRepository, embeddingProvider, llmProvider, config) {
21
+ this.repository = repository;
22
+ this.graphRepository = graphRepository;
23
+ if (embeddingProvider) {
24
+ this.semanticSearcher = new SemanticSearcher(repository, embeddingProvider);
25
+ this.hybridSearcher = new HybridSearcher(repository, embeddingProvider);
26
+ }
27
+ this.agenticReranker = new ReasoningReranker(llmProvider, repository);
28
+ this.maxResults = config?.maxResults ?? DEFAULT_MAX_RESULTS;
29
+ this.timeoutMs = config?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
30
+ }
31
+ async query(options) {
32
+ const { query, limit = this.maxResults, mode = "keyword", includeDeprecated = false } = options;
33
+ if (!query) {
34
+ return [];
35
+ }
36
+ const queryType = classifyQuery(query);
37
+ const weights = getWeightsForQueryType(queryType);
38
+ // Step 1: Vector層 — FTS5 / semantic / hybrid
39
+ const vectorResults = await this.fetchVectorResults(query, limit, mode, includeDeprecated);
40
+ // Step 2: Graph層 — Vector層の上位候補から関連エンティティを取得し追加候補を生成
41
+ const graphEnhanced = await this.fetchGraphResults(vectorResults, query, weights.graph);
42
+ // Step 3: Agentic層 — LLMによるリランキング(タイムアウト制御あり)
43
+ const mergedResults = this.mergeLayerResults(vectorResults, graphEnhanced, weights);
44
+ const finalResults = await this.applyAgenticLayer(query, mergedResults, weights.agentic);
45
+ return finalResults.sort((a, b) => b.score - a.score).slice(0, limit);
46
+ }
47
+ async fetchVectorResults(query, limit, mode, includeDeprecated) {
48
+ try {
49
+ if (mode === "semantic" && this.semanticSearcher) {
50
+ return await this.semanticSearcher.search(query, limit);
51
+ }
52
+ if (mode === "hybrid" && this.hybridSearcher) {
53
+ return await this.hybridSearcher.search(query, limit);
54
+ }
55
+ }
56
+ catch {
57
+ // フォールバック: FTS5
58
+ }
59
+ // FTS5 keyword検索
60
+ const rows = this.repository.searchNotesWithRank(query, limit, includeDeprecated);
61
+ if (rows.length === 0) {
62
+ return [];
63
+ }
64
+ const rawRanks = rows.map((r) => Math.abs(r.rank));
65
+ const minRank = Math.min(...rawRanks);
66
+ const maxRank = Math.max(...rawRanks);
67
+ const range = maxRank - minRank;
68
+ return rows.map(({ note, rank }) => {
69
+ const normalized = range > 0 ? (Math.abs(rank) - minRank) / range : 1.0;
70
+ const score = 1 - normalized;
71
+ return {
72
+ note,
73
+ score,
74
+ matchReason: [`キーワード一致: "${query}"`],
75
+ };
76
+ });
77
+ }
78
+ async fetchGraphResults(vectorResults, _query, graphWeight) {
79
+ const graphResultMap = new Map();
80
+ if (graphWeight === 0 || vectorResults.length === 0) {
81
+ return graphResultMap;
82
+ }
83
+ // Vector層の上位20件を使ってGraph探索
84
+ const topCandidates = vectorResults.slice(0, GRAPH_CANDIDATE_LIMIT);
85
+ const additionalNoteIds = new Set(topCandidates.map((r) => r.note.id));
86
+ for (const result of topCandidates) {
87
+ const noteId = result.note.id;
88
+ const linkedEntities = this.graphRepository.getLinkedEntities(noteId);
89
+ if (linkedEntities.length === 0)
90
+ continue;
91
+ // 関連エンティティを取得してgraphContextとして付与
92
+ const entityGraphs = [];
93
+ const linkedNoteIds = new Set();
94
+ for (const entity of linkedEntities) {
95
+ const entityGraph = this.graphRepository.getEntityWithGraph(entity.id);
96
+ if (entityGraph) {
97
+ entityGraphs.push(entityGraph);
98
+ // 関連エンティティに紐づく他のノートを候補に追加
99
+ for (const ln of entityGraph.linkedNotes) {
100
+ if (!additionalNoteIds.has(ln.noteId)) {
101
+ linkedNoteIds.add(ln.noteId);
102
+ additionalNoteIds.add(ln.noteId);
103
+ }
104
+ }
105
+ }
106
+ }
107
+ // 既存vectorResultに対してgraphContextを付与
108
+ if (entityGraphs.length > 0) {
109
+ const graphScore = this.calculateGraphScore(linkedEntities.length, entityGraphs);
110
+ graphResultMap.set(noteId, {
111
+ score: graphScore,
112
+ graphContext: entityGraphs,
113
+ matchReason: [`グラフ関連エンティティ数: ${linkedEntities.length}`],
114
+ });
115
+ }
116
+ // 関連ノートを新規候補として追加
117
+ for (const additionalNoteId of linkedNoteIds) {
118
+ if (!graphResultMap.has(additionalNoteId)) {
119
+ const note = this.repository.getNoteById(additionalNoteId);
120
+ if (note) {
121
+ const graphScore = 0.3; // 間接的な関連のスコア
122
+ graphResultMap.set(additionalNoteId, {
123
+ score: graphScore,
124
+ graphContext: entityGraphs,
125
+ matchReason: [`グラフ経由の関連ノート (entity: ${linkedEntities[0]?.name ?? ""})`],
126
+ });
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return graphResultMap;
132
+ }
133
+ calculateGraphScore(entityCount, entityGraphs) {
134
+ // エンティティ数と関係の強度に基づいてスコアを計算
135
+ const entityBonus = Math.min(entityCount * 0.1, 0.5);
136
+ const relationStrength = entityGraphs.reduce((sum, eg) => {
137
+ const outgoing = eg.outgoingRelations.reduce((s, r) => s + (r.strength ?? 1.0), 0);
138
+ const incoming = eg.incomingRelations.reduce((s, r) => s + (r.strength ?? 1.0), 0);
139
+ const count = eg.outgoingRelations.length + eg.incomingRelations.length;
140
+ return sum + (count > 0 ? (outgoing + incoming) / count : 0);
141
+ }, 0);
142
+ const avgRelationStrength = entityGraphs.length > 0 ? relationStrength / entityGraphs.length : 0;
143
+ return Math.min(entityBonus + avgRelationStrength * 0.3, 1.0);
144
+ }
145
+ mergeLayerResults(vectorResults, graphResultMap, weights) {
146
+ // vectorResultsを基本候補として使用
147
+ const noteMap = new Map();
148
+ for (const vr of vectorResults) {
149
+ const graphData = graphResultMap.get(vr.note.id);
150
+ const vectorScore = vr.score;
151
+ const graphScore = graphData?.score ?? 0;
152
+ // agenticは後で上書き、ここでは仮で0
153
+ const agenticScore = 0;
154
+ const finalScore = weights.vector * vectorScore + weights.graph * graphScore + weights.agentic * agenticScore;
155
+ noteMap.set(vr.note.id, {
156
+ note: vr.note,
157
+ score: finalScore,
158
+ layerScores: {
159
+ vector: vectorScore,
160
+ graph: graphScore,
161
+ agentic: agenticScore,
162
+ },
163
+ matchReason: [...vr.matchReason, ...(graphData?.matchReason ?? [])],
164
+ graphContext: graphData?.graphContext,
165
+ });
166
+ }
167
+ // graphResultMapに含まれる新規ノート(vectorになかったもの)を追加
168
+ for (const [noteId, graphData] of graphResultMap) {
169
+ if (!noteMap.has(noteId)) {
170
+ const note = this.repository.getNoteById(noteId);
171
+ if (!note)
172
+ continue;
173
+ const graphScore = graphData.score;
174
+ const finalScore = weights.graph * graphScore;
175
+ noteMap.set(noteId, {
176
+ note,
177
+ score: finalScore,
178
+ layerScores: {
179
+ vector: 0,
180
+ graph: graphScore,
181
+ agentic: 0,
182
+ },
183
+ matchReason: graphData.matchReason,
184
+ graphContext: graphData.graphContext,
185
+ });
186
+ }
187
+ }
188
+ return Array.from(noteMap.values());
189
+ }
190
+ async applyAgenticLayer(query, candidates, agenticWeight) {
191
+ if (candidates.length === 0 || agenticWeight === 0) {
192
+ return candidates;
193
+ }
194
+ // SearchResult形式に変換してReasoningRerankerに渡す
195
+ const searchResults = candidates.map((c) => ({
196
+ note: c.note,
197
+ score: c.score,
198
+ matchReason: c.matchReason,
199
+ }));
200
+ // タイムアウト制御: LLMが遅延した場合はVector+Graphのみで返却
201
+ const rerankedPromise = this.agenticReranker.rerank(query, searchResults);
202
+ const timeoutPromise = new Promise((resolve) => setTimeout(() => resolve(null), this.timeoutMs));
203
+ const reranked = await Promise.race([rerankedPromise, timeoutPromise]);
204
+ if (reranked === null) {
205
+ // タイムアウト: agenticScoreなしで返却
206
+ return candidates;
207
+ }
208
+ // rerankedのスコアをagenticScoreとして候補にマージ
209
+ const rerankedMap = new Map(reranked.map((r) => [r.note.id, r]));
210
+ return candidates.map((candidate) => {
211
+ const rerankedResult = rerankedMap.get(candidate.note.id);
212
+ if (!rerankedResult) {
213
+ return candidate;
214
+ }
215
+ const agenticScore = rerankedResult.score;
216
+ const vectorScore = candidate.layerScores["vector"] ?? 0;
217
+ const graphScore = candidate.layerScores["graph"] ?? 0;
218
+ // mergeLayerResultsで計算済みのvector+graphスコアにagenticを加算
219
+ // finalScore = w_v * vectorScore + w_g * graphScore + w_a * agenticScore
220
+ // candidateのscoreはすでに w_v * vectorScore + w_g * graphScore (agentic=0で計算済み)
221
+ // なのでagenticScore分を追加する
222
+ const finalScore = candidate.score + agenticWeight * agenticScore;
223
+ const agenticReasons = rerankedResult.reasoning
224
+ ? [`LLM推論: ${rerankedResult.reasoning}`]
225
+ : [];
226
+ return {
227
+ ...candidate,
228
+ score: finalScore,
229
+ layerScores: {
230
+ vector: vectorScore,
231
+ graph: graphScore,
232
+ agentic: agenticScore,
233
+ },
234
+ matchReason: [...candidate.matchReason, ...agenticReasons],
235
+ };
236
+ });
237
+ }
238
+ }
239
+ //# sourceMappingURL=query-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-orchestrator.js","sourceRoot":"","sources":["../../src/search/query-orchestrator.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"}