bilmem 0.1.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/README.md +439 -0
- package/dist/canonical-CglQQ0xc.d.ts +262 -0
- package/dist/cli/index.js +7601 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/index.d.ts +311 -0
- package/dist/core/index.js +1975 -0
- package/dist/core/index.js.map +1 -0
- package/dist/filesystem-B3qAej0l.d.ts +69 -0
- package/dist/index.d.ts +163 -0
- package/dist/index.js +7765 -0
- package/dist/index.js.map +1 -0
- package/dist/install/index.d.ts +373 -0
- package/dist/install/index.js +6632 -0
- package/dist/install/index.js.map +1 -0
- package/dist/jev/index.d.ts +32 -0
- package/dist/jev/index.js +269 -0
- package/dist/jev/index.js.map +1 -0
- package/dist/mcp/index.d.ts +13 -0
- package/dist/mcp/index.js +5479 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/rules/index.d.ts +59 -0
- package/dist/rules/index.js +388 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/scanner/index.d.ts +169 -0
- package/dist/scanner/index.js +3829 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/search/index.d.ts +44 -0
- package/dist/search/index.js +301 -0
- package/dist/search/index.js.map +1 -0
- package/dist/stats/index.d.ts +60 -0
- package/dist/stats/index.js +1373 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/storage/index.d.ts +82 -0
- package/dist/storage/index.js +1748 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/types-Nxq5Gzay.d.ts +390 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/storage/canonical.ts","../../src/rules/loader.ts","../../src/stats/events.ts","../../src/storage/portable.ts","../../src/core/knowledge.ts","../../src/core/quarantine.ts","../../src/storage/compaction.ts"],"sourcesContent":["import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n Knowledge,\n Evidence,\n Observation,\n UnknownRecord,\n OutcomeRecord,\n EvidenceRelation,\n BilmemConfig,\n BilmemMetrics,\n RuleSet,\n RuleDefinition,\n RevisionSnapshot,\n KnowledgeDiff,\n InvestigationReceipt\n} from '../core/types.js';\nimport type { KnowledgeStoreProvider } from '../search/retriever.js';\nimport {\n loadRuleSetFile,\n stringifyRuleSetYaml,\n findRuleFiles\n} from '../rules/loader.js';\nimport type { MetricEvent } from '../stats/types.js';\nimport { readMetricEvents, resetMetricEvents } from '../stats/events.js';\n\nexport function sanitizeFileName(id: string): string {\n return encodeURIComponent(id).replace(/%/g, '_');\n}\n\nexport function desanitizeFileName(name: string): string {\n try {\n return decodeURIComponent(name.replace(/_/g, '%'));\n } catch {\n return name;\n }\n}\n\nexport class Storage implements KnowledgeStoreProvider {\n private baseDir: string;\n private knowledgeDir: string;\n private evidenceDir: string;\n private observationDir: string;\n private unknownDir: string;\n private rulesDir: string;\n private configFile: string;\n private relationsFile: string;\n private outcomesFile: string;\n private metricsFile: string;\n private revisionsFile: string;\n private knowledgeJsonlFile: string;\n private evidenceJsonlFile: string;\n private observationJsonlFile: string;\n private unknownsJsonlFile: string;\n private receiptsDir: string;\n private receiptsJsonlFile: string;\n private eventsFile: string;\n\n constructor(rootDir: string = process.cwd()) {\n this.baseDir = path.resolve(rootDir, '.bilmem');\n this.knowledgeDir = path.join(this.baseDir, 'knowledge');\n this.evidenceDir = path.join(this.baseDir, 'evidence');\n this.observationDir = path.join(this.baseDir, 'observations');\n this.unknownDir = path.join(this.baseDir, 'unknowns');\n this.rulesDir = path.join(this.baseDir, 'rules');\n this.receiptsDir = path.join(this.baseDir, 'receipts');\n this.configFile = path.join(this.baseDir, 'config.json');\n this.relationsFile = path.join(this.baseDir, 'relations.json');\n this.outcomesFile = path.join(this.baseDir, 'outcomes.jsonl');\n this.metricsFile = path.join(this.baseDir, 'metrics.json');\n this.revisionsFile = path.join(this.baseDir, 'revisions.jsonl');\n this.knowledgeJsonlFile = path.join(this.baseDir, 'knowledge.jsonl');\n this.evidenceJsonlFile = path.join(this.baseDir, 'evidence.jsonl');\n this.observationJsonlFile = path.join(this.baseDir, 'observations.jsonl');\n this.unknownsJsonlFile = path.join(this.baseDir, 'unknowns.jsonl');\n this.receiptsJsonlFile = path.join(this.baseDir, 'receipts.jsonl');\n this.eventsFile = path.join(this.baseDir, 'events.jsonl');\n }\n\n getBaseDir(): string {\n return this.baseDir;\n }\n\n async isInitialized(): Promise<boolean> {\n try {\n await fs.access(this.configFile);\n return true;\n } catch {\n return false;\n }\n }\n\n async init(options: { projectName?: string; defaultScope?: string } = {}): Promise<BilmemConfig> {\n await fs.mkdir(this.knowledgeDir, { recursive: true });\n await fs.mkdir(this.evidenceDir, { recursive: true });\n await fs.mkdir(this.observationDir, { recursive: true });\n await fs.mkdir(this.unknownDir, { recursive: true });\n await fs.mkdir(this.rulesDir, { recursive: true });\n await fs.mkdir(this.receiptsDir, { recursive: true });\n\n let config: BilmemConfig;\n if (await this.isInitialized()) {\n config = await this.getConfig();\n } else {\n config = {\n schemaVersion: 1,\n projectName: options.projectName ?? path.basename(path.dirname(this.baseDir)) ?? 'project',\n defaultScope: options.defaultScope ?? 'project',\n dataDir: this.baseDir\n };\n await this.saveConfig(config);\n }\n\n // Initialize relations & metrics if missing\n try {\n await fs.access(this.relationsFile);\n } catch {\n await fs.writeFile(this.relationsFile, JSON.stringify([], null, 2), 'utf-8');\n }\n\n try {\n await fs.access(this.metricsFile);\n } catch {\n const defaultMetrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n await fs.writeFile(this.metricsFile, JSON.stringify(defaultMetrics, null, 2), 'utf-8');\n }\n\n return config;\n }\n\n // --- Config ---\n\n async getConfig(): Promise<BilmemConfig> {\n const raw = await fs.readFile(this.configFile, 'utf-8');\n return JSON.parse(raw) as BilmemConfig;\n }\n\n async saveConfig(config: BilmemConfig): Promise<void> {\n await fs.writeFile(this.configFile, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async updateConfig(updates: Partial<BilmemConfig>): Promise<BilmemConfig> {\n const current = await this.getConfig();\n const updated = { ...current, ...updates };\n await this.saveConfig(updated);\n return updated;\n }\n\n // --- Knowledge ---\n\n async saveKnowledge(knowledge: Knowledge): Promise<void> {\n await fs.mkdir(this.knowledgeDir, { recursive: true });\n const filename = `${sanitizeFileName(knowledge.id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n await fs.writeFile(filePath, JSON.stringify(knowledge, null, 2), 'utf-8');\n await fs.appendFile(this.knowledgeJsonlFile, JSON.stringify(knowledge) + '\\n', 'utf-8');\n }\n\n async getKnowledge(id: string): Promise<Knowledge | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Knowledge;\n } catch {\n return undefined;\n }\n }\n\n async getAllKnowledge(): Promise<Knowledge[]> {\n try {\n const files = await fs.readdir(this.knowledgeDir);\n const items: Knowledge[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.knowledgeDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {\n // Ignore corrupt file\n }\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteKnowledge(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Evidence ---\n\n async saveEvidence(evidence: Evidence): Promise<void> {\n await fs.mkdir(this.evidenceDir, { recursive: true });\n const filename = `${sanitizeFileName(evidence.id)}.json`;\n const filePath = path.join(this.evidenceDir, filename);\n await fs.writeFile(filePath, JSON.stringify(evidence, null, 2), 'utf-8');\n await fs.appendFile(this.evidenceJsonlFile, JSON.stringify(evidence) + '\\n', 'utf-8');\n }\n\n async getEvidence(id: string): Promise<Evidence | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.evidenceDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Evidence;\n } catch {\n return undefined;\n }\n }\n\n async getAllEvidence(): Promise<Evidence[]> {\n try {\n const files = await fs.readdir(this.evidenceDir);\n const items: Evidence[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.evidenceDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n // --- Observations ---\n\n async saveObservation(obs: Observation): Promise<void> {\n await fs.mkdir(this.observationDir, { recursive: true });\n const filename = `${sanitizeFileName(obs.id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n await fs.writeFile(filePath, JSON.stringify(obs, null, 2), 'utf-8');\n await fs.appendFile(this.observationJsonlFile, JSON.stringify(obs) + '\\n', 'utf-8');\n }\n\n async getObservation(id: string): Promise<Observation | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Observation;\n } catch {\n return undefined;\n }\n }\n\n async getAllObservations(): Promise<Observation[]> {\n try {\n const files = await fs.readdir(this.observationDir);\n const items: Observation[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.observationDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteObservation(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Unknowns ---\n\n async saveUnknown(record: UnknownRecord): Promise<void> {\n await fs.mkdir(this.unknownDir, { recursive: true });\n const filename = `${sanitizeFileName(record.id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n await fs.writeFile(filePath, JSON.stringify(record, null, 2), 'utf-8');\n await fs.appendFile(this.unknownsJsonlFile, JSON.stringify(record) + '\\n', 'utf-8');\n }\n\n async getUnknown(id: string): Promise<UnknownRecord | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as UnknownRecord;\n } catch {\n return undefined;\n }\n }\n\n async getAllUnknowns(): Promise<UnknownRecord[]> {\n try {\n const files = await fs.readdir(this.unknownDir);\n const items: UnknownRecord[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.unknownDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteUnknown(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Outcomes (Append-oriented log) ---\n\n async appendOutcome(outcome: OutcomeRecord): Promise<void> {\n const line = JSON.stringify(outcome) + '\\n';\n await fs.appendFile(this.outcomesFile, line, 'utf-8');\n if (outcome.knowledgeId) {\n await this.appendMetricEvent({\n type: 'outcome',\n knowledgeId: outcome.knowledgeId,\n result: outcome.result,\n timestamp: Date.now()\n });\n if (outcome.result === 'success') {\n await this.appendMetricEvent({\n type: 'question_resolved',\n questionId: outcome.knowledgeId,\n timestamp: Date.now()\n });\n }\n }\n }\n\n async getAllOutcomes(): Promise<OutcomeRecord[]> {\n try {\n const raw = await fs.readFile(this.outcomesFile, 'utf-8');\n const lines = raw.split('\\n').filter((l) => l.trim().length > 0);\n return lines.map((l) => JSON.parse(l));\n } catch {\n return [];\n }\n }\n\n // --- Metric Events (Append-only local log) ---\n\n async appendMetricEvent(event: MetricEvent): Promise<void> {\n try {\n await fs.mkdir(this.baseDir, { recursive: true });\n await fs.appendFile(this.eventsFile, JSON.stringify(event) + '\\n', 'utf-8');\n } catch {\n // non-fatal\n }\n }\n\n async getMetricEvents(filter?: { sinceTimestamp?: number; knowledgeId?: string }): Promise<MetricEvent[]> {\n return readMetricEvents(path.dirname(this.baseDir), filter);\n }\n\n async resetMetricEvents(): Promise<void> {\n return resetMetricEvents(path.dirname(this.baseDir));\n }\n\n // --- Investigation Receipts ---\n\n async saveReceipt(receipt: InvestigationReceipt): Promise<void> {\n await fs.mkdir(this.receiptsDir, { recursive: true });\n const filename = `${sanitizeFileName(receipt.id)}.json`;\n const filePath = path.join(this.receiptsDir, filename);\n await fs.writeFile(filePath, JSON.stringify(receipt, null, 2), 'utf-8');\n await fs.appendFile(this.receiptsJsonlFile, JSON.stringify(receipt) + '\\n', 'utf-8');\n }\n\n async getReceipt(id: string): Promise<InvestigationReceipt | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.receiptsDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as InvestigationReceipt;\n } catch {\n return undefined;\n }\n }\n\n async getAllReceipts(): Promise<InvestigationReceipt[]> {\n try {\n const files = await fs.readdir(this.receiptsDir);\n const items: InvestigationReceipt[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.receiptsDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n // --- Relations ---\n\n async getRelations(): Promise<EvidenceRelation[]> {\n try {\n const raw = await fs.readFile(this.relationsFile, 'utf-8');\n return JSON.parse(raw) as EvidenceRelation[];\n } catch {\n return [];\n }\n }\n\n async saveRelations(relations: EvidenceRelation[]): Promise<void> {\n await fs.writeFile(this.relationsFile, JSON.stringify(relations, null, 2), 'utf-8');\n }\n\n // --- Metrics ---\n\n async getMetrics(): Promise<BilmemMetrics> {\n try {\n const raw = await fs.readFile(this.metricsFile, 'utf-8');\n return JSON.parse(raw) as BilmemMetrics;\n } catch {\n return {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n }\n }\n\n async saveMetrics(metrics: BilmemMetrics): Promise<void> {\n await fs.writeFile(this.metricsFile, JSON.stringify(metrics, null, 2), 'utf-8');\n }\n\n // --- Rules ---\n\n getRulesDir(): string {\n return this.rulesDir;\n }\n\n async loadRuleSets(): Promise<RuleSet[]> {\n const files = await findRuleFiles(path.dirname(this.baseDir), this.rulesDir);\n const sets: RuleSet[] = [];\n for (const f of files) {\n try {\n sets.push(await loadRuleSetFile(f));\n } catch {}\n }\n return sets;\n }\n\n async saveRuleSet(ruleSet: RuleSet, fileName: string = 'default.yml'): Promise<string> {\n await fs.mkdir(this.rulesDir, { recursive: true });\n const cleanName = fileName.endsWith('.yml') || fileName.endsWith('.yaml') ? fileName : `${fileName}.yml`;\n const targetPath = path.join(this.rulesDir, cleanName);\n const yaml = stringifyRuleSetYaml(ruleSet);\n await fs.writeFile(targetPath, yaml, 'utf-8');\n return targetPath;\n }\n\n async addRule(rule: RuleDefinition, fileName: string = 'default.yml'): Promise<string> {\n await fs.mkdir(this.rulesDir, { recursive: true });\n const cleanName = fileName.endsWith('.yml') || fileName.endsWith('.yaml') ? fileName : `${fileName}.yml`;\n const targetPath = path.join(this.rulesDir, cleanName);\n\n let existingSet: RuleSet;\n try {\n existingSet = await loadRuleSetFile(targetPath);\n } catch {\n existingSet = {\n name: path.basename(cleanName, path.extname(cleanName)),\n rules: []\n };\n }\n\n const existingIdx = existingSet.rules.findIndex((r) => r.id === rule.id);\n if (existingIdx >= 0) {\n existingSet.rules[existingIdx] = rule;\n } else {\n existingSet.rules.push(rule);\n }\n\n const yaml = stringifyRuleSetYaml(existingSet);\n await fs.writeFile(targetPath, yaml, 'utf-8');\n return targetPath;\n }\n\n // --- Revisions & Incremental Learning Diff ---\n\n async appendRevision(snapshot: RevisionSnapshot): Promise<void> {\n const line = JSON.stringify(snapshot) + '\\n';\n await fs.appendFile(this.revisionsFile, line, 'utf-8');\n }\n\n async getRevisions(): Promise<RevisionSnapshot[]> {\n try {\n const raw = await fs.readFile(this.revisionsFile, 'utf-8');\n const lines = raw.split('\\n').filter((l) => l.trim().length > 0);\n return lines.map((l) => JSON.parse(l));\n } catch {\n return [];\n }\n }\n\n async getLatestRevision(): Promise<RevisionSnapshot | undefined> {\n const revs = await this.getRevisions();\n return revs.length > 0 ? revs[revs.length - 1] : undefined;\n }\n\n async getDiff(sinceRef?: string): Promise<KnowledgeDiff> {\n const revisions = await this.getRevisions();\n let baselineSnapshot: RevisionSnapshot | undefined;\n let targetSnapshot: RevisionSnapshot | undefined;\n\n if (sinceRef && sinceRef.includes('..')) {\n const [startRef, endRef] = sinceRef.split('..').map((s) => s.trim().toLowerCase());\n baselineSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === startRef ||\n r.commit?.toLowerCase() === startRef ||\n r.commit?.toLowerCase().startsWith(startRef) ||\n r.id.toLowerCase().startsWith(startRef)\n );\n targetSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === endRef ||\n r.commit?.toLowerCase() === endRef ||\n r.commit?.toLowerCase().startsWith(endRef) ||\n r.id.toLowerCase().startsWith(endRef)\n );\n } else if (sinceRef) {\n const cleanRef = sinceRef.trim().toLowerCase();\n baselineSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === cleanRef ||\n r.commit?.toLowerCase() === cleanRef ||\n r.commit?.toLowerCase().startsWith(cleanRef) ||\n r.id.toLowerCase().startsWith(cleanRef)\n );\n } else {\n // If no ref provided, compare against the snapshot before the latest (if available)\n if (revisions.length >= 2) {\n baselineSnapshot = revisions[revisions.length - 2];\n } else if (revisions.length === 1) {\n baselineSnapshot = revisions[0];\n }\n }\n\n const baselineTimestamp = baselineSnapshot?.timestamp ?? '1970-01-01T00:00:00.000Z';\n const baselineTime = new Date(baselineTimestamp).getTime();\n const targetTime = targetSnapshot ? new Date(targetSnapshot.timestamp).getTime() : Date.now();\n\n const inWindow = (time: number) => time >= baselineTime && time <= targetTime;\n\n const allObservations = await this.getAllObservations();\n const allKnowledge = await this.getAllKnowledge();\n const allUnknowns = await this.getAllUnknowns();\n\n let observationsAdded = 0;\n for (const obs of allObservations) {\n const obsTime = new Date(obs.recordedAt || obs.provenance?.timestamp || 0).getTime();\n if (inWindow(obsTime)) {\n observationsAdded++;\n }\n }\n\n let candidatesAdded = 0;\n let strengthenedCount = 0;\n let revisedCount = 0;\n let contradictionCount = 0;\n let invalidatedCount = 0;\n let needsRevalidationCount = 0;\n\n const strengthened: string[] = [];\n const revised: string[] = [];\n const contradictions: string[] = [];\n const invalidated: string[] = [];\n const needsRevalidation: string[] = [];\n\n for (const k of allKnowledge) {\n const createdTime = new Date(k.createdAt).getTime();\n const updatedTime = new Date(k.updatedAt).getTime();\n\n if ((k.status === 'invalid' || k.status === 'invalidated') && inWindow(updatedTime)) {\n invalidatedCount++;\n invalidated.push(k.id);\n continue;\n }\n\n if (k.status === 'contradicted' && inWindow(updatedTime)) {\n contradictionCount++;\n contradictions.push(k.id);\n continue;\n }\n\n if ((k.status === 'needs_revalidation' || k.status === 'stale') && inWindow(updatedTime)) {\n needsRevalidationCount++;\n needsRevalidation.push(k.id);\n continue;\n }\n\n if (inWindow(createdTime)) {\n // Newly added knowledge candidate in this window\n candidatesAdded++;\n } else if (inWindow(updatedTime)) {\n // Pre-existing knowledge revised or strengthened\n if (k.metrics.support_count > 1 || k.confidence >= 0.85 || k.metrics.successful_outcomes > 0) {\n strengthenedCount++;\n strengthened.push(k.id);\n } else {\n revisedCount++;\n revised.push(k.id);\n }\n }\n }\n\n let unknownsCount = 0;\n const unknownsList: string[] = [];\n for (const u of allUnknowns) {\n const uTime = new Date(u.createdAt || u.updatedAt || 0).getTime();\n if (inWindow(uTime)) {\n unknownsCount++;\n unknownsList.push(u.id);\n }\n }\n\n const refLabel = sinceRef ?? (baselineSnapshot ? (baselineSnapshot.commit?.slice(0, 7) || baselineSnapshot.id.slice(0, 7)) : undefined);\n\n return {\n sinceRef: refLabel,\n observationsAdded,\n candidatesAdded,\n strengthenedCount,\n revisedCount,\n contradictionCount,\n unknownsCount,\n needsRevalidationCount,\n invalidatedCount,\n details: {\n strengthened,\n revised,\n contradictions,\n unknowns: unknownsList,\n needsRevalidation,\n invalidated\n }\n };\n }\n}\n\nexport function formatKnowledgeDiff(diff: KnowledgeDiff): string {\n const header = diff.sinceRef ? `Since ${diff.sinceRef}:` : 'Recent knowledge changes:';\n const lines = [\n header,\n '',\n `+ ${diff.observationsAdded} observations`,\n `+ ${diff.candidatesAdded} candidates`,\n `↑ ${diff.strengthenedCount} knowledge strengthened`,\n `~ ${diff.revisedCount} knowledge revised`,\n `! ${diff.contradictionCount} contradiction${diff.contradictionCount === 1 ? '' : 's'}`,\n `? ${diff.unknownsCount ?? 0} unknowns`,\n `× ${diff.needsRevalidationCount ?? 0} knowledge needs revalidation`,\n `- ${diff.invalidatedCount} invalidated`\n ];\n return lines.join('\\n');\n}\n\nexport { Storage as CanonicalStorage };\n\n","import YAML from 'yaml';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { RuleDefinition, RuleSet, KnowledgeType } from '../core/types.js';\n\nexport interface RuleValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Validates whether an object conforms to the RuleDefinition specification.\n */\nexport function validateRuleDefinition(rule: unknown, index: number = 0): string[] {\n const errors: string[] = [];\n if (!rule || typeof rule !== 'object') {\n errors.push(`Rule at index ${index} must be an object.`);\n return errors;\n }\n\n const r = rule as Partial<RuleDefinition>;\n if (!r.id || typeof r.id !== 'string' || !r.id.trim()) {\n errors.push(`Rule at index ${index} requires a non-empty string 'id'.`);\n }\n\n if (!r.statement || typeof r.statement !== 'string' || !r.statement.trim()) {\n errors.push(`Rule '${r.id || index}' requires a non-empty string 'statement'.`);\n }\n\n if (r.type) {\n const validTypes: KnowledgeType[] = [\n 'rule',\n 'convention',\n 'decision',\n 'lesson',\n 'architecture',\n 'fact'\n ];\n if (!validTypes.includes(r.type)) {\n errors.push(`Rule '${r.id || index}' has invalid type '${r.type}'. Allowed: ${validTypes.join(', ')}.`);\n }\n }\n\n if (r.confidence !== undefined) {\n if (typeof r.confidence !== 'number' || r.confidence < 0 || r.confidence > 1) {\n errors.push(`Rule '${r.id || index}' confidence must be a number between 0.0 and 1.0.`);\n }\n }\n\n if (r.positive !== undefined && !Array.isArray(r.positive)) {\n errors.push(`Rule '${r.id || index}' positive cues must be an array of strings.`);\n }\n\n if (r.negative !== undefined && !Array.isArray(r.negative)) {\n errors.push(`Rule '${r.id || index}' negative cues must be an array of strings.`);\n }\n\n return errors;\n}\n\n/**\n * Validates a RuleSet structure.\n */\nexport function validateRuleSet(data: unknown): RuleValidationResult {\n const errors: string[] = [];\n if (!data || typeof data !== 'object') {\n return { valid: false, errors: ['RuleSet content must be an object or an array of rules.'] };\n }\n\n let rules: unknown[] = [];\n if (Array.isArray(data)) {\n rules = data;\n } else if ('rules' in data && Array.isArray((data as any).rules)) {\n rules = (data as any).rules;\n } else if ('id' in data && 'statement' in data) {\n rules = [data];\n } else {\n return { valid: false, errors: ['RuleSet must contain a \"rules\" array or be a list of rule definitions.'] };\n }\n\n if (rules.length === 0) {\n errors.push('RuleSet contains no rules.');\n }\n\n rules.forEach((rule, idx) => {\n errors.push(...validateRuleDefinition(rule, idx));\n });\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Parses a YAML string into a normalized RuleSet.\n */\nexport function parseRuleSetYaml(content: string, sourcePath: string = 'inline.yml'): RuleSet {\n let parsed: unknown;\n try {\n parsed = YAML.parse(content);\n } catch (err: any) {\n throw new Error(`YAML syntax error in ${sourcePath}: ${err.message}`);\n }\n\n const validation = validateRuleSet(parsed);\n if (!validation.valid) {\n throw new Error(`Invalid RuleSet in ${sourcePath}:\\n- ${validation.errors.join('\\n- ')}`);\n }\n\n if (Array.isArray(parsed)) {\n return {\n name: path.basename(sourcePath, path.extname(sourcePath)),\n rules: parsed as RuleDefinition[]\n };\n }\n\n if ('id' in (parsed as any) && 'statement' in (parsed as any) && !('rules' in (parsed as any))) {\n return {\n name: (parsed as any).id,\n rules: [parsed as RuleDefinition]\n };\n }\n\n const set = parsed as RuleSet;\n return {\n name: set.name ?? path.basename(sourcePath, path.extname(sourcePath)),\n version: set.version ?? 1,\n scope: set.scope ?? 'project',\n description: set.description,\n rules: set.rules\n };\n}\n\n/**\n * Formats a RuleSet into clean, Git-friendly YAML.\n */\nexport function stringifyRuleSetYaml(ruleSet: RuleSet): string {\n const payload: Record<string, unknown> = {};\n if (ruleSet.name) payload.name = ruleSet.name;\n if (ruleSet.version !== undefined) payload.version = ruleSet.version;\n if (ruleSet.scope) payload.scope = ruleSet.scope;\n if (ruleSet.description) payload.description = ruleSet.description;\n\n payload.rules = ruleSet.rules.map((r) => {\n const ruleObj: Record<string, unknown> = {\n id: r.id\n };\n if (r.name) ruleObj.name = r.name;\n ruleObj.statement = r.statement;\n if (r.type && r.type !== 'rule') ruleObj.type = r.type;\n if (r.confidence !== undefined && r.confidence !== 0.95) ruleObj.confidence = r.confidence;\n if (r.scope && r.scope !== 'project') ruleObj.scope = r.scope;\n if (r.positive && r.positive.length > 0) ruleObj.positive = r.positive;\n if (r.negative && r.negative.length > 0) ruleObj.negative = r.negative;\n if (r.tags && r.tags.length > 0) ruleObj.tags = r.tags;\n if (r.when && Object.keys(r.when).length > 0) ruleObj.when = r.when;\n if (r.details && Object.keys(r.details).length > 0) ruleObj.details = r.details;\n return ruleObj;\n });\n\n return YAML.stringify(payload, { indent: 2, lineWidth: 100 });\n}\n\n/**\n * Reads and parses a single YAML rule file.\n */\nexport async function loadRuleSetFile(filePath: string): Promise<RuleSet> {\n const content = await fs.readFile(filePath, 'utf-8');\n return parseRuleSetYaml(content, filePath);\n}\n\n/**\n * Finds all rule YAML files in standard bilmem locations.\n */\nexport async function findRuleFiles(rootDir: string, storageRulesDir?: string): Promise<string[]> {\n const candidates: string[] = [];\n\n // 1. Storage rules directory: .bilmem/rules/*.yml, *.yaml\n const rulesDir = storageRulesDir || path.resolve(rootDir, '.bilmem', 'rules');\n try {\n const entries = await fs.readdir(rulesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && (entry.name.endsWith('.yml') || entry.name.endsWith('.yaml'))) {\n candidates.push(path.join(rulesDir, entry.name));\n }\n }\n } catch {\n // Directory might not exist yet\n }\n\n // 2. Storage root: .bilmem/rules.yml, .bilmem/rules.yaml\n for (const name of ['rules.yml', 'rules.yaml']) {\n const p = path.resolve(rootDir, '.bilmem', name);\n try {\n const st = await fs.stat(p);\n if (st.isFile()) candidates.push(p);\n } catch {}\n }\n\n // 3. Project root: rules.yml, rules.yaml, bilmem.rules.yml, bilmem.rules.yaml\n for (const name of ['bilmem.rules.yml', 'bilmem.rules.yaml', 'rules.yml', 'rules.yaml']) {\n const p = path.resolve(rootDir, name);\n try {\n const st = await fs.stat(p);\n if (st.isFile()) candidates.push(p);\n } catch {}\n }\n\n // Deduplicate canonical paths\n return Array.from(new Set(candidates));\n}\n\n/**\n * Loads and combines all rule sets discovered in project and storage.\n */\nexport async function loadAllProjectRuleSets(\n rootDir: string,\n storageRulesDir?: string\n): Promise<{ ruleSets: RuleSet[]; sourceFiles: string[] }> {\n const files = await findRuleFiles(rootDir, storageRulesDir);\n const ruleSets: RuleSet[] = [];\n const loadedFiles: string[] = [];\n\n for (const file of files) {\n try {\n const set = await loadRuleSetFile(file);\n ruleSets.push(set);\n loadedFiles.push(file);\n } catch (err: any) {\n // Log or keep error context without failing the entire scan\n console.warn(`[bilmem] Warning: Failed to load rule set from ${file}: ${err.message}`);\n }\n }\n\n return { ruleSets, sourceFiles: loadedFiles };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MetricEvent } from './types.js';\n\nexport function getEventsFilePath(rootDir: string): string {\n return path.join(rootDir, '.bilmem', 'events.jsonl');\n}\n\n/**\n * Appends a metric event to .bilmem/events.jsonl.\n * Fire-and-forget safe: will not crash caller if filesystem error occurs.\n */\nexport async function appendMetricEvent(\n rootDir: string,\n event: MetricEvent\n): Promise<void> {\n const filePath = getEventsFilePath(rootDir);\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const line = JSON.stringify(event) + '\\n';\n await fs.appendFile(filePath, line, 'utf-8');\n } catch {\n // Non-fatal logging failure: core operations must never fail due to metric tracking\n }\n}\n\n/**\n * Reads all metric events from .bilmem/events.jsonl with resilience against\n * corrupted tails, empty lines, and malformed entries.\n */\nexport async function readMetricEvents(\n rootDir: string,\n filter?: { sinceTimestamp?: number; knowledgeId?: string }\n): Promise<MetricEvent[]> {\n const filePath = getEventsFilePath(rootDir);\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return [];\n }\n return [];\n }\n\n const lines = raw.split('\\n');\n const events: MetricEvent[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const parsed = JSON.parse(trimmed) as MetricEvent;\n if (!parsed || typeof parsed !== 'object' || typeof parsed.type !== 'string') {\n continue;\n }\n if (typeof parsed.timestamp !== 'number') {\n continue;\n }\n\n if (filter?.sinceTimestamp !== undefined && parsed.timestamp < filter.sinceTimestamp) {\n continue;\n }\n\n if (filter?.knowledgeId !== undefined) {\n const kid = (parsed as { knowledgeId?: string }).knowledgeId;\n if (kid !== filter.knowledgeId) {\n continue;\n }\n }\n\n events.push(parsed);\n } catch {\n // Gracefully ignore corrupted line / partial write\n continue;\n }\n }\n\n return events;\n}\n\n/**\n * Safely resets only the metric events log.\n * Preserves all knowledge, evidence, unknowns, rules, and receipts.\n */\nexport async function resetMetricEvents(rootDir: string): Promise<void> {\n const filePath = getEventsFilePath(rootDir);\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, '', 'utf-8');\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n}\n","import YAML from 'yaml';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n Knowledge,\n UnknownRecord,\n Evidence,\n Observation,\n EvidenceRelation,\n BilmemConfig,\n BilmemMetrics,\n ReconciliationResult\n} from '../core/types.js';\nimport { reconcileKnowledge, applyReconciliation } from '../core/knowledge.js';\nimport type { Storage } from './canonical.js';\n\nexport interface PortableDump {\n schemaVersion: number;\n exportedAt: string;\n config: BilmemConfig;\n knowledge: Knowledge[];\n unknowns: UnknownRecord[];\n evidence: Evidence[];\n observations?: Observation[];\n relations: EvidenceRelation[];\n metrics: BilmemMetrics;\n}\n\nexport interface ImportReport {\n totalParsed: number;\n results: ReconciliationResult[];\n created: Knowledge[];\n updated: Knowledge[];\n}\n\n/**\n * Exports active or scoped knowledge to human-readable, Git-friendly YAML.\n */\nexport function exportKnowledgeToYaml(\n items: Knowledge[],\n options: { scope?: string } = {}\n): string {\n let filtered = items;\n if (options.scope) {\n const s = options.scope.toLowerCase();\n filtered = items.filter((k) => k.scope.toLowerCase() === s);\n }\n\n // Format objects neatly for YAML serialization\n const payload = {\n schemaVersion: 1,\n exportedAt: new Date().toISOString(),\n count: filtered.length,\n knowledge: filtered.map((k) => ({\n id: k.id,\n type: k.type,\n status: k.status,\n statement: k.statement,\n positive: k.positive,\n negative: k.negative,\n relations: k.relations.length > 0 ? k.relations : undefined,\n confidence: k.confidence,\n evidence: k.evidence.length > 0 ? k.evidence : undefined,\n scope: k.scope,\n tags: k.tags && k.tags.length > 0 ? k.tags : undefined,\n temporal: k.temporal,\n metrics: {\n reuse_count: k.metrics.reuse_count,\n support_count: k.metrics.support_count,\n contradiction_count: k.metrics.contradiction_count\n }\n }))\n };\n\n return YAML.stringify(payload, { indent: 2, lineWidth: 100 });\n}\n\n/**\n * Smart import operation:\n * Validates, normalizes, retrieves related knowledge, and reconciles\n * with merge / update / contradict / new actions.\n */\nexport async function importKnowledgeFromYaml(\n yamlContent: string,\n storage: Storage\n): Promise<ImportReport> {\n const parsed = YAML.parse(yamlContent);\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid YAML: root must be an object');\n }\n\n let candidates: any[] = [];\n if (Array.isArray(parsed)) {\n candidates = parsed;\n } else if (Array.isArray(parsed.knowledge)) {\n candidates = parsed.knowledge;\n } else if (parsed.id && parsed.statement) {\n candidates = [parsed];\n } else {\n throw new Error('Invalid knowledge YAML format: no knowledge entries found');\n }\n\n const existing = await storage.getAllKnowledge();\n const results: ReconciliationResult[] = [];\n const created: Knowledge[] = [];\n const updated: Knowledge[] = [];\n\n for (const raw of candidates) {\n if (!raw.statement || typeof raw.statement !== 'string') {\n continue;\n }\n\n const rec = reconcileKnowledge(raw, existing);\n results.push(rec);\n\n const { updatedKnowledge, action } = applyReconciliation(rec, raw, existing, storage);\n await storage.saveKnowledge(updatedKnowledge);\n\n if (action === 'NEW' || action === 'SPECIALIZE') {\n created.push(updatedKnowledge);\n existing.push(updatedKnowledge);\n } else if (action !== 'IGNORE') {\n updated.push(updatedKnowledge);\n }\n }\n\n return {\n totalParsed: candidates.length,\n results,\n created,\n updated\n };\n}\n\n/**\n * Produces a portable, complete snapshot sufficient for deterministic restoration.\n */\nexport async function dumpToYaml(storage: Storage): Promise<string> {\n const config = await storage.getConfig();\n const knowledge = await storage.getAllKnowledge();\n const unknowns = await storage.getAllUnknowns();\n const evidence = await storage.getAllEvidence();\n const observations = await storage.getAllObservations();\n const relations = await storage.getRelations();\n const metrics = await storage.getMetrics();\n\n const dump: PortableDump = {\n schemaVersion: 1,\n exportedAt: new Date().toISOString(),\n config,\n knowledge,\n unknowns,\n evidence,\n observations,\n relations,\n metrics\n };\n\n return YAML.stringify(dump, { indent: 2, lineWidth: 120 });\n}\n\n/**\n * Deterministic restoration from a dump file.\n * Does NOT reinterpret or relearn the backup; restores exact canonical state.\n */\nexport async function restoreFromYaml(\n yamlContent: string,\n storage: Storage\n): Promise<{ restoredKnowledgeCount: number; restoredUnknownsCount: number }> {\n const parsed = YAML.parse(yamlContent) as PortableDump;\n if (!parsed || parsed.schemaVersion !== 1) {\n throw new Error(`Unsupported snapshot schema version: ${parsed?.schemaVersion}`);\n }\n\n // Restore config\n if (parsed.config) {\n await storage.saveConfig(parsed.config);\n }\n\n // Restore knowledge\n let kCount = 0;\n if (Array.isArray(parsed.knowledge)) {\n for (const k of parsed.knowledge) {\n await storage.saveKnowledge(k);\n kCount++;\n }\n }\n\n // Restore unknowns\n let uCount = 0;\n if (Array.isArray(parsed.unknowns)) {\n for (const u of parsed.unknowns) {\n await storage.saveUnknown(u);\n uCount++;\n }\n }\n\n // Restore evidence\n if (Array.isArray(parsed.evidence)) {\n for (const e of parsed.evidence) {\n await storage.saveEvidence(e);\n }\n }\n\n // Restore observations\n if (Array.isArray(parsed.observations)) {\n for (const o of parsed.observations) {\n await storage.saveObservation(o);\n }\n }\n\n // Restore relations\n if (Array.isArray(parsed.relations)) {\n await storage.saveRelations(parsed.relations);\n }\n\n // Restore metrics\n if (parsed.metrics) {\n await storage.saveMetrics(parsed.metrics);\n }\n\n return {\n restoredKnowledgeCount: kCount,\n restoredUnknownsCount: uCount\n };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n Knowledge,\n KnowledgeType,\n KnowledgeStatus,\n KnowledgeStage,\n KnowledgeHistoryEntry,\n KnowledgeOutcomesSummary,\n Scope,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction,\n ConfidenceTier\n} from './types.js';\nimport { determineInitialStage, calculateKnowledgeValue, evaluatePromotion } from './quarantine.js';\nimport type { MetricEvent } from '../stats/types.js';\n\n/**\n * Deterministic mapping between confidence tiers and normalized float scores.\n * Replaces arbitrary precision floats with explainable thresholds.\n */\nexport function tierToConfidence(tier: ConfidenceTier): number {\n switch (tier) {\n case 'low':\n return 0.50;\n case 'medium':\n return 0.75;\n case 'high':\n return 0.95;\n }\n}\n\nexport function confidenceToTier(score: number): ConfidenceTier {\n if (score >= 0.85) return 'high';\n if (score >= 0.65) return 'medium';\n return 'low';\n}\n\nexport function hashString(input: string): string {\n return createHash('sha256').update(input.trim().toLowerCase()).digest('hex').slice(0, 16);\n}\n\nexport function createObservation(params: {\n source: string;\n claim: string;\n provenance?: Provenance;\n confidence?: number;\n positive?: string[];\n negative?: string[];\n details?: Record<string, unknown>;\n}): Observation {\n const provenance: Provenance = params.provenance ?? {\n type: 'file',\n path: params.source,\n timestamp: new Date().toISOString()\n };\n const contentForHash = `${params.source}:${params.claim}:${provenance.commit || provenance.timestamp || Date.now()}`;\n const id = `obs_${hashString(contentForHash)}`;\n\n return {\n id,\n source: params.source,\n claim: params.claim.trim(),\n provenance,\n confidence: Math.min(1.0, Math.max(0.0, params.confidence ?? 0.8)),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n details: params.details,\n recordedAt: new Date().toISOString()\n };\n}\n\n/**\n * Creates or consolidates evidence based on underlying source.\n * Crucial constraint: Multiple agents reading the same source must NOT count as independent evidence.\n */\nexport function createEvidence(\n observation: Observation,\n type: 'supports' | 'contradicts' | 'observes' = 'supports'\n): Evidence {\n const sourceHash = hashString(observation.source);\n const id = `evi_${sourceHash}`;\n\n return {\n id,\n source: observation.source,\n sourceHash,\n observationIds: [observation.id],\n type,\n claim: observation.claim,\n provenance: observation.provenance,\n weight: 1.0,\n firstObservedAt: observation.recordedAt,\n lastObservedAt: observation.recordedAt\n };\n}\n\nexport function createKnowledge(params: {\n id: string;\n type?: KnowledgeType;\n status?: KnowledgeStatus;\n stage?: KnowledgeStage;\n statement: string;\n positive?: string[];\n negative?: string[];\n relations?: string[];\n depends_on?: string[];\n resolves?: string[];\n question?: string;\n confidence?: number;\n confidenceTier?: ConfidenceTier;\n evidence?: string[];\n scope?: Scope;\n tags?: string[];\n history?: KnowledgeHistoryEntry[];\n outcomesSummary?: KnowledgeOutcomesSummary;\n}): Knowledge {\n const now = new Date().toISOString();\n const confidenceTier =\n params.confidenceTier ??\n (params.confidence !== undefined ? confidenceToTier(params.confidence) : undefined);\n const confidence =\n params.confidence !== undefined\n ? params.confidence\n : (confidenceTier ? tierToConfidence(confidenceTier) : 0.85);\n\n const dependsOn = new Set<string>(params.depends_on ?? []);\n if (params.evidence) {\n for (const ev of params.evidence) {\n if (ev.startsWith('file:') || ev.startsWith('test:') || ev.startsWith('code:')) {\n dependsOn.add(ev);\n } else if (ev.includes('/') || ev.endsWith('.json') || ev.endsWith('.yaml') || ev.endsWith('.yml')) {\n dependsOn.add(`file:${ev}`);\n }\n }\n }\n\n const initialStage = params.stage ?? determineInitialStage({\n type: params.type ?? 'lesson',\n evidence: params.evidence ?? [],\n confidence\n });\n\n const status = params.status ?? (initialStage === 'candidate' ? 'candidate' : 'active');\n\n const history: KnowledgeHistoryEntry[] = params.history ?? [\n {\n timestamp: now,\n stage: initialStage,\n status,\n reason: `Initial knowledge recorded (${params.type ?? 'lesson'})`,\n source: params.evidence?.[0]\n }\n ];\n\n const knowledgeItem: Knowledge = {\n id: params.id.trim(),\n type: params.type ?? 'lesson',\n status,\n stage: initialStage,\n statement: params.statement.trim(),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n relations: Array.from(new Set(params.relations?.map((r) => r.trim()) ?? [])),\n depends_on: Array.from(dependsOn),\n resolves: params.resolves ? Array.from(new Set(params.resolves.map((r) => r.trim()))) : undefined,\n question: params.question?.trim(),\n confidence: Math.min(1.0, Math.max(0.0, confidence)),\n confidenceTier,\n evidence: Array.from(new Set(params.evidence ?? [])),\n scope: params.scope ?? 'project',\n tags: Array.from(new Set(params.tags?.map((t) => t.trim().toLowerCase()) ?? [])),\n temporal: {\n revision: 1\n },\n metrics: {\n reuse_count: 0,\n support_count: 1,\n contradiction_count: 0,\n successful_outcomes: 0,\n failed_outcomes: 0\n },\n outcomesSummary: params.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n },\n history,\n value: 0,\n createdAt: now,\n updatedAt: now\n };\n\n knowledgeItem.value = calculateKnowledgeValue(knowledgeItem);\n return knowledgeItem;\n}\n\n/**\n * Calculate effective confidence combining evidence ratio and outcome history.\n */\nexport function calculateEffectiveConfidence(knowledge: Knowledge): number {\n const m = knowledge.metrics;\n const base = knowledge.confidence;\n\n // Evidence ratio dampening: heavily penalizes contradictions\n const evRatio = (m.support_count + 1) / (m.support_count + 3 * m.contradiction_count + 1);\n\n const totalOutcomes = m.successful_outcomes + m.failed_outcomes;\n let outRatio = 1.0;\n let evWeight = 0.6;\n let outWeight = 0.4;\n\n if (totalOutcomes === 0) {\n evWeight = 0.85;\n outWeight = 0.15;\n } else {\n outRatio = (m.successful_outcomes + 1) / (totalOutcomes + 1);\n }\n\n const effective = base * (evWeight * evRatio + outWeight * outRatio);\n return Math.round(Math.min(1.0, Math.max(0.05, effective)) * 100) / 100;\n}\n\nconst knowledgeTokenCache = new WeakMap<Knowledge, Set<string>>();\n\n/**\n * Tokenize string into lowercase terms for lexical similarity comparison.\n */\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getCachedTokens(k: Knowledge): Set<string> {\n let tokens = knowledgeTokenCache.get(k);\n if (!tokens) {\n tokens = tokenize(k.statement);\n knowledgeTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\nfunction jaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 1.0;\n let intersection = 0;\n for (const item of setA) {\n if (setB.has(item)) intersection++;\n }\n const union = setA.size + setB.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Known polar antonym word pairs.\n */\nconst POLAR_ANTONYMS: Array<[string, string]> = [\n ['enabled', 'disabled'],\n ['enable', 'disable'],\n ['active', 'inactive'],\n ['true', 'false'],\n ['on', 'off'],\n ['yes', 'no'],\n ['allowed', 'disallowed'],\n ['allowed', 'prohibited'],\n ['allowed', 'forbidden'],\n ['permit', 'deny'],\n ['allow', 'forbid'],\n ['allow', 'prohibit'],\n ['always', 'never'],\n ['should', 'should not'],\n ['must', 'must not'],\n ['required', 'optional'],\n ['required', 'forbidden'],\n ['valid', 'invalid'],\n ['safe', 'unsafe'],\n ['sync', 'async'],\n ['synchronous', 'asynchronous'],\n ['public', 'private']\n];\n\nconst NEGATION_PATTERNS = [\n /\\bnot\\b/i,\n /\\bnever\\b/i,\n /\\bno\\b/i,\n /\\bcannot\\b/i,\n /\\bwithout\\b/i,\n /\\bdisallow\\b/i,\n /\\bforbid\\b/i,\n /\\bprohibit\\b/i,\n /\\bavoid\\b/i\n];\n\n/**\n * Checks if two statements express opposite polarity or semantic contradiction.\n * Essential rule: High lexical similarity does NOT imply MERGE.\n * \"cache enabled in production\" vs \"cache disabled in production\" have opposite polarity.\n */\nexport function detectPolarContradiction(\n stmtA: string,\n stmtB: string\n): { contradicted: boolean; reason?: string } {\n const lowerA = stmtA.toLowerCase();\n const lowerB = stmtB.toLowerCase();\n\n // 1. Check known antonym pairs\n for (const [pos, neg] of POLAR_ANTONYMS) {\n const aHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerA);\n const aHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerA);\n const bHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerB);\n const bHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerB);\n\n if ((aHasPos && bHasNeg) || (aHasNeg && bHasPos)) {\n return {\n contradicted: true,\n reason: `Polar opposite terms detected: '${pos}' vs '${neg}'`\n };\n }\n }\n\n // 2. Check asymmetric negation (one statement has negation, the other does not)\n const aHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerA));\n const bHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerB));\n\n if (aHasNegation !== bHasNegation) {\n return {\n contradicted: true,\n reason: 'Asymmetric negation detected (one statement asserts, the other negates)'\n };\n }\n\n return { contradicted: false };\n}\n\n/**\n * Reconcile an incoming candidate lesson with existing knowledge.\n * Classifies the action as: NEW, MERGE, UPDATE, SUPPORT, CONTRADICT, SPECIALIZE, GENERALIZE, IGNORE.\n */\nexport function reconcileKnowledge(\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[]\n): ReconciliationResult {\n const candidateId = candidate.id?.trim();\n const candidateStmt = candidate.statement.trim();\n const candidateTokens = tokenize(candidateStmt);\n const candidatePos = new Set((candidate.positive ?? []).map((p) => p.trim().toLowerCase()));\n\n // 1. Direct ID match\n if (candidateId) {\n const directMatch = existingList.find((k) => k.id === candidateId);\n if (directMatch) {\n // Check for exact identical statement\n if (directMatch.statement.trim().toLowerCase() === candidateStmt.toLowerCase()) {\n // If evidence is identical and cues are identical, IGNORE to avoid duplicate bloat\n const hasNewEvidence = (candidate.evidence ?? []).some((e) => !directMatch.evidence.includes(e));\n if (!hasNewEvidence) {\n return {\n action: 'IGNORE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Identical statement and evidence already recorded'\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Confirms existing knowledge with new evidence source'\n };\n }\n\n // Check if candidate contradicts existing statement (e.g. contains negation or opposing cues)\n const opposingPositive = (candidate.negative ?? []).some((n) => directMatch.positive.includes(n));\n const opposingNegative = (candidate.positive ?? []).some((p) => directMatch.negative.includes(p));\n const polarCheck = detectPolarContradiction(candidateStmt, directMatch.statement);\n\n if (opposingPositive || opposingNegative || polarCheck.contradicted) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !directMatch.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(directMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(directMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Conflicting claim applies under specialized context cues: [${distinctCues.join(', ')}] (${polarCheck.reason || 'opposing polarity'})`\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Contradicts existing statement (${polarCheck.reason || 'opposing polarity'}) for ID \"${directMatch.id}\"`\n };\n }\n\n return {\n action: 'UPDATE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Refines or updates existing knowledge statement'\n };\n }\n }\n\n // 2. Search for nearby existing knowledge by statement similarity and contextual overlap\n let bestMatch: Knowledge | null = null;\n let bestSim = 0;\n let bestPolarCheck: { contradicted: boolean; reason?: string } = { contradicted: false };\n\n for (const existing of existingList) {\n const existingTokens = getCachedTokens(existing);\n const sim = jaccardSimilarity(candidateTokens, existingTokens);\n\n // Explicit polar contradiction check: opposing polar assertions on same topic\n const polarCheck = detectPolarContradiction(candidateStmt, existing.statement);\n if (polarCheck.contradicted) {\n let sharedCount = 0;\n for (const t of candidateTokens) {\n if (existingTokens.has(t)) sharedCount++;\n }\n const sharedCues = (candidate.positive ?? []).filter((p) => existing.positive.includes(p));\n if (sharedCount >= 2 || (sharedCues.length >= 1 && sim >= 0.35) || sim >= 0.40) {\n bestMatch = existing;\n bestSim = Math.max(sim, 0.85);\n bestPolarCheck = polarCheck;\n break;\n }\n }\n\n if (sim > bestSim) {\n bestSim = sim;\n bestMatch = existing;\n bestPolarCheck = polarCheck;\n }\n }\n\n if (bestMatch && bestSim >= 0.70) {\n // CRITICAL: First evaluate contradiction and polar polarity BEFORE any merge decision!\n const polarCheck = bestPolarCheck.contradicted\n ? bestPolarCheck\n : detectPolarContradiction(candidateStmt, bestMatch.statement);\n const hasOpposingCues =\n (candidate.negative ?? []).some((n) => bestMatch!.positive.includes(n)) ||\n (candidate.positive ?? []).some((p) => bestMatch!.negative.includes(p));\n\n if (polarCheck.contradicted || hasOpposingCues) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !bestMatch!.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(bestMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(bestMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `High textual similarity (${Math.round(bestSim * 100)}%) with polar distinction across contexts (${polarCheck.reason || 'opposing cues'})`,\n score: bestSim\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Contradicting statement (${polarCheck.reason || 'opposing cues'}) despite high textual similarity (${Math.round(bestSim * 100)}%)`,\n score: bestSim\n };\n }\n\n // Only if polarity is compatible and similarity is nearly identical:\n if (bestSim >= 0.90) {\n return {\n action: 'MERGE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Nearly identical statement (${Math.round(bestSim * 100)}% match) with compatible polarity; merging cues and evidence`,\n score: bestSim\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Supports existing knowledge (${Math.round(bestSim * 100)}% similarity) with compatible polarity`,\n score: bestSim\n };\n }\n\n // 3. Fallback: completely new knowledge\n return {\n action: 'NEW',\n reason: 'No conflicting or matching knowledge found; creating new knowledge entry'\n };\n}\n\n/**\n * Apply reconciliation to knowledge base.\n */\nexport function applyReconciliation(\n reconciliation: ReconciliationResult,\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[],\n storage?: { appendMetricEvent(event: MetricEvent): Promise<void> }\n): { updatedKnowledge: Knowledge; action: ReconciliationAction; createdId: string } {\n const now = new Date().toISOString();\n\n switch (reconciliation.action) {\n case 'SUPPORT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n\n // Add new evidence refs\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) {\n target.evidence.push(e);\n }\n }\n }\n\n // Merge positive/negative cues if any new\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Confirmed with supporting evidence',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'SUPPORT', createdId: target.id };\n }\n\n case 'MERGE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_merged',\n knowledgeId: target.id,\n targetId: reconciliation.targetId,\n timestamp: Date.now()\n });\n\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (candidate.negative) {\n for (const n of candidate.negative) {\n const ln = n.trim().toLowerCase();\n if (!target.negative.includes(ln)) target.negative.push(ln);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Merged with compatible knowledge candidate',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'MERGE', createdId: target.id };\n }\n\n case 'UPDATE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.statement = candidate.statement;\n if (candidate.type) target.type = candidate.type;\n if (candidate.positive) {\n target.positive = Array.from(new Set([...target.positive, ...candidate.positive.map((p) => p.toLowerCase())]));\n }\n if (candidate.negative) {\n target.negative = Array.from(new Set([...target.negative, ...candidate.negative.map((n) => n.toLowerCase())]));\n }\n if (candidate.evidence) {\n target.evidence = Array.from(new Set([...target.evidence, ...candidate.evidence]));\n }\n\n target.temporal = {\n revision: (target.temporal?.revision ?? 1) + 1,\n valid_from: { timestamp: now }\n };\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Updated statement and context',\n source: candidate.evidence?.[0]\n });\n\n target.updatedAt = now;\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'UPDATE', createdId: target.id };\n }\n\n case 'CONTRADICT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.contradiction_count++;\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (target.metrics.contradiction_count > target.metrics.support_count) {\n target.status = 'contradicted';\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Contradicted by opposing claim',\n source: candidate.evidence?.[0]\n });\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n storage?.appendMetricEvent({\n type: 'contradiction_detected',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'CONTRADICT', createdId: target.id };\n }\n\n case 'SPECIALIZE': {\n // Create specialized branch\n const parent = existingList.find((k) => k.id === reconciliation.targetId);\n const subContext = candidate.positive?.[0] || 'specialized';\n const newId =\n candidate.id && candidate.id !== parent?.id\n ? candidate.id\n : `${parent ? parent.id : 'knowledge'}.${subContext}`;\n\n const created = createKnowledge({\n id: newId,\n type: candidate.type ?? parent?.type ?? 'lesson',\n statement: candidate.statement,\n positive: candidate.positive ?? [],\n negative: candidate.negative ?? [],\n relations: parent ? [parent.id, ...(candidate.relations ?? [])] : (candidate.relations ?? []),\n confidence: candidate.confidence ?? 0.85,\n evidence: candidate.evidence ?? [],\n scope: candidate.scope ?? parent?.scope ?? 'project',\n tags: candidate.tags ?? parent?.tags ?? []\n });\n\n if (parent) {\n if (!parent.relations.includes(newId)) {\n parent.relations.push(newId);\n }\n if (!parent.history) {\n parent.history = [\n {\n timestamp: parent.createdAt || now,\n stage: parent.stage,\n status: parent.status,\n reason: 'Initial knowledge recorded'\n }\n ];\n }\n parent.history.push({\n timestamp: now,\n stage: parent.stage,\n status: parent.status,\n reason: `Specialized into contextual branch ${newId}`\n });\n }\n\n storage?.appendMetricEvent({\n type: 'knowledge_specialized',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n\n return { updatedKnowledge: created, action: 'SPECIALIZE', createdId: created.id };\n }\n\n case 'IGNORE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n storage?.appendMetricEvent({\n type: 'duplicate_ignored',\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'IGNORE', createdId: target.id };\n }\n\n case 'NEW':\n default: {\n const newId = candidate.id || `kn_${hashString(candidate.statement)}`;\n const created = createKnowledge({\n id: newId,\n type: candidate.type,\n statement: candidate.statement,\n positive: candidate.positive,\n negative: candidate.negative,\n relations: candidate.relations,\n confidence: candidate.confidence,\n evidence: candidate.evidence,\n scope: candidate.scope,\n tags: candidate.tags\n });\n storage?.appendMetricEvent({\n type: 'knowledge_created',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: created, action: 'NEW', createdId: created.id };\n }\n }\n}\n","import type {\n Knowledge,\n KnowledgeStage,\n OutcomeRecord,\n KnowledgeBudgetConfig\n} from './types.js';\n\n/**\n * Determines initial quarantine stage for a new knowledge item.\n * Deterministic facts (e.g. compiler config, explicit package manifests) skip probation directly to 'active'.\n * Speculative lessons, heuristics, and inferences start in 'candidate' stage.\n */\nexport function determineInitialStage(knowledge: Partial<Knowledge>): KnowledgeStage {\n if (\n knowledge.type === 'fact' ||\n knowledge.type === 'architecture' ||\n knowledge.confidenceTier === 'high' ||\n (knowledge.confidence !== undefined && knowledge.confidence >= 0.85)\n ) {\n return 'active';\n }\n if (\n knowledge.type === 'rule' &&\n ((knowledge.evidence?.length ?? 0) >= 2 || (knowledge.confidence !== undefined && knowledge.confidence >= 0.75))\n ) {\n return 'probation';\n }\n if (knowledge.confidence !== undefined && knowledge.confidence >= 0.70) {\n return 'probation';\n }\n return 'candidate';\n}\n\n/**\n * Evaluates whether a knowledge item qualifies for promotion along the quarantine ladder:\n * CANDIDATE -> PROBATION -> ACTIVE\n */\nexport function evaluatePromotion(knowledge: Knowledge): {\n promoted: boolean;\n newStage: KnowledgeStage;\n reason?: string;\n} {\n const stage = knowledge.stage ?? 'candidate';\n const supportCount = knowledge.metrics.support_count;\n const reuseCount = knowledge.metrics.reuse_count;\n const successCount = Math.max(knowledge.outcomesSummary?.successful ?? 0, knowledge.metrics.successful_outcomes ?? 0);\n const misleadingCount = Math.max(knowledge.outcomesSummary?.misleading ?? 0, knowledge.metrics.failed_outcomes ?? 0);\n\n if (stage === 'candidate') {\n // Promote to probation if supported by 2+ independent sources or high confidence evidence\n if (supportCount >= 2 || (knowledge.evidence && knowledge.evidence.length >= 2) || knowledge.confidence >= 0.85) {\n return {\n promoted: true,\n newStage: 'probation',\n reason: `Supported by ${supportCount} sources / ${knowledge.evidence.length} evidence nodes`\n };\n }\n } else if (stage === 'probation') {\n // Promote to active if successfully reused or confirmed by positive task outcome without misleading outcomes\n if ((successCount > 0 && misleadingCount === 0) || (reuseCount >= 2 && misleadingCount === 0)) {\n return {\n promoted: true,\n newStage: 'active',\n reason: `Verified by ${successCount} successful task outcomes and ${reuseCount} reuses`\n };\n }\n }\n\n return { promoted: false, newStage: stage };\n}\n\n/**\n * Calculates deterministic knowledge value metric.\n * Combines reuse frequency, evidence backing, successful task outcomes, and penalizes misleading outcomes.\n * Used during compaction and knowledge budget management.\n */\nexport function calculateKnowledgeValue(knowledge: Knowledge): number {\n const reuse = knowledge.metrics.reuse_count;\n const success = knowledge.outcomesSummary?.successful ?? knowledge.metrics.successful_outcomes;\n const misleading = knowledge.outcomesSummary?.misleading ?? knowledge.metrics.failed_outcomes;\n const evidenceCount = Math.min(knowledge.evidence.length, 6);\n const confidence = knowledge.confidence;\n\n let value = (reuse * 2.5) + (success * 4.0) + (evidenceCount * 1.5) + (confidence * 2.0) - (misleading * 5.0);\n\n if (knowledge.status === 'active') value += 5.0;\n if (knowledge.status === 'needs_revalidation') value -= 3.0;\n if (knowledge.status === 'contradicted') value -= 8.0;\n if (knowledge.status === 'stale') value -= 4.0;\n if (knowledge.stage === 'active') value += 3.0;\n if (knowledge.stage === 'candidate') value -= 1.0;\n\n return Math.round(value * 10) / 10;\n}\n\n/**\n * Applies a task outcome record to a knowledge item:\n * Updates outcome telemetry, recalculates value, and triggers promotion or demotion.\n */\nexport function recordOutcomeOnKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): { updatedKnowledge: Knowledge; actionTaken?: string } {\n const now = new Date().toISOString();\n const summary = knowledge.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n };\n\n summary.applied++;\n let actionTaken: string | undefined;\n\n if (outcome.result === 'success') {\n summary.successful++;\n knowledge.metrics.successful_outcomes++;\n knowledge.metrics.reuse_count++;\n // Check if probation item qualifies for promotion\n const promo = evaluatePromotion({ ...knowledge, outcomesSummary: summary });\n if (promo.promoted) {\n knowledge.stage = promo.newStage;\n actionTaken = `Promoted to ${promo.newStage} (${promo.reason})`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: knowledge.status,\n action: 'promote',\n reason: promo.reason\n });\n knowledge.history = history;\n }\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n summary.misleading++;\n knowledge.metrics.failed_outcomes++;\n // Demote or mark needs_revalidation if misleading outcomes dominate\n if (summary.misleading >= 2 && summary.misleading > summary.successful) {\n knowledge.status = 'needs_revalidation';\n actionTaken = `Marked needs_revalidation: ${summary.misleading} misleading outcomes recorded`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: 'needs_revalidation',\n action: 'demote',\n reason: actionTaken\n });\n knowledge.history = history;\n }\n } else {\n summary.neutral++;\n }\n\n knowledge.outcomesSummary = summary;\n knowledge.value = calculateKnowledgeValue(knowledge);\n knowledge.updatedAt = now;\n\n return { updatedKnowledge: knowledge, actionTaken };\n}\n\n/**\n * Enforces knowledge budget without arbitrarily deleting provenance.\n * When active knowledge exceeds budget, demotes lowest-value items to probation/candidate.\n */\nexport function enforceKnowledgeBudget(\n knowledgeList: Knowledge[],\n budget?: KnowledgeBudgetConfig\n): { modifiedList: Knowledge[]; demotedCount: number } {\n if (!budget || !budget.active || budget.active <= 0) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n const activeItems = knowledgeList.filter((k) => k.status === 'active' && k.stage === 'active');\n if (activeItems.length <= budget.active) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n // Sort active items by value ascending (lowest value first)\n activeItems.sort((a, b) => calculateKnowledgeValue(a) - calculateKnowledgeValue(b));\n\n const excessCount = activeItems.length - budget.active;\n const toDemote = new Set(activeItems.slice(0, excessCount).map((k) => k.id));\n const now = new Date().toISOString();\n\n const modifiedList = knowledgeList.map((k) => {\n if (toDemote.has(k.id)) {\n const history = k.history ?? [];\n k.stage = 'probation';\n k.status = 'probation';\n k.updatedAt = now;\n k.history = [\n ...history,\n {\n timestamp: now,\n stage: 'probation',\n status: 'probation',\n action: 'budget_demotion',\n reason: `Active items exceeded budget (${budget.active}). Demoted to probation based on knowledge value.`\n }\n ];\n return k;\n }\n return k;\n });\n\n return { modifiedList, demotedCount: excessCount };\n}\n","import type { Knowledge, Observation } from '../core/types.js';\nimport type { Storage } from './canonical.js';\nimport { calculateEffectiveConfidence, detectPolarContradiction } from '../core/knowledge.js';\n\nexport interface CompactionReport {\n dryRun: boolean;\n mergedDuplicatesCount: number;\n markedStaleCount: number;\n markedContradictedCount: number;\n prunedObservationsCount: number;\n details: string[];\n}\n\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction jaccard(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 1.0;\n let inter = 0;\n for (const item of a) {\n if (b.has(item)) inter++;\n }\n const union = a.size + b.size - inter;\n return union === 0 ? 0 : inter / union;\n}\n\n/**\n * Conservative compaction mechanism:\n * - merges duplicates & consolidates highly similar knowledge only after polarity check\n * - marks stale knowledge based on age / zero reuse\n * - detects heavily contradicted knowledge\n * - cleans orphaned, unreferenced low-value observations while strictly preserving provenance.\n */\nexport async function compact(\n storage: Storage,\n options: { dryRun?: boolean } = {}\n): Promise<CompactionReport> {\n const dryRun = options.dryRun ?? false;\n const report: CompactionReport = {\n dryRun,\n mergedDuplicatesCount: 0,\n markedStaleCount: 0,\n markedContradictedCount: 0,\n prunedObservationsCount: 0,\n details: []\n };\n\n const allKnowledge = await storage.getAllKnowledge();\n const allEvidence = await storage.getAllEvidence();\n const allObservations = await storage.getAllObservations();\n\n // Set of all evidence and observation IDs referenced by active knowledge\n const activeReferencedEvidence = new Set<string>();\n for (const k of allKnowledge) {\n for (const e of k.evidence) {\n activeReferencedEvidence.add(e);\n }\n }\n\n const activeReferencedObservations = new Set<string>();\n for (const ev of allEvidence) {\n for (const oId of ev.observationIds) {\n activeReferencedObservations.add(oId);\n }\n }\n\n // 1. Merge duplicates / highly similar knowledge units\n const processed = new Set<string>();\n const toDelete = new Set<string>();\n\n for (let i = 0; i < allKnowledge.length; i++) {\n const primary = allKnowledge[i];\n if (processed.has(primary.id) || toDelete.has(primary.id)) continue;\n processed.add(primary.id);\n\n const primaryTokens = tokenize(primary.statement);\n\n for (let j = i + 1; j < allKnowledge.length; j++) {\n const secondary = allKnowledge[j];\n if (processed.has(secondary.id) || toDelete.has(secondary.id)) continue;\n if (primary.scope !== secondary.scope) continue;\n\n // Essential check: Never merge polar contradictions regardless of lexical similarity\n const polarCheck = detectPolarContradiction(primary.statement, secondary.statement);\n if (polarCheck.contradicted) {\n primary.metrics.contradiction_count++;\n secondary.metrics.contradiction_count++;\n report.markedContradictedCount++;\n report.details.push(\n `Detected contradiction: \"${secondary.id}\" vs \"${primary.id}\" (${polarCheck.reason}). Skipping merge.`\n );\n continue;\n }\n\n const secondaryTokens = tokenize(secondary.statement);\n const sim = jaccard(primaryTokens, secondaryTokens);\n\n if (sim >= 0.85) {\n // High similarity and not contradictory: merge secondary into primary\n report.mergedDuplicatesCount++;\n report.details.push(`Merged duplicate: \"${secondary.id}\" into \"${primary.id}\" (${Math.round(sim * 100)}% match)`);\n\n primary.metrics.support_count += secondary.metrics.support_count;\n primary.metrics.reuse_count += secondary.metrics.reuse_count;\n primary.metrics.successful_outcomes += secondary.metrics.successful_outcomes;\n primary.metrics.failed_outcomes += secondary.metrics.failed_outcomes;\n\n // Merge evidence\n for (const e of secondary.evidence) {\n if (!primary.evidence.includes(e)) primary.evidence.push(e);\n }\n\n // Merge cues\n for (const p of secondary.positive) {\n if (!primary.positive.includes(p)) primary.positive.push(p);\n }\n for (const n of secondary.negative) {\n if (!primary.negative.includes(n)) primary.negative.push(n);\n }\n\n primary.confidence = calculateEffectiveConfidence(primary);\n toDelete.add(secondary.id);\n }\n }\n\n // 2. Check for contradiction / stale status\n if (primary.metrics.contradiction_count > 2 * primary.metrics.support_count && primary.status === 'active') {\n primary.status = 'contradicted';\n report.markedContradictedCount++;\n report.details.push(`Marked \"${primary.id}\" as contradicted (${primary.metrics.contradiction_count} vs ${primary.metrics.support_count})`);\n }\n\n if (!dryRun) {\n await storage.saveKnowledge(primary);\n }\n }\n\n // Delete merged secondary knowledge items\n if (!dryRun) {\n for (const delId of toDelete) {\n await storage.deleteKnowledge(delId);\n }\n }\n\n // 3. Prune orphaned observations (older than 14 days, never referenced by any evidence or knowledge)\n const now = Date.now();\n const FOURTEEN_DAYS_MS = 14 * 24 * 60 * 60 * 1000;\n\n for (const obs of allObservations) {\n const isReferenced =\n activeReferencedObservations.has(obs.id) ||\n activeReferencedEvidence.has(obs.id) ||\n activeReferencedEvidence.has(obs.source);\n\n if (!isReferenced) {\n const age = now - new Date(obs.recordedAt).getTime();\n if (age > FOURTEEN_DAYS_MS) {\n report.prunedObservationsCount++;\n report.details.push(`Pruned unreferenced stale observation: \"${obs.id}\"`);\n if (!dryRun) {\n await storage.deleteObservation(obs.id);\n }\n }\n }\n }\n\n return report;\n}\n"],"mappings":"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","names":["fs","path","fs","path","YAML","YAML","tokenize"]}
|