@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.
Files changed (245) hide show
  1. package/README.md +2 -2
  2. package/dist/lib/application/handlers/PromptSubmitHandler.js +2 -2
  3. package/dist/lib/application/handlers/PromptSubmitHandler.js.map +1 -1
  4. package/dist/lib/application/handlers/SessionStopHandler.d.ts.map +1 -1
  5. package/dist/lib/application/handlers/SessionStopHandler.js +12 -2
  6. package/dist/lib/application/handlers/SessionStopHandler.js.map +1 -1
  7. package/dist/lib/commands/init.js +3 -3
  8. package/dist/lib/commands/init.js.map +1 -1
  9. package/dist/lib/commands/knowledge.d.ts.map +1 -1
  10. package/dist/lib/commands/knowledge.js +449 -1
  11. package/dist/lib/commands/knowledge.js.map +1 -1
  12. package/dist/lib/domain/errors/LlmErrors.d.ts +41 -0
  13. package/dist/lib/domain/errors/LlmErrors.d.ts.map +1 -0
  14. package/dist/lib/domain/errors/LlmErrors.js +64 -0
  15. package/dist/lib/domain/errors/LlmErrors.js.map +1 -0
  16. package/dist/lib/domain/interfaces/IConsolidationService.d.ts +65 -0
  17. package/dist/lib/domain/interfaces/IConsolidationService.d.ts.map +1 -0
  18. package/dist/lib/domain/interfaces/IConsolidationService.js +21 -0
  19. package/dist/lib/domain/interfaces/IConsolidationService.js.map +1 -0
  20. package/dist/lib/domain/interfaces/ICurationService.d.ts +81 -0
  21. package/dist/lib/domain/interfaces/ICurationService.d.ts.map +1 -0
  22. package/dist/lib/domain/interfaces/ICurationService.js +65 -0
  23. package/dist/lib/domain/interfaces/ICurationService.js.map +1 -0
  24. package/dist/lib/domain/interfaces/IDeduplicationService.d.ts +67 -0
  25. package/dist/lib/domain/interfaces/IDeduplicationService.d.ts.map +1 -0
  26. package/dist/lib/domain/interfaces/IDeduplicationService.js +9 -0
  27. package/dist/lib/domain/interfaces/IDeduplicationService.js.map +1 -0
  28. package/dist/lib/domain/interfaces/ILlmConfigService.d.ts +36 -0
  29. package/dist/lib/domain/interfaces/ILlmConfigService.d.ts.map +1 -0
  30. package/dist/lib/domain/interfaces/ILlmConfigService.js +11 -0
  31. package/dist/lib/domain/interfaces/ILlmConfigService.js.map +1 -0
  32. package/dist/lib/domain/interfaces/ILlmGuard.d.ts +35 -0
  33. package/dist/lib/domain/interfaces/ILlmGuard.d.ts.map +1 -0
  34. package/dist/lib/domain/interfaces/ILlmGuard.js +12 -0
  35. package/dist/lib/domain/interfaces/ILlmGuard.js.map +1 -0
  36. package/dist/lib/domain/interfaces/ILlmService.d.ts +87 -0
  37. package/dist/lib/domain/interfaces/ILlmService.d.ts.map +1 -0
  38. package/dist/lib/domain/interfaces/ILlmService.js +40 -0
  39. package/dist/lib/domain/interfaces/ILlmService.js.map +1 -0
  40. package/dist/lib/domain/interfaces/ILlmUsageTracker.d.ts +60 -0
  41. package/dist/lib/domain/interfaces/ILlmUsageTracker.d.ts.map +1 -0
  42. package/dist/lib/domain/interfaces/ILlmUsageTracker.js +29 -0
  43. package/dist/lib/domain/interfaces/ILlmUsageTracker.js.map +1 -0
  44. package/dist/lib/domain/interfaces/IMemoryService.d.ts +90 -0
  45. package/dist/lib/domain/interfaces/IMemoryService.d.ts.map +1 -1
  46. package/dist/lib/domain/interfaces/INlCurationService.d.ts +75 -0
  47. package/dist/lib/domain/interfaces/INlCurationService.d.ts.map +1 -0
  48. package/dist/lib/domain/interfaces/INlCurationService.js +31 -0
  49. package/dist/lib/domain/interfaces/INlCurationService.js.map +1 -0
  50. package/dist/lib/domain/interfaces/IPreferenceStore.d.ts +46 -0
  51. package/dist/lib/domain/interfaces/IPreferenceStore.d.ts.map +1 -0
  52. package/dist/lib/domain/interfaces/IPreferenceStore.js +11 -0
  53. package/dist/lib/domain/interfaces/IPreferenceStore.js.map +1 -0
  54. package/dist/lib/domain/interfaces/IRecursionService.d.ts +10 -6
  55. package/dist/lib/domain/interfaces/IRecursionService.d.ts.map +1 -1
  56. package/dist/lib/domain/interfaces/ISummarizationService.d.ts +52 -0
  57. package/dist/lib/domain/interfaces/ISummarizationService.d.ts.map +1 -0
  58. package/dist/lib/domain/interfaces/ISummarizationService.js +11 -0
  59. package/dist/lib/domain/interfaces/ISummarizationService.js.map +1 -0
  60. package/dist/lib/domain/interfaces/ITaskTypeDetector.d.ts +34 -0
  61. package/dist/lib/domain/interfaces/ITaskTypeDetector.d.ts.map +1 -0
  62. package/dist/lib/domain/interfaces/ITaskTypeDetector.js +9 -0
  63. package/dist/lib/domain/interfaces/ITaskTypeDetector.js.map +1 -0
  64. package/dist/lib/domain/interfaces/ITranscriptEnricher.d.ts +68 -0
  65. package/dist/lib/domain/interfaces/ITranscriptEnricher.d.ts.map +1 -0
  66. package/dist/lib/domain/interfaces/ITranscriptEnricher.js +32 -0
  67. package/dist/lib/domain/interfaces/ITranscriptEnricher.js.map +1 -0
  68. package/dist/lib/domain/interfaces/IWorkSummary.d.ts +64 -0
  69. package/dist/lib/domain/interfaces/IWorkSummary.d.ts.map +1 -0
  70. package/dist/lib/domain/interfaces/IWorkSummary.js +13 -0
  71. package/dist/lib/domain/interfaces/IWorkSummary.js.map +1 -0
  72. package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.d.ts +46 -0
  73. package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.d.ts.map +1 -0
  74. package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.js +9 -0
  75. package/dist/lib/domain/interfaces/dal/IMemoryRelationshipRepository.js.map +1 -0
  76. package/dist/lib/domain/interfaces/dal/IMemoryRepository.d.ts +62 -1
  77. package/dist/lib/domain/interfaces/dal/IMemoryRepository.d.ts.map +1 -1
  78. package/dist/lib/domain/interfaces/dal/index.d.ts +3 -2
  79. package/dist/lib/domain/interfaces/dal/index.d.ts.map +1 -1
  80. package/dist/lib/domain/interfaces/dal/index.js.map +1 -1
  81. package/dist/lib/domain/interfaces/dal/types.d.ts +37 -0
  82. package/dist/lib/domain/interfaces/dal/types.d.ts.map +1 -1
  83. package/dist/lib/domain/interfaces/dal/types.js.map +1 -1
  84. package/dist/lib/domain/interfaces/index.d.ts +15 -1
  85. package/dist/lib/domain/interfaces/index.d.ts.map +1 -1
  86. package/dist/lib/domain/interfaces/index.js +21 -1
  87. package/dist/lib/domain/interfaces/index.js.map +1 -1
  88. package/dist/lib/domain/interfaces/types/ICapturedWork.d.ts +3 -0
  89. package/dist/lib/domain/interfaces/types/ICapturedWork.d.ts.map +1 -1
  90. package/dist/lib/domain/interfaces/types/ICapturedWork.js.map +1 -1
  91. package/dist/lib/domain/interfaces/types/IMemoryLifecycle.d.ts +56 -0
  92. package/dist/lib/domain/interfaces/types/IMemoryLifecycle.d.ts.map +1 -0
  93. package/dist/lib/domain/interfaces/types/IMemoryLifecycle.js +94 -0
  94. package/dist/lib/domain/interfaces/types/IMemoryLifecycle.js.map +1 -0
  95. package/dist/lib/domain/interfaces/types/IMemoryQuality.d.ts +113 -0
  96. package/dist/lib/domain/interfaces/types/IMemoryQuality.d.ts.map +1 -0
  97. package/dist/lib/domain/interfaces/types/IMemoryQuality.js +195 -0
  98. package/dist/lib/domain/interfaces/types/IMemoryQuality.js.map +1 -0
  99. package/dist/lib/domain/interfaces/types/IMemoryRelationship.d.ts +49 -0
  100. package/dist/lib/domain/interfaces/types/IMemoryRelationship.d.ts.map +1 -0
  101. package/dist/lib/domain/interfaces/types/IMemoryRelationship.js +62 -0
  102. package/dist/lib/domain/interfaces/types/IMemoryRelationship.js.map +1 -0
  103. package/dist/lib/domain/interfaces/types/ITaskType.d.ts +59 -0
  104. package/dist/lib/domain/interfaces/types/ITaskType.d.ts.map +1 -0
  105. package/dist/lib/domain/interfaces/types/ITaskType.js +104 -0
  106. package/dist/lib/domain/interfaces/types/ITaskType.js.map +1 -0
  107. package/dist/lib/domain/interfaces/types/index.d.ts +4 -0
  108. package/dist/lib/domain/interfaces/types/index.d.ts.map +1 -1
  109. package/dist/lib/domain/interfaces/types/index.js +33 -1
  110. package/dist/lib/domain/interfaces/types/index.js.map +1 -1
  111. package/dist/lib/domain/utils/deduplication.d.ts +38 -0
  112. package/dist/lib/domain/utils/deduplication.d.ts.map +1 -0
  113. package/dist/lib/domain/utils/deduplication.js +225 -0
  114. package/dist/lib/domain/utils/deduplication.js.map +1 -0
  115. package/dist/lib/domain/utils/index.d.ts +1 -0
  116. package/dist/lib/domain/utils/index.d.ts.map +1 -1
  117. package/dist/lib/domain/utils/index.js +6 -1
  118. package/dist/lib/domain/utils/index.js.map +1 -1
  119. package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.d.ts +12 -2
  120. package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.d.ts.map +1 -1
  121. package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.js +14 -0
  122. package/dist/lib/infrastructure/dal/repositories/mcp/McpMemoryRepository.js.map +1 -1
  123. package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.d.ts +25 -3
  124. package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.d.ts.map +1 -1
  125. package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.js +156 -1
  126. package/dist/lib/infrastructure/dal/repositories/neo4j/Neo4jMemoryRepository.js.map +1 -1
  127. package/dist/lib/infrastructure/di/bootstrap.d.ts.map +1 -1
  128. package/dist/lib/infrastructure/di/bootstrap.js +92 -2
  129. package/dist/lib/infrastructure/di/bootstrap.js.map +1 -1
  130. package/dist/lib/infrastructure/di/tokens.d.ts +24 -0
  131. package/dist/lib/infrastructure/di/tokens.d.ts.map +1 -1
  132. package/dist/lib/infrastructure/di/tokens.js +12 -0
  133. package/dist/lib/infrastructure/di/tokens.js.map +1 -1
  134. package/dist/lib/infrastructure/services/ConsolidationService.d.ts +21 -0
  135. package/dist/lib/infrastructure/services/ConsolidationService.d.ts.map +1 -0
  136. package/dist/lib/infrastructure/services/ConsolidationService.js +134 -0
  137. package/dist/lib/infrastructure/services/ConsolidationService.js.map +1 -0
  138. package/dist/lib/infrastructure/services/CurationService.d.ts +28 -0
  139. package/dist/lib/infrastructure/services/CurationService.d.ts.map +1 -0
  140. package/dist/lib/infrastructure/services/CurationService.js +112 -0
  141. package/dist/lib/infrastructure/services/CurationService.js.map +1 -0
  142. package/dist/lib/infrastructure/services/DeduplicationService.d.ts +21 -0
  143. package/dist/lib/infrastructure/services/DeduplicationService.d.ts.map +1 -0
  144. package/dist/lib/infrastructure/services/DeduplicationService.js +111 -0
  145. package/dist/lib/infrastructure/services/DeduplicationService.js.map +1 -0
  146. package/dist/lib/infrastructure/services/LlmConfigService.d.ts +19 -0
  147. package/dist/lib/infrastructure/services/LlmConfigService.d.ts.map +1 -0
  148. package/dist/lib/infrastructure/services/LlmConfigService.js +161 -0
  149. package/dist/lib/infrastructure/services/LlmConfigService.js.map +1 -0
  150. package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.d.ts +47 -0
  151. package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.d.ts.map +1 -0
  152. package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.js +176 -0
  153. package/dist/lib/infrastructure/services/LlmDeduplicationEnhancer.js.map +1 -0
  154. package/dist/lib/infrastructure/services/LlmGuard.d.ts +29 -0
  155. package/dist/lib/infrastructure/services/LlmGuard.d.ts.map +1 -0
  156. package/dist/lib/infrastructure/services/LlmGuard.js +92 -0
  157. package/dist/lib/infrastructure/services/LlmGuard.js.map +1 -0
  158. package/dist/lib/infrastructure/services/LlmService.d.ts +19 -0
  159. package/dist/lib/infrastructure/services/LlmService.d.ts.map +1 -0
  160. package/dist/lib/infrastructure/services/LlmService.js +253 -0
  161. package/dist/lib/infrastructure/services/LlmService.js.map +1 -0
  162. package/dist/lib/infrastructure/services/LlmUsageTracker.d.ts +25 -0
  163. package/dist/lib/infrastructure/services/LlmUsageTracker.d.ts.map +1 -0
  164. package/dist/lib/infrastructure/services/LlmUsageTracker.js +130 -0
  165. package/dist/lib/infrastructure/services/LlmUsageTracker.js.map +1 -0
  166. package/dist/lib/infrastructure/services/MemoryService.d.ts +29 -2
  167. package/dist/lib/infrastructure/services/MemoryService.d.ts.map +1 -1
  168. package/dist/lib/infrastructure/services/MemoryService.js +93 -0
  169. package/dist/lib/infrastructure/services/MemoryService.js.map +1 -1
  170. package/dist/lib/infrastructure/services/NlCurationService.d.ts +29 -0
  171. package/dist/lib/infrastructure/services/NlCurationService.d.ts.map +1 -0
  172. package/dist/lib/infrastructure/services/NlCurationService.js +276 -0
  173. package/dist/lib/infrastructure/services/NlCurationService.js.map +1 -0
  174. package/dist/lib/infrastructure/services/PreferenceStore.d.ts +19 -0
  175. package/dist/lib/infrastructure/services/PreferenceStore.d.ts.map +1 -0
  176. package/dist/lib/infrastructure/services/PreferenceStore.js +109 -0
  177. package/dist/lib/infrastructure/services/PreferenceStore.js.map +1 -0
  178. package/dist/lib/infrastructure/services/SessionCaptureService.d.ts +60 -19
  179. package/dist/lib/infrastructure/services/SessionCaptureService.d.ts.map +1 -1
  180. package/dist/lib/infrastructure/services/SessionCaptureService.js +474 -51
  181. package/dist/lib/infrastructure/services/SessionCaptureService.js.map +1 -1
  182. package/dist/lib/infrastructure/services/SummarizationService.d.ts +21 -0
  183. package/dist/lib/infrastructure/services/SummarizationService.d.ts.map +1 -0
  184. package/dist/lib/infrastructure/services/SummarizationService.js +132 -0
  185. package/dist/lib/infrastructure/services/SummarizationService.js.map +1 -0
  186. package/dist/lib/infrastructure/services/TranscriptEnricher.d.ts +23 -0
  187. package/dist/lib/infrastructure/services/TranscriptEnricher.d.ts.map +1 -0
  188. package/dist/lib/infrastructure/services/TranscriptEnricher.js +170 -0
  189. package/dist/lib/infrastructure/services/TranscriptEnricher.js.map +1 -0
  190. package/dist/lib/infrastructure/services/index.d.ts +12 -0
  191. package/dist/lib/infrastructure/services/index.d.ts.map +1 -1
  192. package/dist/lib/infrastructure/services/index.js +31 -1
  193. package/dist/lib/infrastructure/services/index.js.map +1 -1
  194. package/dist/lib/infrastructure/services/prompts/curation.d.ts +22 -0
  195. package/dist/lib/infrastructure/services/prompts/curation.d.ts.map +1 -0
  196. package/dist/lib/infrastructure/services/prompts/curation.js +73 -0
  197. package/dist/lib/infrastructure/services/prompts/curation.js.map +1 -0
  198. package/dist/lib/infrastructure/services/prompts/deduplication.d.ts +31 -0
  199. package/dist/lib/infrastructure/services/prompts/deduplication.d.ts.map +1 -0
  200. package/dist/lib/infrastructure/services/prompts/deduplication.js +52 -0
  201. package/dist/lib/infrastructure/services/prompts/deduplication.js.map +1 -0
  202. package/dist/lib/infrastructure/services/prompts/extraction.d.ts +27 -0
  203. package/dist/lib/infrastructure/services/prompts/extraction.d.ts.map +1 -0
  204. package/dist/lib/infrastructure/services/prompts/extraction.js +94 -0
  205. package/dist/lib/infrastructure/services/prompts/extraction.js.map +1 -0
  206. package/dist/lib/infrastructure/services/prompts/summarization.d.ts +25 -0
  207. package/dist/lib/infrastructure/services/prompts/summarization.d.ts.map +1 -0
  208. package/dist/lib/infrastructure/services/prompts/summarization.js +60 -0
  209. package/dist/lib/infrastructure/services/prompts/summarization.js.map +1 -0
  210. package/dist/lib/skills/common/type-mappings.d.ts.map +1 -1
  211. package/dist/lib/skills/common/type-mappings.js +5 -0
  212. package/dist/lib/skills/common/type-mappings.js.map +1 -1
  213. package/dist/lib/skills/memory/memory.d.ts +8 -2
  214. package/dist/lib/skills/memory/memory.d.ts.map +1 -1
  215. package/dist/lib/skills/memory/memory.js +27 -3
  216. package/dist/lib/skills/memory/memory.js.map +1 -1
  217. package/dist/lib/skills/shared/clients/Neo4jClient.d.ts.map +1 -1
  218. package/dist/lib/skills/shared/clients/Neo4jClient.js +75 -30
  219. package/dist/lib/skills/shared/clients/Neo4jClient.js.map +1 -1
  220. package/dist/lib/skills/shared/clients/interfaces/INeo4jClient.d.ts +16 -0
  221. package/dist/lib/skills/shared/clients/interfaces/INeo4jClient.d.ts.map +1 -1
  222. package/dist/lib/skills/shared/services/MemoryCliService.d.ts +28 -2
  223. package/dist/lib/skills/shared/services/MemoryCliService.d.ts.map +1 -1
  224. package/dist/lib/skills/shared/services/MemoryCliService.js +112 -5
  225. package/dist/lib/skills/shared/services/MemoryCliService.js.map +1 -1
  226. package/dist/lib/skills/shared/services/MemoryService.d.ts.map +1 -1
  227. package/dist/lib/skills/shared/services/MemoryService.js +410 -1
  228. package/dist/lib/skills/shared/services/MemoryService.js.map +1 -1
  229. package/dist/lib/skills/shared/services/index.d.ts +1 -1
  230. package/dist/lib/skills/shared/services/index.d.ts.map +1 -1
  231. package/dist/lib/skills/shared/services/index.js +2 -1
  232. package/dist/lib/skills/shared/services/index.js.map +1 -1
  233. package/dist/lib/skills/shared/services/interfaces/IMemoryService.d.ts +148 -0
  234. package/dist/lib/skills/shared/services/interfaces/IMemoryService.d.ts.map +1 -1
  235. package/dist/lib/skills/shared/services/interfaces/IMemoryService.js +0 -4
  236. package/dist/lib/skills/shared/services/interfaces/IMemoryService.js.map +1 -1
  237. package/dist/opencode/lisa.js +3904 -507
  238. package/dist/package.json +16 -16
  239. package/dist/project/.lisa/skills/git/SKILL.md +4 -13
  240. package/dist/project/.lisa/skills/init-review/SKILL.md +1 -1
  241. package/dist/project/.lisa/skills/jira/SKILL.md +1 -1
  242. package/dist/project/.lisa/skills/lisa/SKILL.md +1 -1
  243. package/dist/project/.lisa/skills/memory/SKILL.md +1 -2
  244. package/dist/project/.lisa/skills/tasks/SKILL.md +3 -4
  245. 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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"}