@tonycasey/lisa 2.12.0 → 2.25.2
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 +2 -2
- package/dist/lib/application/handlers/PromptSubmitHandler.js +2 -2
- package/dist/lib/application/handlers/PromptSubmitHandler.js.map +1 -1
- package/dist/lib/application/handlers/SessionStopHandler.d.ts.map +1 -1
- package/dist/lib/application/handlers/SessionStopHandler.js +12 -2
- package/dist/lib/application/handlers/SessionStopHandler.js.map +1 -1
- package/dist/lib/commands/init.js +3 -3
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/knowledge.d.ts.map +1 -1
- package/dist/lib/commands/knowledge.js +449 -1
- package/dist/lib/commands/knowledge.js.map +1 -1
- package/dist/lib/domain/errors/LlmErrors.d.ts +41 -0
- package/dist/lib/domain/errors/LlmErrors.d.ts.map +1 -0
- package/dist/lib/domain/errors/LlmErrors.js +64 -0
- package/dist/lib/domain/errors/LlmErrors.js.map +1 -0
- package/dist/lib/domain/interfaces/IConsolidationService.d.ts +65 -0
- package/dist/lib/domain/interfaces/IConsolidationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IConsolidationService.js +21 -0
- package/dist/lib/domain/interfaces/IConsolidationService.js.map +1 -0
- package/dist/lib/domain/interfaces/ICurationService.d.ts +81 -0
- package/dist/lib/domain/interfaces/ICurationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ICurationService.js +65 -0
- package/dist/lib/domain/interfaces/ICurationService.js.map +1 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.d.ts +67 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.js +9 -0
- package/dist/lib/domain/interfaces/IDeduplicationService.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.d.ts +36 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.js +11 -0
- package/dist/lib/domain/interfaces/ILlmConfigService.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmGuard.d.ts +35 -0
- package/dist/lib/domain/interfaces/ILlmGuard.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmGuard.js +12 -0
- package/dist/lib/domain/interfaces/ILlmGuard.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmService.d.ts +87 -0
- package/dist/lib/domain/interfaces/ILlmService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmService.js +40 -0
- package/dist/lib/domain/interfaces/ILlmService.js.map +1 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.d.ts +60 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.js +29 -0
- package/dist/lib/domain/interfaces/ILlmUsageTracker.js.map +1 -0
- package/dist/lib/domain/interfaces/IMemoryService.d.ts +90 -0
- package/dist/lib/domain/interfaces/IMemoryService.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/INlCurationService.d.ts +75 -0
- package/dist/lib/domain/interfaces/INlCurationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/INlCurationService.js +31 -0
- package/dist/lib/domain/interfaces/INlCurationService.js.map +1 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.d.ts +46 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.js +11 -0
- package/dist/lib/domain/interfaces/IPreferenceStore.js.map +1 -0
- package/dist/lib/domain/interfaces/IRecursionService.d.ts +10 -6
- package/dist/lib/domain/interfaces/IRecursionService.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/ISummarizationService.d.ts +52 -0
- package/dist/lib/domain/interfaces/ISummarizationService.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ISummarizationService.js +11 -0
- package/dist/lib/domain/interfaces/ISummarizationService.js.map +1 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.d.ts +34 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.js +9 -0
- package/dist/lib/domain/interfaces/ITaskTypeDetector.js.map +1 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.d.ts +68 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.js +32 -0
- package/dist/lib/domain/interfaces/ITranscriptEnricher.js.map +1 -0
- package/dist/lib/domain/interfaces/IWorkSummary.d.ts +64 -0
- package/dist/lib/domain/interfaces/IWorkSummary.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/IWorkSummary.js +13 -0
- package/dist/lib/domain/interfaces/IWorkSummary.js.map +1 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.d.ts +46 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.js +9 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.js.map +1 -0
- package/dist/lib/domain/interfaces/dal/IMemoryRepository.d.ts +62 -1
- package/dist/lib/domain/interfaces/dal/IMemoryRepository.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/dal/index.d.ts +3 -2
- package/dist/lib/domain/interfaces/dal/index.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/dal/index.js.map +1 -1
- package/dist/lib/domain/interfaces/dal/types.d.ts +37 -0
- package/dist/lib/domain/interfaces/dal/types.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/dal/types.js.map +1 -1
- package/dist/lib/domain/interfaces/index.d.ts +15 -1
- package/dist/lib/domain/interfaces/index.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/index.js +21 -1
- package/dist/lib/domain/interfaces/index.js.map +1 -1
- package/dist/lib/domain/interfaces/types/ICapturedWork.d.ts +3 -0
- package/dist/lib/domain/interfaces/types/ICapturedWork.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/types/ICapturedWork.js.map +1 -1
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.d.ts +56 -0
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.js +94 -0
- package/dist/lib/domain/interfaces/types/IMemoryLifecycle.js.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.d.ts +113 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.js +195 -0
- package/dist/lib/domain/interfaces/types/IMemoryQuality.js.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.d.ts +49 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.js +62 -0
- package/dist/lib/domain/interfaces/types/IMemoryRelationship.js.map +1 -0
- package/dist/lib/domain/interfaces/types/ITaskType.d.ts +59 -0
- package/dist/lib/domain/interfaces/types/ITaskType.d.ts.map +1 -0
- package/dist/lib/domain/interfaces/types/ITaskType.js +104 -0
- package/dist/lib/domain/interfaces/types/ITaskType.js.map +1 -0
- package/dist/lib/domain/interfaces/types/index.d.ts +4 -0
- package/dist/lib/domain/interfaces/types/index.d.ts.map +1 -1
- package/dist/lib/domain/interfaces/types/index.js +33 -1
- package/dist/lib/domain/interfaces/types/index.js.map +1 -1
- package/dist/lib/domain/utils/deduplication.d.ts +38 -0
- package/dist/lib/domain/utils/deduplication.d.ts.map +1 -0
- package/dist/lib/domain/utils/deduplication.js +225 -0
- package/dist/lib/domain/utils/deduplication.js.map +1 -0
- package/dist/lib/domain/utils/index.d.ts +1 -0
- package/dist/lib/domain/utils/index.d.ts.map +1 -1
- package/dist/lib/domain/utils/index.js +6 -1
- package/dist/lib/domain/utils/index.js.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.d.ts +12 -2
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.d.ts.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.js +14 -0
- package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.js.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.d.ts +25 -3
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.d.ts.map +1 -1
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.js +156 -1
- package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.js.map +1 -1
- package/dist/lib/infrastructure/di/bootstrap.d.ts.map +1 -1
- package/dist/lib/infrastructure/di/bootstrap.js +92 -2
- package/dist/lib/infrastructure/di/bootstrap.js.map +1 -1
- package/dist/lib/infrastructure/di/tokens.d.ts +24 -0
- package/dist/lib/infrastructure/di/tokens.d.ts.map +1 -1
- package/dist/lib/infrastructure/di/tokens.js +12 -0
- package/dist/lib/infrastructure/di/tokens.js.map +1 -1
- package/dist/lib/infrastructure/services/ConsolidationService.d.ts +21 -0
- package/dist/lib/infrastructure/services/ConsolidationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/ConsolidationService.js +134 -0
- package/dist/lib/infrastructure/services/ConsolidationService.js.map +1 -0
- package/dist/lib/infrastructure/services/CurationService.d.ts +28 -0
- package/dist/lib/infrastructure/services/CurationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/CurationService.js +112 -0
- package/dist/lib/infrastructure/services/CurationService.js.map +1 -0
- package/dist/lib/infrastructure/services/DeduplicationService.d.ts +21 -0
- package/dist/lib/infrastructure/services/DeduplicationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/DeduplicationService.js +111 -0
- package/dist/lib/infrastructure/services/DeduplicationService.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmConfigService.d.ts +19 -0
- package/dist/lib/infrastructure/services/LlmConfigService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmConfigService.js +161 -0
- package/dist/lib/infrastructure/services/LlmConfigService.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.d.ts +47 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.js +176 -0
- package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmGuard.d.ts +29 -0
- package/dist/lib/infrastructure/services/LlmGuard.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmGuard.js +92 -0
- package/dist/lib/infrastructure/services/LlmGuard.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmService.d.ts +19 -0
- package/dist/lib/infrastructure/services/LlmService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmService.js +253 -0
- package/dist/lib/infrastructure/services/LlmService.js.map +1 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.d.ts +25 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.js +130 -0
- package/dist/lib/infrastructure/services/LlmUsageTracker.js.map +1 -0
- package/dist/lib/infrastructure/services/MemoryService.d.ts +29 -2
- package/dist/lib/infrastructure/services/MemoryService.d.ts.map +1 -1
- package/dist/lib/infrastructure/services/MemoryService.js +93 -0
- package/dist/lib/infrastructure/services/MemoryService.js.map +1 -1
- package/dist/lib/infrastructure/services/NlCurationService.d.ts +29 -0
- package/dist/lib/infrastructure/services/NlCurationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/NlCurationService.js +276 -0
- package/dist/lib/infrastructure/services/NlCurationService.js.map +1 -0
- package/dist/lib/infrastructure/services/PreferenceStore.d.ts +19 -0
- package/dist/lib/infrastructure/services/PreferenceStore.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/PreferenceStore.js +109 -0
- package/dist/lib/infrastructure/services/PreferenceStore.js.map +1 -0
- package/dist/lib/infrastructure/services/SessionCaptureService.d.ts +60 -19
- package/dist/lib/infrastructure/services/SessionCaptureService.d.ts.map +1 -1
- package/dist/lib/infrastructure/services/SessionCaptureService.js +474 -51
- package/dist/lib/infrastructure/services/SessionCaptureService.js.map +1 -1
- package/dist/lib/infrastructure/services/SummarizationService.d.ts +21 -0
- package/dist/lib/infrastructure/services/SummarizationService.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/SummarizationService.js +132 -0
- package/dist/lib/infrastructure/services/SummarizationService.js.map +1 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.d.ts +23 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.js +170 -0
- package/dist/lib/infrastructure/services/TranscriptEnricher.js.map +1 -0
- package/dist/lib/infrastructure/services/index.d.ts +12 -0
- package/dist/lib/infrastructure/services/index.d.ts.map +1 -1
- package/dist/lib/infrastructure/services/index.js +31 -1
- package/dist/lib/infrastructure/services/index.js.map +1 -1
- package/dist/lib/infrastructure/services/prompts/curation.d.ts +22 -0
- package/dist/lib/infrastructure/services/prompts/curation.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/curation.js +73 -0
- package/dist/lib/infrastructure/services/prompts/curation.js.map +1 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.d.ts +31 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.js +52 -0
- package/dist/lib/infrastructure/services/prompts/deduplication.js.map +1 -0
- package/dist/lib/infrastructure/services/prompts/extraction.d.ts +27 -0
- package/dist/lib/infrastructure/services/prompts/extraction.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/extraction.js +94 -0
- package/dist/lib/infrastructure/services/prompts/extraction.js.map +1 -0
- package/dist/lib/infrastructure/services/prompts/summarization.d.ts +25 -0
- package/dist/lib/infrastructure/services/prompts/summarization.d.ts.map +1 -0
- package/dist/lib/infrastructure/services/prompts/summarization.js +60 -0
- package/dist/lib/infrastructure/services/prompts/summarization.js.map +1 -0
- package/dist/lib/skills/common/type-mappings.d.ts.map +1 -1
- package/dist/lib/skills/common/type-mappings.js +5 -0
- package/dist/lib/skills/common/type-mappings.js.map +1 -1
- package/dist/lib/skills/memory/memory.d.ts +8 -2
- package/dist/lib/skills/memory/memory.d.ts.map +1 -1
- package/dist/lib/skills/memory/memory.js +27 -3
- package/dist/lib/skills/memory/memory.js.map +1 -1
- package/dist/lib/skills/shared/clients/Neo4jClient.d.ts.map +1 -1
- package/dist/lib/skills/shared/clients/Neo4jClient.js +75 -30
- package/dist/lib/skills/shared/clients/Neo4jClient.js.map +1 -1
- package/dist/lib/skills/shared/clients/interfaces/INeo4jClient.d.ts +16 -0
- package/dist/lib/skills/shared/clients/interfaces/INeo4jClient.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/MemoryCliService.d.ts +28 -2
- package/dist/lib/skills/shared/services/MemoryCliService.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/MemoryCliService.js +112 -5
- package/dist/lib/skills/shared/services/MemoryCliService.js.map +1 -1
- package/dist/lib/skills/shared/services/MemoryService.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/MemoryService.js +410 -1
- package/dist/lib/skills/shared/services/MemoryService.js.map +1 -1
- package/dist/lib/skills/shared/services/index.d.ts +1 -1
- package/dist/lib/skills/shared/services/index.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/index.js +2 -1
- package/dist/lib/skills/shared/services/index.js.map +1 -1
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.d.ts +148 -0
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.d.ts.map +1 -1
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.js +0 -4
- package/dist/lib/skills/shared/services/interfaces/IMemoryService.js.map +1 -1
- package/dist/opencode/lisa.js +3904 -507
- package/dist/package.json +16 -16
- package/dist/project/.lisa/skills/git/SKILL.md +4 -13
- package/dist/project/.lisa/skills/init-review/SKILL.md +1 -1
- package/dist/project/.lisa/skills/jira/SKILL.md +1 -1
- package/dist/project/.lisa/skills/lisa/SKILL.md +1 -1
- package/dist/project/.lisa/skills/memory/SKILL.md +1 -2
- package/dist/project/.lisa/skills/tasks/SKILL.md +3 -4
- package/package.json +1 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Consolidation Service Implementation.
|
|
4
|
+
*
|
|
5
|
+
* Consolidates duplicate or related memory facts by merging,
|
|
6
|
+
* archiving duplicates, or keeping all unchanged.
|
|
7
|
+
*
|
|
8
|
+
* Creates supersedes relationships when a relationship writer is available.
|
|
9
|
+
*
|
|
10
|
+
* Part of Phase 5C: Curation & Compaction.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.createConsolidationService = createConsolidationService;
|
|
14
|
+
/**
|
|
15
|
+
* Create a ConsolidationService.
|
|
16
|
+
*
|
|
17
|
+
* @param memoryWriter - Memory writer for adding/expiring facts
|
|
18
|
+
* @param memoryReader - Memory reader for loading facts (to find newest)
|
|
19
|
+
* @param relationshipWriter - Optional relationship writer for supersedes links
|
|
20
|
+
*/
|
|
21
|
+
function createConsolidationService(memoryWriter, memoryReader, relationshipWriter) {
|
|
22
|
+
return {
|
|
23
|
+
async consolidate(groupId, factUuids, action, options) {
|
|
24
|
+
// Validate: at least 2 UUIDs
|
|
25
|
+
if (factUuids.length < 2) {
|
|
26
|
+
throw new Error('Consolidation requires at least 2 fact UUIDs');
|
|
27
|
+
}
|
|
28
|
+
// Validate: retainUuid must be in the list
|
|
29
|
+
if (options?.retainUuid && !factUuids.includes(options.retainUuid)) {
|
|
30
|
+
throw new Error(`retainUuid "${options.retainUuid}" is not in the provided fact UUIDs`);
|
|
31
|
+
}
|
|
32
|
+
if (action === 'keep-all') {
|
|
33
|
+
return {
|
|
34
|
+
action: 'keep-all',
|
|
35
|
+
retainedUuid: factUuids[0],
|
|
36
|
+
archivedUuids: [],
|
|
37
|
+
relationshipsCreated: 0,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (action === 'merge') {
|
|
41
|
+
return await handleMerge(groupId, factUuids, options);
|
|
42
|
+
}
|
|
43
|
+
// archive-duplicates
|
|
44
|
+
return await handleArchiveDuplicates(groupId, factUuids, options);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Handle the merge action: create new fact, expire originals, link supersedes.
|
|
49
|
+
*/
|
|
50
|
+
async function handleMerge(groupId, factUuids, options) {
|
|
51
|
+
// Determine merged text
|
|
52
|
+
const mergedText = options?.mergedText;
|
|
53
|
+
if (!mergedText) {
|
|
54
|
+
throw new Error('merge action requires mergedText in options');
|
|
55
|
+
}
|
|
56
|
+
// Add the new merged fact
|
|
57
|
+
await memoryWriter.addFact(groupId, mergedText);
|
|
58
|
+
// Find the UUID of the newly created fact by searching recent facts
|
|
59
|
+
// for the merged text. Load enough to find it deterministically.
|
|
60
|
+
const recentFacts = await memoryReader.loadFactsDateOrdered([groupId], 20);
|
|
61
|
+
const newFact = recentFacts.find((fact) => fact.fact === mergedText);
|
|
62
|
+
if (!newFact?.uuid) {
|
|
63
|
+
throw new Error('Unable to locate merged fact after creation');
|
|
64
|
+
}
|
|
65
|
+
const retainedUuid = newFact.uuid;
|
|
66
|
+
// Expire all original facts
|
|
67
|
+
const archivedUuids = [];
|
|
68
|
+
for (const uuid of factUuids) {
|
|
69
|
+
await memoryWriter.expireFact(groupId, uuid);
|
|
70
|
+
archivedUuids.push(uuid);
|
|
71
|
+
}
|
|
72
|
+
// Create supersedes relationships
|
|
73
|
+
let relationshipsCreated = 0;
|
|
74
|
+
if (relationshipWriter) {
|
|
75
|
+
for (const uuid of factUuids) {
|
|
76
|
+
try {
|
|
77
|
+
await relationshipWriter.linkFacts(groupId, retainedUuid, uuid, 'supersedes');
|
|
78
|
+
relationshipsCreated++;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Gracefully skip if relationship creation fails
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
action: 'merge',
|
|
87
|
+
retainedUuid,
|
|
88
|
+
archivedUuids,
|
|
89
|
+
relationshipsCreated,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Handle the archive-duplicates action: keep one, expire rest, link supersedes.
|
|
94
|
+
*/
|
|
95
|
+
async function handleArchiveDuplicates(groupId, factUuids, options) {
|
|
96
|
+
let retainUuid = options?.retainUuid;
|
|
97
|
+
// Default to the newest fact if no retainUuid specified
|
|
98
|
+
if (!retainUuid) {
|
|
99
|
+
const facts = await memoryReader.loadFactsDateOrdered([groupId]);
|
|
100
|
+
// Find the newest fact that's in our UUID list
|
|
101
|
+
const uuidSet = new Set(factUuids);
|
|
102
|
+
const newest = facts.find((f) => f.uuid && uuidSet.has(f.uuid));
|
|
103
|
+
retainUuid = newest?.uuid ?? factUuids[0];
|
|
104
|
+
}
|
|
105
|
+
// Expire all facts except the retained one
|
|
106
|
+
const archivedUuids = [];
|
|
107
|
+
for (const uuid of factUuids) {
|
|
108
|
+
if (uuid !== retainUuid) {
|
|
109
|
+
await memoryWriter.expireFact(groupId, uuid);
|
|
110
|
+
archivedUuids.push(uuid);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Create supersedes relationships
|
|
114
|
+
let relationshipsCreated = 0;
|
|
115
|
+
if (relationshipWriter) {
|
|
116
|
+
for (const uuid of archivedUuids) {
|
|
117
|
+
try {
|
|
118
|
+
await relationshipWriter.linkFacts(groupId, retainUuid, uuid, 'supersedes');
|
|
119
|
+
relationshipsCreated++;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Gracefully skip if relationship creation fails
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
action: 'archive-duplicates',
|
|
128
|
+
retainedUuid: retainUuid,
|
|
129
|
+
archivedUuids,
|
|
130
|
+
relationshipsCreated,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=ConsolidationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsolidationService.js","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/ConsolidationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curation Service Implementation.
|
|
3
|
+
*
|
|
4
|
+
* Marks facts with curation status (authoritative, draft, deprecated, needs-review)
|
|
5
|
+
* and computes quality scores for ranking facts by reliability.
|
|
6
|
+
*
|
|
7
|
+
* Detection only — delegates mutations to the underlying memory service.
|
|
8
|
+
*
|
|
9
|
+
* Part of Phase 5C: Curation & Compaction.
|
|
10
|
+
*/
|
|
11
|
+
import type { ICurationService } from '../../domain/interfaces/ICurationService';
|
|
12
|
+
import type { IMemoryWriter } from '../../domain/interfaces/IMemoryService';
|
|
13
|
+
/**
|
|
14
|
+
* Compute recency bonus for a fact.
|
|
15
|
+
* 1.0 for facts < 7 days old, decays linearly to 0.5 at 90 days.
|
|
16
|
+
*
|
|
17
|
+
* @param createdAt - ISO timestamp or Date of fact creation
|
|
18
|
+
* @param now - Current time (for testing)
|
|
19
|
+
* @returns Recency bonus between 0.5 and 1.0
|
|
20
|
+
*/
|
|
21
|
+
export declare function computeRecencyBonus(createdAt: string | Date | undefined, now?: Date): number;
|
|
22
|
+
/**
|
|
23
|
+
* Create a CurationService.
|
|
24
|
+
*
|
|
25
|
+
* @param memoryWriter - Memory writer for mutations (addFact for tags, expireFact for deprecated)
|
|
26
|
+
*/
|
|
27
|
+
export declare function createCurationService(memoryWriter: IMemoryWriter): ICurationService;
|
|
28
|
+
//# sourceMappingURL=CurationService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurationService.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/CurationService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,0CAA0C,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAwC5E;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAcxG;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,aAAa,GAC1B,gBAAgB,CAqDlB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Curation Service Implementation.
|
|
4
|
+
*
|
|
5
|
+
* Marks facts with curation status (authoritative, draft, deprecated, needs-review)
|
|
6
|
+
* and computes quality scores for ranking facts by reliability.
|
|
7
|
+
*
|
|
8
|
+
* Detection only — delegates mutations to the underlying memory service.
|
|
9
|
+
*
|
|
10
|
+
* Part of Phase 5C: Curation & Compaction.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.computeRecencyBonus = computeRecencyBonus;
|
|
14
|
+
exports.createCurationService = createCurationService;
|
|
15
|
+
const ICurationService_1 = require("../../domain/interfaces/ICurationService");
|
|
16
|
+
const IMemoryQuality_1 = require("../../domain/interfaces/types/IMemoryQuality");
|
|
17
|
+
/**
|
|
18
|
+
* Source weight map for quality score computation.
|
|
19
|
+
* Higher weight = more reliable source.
|
|
20
|
+
*/
|
|
21
|
+
const SOURCE_WEIGHTS = {
|
|
22
|
+
'user-explicit': 1.0,
|
|
23
|
+
'code-analysis': 0.8,
|
|
24
|
+
'session-capture': 0.7,
|
|
25
|
+
'external-sync': 0.6,
|
|
26
|
+
'prompt-capture': 0.4,
|
|
27
|
+
'auto-inferred': 0.3,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Default source weight when no source tag is present.
|
|
31
|
+
*/
|
|
32
|
+
const DEFAULT_SOURCE_WEIGHT = 0.5;
|
|
33
|
+
/**
|
|
34
|
+
* Default confidence level when no confidence tag is present.
|
|
35
|
+
*/
|
|
36
|
+
const DEFAULT_CONFIDENCE = 'medium';
|
|
37
|
+
/**
|
|
38
|
+
* Recency thresholds in milliseconds.
|
|
39
|
+
*/
|
|
40
|
+
const RECENCY_FULL_BONUS_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
41
|
+
const RECENCY_DECAY_END_MS = 90 * 24 * 60 * 60 * 1000; // 90 days
|
|
42
|
+
const RECENCY_MIN_BONUS = 0.5;
|
|
43
|
+
/**
|
|
44
|
+
* Compute recency bonus for a fact.
|
|
45
|
+
* 1.0 for facts < 7 days old, decays linearly to 0.5 at 90 days.
|
|
46
|
+
*
|
|
47
|
+
* @param createdAt - ISO timestamp or Date of fact creation
|
|
48
|
+
* @param now - Current time (for testing)
|
|
49
|
+
* @returns Recency bonus between 0.5 and 1.0
|
|
50
|
+
*/
|
|
51
|
+
function computeRecencyBonus(createdAt, now = new Date()) {
|
|
52
|
+
if (!createdAt)
|
|
53
|
+
return RECENCY_MIN_BONUS;
|
|
54
|
+
const created = typeof createdAt === 'string' ? new Date(createdAt) : createdAt;
|
|
55
|
+
if (isNaN(created.getTime()))
|
|
56
|
+
return RECENCY_MIN_BONUS;
|
|
57
|
+
const ageMs = now.getTime() - created.getTime();
|
|
58
|
+
if (ageMs <= RECENCY_FULL_BONUS_MS)
|
|
59
|
+
return 1.0;
|
|
60
|
+
if (ageMs >= RECENCY_DECAY_END_MS)
|
|
61
|
+
return RECENCY_MIN_BONUS;
|
|
62
|
+
// Linear decay from 1.0 to 0.5 between 7 and 90 days
|
|
63
|
+
const decayRange = RECENCY_DECAY_END_MS - RECENCY_FULL_BONUS_MS;
|
|
64
|
+
const decayProgress = (ageMs - RECENCY_FULL_BONUS_MS) / decayRange;
|
|
65
|
+
return 1.0 - decayProgress * (1.0 - RECENCY_MIN_BONUS);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a CurationService.
|
|
69
|
+
*
|
|
70
|
+
* @param memoryWriter - Memory writer for mutations (addFact for tags, expireFact for deprecated)
|
|
71
|
+
*/
|
|
72
|
+
function createCurationService(memoryWriter) {
|
|
73
|
+
return {
|
|
74
|
+
async markFact(groupId, uuid, mark) {
|
|
75
|
+
const curationTag = (0, ICurationService_1.resolveCurationTag)(mark);
|
|
76
|
+
// Add the curation tag to the fact
|
|
77
|
+
await memoryWriter.addFact(groupId, `__curate:${uuid}`, [curationTag]);
|
|
78
|
+
// Side effects by mark
|
|
79
|
+
if (mark === 'deprecated') {
|
|
80
|
+
await memoryWriter.expireFact(groupId, uuid);
|
|
81
|
+
}
|
|
82
|
+
if (mark === 'authoritative') {
|
|
83
|
+
// Promote confidence to verified
|
|
84
|
+
const confidenceTag = (0, IMemoryQuality_1.resolveConfidenceTag)('verified');
|
|
85
|
+
await memoryWriter.addFact(groupId, `__promote:${uuid}`, [confidenceTag]);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
computeQualityScore(item) {
|
|
89
|
+
const tags = item.tags ?? [];
|
|
90
|
+
// Parse confidence from tags, default to medium
|
|
91
|
+
const confidence = (0, IMemoryQuality_1.parseConfidenceTag)(tags) ?? DEFAULT_CONFIDENCE;
|
|
92
|
+
const confidenceScore = IMemoryQuality_1.CONFIDENCE_SCORES[confidence];
|
|
93
|
+
// Parse source from tags, use default weight
|
|
94
|
+
const source = (0, IMemoryQuality_1.parseSourceTag)(tags);
|
|
95
|
+
const sourceWeight = source ? (SOURCE_WEIGHTS[source] ?? DEFAULT_SOURCE_WEIGHT) : DEFAULT_SOURCE_WEIGHT;
|
|
96
|
+
// Compute recency bonus
|
|
97
|
+
const recencyBonus = computeRecencyBonus(item.created_at);
|
|
98
|
+
// Quality score = confidence × source weight × recency
|
|
99
|
+
const score = confidenceScore * sourceWeight * recencyBonus;
|
|
100
|
+
// Clamp to [0.0, 1.0]
|
|
101
|
+
return Math.max(0, Math.min(1, Math.round(score * 1000) / 1000));
|
|
102
|
+
},
|
|
103
|
+
rankByQuality(items) {
|
|
104
|
+
return [...items].sort((a, b) => {
|
|
105
|
+
const scoreA = this.computeQualityScore(a);
|
|
106
|
+
const scoreB = this.computeQualityScore(b);
|
|
107
|
+
return scoreB - scoreA;
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=CurationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurationService.js","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/CurationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deduplication Detection Service.
|
|
3
|
+
*
|
|
4
|
+
* Infrastructure wrapper around the domain-level deduplication algorithm.
|
|
5
|
+
* Loads facts and conflict groups from repositories, then delegates
|
|
6
|
+
* to the pure detection functions in domain/utils/deduplication.
|
|
7
|
+
*
|
|
8
|
+
* Detection only — no mutations. Consolidation is handled separately.
|
|
9
|
+
*/
|
|
10
|
+
import type { IDeduplicationService } from '../../domain/interfaces/IDeduplicationService';
|
|
11
|
+
import type { IMemoryServiceWithQuality } from '../../domain/interfaces/IMemoryService';
|
|
12
|
+
import type { ILlmDeduplicationEnhancer } from './LlmDeduplicationEnhancer';
|
|
13
|
+
export { normalizeText, extractWords, jaccardSimilarity, detectDuplicatesFromFacts, } from '../../domain/utils/deduplication';
|
|
14
|
+
/**
|
|
15
|
+
* Create a DeduplicationService.
|
|
16
|
+
*
|
|
17
|
+
* @param memoryService - Memory service with quality reader (for loading facts and conflicts)
|
|
18
|
+
* @param llmEnhancer - Optional LLM deduplication enhancer for semantic 4th pass
|
|
19
|
+
*/
|
|
20
|
+
export declare function createDeduplicationService(memoryService: IMemoryServiceWithQuality, llmEnhancer?: ILlmDeduplicationEnhancer): IDeduplicationService;
|
|
21
|
+
//# sourceMappingURL=DeduplicationService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeduplicationService.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/DeduplicationService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,qBAAqB,EAItB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAG5E,OAAO,EACL,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,kCAAkC,CAAC;AAY1C;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,yBAAyB,EACxC,WAAW,CAAC,EAAE,yBAAyB,GACtC,qBAAqB,CAwDvB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deduplication Detection Service.
|
|
4
|
+
*
|
|
5
|
+
* Infrastructure wrapper around the domain-level deduplication algorithm.
|
|
6
|
+
* Loads facts and conflict groups from repositories, then delegates
|
|
7
|
+
* to the pure detection functions in domain/utils/deduplication.
|
|
8
|
+
*
|
|
9
|
+
* Detection only — no mutations. Consolidation is handled separately.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.detectDuplicatesFromFacts = exports.jaccardSimilarity = exports.extractWords = exports.normalizeText = void 0;
|
|
46
|
+
exports.createDeduplicationService = createDeduplicationService;
|
|
47
|
+
// Re-export pure algorithm functions from domain utils for backward compatibility
|
|
48
|
+
var deduplication_1 = require("../../domain/utils/deduplication");
|
|
49
|
+
Object.defineProperty(exports, "normalizeText", { enumerable: true, get: function () { return deduplication_1.normalizeText; } });
|
|
50
|
+
Object.defineProperty(exports, "extractWords", { enumerable: true, get: function () { return deduplication_1.extractWords; } });
|
|
51
|
+
Object.defineProperty(exports, "jaccardSimilarity", { enumerable: true, get: function () { return deduplication_1.jaccardSimilarity; } });
|
|
52
|
+
Object.defineProperty(exports, "detectDuplicatesFromFacts", { enumerable: true, get: function () { return deduplication_1.detectDuplicatesFromFacts; } });
|
|
53
|
+
/**
|
|
54
|
+
* Default options for deduplication.
|
|
55
|
+
*/
|
|
56
|
+
const DEDUP_DEFAULTS = {
|
|
57
|
+
minSimilarity: 0.6,
|
|
58
|
+
limit: 10,
|
|
59
|
+
since: new Date(0), // epoch — no filter
|
|
60
|
+
aiAssist: false,
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Create a DeduplicationService.
|
|
64
|
+
*
|
|
65
|
+
* @param memoryService - Memory service with quality reader (for loading facts and conflicts)
|
|
66
|
+
* @param llmEnhancer - Optional LLM deduplication enhancer for semantic 4th pass
|
|
67
|
+
*/
|
|
68
|
+
function createDeduplicationService(memoryService, llmEnhancer) {
|
|
69
|
+
return {
|
|
70
|
+
async detectDuplicates(groupId, options) {
|
|
71
|
+
const { detectDuplicatesFromFacts } = await Promise.resolve().then(() => __importStar(require('../../domain/utils/deduplication')));
|
|
72
|
+
const opts = { ...DEDUP_DEFAULTS, ...options };
|
|
73
|
+
// Load facts (up to 500)
|
|
74
|
+
const dateOptions = opts.since.getTime() > 0 ? { since: opts.since } : undefined;
|
|
75
|
+
const facts = await memoryService.loadFactsDateOrdered([groupId], 500, dateOptions);
|
|
76
|
+
// Load conflict groups for tag overlap pass
|
|
77
|
+
let conflictGroups = [];
|
|
78
|
+
try {
|
|
79
|
+
conflictGroups = await memoryService.findConflicts([groupId]);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// findConflicts may not be available (e.g., no Neo4j); skip Pass 2
|
|
83
|
+
}
|
|
84
|
+
// Passes 1-3: algorithmic deduplication
|
|
85
|
+
const algorithmicGroups = detectDuplicatesFromFacts(facts, conflictGroups, opts);
|
|
86
|
+
// Pass 4: optional LLM semantic deduplication
|
|
87
|
+
let allGroups = algorithmicGroups;
|
|
88
|
+
if (llmEnhancer && opts.aiAssist) {
|
|
89
|
+
try {
|
|
90
|
+
const llmGroups = await llmEnhancer.findSemanticDuplicates(facts, algorithmicGroups);
|
|
91
|
+
if (llmGroups.length > 0) {
|
|
92
|
+
allGroups = [...algorithmicGroups, ...llmGroups];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (_error) {
|
|
96
|
+
// LLM enhancer failed; proceed with algorithmic results only
|
|
97
|
+
// The enhancer logs its own failures; this is a fallback safety net
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Re-sort by similarity descending and apply limit
|
|
101
|
+
const sorted = [...allGroups].sort((a, b) => b.similarity - a.similarity);
|
|
102
|
+
const limited = sorted.slice(0, opts.limit);
|
|
103
|
+
return {
|
|
104
|
+
totalFactsScanned: facts.length,
|
|
105
|
+
duplicateGroups: limited,
|
|
106
|
+
totalDuplicates: limited.reduce((sum, g) => sum + g.facts.length, 0),
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=DeduplicationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeduplicationService.js","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/DeduplicationService.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCH,gEA2DC;AAnFD,kFAAkF;AAClF,kEAK0C;AAJxC,8GAAA,aAAa,OAAA;AACb,6GAAA,YAAY,OAAA;AACZ,kHAAA,iBAAiB,OAAA;AACjB,0HAAA,yBAAyB,OAAA;AAG3B;;GAEG;AACH,MAAM,cAAc,GAAoC;IACtD,aAAa,EAAE,GAAG;IAClB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB;IACxC,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,aAAwC,EACxC,WAAuC;IAEvC,OAAO;QACL,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,OAA+B;YAE/B,MAAM,EAAE,yBAAyB,EAAE,GAAG,wDAAa,kCAAkC,GAAC,CAAC;YACvF,MAAM,IAAI,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;YAE/C,yBAAyB;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,oBAAoB,CACpD,CAAC,OAAO,CAAC,EACT,GAAG,EACH,WAAW,CACZ,CAAC;YAEF,4CAA4C;YAC5C,IAAI,cAAc,GAA8B,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,cAAc,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,mEAAmE;YACrE,CAAC;YAED,wCAAwC;YACxC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAEjF,8CAA8C;YAC9C,IAAI,SAAS,GAA+B,iBAAiB,CAAC;YAC9D,IAAI,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,sBAAsB,CACxD,KAAK,EACL,iBAAiB,CAClB,CAAC;oBACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzB,SAAS,GAAG,CAAC,GAAG,iBAAiB,EAAE,GAAG,SAAS,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;gBAAC,OAAO,MAAM,EAAE,CAAC;oBAChB,6DAA6D;oBAC7D,oEAAoE;gBACtE,CAAC;YACH,CAAC;YAED,mDAAmD;YACnD,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAE5C,OAAO;gBACL,iBAAiB,EAAE,KAAK,CAAC,MAAM;gBAC/B,eAAe,EAAE,OAAO;gBACxB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;aACrE,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Configuration Service Implementation.
|
|
3
|
+
*
|
|
4
|
+
* Reads/writes LLM configuration from PreferenceStore with `llm:*` keys.
|
|
5
|
+
* Environment variables take precedence over stored preferences.
|
|
6
|
+
*
|
|
7
|
+
* Merge order: defaults <- preferences <- environment variables.
|
|
8
|
+
*
|
|
9
|
+
* Part of Phase 6A: LLM Provider Abstraction Layer.
|
|
10
|
+
*/
|
|
11
|
+
import type { ILlmConfigService } from '../../domain/interfaces/ILlmConfigService';
|
|
12
|
+
import type { IPreferenceStore } from '../../domain/interfaces/IPreferenceStore';
|
|
13
|
+
/**
|
|
14
|
+
* Create an LLM configuration service.
|
|
15
|
+
*
|
|
16
|
+
* @param preferenceStore - Preference store for persisting config
|
|
17
|
+
*/
|
|
18
|
+
export declare function createLlmConfigService(preferenceStore: IPreferenceStore): ILlmConfigService;
|
|
19
|
+
//# sourceMappingURL=LlmConfigService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LlmConfigService.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/LlmConfigService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAiCjF;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,gBAAgB,GAChC,iBAAiB,CA8HnB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Configuration Service Implementation.
|
|
4
|
+
*
|
|
5
|
+
* Reads/writes LLM configuration from PreferenceStore with `llm:*` keys.
|
|
6
|
+
* Environment variables take precedence over stored preferences.
|
|
7
|
+
*
|
|
8
|
+
* Merge order: defaults <- preferences <- environment variables.
|
|
9
|
+
*
|
|
10
|
+
* Part of Phase 6A: LLM Provider Abstraction Layer.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.createLlmConfigService = createLlmConfigService;
|
|
14
|
+
const ILlmService_1 = require("../../domain/interfaces/ILlmService");
|
|
15
|
+
const LlmErrors_1 = require("../../domain/errors/LlmErrors");
|
|
16
|
+
/** Preference keys for LLM configuration. */
|
|
17
|
+
const PREF_KEYS = {
|
|
18
|
+
provider: 'llm:provider',
|
|
19
|
+
model: 'llm:model',
|
|
20
|
+
endpoint: 'llm:endpoint',
|
|
21
|
+
apiKey: 'llm:apiKey',
|
|
22
|
+
enabled: 'llm:enabled',
|
|
23
|
+
maxTokens: 'llm:maxTokens',
|
|
24
|
+
temperature: 'llm:temperature',
|
|
25
|
+
};
|
|
26
|
+
/** Environment variable names for LLM configuration. */
|
|
27
|
+
const ENV_VARS = {
|
|
28
|
+
provider: 'LISA_LLM_PROVIDER',
|
|
29
|
+
model: 'LISA_LLM_MODEL',
|
|
30
|
+
endpoint: 'LISA_LLM_ENDPOINT',
|
|
31
|
+
apiKey: 'LISA_LLM_API_KEY',
|
|
32
|
+
enabled: 'LISA_LLM_ENABLED',
|
|
33
|
+
};
|
|
34
|
+
/** All llm:* preference keys. */
|
|
35
|
+
const ALL_PREF_KEYS = Object.values(PREF_KEYS);
|
|
36
|
+
/**
|
|
37
|
+
* Create an LLM configuration service.
|
|
38
|
+
*
|
|
39
|
+
* @param preferenceStore - Preference store for persisting config
|
|
40
|
+
*/
|
|
41
|
+
function createLlmConfigService(preferenceStore) {
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the API key from env vars with provider-specific fallbacks.
|
|
44
|
+
*/
|
|
45
|
+
function resolveApiKeyFromEnv(provider) {
|
|
46
|
+
// Direct env var takes top priority
|
|
47
|
+
const direct = process.env[ENV_VARS.apiKey];
|
|
48
|
+
if (direct)
|
|
49
|
+
return direct;
|
|
50
|
+
// Provider-specific fallbacks
|
|
51
|
+
if (provider === 'anthropic')
|
|
52
|
+
return process.env.ANTHROPIC_API_KEY;
|
|
53
|
+
if (provider === 'openai')
|
|
54
|
+
return process.env.OPENAI_API_KEY;
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
async getConfig() {
|
|
59
|
+
const defaults = (0, ILlmService_1.getDefaultLlmConfig)();
|
|
60
|
+
// Read preferences
|
|
61
|
+
const prefProvider = await preferenceStore.get(PREF_KEYS.provider);
|
|
62
|
+
const prefModel = await preferenceStore.get(PREF_KEYS.model);
|
|
63
|
+
const prefEndpoint = await preferenceStore.get(PREF_KEYS.endpoint);
|
|
64
|
+
const prefApiKey = await preferenceStore.get(PREF_KEYS.apiKey);
|
|
65
|
+
const prefEnabled = await preferenceStore.get(PREF_KEYS.enabled);
|
|
66
|
+
const prefMaxTokens = await preferenceStore.get(PREF_KEYS.maxTokens);
|
|
67
|
+
const prefTemperature = await preferenceStore.get(PREF_KEYS.temperature);
|
|
68
|
+
// Build config from preferences
|
|
69
|
+
const fromPrefs = {};
|
|
70
|
+
if (prefProvider !== null) {
|
|
71
|
+
if ((0, ILlmService_1.isValidLlmProvider)(prefProvider)) {
|
|
72
|
+
fromPrefs.provider = prefProvider;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (prefModel !== null)
|
|
76
|
+
fromPrefs.model = prefModel;
|
|
77
|
+
if (prefEndpoint !== null)
|
|
78
|
+
fromPrefs.endpoint = prefEndpoint;
|
|
79
|
+
if (prefApiKey !== null)
|
|
80
|
+
fromPrefs.apiKey = prefApiKey;
|
|
81
|
+
if (prefEnabled !== null)
|
|
82
|
+
fromPrefs.enabled = prefEnabled === 'true';
|
|
83
|
+
if (prefMaxTokens !== null) {
|
|
84
|
+
const parsed = parseInt(prefMaxTokens, 10);
|
|
85
|
+
if (!isNaN(parsed) && parsed > 0)
|
|
86
|
+
fromPrefs.maxTokens = parsed;
|
|
87
|
+
}
|
|
88
|
+
if (prefTemperature !== null) {
|
|
89
|
+
const parsed = parseFloat(prefTemperature);
|
|
90
|
+
if (!isNaN(parsed) && parsed >= 0 && parsed <= 2)
|
|
91
|
+
fromPrefs.temperature = parsed;
|
|
92
|
+
}
|
|
93
|
+
// Merge defaults <- prefs
|
|
94
|
+
const merged = { ...defaults, ...fromPrefs };
|
|
95
|
+
// Apply environment variable overrides
|
|
96
|
+
const envProvider = process.env[ENV_VARS.provider];
|
|
97
|
+
if (envProvider && (0, ILlmService_1.isValidLlmProvider)(envProvider)) {
|
|
98
|
+
merged.provider = envProvider;
|
|
99
|
+
}
|
|
100
|
+
const envModel = process.env[ENV_VARS.model];
|
|
101
|
+
if (envModel)
|
|
102
|
+
merged.model = envModel;
|
|
103
|
+
const envEndpoint = process.env[ENV_VARS.endpoint];
|
|
104
|
+
if (envEndpoint)
|
|
105
|
+
merged.endpoint = envEndpoint;
|
|
106
|
+
const envEnabled = process.env[ENV_VARS.enabled];
|
|
107
|
+
if (envEnabled !== undefined)
|
|
108
|
+
merged.enabled = envEnabled === 'true';
|
|
109
|
+
// API key: env vars (with provider-specific fallback)
|
|
110
|
+
const envApiKey = resolveApiKeyFromEnv(merged.provider);
|
|
111
|
+
if (envApiKey)
|
|
112
|
+
merged.apiKey = envApiKey;
|
|
113
|
+
return merged;
|
|
114
|
+
},
|
|
115
|
+
async setProvider(provider) {
|
|
116
|
+
if (!(0, ILlmService_1.isValidLlmProvider)(provider)) {
|
|
117
|
+
throw new LlmErrors_1.LlmConfigError(`Invalid LLM provider: ${provider}`, { provider });
|
|
118
|
+
}
|
|
119
|
+
await preferenceStore.set(PREF_KEYS.provider, provider);
|
|
120
|
+
},
|
|
121
|
+
async setModel(model) {
|
|
122
|
+
if (!model.trim()) {
|
|
123
|
+
throw new LlmErrors_1.LlmConfigError('Model name cannot be empty');
|
|
124
|
+
}
|
|
125
|
+
await preferenceStore.set(PREF_KEYS.model, model.trim());
|
|
126
|
+
},
|
|
127
|
+
async setEndpoint(endpoint) {
|
|
128
|
+
if (!endpoint.trim()) {
|
|
129
|
+
throw new LlmErrors_1.LlmConfigError('Endpoint cannot be empty');
|
|
130
|
+
}
|
|
131
|
+
await preferenceStore.set(PREF_KEYS.endpoint, endpoint.trim());
|
|
132
|
+
},
|
|
133
|
+
async setApiKey(apiKey) {
|
|
134
|
+
if (!apiKey.trim()) {
|
|
135
|
+
throw new LlmErrors_1.LlmConfigError('API key cannot be empty');
|
|
136
|
+
}
|
|
137
|
+
await preferenceStore.set(PREF_KEYS.apiKey, apiKey.trim());
|
|
138
|
+
},
|
|
139
|
+
async setEnabled(enabled) {
|
|
140
|
+
await preferenceStore.set(PREF_KEYS.enabled, String(enabled));
|
|
141
|
+
},
|
|
142
|
+
async setMaxTokens(maxTokens) {
|
|
143
|
+
if (!Number.isInteger(maxTokens) || maxTokens <= 0) {
|
|
144
|
+
throw new LlmErrors_1.LlmConfigError('maxTokens must be a positive integer', { maxTokens });
|
|
145
|
+
}
|
|
146
|
+
await preferenceStore.set(PREF_KEYS.maxTokens, String(maxTokens));
|
|
147
|
+
},
|
|
148
|
+
async setTemperature(temperature) {
|
|
149
|
+
if (isNaN(temperature) || temperature < 0 || temperature > 2) {
|
|
150
|
+
throw new LlmErrors_1.LlmConfigError('Temperature must be between 0 and 2', { temperature });
|
|
151
|
+
}
|
|
152
|
+
await preferenceStore.set(PREF_KEYS.temperature, String(temperature));
|
|
153
|
+
},
|
|
154
|
+
async reset() {
|
|
155
|
+
for (const key of ALL_PREF_KEYS) {
|
|
156
|
+
await preferenceStore.delete(key);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=LlmConfigService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LlmConfigService.js","sourceRoot":"","sources":["../../../../src/lib/infrastructure/services/LlmConfigService.ts"],"names":[],"mappings":"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"}
|