@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.
- package/dist/agents/index.d.ts +7 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/observer-agent.d.ts +31 -0
- package/dist/agents/observer-agent.d.ts.map +1 -0
- package/dist/agents/observer-agent.js +164 -0
- package/dist/agents/observer-agent.js.map +1 -0
- package/dist/agents/reflector-agent.d.ts +66 -0
- package/dist/agents/reflector-agent.d.ts.map +1 -0
- package/dist/agents/reflector-agent.js +420 -0
- package/dist/agents/reflector-agent.js.map +1 -0
- package/dist/agents/types.d.ts +47 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/vector-classification-rules.d.ts +14 -0
- package/dist/agents/vector-classification-rules.d.ts.map +1 -0
- package/dist/agents/vector-classification-rules.js +229 -0
- package/dist/agents/vector-classification-rules.js.map +1 -0
- package/dist/config/config-loader.d.ts +13 -0
- package/dist/config/config-loader.d.ts.map +1 -1
- package/dist/config/config-loader.js +19 -11
- package/dist/config/config-loader.js.map +1 -1
- package/dist/extraction/causal-link-detector.d.ts +16 -0
- package/dist/extraction/causal-link-detector.d.ts.map +1 -0
- package/dist/extraction/causal-link-detector.js +142 -0
- package/dist/extraction/causal-link-detector.js.map +1 -0
- package/dist/extraction/incremental-extractor.d.ts +21 -0
- package/dist/extraction/incremental-extractor.d.ts.map +1 -0
- package/dist/extraction/incremental-extractor.js +113 -0
- package/dist/extraction/incremental-extractor.js.map +1 -0
- package/dist/extraction/psp-detector.d.ts +3 -3
- package/dist/extraction/psp-detector.d.ts.map +1 -1
- package/dist/extraction/psp-detector.js +51 -3
- package/dist/extraction/psp-detector.js.map +1 -1
- package/dist/graph/entity-extractor.d.ts +1 -0
- package/dist/graph/entity-extractor.d.ts.map +1 -1
- package/dist/graph/entity-extractor.js +36 -2
- package/dist/graph/entity-extractor.js.map +1 -1
- package/dist/graph/graph-repository.d.ts +37 -5
- package/dist/graph/graph-repository.d.ts.map +1 -1
- package/dist/graph/graph-repository.js +68 -12
- package/dist/graph/graph-repository.js.map +1 -1
- package/dist/graph/temporal-query.d.ts +69 -0
- package/dist/graph/temporal-query.d.ts.map +1 -0
- package/dist/graph/temporal-query.js +172 -0
- package/dist/graph/temporal-query.js.map +1 -0
- package/dist/index.d.ts +29 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/errors.d.ts +8 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +11 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +5 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/ollama-provider.d.ts +13 -0
- package/dist/llm/ollama-provider.d.ts.map +1 -0
- package/dist/llm/ollama-provider.js +130 -0
- package/dist/llm/ollama-provider.js.map +1 -0
- package/dist/llm/openai-provider.d.ts +15 -0
- package/dist/llm/openai-provider.d.ts.map +1 -0
- package/dist/llm/openai-provider.js +143 -0
- package/dist/llm/openai-provider.js.map +1 -0
- package/dist/llm/provider-factory.d.ts +3 -0
- package/dist/llm/provider-factory.d.ts.map +1 -0
- package/dist/llm/provider-factory.js +25 -0
- package/dist/llm/provider-factory.js.map +1 -0
- package/dist/llm/types.d.ts +50 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/provenance/provenance-repository.d.ts +23 -22
- package/dist/provenance/provenance-repository.d.ts.map +1 -1
- package/dist/provenance/provenance-repository.js +82 -44
- package/dist/provenance/provenance-repository.js.map +1 -1
- package/dist/search/knowledge-searcher.d.ts +12 -1
- package/dist/search/knowledge-searcher.d.ts.map +1 -1
- package/dist/search/knowledge-searcher.js +93 -31
- package/dist/search/knowledge-searcher.js.map +1 -1
- package/dist/search/query-classifier.d.ts +17 -0
- package/dist/search/query-classifier.d.ts.map +1 -0
- package/dist/search/query-classifier.js +63 -0
- package/dist/search/query-classifier.js.map +1 -0
- package/dist/search/query-orchestrator.d.ts +39 -0
- package/dist/search/query-orchestrator.d.ts.map +1 -0
- package/dist/search/query-orchestrator.js +239 -0
- package/dist/search/query-orchestrator.js.map +1 -0
- package/dist/search/reasoning-reranker.d.ts +59 -0
- package/dist/search/reasoning-reranker.d.ts.map +1 -0
- package/dist/search/reasoning-reranker.js +334 -0
- package/dist/search/reasoning-reranker.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +6 -0
- package/dist/services/knowledge-service.d.ts.map +1 -1
- package/dist/services/knowledge-service.js +7 -2
- package/dist/services/knowledge-service.js.map +1 -1
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +46 -6
- package/dist/storage/database.js.map +1 -1
- package/dist/storage/knowledge-repository.d.ts +65 -1
- package/dist/storage/knowledge-repository.d.ts.map +1 -1
- package/dist/storage/knowledge-repository.js +163 -9
- package/dist/storage/knowledge-repository.js.map +1 -1
- package/dist/storage/migrations/007_spec_alignment.d.ts +3 -0
- package/dist/storage/migrations/007_spec_alignment.d.ts.map +1 -0
- package/dist/storage/migrations/007_spec_alignment.js +116 -0
- package/dist/storage/migrations/007_spec_alignment.js.map +1 -0
- package/dist/storage/migrations/008_knowledge_versioning.d.ts +15 -0
- package/dist/storage/migrations/008_knowledge_versioning.d.ts.map +1 -0
- package/dist/storage/migrations/008_knowledge_versioning.js +69 -0
- package/dist/storage/migrations/008_knowledge_versioning.js.map +1 -0
- package/dist/storage/migrations/009_extraction_metadata.d.ts +12 -0
- package/dist/storage/migrations/009_extraction_metadata.d.ts.map +1 -0
- package/dist/storage/migrations/009_extraction_metadata.js +39 -0
- package/dist/storage/migrations/009_extraction_metadata.js.map +1 -0
- package/dist/storage/migrations/010_memory_protocol.d.ts +12 -0
- package/dist/storage/migrations/010_memory_protocol.d.ts.map +1 -0
- package/dist/storage/migrations/010_memory_protocol.js +26 -0
- package/dist/storage/migrations/010_memory_protocol.js.map +1 -0
- package/dist/storage/migrator.d.ts +3 -1
- package/dist/storage/migrator.d.ts.map +1 -1
- package/dist/storage/migrator.js +2 -1
- package/dist/storage/migrator.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
const DEFAULT_MAX_CONCURRENCY = 4;
|
|
2
|
+
const DEFAULT_SIMILARITY_THRESHOLD = 0.8;
|
|
3
|
+
const LLM_CONTENT_PREVIEW_LENGTH = 200;
|
|
4
|
+
/**
|
|
5
|
+
* Jaccardトークンベースのテキスト類似度を計算する。
|
|
6
|
+
* 単語を小文字分割してSetを構築し、積集合/和集合の比率を返す。
|
|
7
|
+
*/
|
|
8
|
+
function jaccardSimilarity(a, b) {
|
|
9
|
+
const tokensA = new Set(a
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.split(/\s+/)
|
|
12
|
+
.filter((t) => t.length > 0));
|
|
13
|
+
const tokensB = new Set(b
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
.split(/\s+/)
|
|
16
|
+
.filter((t) => t.length > 0));
|
|
17
|
+
const intersection = new Set([...tokensA].filter((x) => tokensB.has(x)));
|
|
18
|
+
const union = new Set([...tokensA, ...tokensB]);
|
|
19
|
+
return union.size > 0 ? intersection.size / union.size : 0;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* LLMのresolution判定レスポンスをパースする。
|
|
23
|
+
* 失敗時はnullを返す。
|
|
24
|
+
*/
|
|
25
|
+
function parseLLMResolution(content) {
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(content);
|
|
28
|
+
if (typeof parsed === "object" &&
|
|
29
|
+
parsed !== null &&
|
|
30
|
+
"resolution" in parsed &&
|
|
31
|
+
"reasoning" in parsed) {
|
|
32
|
+
const obj = parsed;
|
|
33
|
+
const validResolutions = ["deprecate_old", "deprecate_new", "merge", "keep_both"];
|
|
34
|
+
if (validResolutions.includes(obj.resolution) &&
|
|
35
|
+
typeof obj.reasoning === "string") {
|
|
36
|
+
return {
|
|
37
|
+
resolution: obj.resolution,
|
|
38
|
+
reasoning: obj.reasoning,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 並列処理をconcurrency数で制限してPromiseを実行する
|
|
50
|
+
*/
|
|
51
|
+
async function runWithConcurrency(tasks, maxConcurrency) {
|
|
52
|
+
const results = new Array(tasks.length);
|
|
53
|
+
let nextIndex = 0;
|
|
54
|
+
async function worker() {
|
|
55
|
+
while (nextIndex < tasks.length) {
|
|
56
|
+
const index = nextIndex++;
|
|
57
|
+
results[index] = await tasks[index]();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const workers = Array.from({ length: Math.min(maxConcurrency, tasks.length) }, () => worker());
|
|
61
|
+
await Promise.all(workers);
|
|
62
|
+
return results;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* ルールベースのデフォルトresolutionを返す。
|
|
66
|
+
* 矛盾タイプに応じてresolutionを設定する。
|
|
67
|
+
*/
|
|
68
|
+
function defaultResolution(contradictionType) {
|
|
69
|
+
switch (contradictionType) {
|
|
70
|
+
case "supersede":
|
|
71
|
+
return "deprecate_old";
|
|
72
|
+
case "factual":
|
|
73
|
+
return "deprecate_old";
|
|
74
|
+
case "temporal":
|
|
75
|
+
return "keep_both";
|
|
76
|
+
case "preference_change":
|
|
77
|
+
return "deprecate_old";
|
|
78
|
+
default:
|
|
79
|
+
return "keep_both";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class ReflectorAgent {
|
|
83
|
+
deps;
|
|
84
|
+
maxConcurrency;
|
|
85
|
+
similarityThreshold;
|
|
86
|
+
constructor(deps, config) {
|
|
87
|
+
this.deps = deps;
|
|
88
|
+
this.maxConcurrency = config?.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY;
|
|
89
|
+
this.similarityThreshold = config?.similarityThreshold ?? DEFAULT_SIMILARITY_THRESHOLD;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 矛盾検出 + deprecation候補提示(実行はしない)
|
|
93
|
+
*/
|
|
94
|
+
async reflect(observerOutput) {
|
|
95
|
+
const startTime = Date.now();
|
|
96
|
+
const note = this.deps.repository.getNoteById(observerOutput.noteId);
|
|
97
|
+
if (!note) {
|
|
98
|
+
const processingTimeMs = Date.now() - startTime;
|
|
99
|
+
return {
|
|
100
|
+
noteId: observerOutput.noteId,
|
|
101
|
+
contradictions: [],
|
|
102
|
+
deprecationCandidates: [],
|
|
103
|
+
versionUpdates: [],
|
|
104
|
+
processingMode: "rule",
|
|
105
|
+
processingTimeMs,
|
|
106
|
+
errors: [`Note not found: ${observerOutput.noteId}`],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// ルールベースで矛盾検出
|
|
110
|
+
const allNotes = this.deps.repository.getAllNotes().filter((n) => n.id !== note.id);
|
|
111
|
+
const contradictions = await this.detectContradictions(note, observerOutput, allNotes);
|
|
112
|
+
// LLM補完モード: ルールベースで検出した矛盾にLLM判定を追加
|
|
113
|
+
let usedLLM = false;
|
|
114
|
+
const enrichedContradictions = [...contradictions];
|
|
115
|
+
if (this.deps.llmProvider && contradictions.length > 0) {
|
|
116
|
+
try {
|
|
117
|
+
const isAvailable = await this.deps.llmProvider.isAvailable();
|
|
118
|
+
if (isAvailable) {
|
|
119
|
+
await this.enrichWithLLM(note, enrichedContradictions);
|
|
120
|
+
usedLLM = true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// LLMエラーはサイレントに無視してルールベースにフォールバック
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// deprecation候補の生成(高信頼度の矛盾から生成)
|
|
128
|
+
const deprecationCandidates = this.buildDeprecationCandidates(enrichedContradictions);
|
|
129
|
+
// versionUpdates: supersedeタイプの矛盾からバージョン更新情報を生成
|
|
130
|
+
const versionUpdates = this.buildVersionUpdates(note, enrichedContradictions);
|
|
131
|
+
const processingTimeMs = Date.now() - startTime;
|
|
132
|
+
return {
|
|
133
|
+
noteId: note.id,
|
|
134
|
+
contradictions: enrichedContradictions,
|
|
135
|
+
deprecationCandidates,
|
|
136
|
+
versionUpdates,
|
|
137
|
+
processingMode: usedLLM ? "hybrid" : "rule",
|
|
138
|
+
processingTimeMs,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* バッチ処理: 複数のObserverOutputを並列で処理する
|
|
143
|
+
*/
|
|
144
|
+
async reflectBatch(outputs) {
|
|
145
|
+
if (outputs.length === 0)
|
|
146
|
+
return [];
|
|
147
|
+
const tasks = outputs.map((output) => async () => {
|
|
148
|
+
try {
|
|
149
|
+
return await this.reflect(output);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
153
|
+
return {
|
|
154
|
+
noteId: output.noteId,
|
|
155
|
+
contradictions: [],
|
|
156
|
+
deprecationCandidates: [],
|
|
157
|
+
versionUpdates: [],
|
|
158
|
+
processingMode: "rule",
|
|
159
|
+
processingTimeMs: 0,
|
|
160
|
+
errors: [`batch processing error: ${message}`],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return runWithConcurrency(tasks, this.maxConcurrency);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* ユーザー承認後にdeprecationを実行する(best-effort方式)
|
|
168
|
+
*/
|
|
169
|
+
applyApprovedDeprecations(candidates) {
|
|
170
|
+
for (const candidate of candidates) {
|
|
171
|
+
try {
|
|
172
|
+
this.deps.repository.deprecateNote(candidate.noteId, candidate.reason);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
176
|
+
console.error(`[ReflectorAgent] Failed to deprecate note ${candidate.noteId}: ${message}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* ルールベースの矛盾検出を実行する。
|
|
182
|
+
* 4種類の矛盾タイプを検出する。
|
|
183
|
+
*/
|
|
184
|
+
async detectContradictions(note, observerOutput, allNotes) {
|
|
185
|
+
const contradictions = [];
|
|
186
|
+
// 1. supersede検出: Jaccard類似度 >= threshold
|
|
187
|
+
const supersedeResults = this.detectSupersede(note, allNotes);
|
|
188
|
+
contradictions.push(...supersedeResults);
|
|
189
|
+
// 2. factual矛盾: updatesカテゴリ + entity一致
|
|
190
|
+
const factualResults = await this.detectFactual(note, observerOutput, allNotes);
|
|
191
|
+
contradictions.push(...factualResults);
|
|
192
|
+
// 3. temporal矛盾: valid_fromの逆転
|
|
193
|
+
const temporalResults = this.detectTemporal(note, allNotes, contradictions);
|
|
194
|
+
contradictions.push(...temporalResults);
|
|
195
|
+
// 4. preference変更: preferencesカテゴリの変化
|
|
196
|
+
const preferenceResults = this.detectPreferenceChange(note, observerOutput, allNotes);
|
|
197
|
+
contradictions.push(...preferenceResults);
|
|
198
|
+
return contradictions;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* supersede検出: 類似ノートをJaccard類似度で判定する
|
|
202
|
+
*/
|
|
203
|
+
detectSupersede(note, allNotes) {
|
|
204
|
+
const results = [];
|
|
205
|
+
const noteContent = note.content ?? "";
|
|
206
|
+
for (const existing of allNotes) {
|
|
207
|
+
if (existing.deprecated === 1)
|
|
208
|
+
continue;
|
|
209
|
+
const existingContent = existing.content ?? "";
|
|
210
|
+
const similarity = jaccardSimilarity(noteContent, existingContent);
|
|
211
|
+
if (similarity >= this.similarityThreshold) {
|
|
212
|
+
// 新しいノートが古いノートをsupersede
|
|
213
|
+
results.push({
|
|
214
|
+
newVectorIndex: -1, // supersede検出はベクトルインデックスなし
|
|
215
|
+
existingNoteId: existing.id,
|
|
216
|
+
existingContent: existingContent.slice(0, LLM_CONTENT_PREVIEW_LENGTH),
|
|
217
|
+
contradictionType: "supersede",
|
|
218
|
+
confidence: similarity,
|
|
219
|
+
resolution: defaultResolution("supersede"),
|
|
220
|
+
reasoning: `Jaccard similarity: ${similarity.toFixed(3)} >= threshold: ${this.similarityThreshold}`,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return results;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* factual矛盾検出: updatesカテゴリのベクトルと既存ノートのentityを照合する
|
|
228
|
+
*/
|
|
229
|
+
async detectFactual(note, observerOutput, allNotes) {
|
|
230
|
+
const results = [];
|
|
231
|
+
const updateVectors = observerOutput.vectors.filter((v) => v.category === "updates");
|
|
232
|
+
if (updateVectors.length === 0)
|
|
233
|
+
return results;
|
|
234
|
+
const noteEntityNames = new Set(observerOutput.entities.map((e) => e.name.toLowerCase()));
|
|
235
|
+
if (noteEntityNames.size === 0)
|
|
236
|
+
return results;
|
|
237
|
+
// entity名で既存ノートを検索
|
|
238
|
+
for (const entityName of noteEntityNames) {
|
|
239
|
+
const entityObj = this.deps.graphRepository.getEntityByName(entityName);
|
|
240
|
+
if (!entityObj)
|
|
241
|
+
continue;
|
|
242
|
+
const linkedNotes = this.deps.graphRepository.getLinkedNotes(entityObj.id);
|
|
243
|
+
for (const link of linkedNotes) {
|
|
244
|
+
const existingNote = allNotes.find((n) => n.id === link.noteId);
|
|
245
|
+
if (!existingNote || existingNote.deprecated === 1)
|
|
246
|
+
continue;
|
|
247
|
+
// 既存ノートと新ノートの内容が異なる = factual矛盾
|
|
248
|
+
const existingContent = existingNote.content ?? "";
|
|
249
|
+
const noteContent = note.content ?? "";
|
|
250
|
+
if (existingContent === noteContent)
|
|
251
|
+
continue;
|
|
252
|
+
// 同一entity + 異なるcontent = factual矛盾
|
|
253
|
+
// ただし、supersedeとの重複を避けるため類似度が低い場合のみ
|
|
254
|
+
const similarity = jaccardSimilarity(noteContent, existingContent);
|
|
255
|
+
if (similarity >= this.similarityThreshold)
|
|
256
|
+
continue; // supersedeで処理済み
|
|
257
|
+
for (let i = 0; i < updateVectors.length; i++) {
|
|
258
|
+
results.push({
|
|
259
|
+
newVectorIndex: i,
|
|
260
|
+
existingNoteId: existingNote.id,
|
|
261
|
+
existingContent: existingContent.slice(0, LLM_CONTENT_PREVIEW_LENGTH),
|
|
262
|
+
contradictionType: "factual",
|
|
263
|
+
confidence: 0.7,
|
|
264
|
+
resolution: defaultResolution("factual"),
|
|
265
|
+
reasoning: `Entity "${entityName}" appears in both notes with different content`,
|
|
266
|
+
});
|
|
267
|
+
break; // 同一既存ノートに対して1つだけ
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return results;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* temporal矛盾検出: 新ノートのvalid_fromが既存ノートより前の場合
|
|
275
|
+
*/
|
|
276
|
+
detectTemporal(note, allNotes, _existingContradictions) {
|
|
277
|
+
const results = [];
|
|
278
|
+
const noteValidFrom = note.valid_from;
|
|
279
|
+
if (!noteValidFrom)
|
|
280
|
+
return results;
|
|
281
|
+
const noteValidFromDate = new Date(noteValidFrom).getTime();
|
|
282
|
+
for (const existing of allNotes) {
|
|
283
|
+
if (!existing.valid_from || existing.deprecated === 1)
|
|
284
|
+
continue;
|
|
285
|
+
const existingValidFromDate = new Date(existing.valid_from).getTime();
|
|
286
|
+
// 新しいノートのvalid_fromが古いノートより前 = 時系列の逆転
|
|
287
|
+
if (noteValidFromDate < existingValidFromDate) {
|
|
288
|
+
// 内容の類似性をチェック(無関係なノートは除外)
|
|
289
|
+
const similarity = jaccardSimilarity(note.content ?? "", existing.content ?? "");
|
|
290
|
+
if (similarity < 0.2)
|
|
291
|
+
continue;
|
|
292
|
+
results.push({
|
|
293
|
+
newVectorIndex: -1,
|
|
294
|
+
existingNoteId: existing.id,
|
|
295
|
+
existingContent: (existing.content ?? "").slice(0, LLM_CONTENT_PREVIEW_LENGTH),
|
|
296
|
+
contradictionType: "temporal",
|
|
297
|
+
confidence: 0.6,
|
|
298
|
+
resolution: defaultResolution("temporal"),
|
|
299
|
+
reasoning: `New note valid_from (${noteValidFrom}) is before existing note valid_from (${existing.valid_from})`,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return results;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* preference変更検出: preferencesカテゴリの同ツール/技術に対する異なる評価
|
|
307
|
+
*/
|
|
308
|
+
detectPreferenceChange(note, observerOutput, allNotes) {
|
|
309
|
+
const results = [];
|
|
310
|
+
const prefVectors = observerOutput.vectors.filter((v) => v.category === "preferences");
|
|
311
|
+
if (prefVectors.length === 0)
|
|
312
|
+
return results;
|
|
313
|
+
// preferencesカテゴリを含む既存ノートを検索
|
|
314
|
+
// "prefer"/"preference"などのキーワードで類似ノートを探す
|
|
315
|
+
for (let i = 0; i < prefVectors.length; i++) {
|
|
316
|
+
const prefContent = prefVectors[i].content.toLowerCase();
|
|
317
|
+
for (const existing of allNotes) {
|
|
318
|
+
if (existing.deprecated === 1)
|
|
319
|
+
continue;
|
|
320
|
+
const existingContent = (existing.content ?? "").toLowerCase();
|
|
321
|
+
// "prefer"を含む既存ノートを対象にする
|
|
322
|
+
if (!existingContent.includes("prefer"))
|
|
323
|
+
continue;
|
|
324
|
+
// 完全一致は除外
|
|
325
|
+
if (existingContent === (note.content ?? "").toLowerCase())
|
|
326
|
+
continue;
|
|
327
|
+
// キーワードが重なるが内容が異なる場合
|
|
328
|
+
const prefTokens = new Set(prefContent.split(/\s+/).filter((t) => t.length > 2));
|
|
329
|
+
const existingTokens = new Set(existingContent.split(/\s+/).filter((t) => t.length > 2));
|
|
330
|
+
const sharedTokens = [...prefTokens].filter((t) => existingTokens.has(t));
|
|
331
|
+
// 共有トークンが少なくとも1つある = 同じトピックの異なるpreference
|
|
332
|
+
if (sharedTokens.length > 0) {
|
|
333
|
+
results.push({
|
|
334
|
+
newVectorIndex: i,
|
|
335
|
+
existingNoteId: existing.id,
|
|
336
|
+
existingContent: (existing.content ?? "").slice(0, LLM_CONTENT_PREVIEW_LENGTH),
|
|
337
|
+
contradictionType: "preference_change",
|
|
338
|
+
confidence: 0.65,
|
|
339
|
+
resolution: defaultResolution("preference_change"),
|
|
340
|
+
reasoning: `Preference change detected for shared topics: ${sharedTokens.slice(0, 3).join(", ")}`,
|
|
341
|
+
});
|
|
342
|
+
break; // 同一prefVectorに対して1つのみ
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return results;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* LLMでresolutionを補完する(矛盾配列を直接変更する)
|
|
350
|
+
*/
|
|
351
|
+
async enrichWithLLM(note, contradictions) {
|
|
352
|
+
if (!this.deps.llmProvider)
|
|
353
|
+
return;
|
|
354
|
+
for (const contradiction of contradictions) {
|
|
355
|
+
const notePreview = (note.content ?? "").slice(0, LLM_CONTENT_PREVIEW_LENGTH);
|
|
356
|
+
const existingPreview = contradiction.existingContent.slice(0, LLM_CONTENT_PREVIEW_LENGTH);
|
|
357
|
+
const prompt = `以下の2つのナレッジノートに矛盾が検出されました。適切な解決方法を判定してください。
|
|
358
|
+
|
|
359
|
+
ノートA (ID: ${note.id}): ${notePreview}
|
|
360
|
+
ノートB (ID: ${contradiction.existingNoteId}): ${existingPreview}
|
|
361
|
+
矛盾タイプ: ${contradiction.contradictionType}
|
|
362
|
+
|
|
363
|
+
解決方法をJSON形式で返してください:
|
|
364
|
+
{"resolution": "deprecate_old"|"deprecate_new"|"merge"|"keep_both", "reasoning": "理由"}`;
|
|
365
|
+
try {
|
|
366
|
+
const result = await this.deps.llmProvider.complete({
|
|
367
|
+
messages: [{ role: "user", content: prompt }],
|
|
368
|
+
responseFormat: "json",
|
|
369
|
+
temperature: 0.0,
|
|
370
|
+
});
|
|
371
|
+
const parsed = parseLLMResolution(result.content);
|
|
372
|
+
if (parsed) {
|
|
373
|
+
contradiction.resolution = parsed.resolution;
|
|
374
|
+
contradiction.reasoning = parsed.reasoning;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
// LLMエラーは無視してルールベースのresolutionを維持
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* 矛盾からdeprecation候補を生成する
|
|
384
|
+
*/
|
|
385
|
+
buildDeprecationCandidates(contradictions) {
|
|
386
|
+
const candidateMap = new Map();
|
|
387
|
+
for (const contradiction of contradictions) {
|
|
388
|
+
if (contradiction.resolution !== "deprecate_old")
|
|
389
|
+
continue;
|
|
390
|
+
if (contradiction.confidence < 0.5)
|
|
391
|
+
continue;
|
|
392
|
+
const existing = candidateMap.get(contradiction.existingNoteId);
|
|
393
|
+
if (existing) {
|
|
394
|
+
existing.contradictions.push(contradiction);
|
|
395
|
+
existing.confidence = Math.max(existing.confidence, contradiction.confidence);
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
candidateMap.set(contradiction.existingNoteId, {
|
|
399
|
+
noteId: contradiction.existingNoteId,
|
|
400
|
+
reason: `矛盾検出 (${contradiction.contradictionType}): ${contradiction.reasoning}`,
|
|
401
|
+
confidence: contradiction.confidence,
|
|
402
|
+
contradictions: [contradiction],
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return [...candidateMap.values()];
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* supersedeタイプの矛盾からversionUpdates情報を生成する
|
|
410
|
+
*/
|
|
411
|
+
buildVersionUpdates(note, contradictions) {
|
|
412
|
+
const supersedeContras = contradictions.filter((c) => c.contradictionType === "supersede" && c.resolution === "deprecate_old");
|
|
413
|
+
return supersedeContras.map((c) => ({
|
|
414
|
+
noteId: note.id,
|
|
415
|
+
newVersion: (note.version ?? 1) + 1,
|
|
416
|
+
supersedesNoteId: c.existingNoteId,
|
|
417
|
+
}));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=reflector-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflector-agent.js","sourceRoot":"","sources":["../../src/agents/reflector-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ExtractedPattern } from "../types.js";
|
|
2
|
+
import type { ExtractedEntity } from "../graph/entity-extractor.js";
|
|
3
|
+
export type KnowledgeVectorCategory = "personal_info" | "preferences" | "events" | "temporal_data" | "updates" | "assistant_info";
|
|
4
|
+
export interface KnowledgeVector {
|
|
5
|
+
category: KnowledgeVectorCategory;
|
|
6
|
+
content: string;
|
|
7
|
+
confidence: number;
|
|
8
|
+
source: "rule" | "llm";
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface ObserverOutput {
|
|
12
|
+
noteId: number;
|
|
13
|
+
vectors: KnowledgeVector[];
|
|
14
|
+
patterns: ExtractedPattern[];
|
|
15
|
+
entities: ExtractedEntity[];
|
|
16
|
+
processingMode: "rule" | "hybrid";
|
|
17
|
+
processingTimeMs: number;
|
|
18
|
+
errors?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ContradictionDetection {
|
|
21
|
+
newVectorIndex: number;
|
|
22
|
+
existingNoteId: number;
|
|
23
|
+
existingContent: string;
|
|
24
|
+
contradictionType: "factual" | "temporal" | "preference_change" | "supersede";
|
|
25
|
+
confidence: number;
|
|
26
|
+
resolution: "deprecate_old" | "deprecate_new" | "merge" | "keep_both";
|
|
27
|
+
reasoning: string;
|
|
28
|
+
}
|
|
29
|
+
export interface DeprecationCandidate {
|
|
30
|
+
noteId: number;
|
|
31
|
+
reason: string;
|
|
32
|
+
confidence: number;
|
|
33
|
+
contradictions: ContradictionDetection[];
|
|
34
|
+
}
|
|
35
|
+
export interface ReflectorOutput {
|
|
36
|
+
noteId: number;
|
|
37
|
+
contradictions: ContradictionDetection[];
|
|
38
|
+
deprecationCandidates: DeprecationCandidate[];
|
|
39
|
+
versionUpdates: Array<{
|
|
40
|
+
noteId: number;
|
|
41
|
+
newVersion: number;
|
|
42
|
+
supersedesNoteId: number;
|
|
43
|
+
}>;
|
|
44
|
+
processingMode: "rule" | "hybrid";
|
|
45
|
+
processingTimeMs: number;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,MAAM,uBAAuB,GAC/B,eAAe,GACf,aAAa,GACb,QAAQ,GACR,eAAe,GACf,SAAS,GACT,gBAAgB,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAGD,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,SAAS,GAAG,UAAU,GAAG,mBAAmB,GAAG,WAAW,CAAC;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,eAAe,GAAG,eAAe,GAAG,OAAO,GAAG,WAAW,CAAC;IACtE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,sBAAsB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,cAAc,EAAE,KAAK,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;IACH,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { KnowledgeVector } from "./types.js";
|
|
2
|
+
import type { ExtractedPattern } from "../types.js";
|
|
3
|
+
import type { ExtractedEntity } from "../graph/entity-extractor.js";
|
|
4
|
+
/**
|
|
5
|
+
* ルールベースの6ベクトル分類
|
|
6
|
+
* PatternExtractorとEntityExtractorの出力を6ベクトルにマッピングする
|
|
7
|
+
*/
|
|
8
|
+
export declare function classifyByRules(patterns: ExtractedPattern[], entities: ExtractedEntity[], frontmatter: Record<string, unknown>, content: string): KnowledgeVector[];
|
|
9
|
+
/**
|
|
10
|
+
* LLMのJSON配列レスポンスをパースしてKnowledgeVectorに変換する
|
|
11
|
+
* パース失敗時はnullを返す
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseLLMVectorResponse(content: string): KnowledgeVector[] | null;
|
|
14
|
+
//# sourceMappingURL=vector-classification-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-classification-rules.d.ts","sourceRoot":"","sources":["../../src/agents/vector-classification-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAA2B,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA8JpE;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,QAAQ,EAAE,eAAe,EAAE,EAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,EAAE,MAAM,GACd,eAAe,EAAE,CA6CnB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,GAAG,IAAI,CA4ChF"}
|