@carlonicora/nestjs-neo4jsonapi 1.4.1 → 1.5.1

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 (137) hide show
  1. package/dist/agents/agents.modules.d.ts.map +1 -1
  2. package/dist/agents/agents.modules.js +21 -2
  3. package/dist/agents/agents.modules.js.map +1 -1
  4. package/dist/agents/community.detector/community.detector.module.d.ts +3 -0
  5. package/dist/agents/community.detector/community.detector.module.d.ts.map +1 -0
  6. package/dist/agents/community.detector/community.detector.module.js +25 -0
  7. package/dist/agents/community.detector/community.detector.module.js.map +1 -0
  8. package/dist/agents/community.detector/services/community.detector.service.d.ts +63 -0
  9. package/dist/agents/community.detector/services/community.detector.service.d.ts.map +1 -0
  10. package/dist/agents/community.detector/services/community.detector.service.js +343 -0
  11. package/dist/agents/community.detector/services/community.detector.service.js.map +1 -0
  12. package/dist/agents/community.summariser/community.summariser.module.d.ts +3 -0
  13. package/dist/agents/community.summariser/community.summariser.module.d.ts.map +1 -0
  14. package/dist/agents/community.summariser/community.summariser.module.js +33 -0
  15. package/dist/agents/community.summariser/community.summariser.module.js.map +1 -0
  16. package/dist/agents/community.summariser/processors/community.summariser.processor.d.ts +21 -0
  17. package/dist/agents/community.summariser/processors/community.summariser.processor.d.ts.map +1 -0
  18. package/dist/agents/community.summariser/processors/community.summariser.processor.js +70 -0
  19. package/dist/agents/community.summariser/processors/community.summariser.processor.js.map +1 -0
  20. package/dist/agents/community.summariser/services/community.summariser.service.d.ts +26 -0
  21. package/dist/agents/community.summariser/services/community.summariser.service.d.ts.map +1 -0
  22. package/dist/agents/community.summariser/services/community.summariser.service.js +155 -0
  23. package/dist/agents/community.summariser/services/community.summariser.service.js.map +1 -0
  24. package/dist/agents/drift/contexts/drift.context.d.ts +56 -0
  25. package/dist/agents/drift/contexts/drift.context.d.ts.map +1 -0
  26. package/dist/agents/drift/contexts/drift.context.js +91 -0
  27. package/dist/agents/drift/contexts/drift.context.js.map +1 -0
  28. package/dist/agents/drift/drift.module.d.ts +3 -0
  29. package/dist/agents/drift/drift.module.d.ts.map +1 -0
  30. package/dist/agents/drift/drift.module.js +44 -0
  31. package/dist/agents/drift/drift.module.js.map +1 -0
  32. package/dist/agents/drift/nodes/community.search.node.service.d.ts +12 -0
  33. package/dist/agents/drift/nodes/community.search.node.service.d.ts.map +1 -0
  34. package/dist/agents/drift/nodes/community.search.node.service.js +57 -0
  35. package/dist/agents/drift/nodes/community.search.node.service.js.map +1 -0
  36. package/dist/agents/drift/nodes/followup.node.service.d.ts +28 -0
  37. package/dist/agents/drift/nodes/followup.node.service.d.ts.map +1 -0
  38. package/dist/agents/drift/nodes/followup.node.service.js +174 -0
  39. package/dist/agents/drift/nodes/followup.node.service.js.map +1 -0
  40. package/dist/agents/drift/nodes/hyde.node.service.d.ts +21 -0
  41. package/dist/agents/drift/nodes/hyde.node.service.d.ts.map +1 -0
  42. package/dist/agents/drift/nodes/hyde.node.service.js +114 -0
  43. package/dist/agents/drift/nodes/hyde.node.service.js.map +1 -0
  44. package/dist/agents/drift/nodes/primer.answer.node.service.d.ts +17 -0
  45. package/dist/agents/drift/nodes/primer.answer.node.service.d.ts.map +1 -0
  46. package/dist/agents/drift/nodes/primer.answer.node.service.js +108 -0
  47. package/dist/agents/drift/nodes/primer.answer.node.service.js.map +1 -0
  48. package/dist/agents/drift/nodes/synthesis.node.service.d.ts +17 -0
  49. package/dist/agents/drift/nodes/synthesis.node.service.d.ts.map +1 -0
  50. package/dist/agents/drift/nodes/synthesis.node.service.js +105 -0
  51. package/dist/agents/drift/nodes/synthesis.node.service.js.map +1 -0
  52. package/dist/agents/drift/services/drift.migration.service.d.ts +47 -0
  53. package/dist/agents/drift/services/drift.migration.service.d.ts.map +1 -0
  54. package/dist/agents/drift/services/drift.migration.service.js +114 -0
  55. package/dist/agents/drift/services/drift.migration.service.js.map +1 -0
  56. package/dist/agents/drift/services/drift.search.service.d.ts +52 -0
  57. package/dist/agents/drift/services/drift.search.service.d.ts.map +1 -0
  58. package/dist/agents/drift/services/drift.search.service.js +185 -0
  59. package/dist/agents/drift/services/drift.search.service.js.map +1 -0
  60. package/dist/agents/graph.creator/interfaces/chunk.analysis.interface.d.ts +4 -0
  61. package/dist/agents/graph.creator/interfaces/chunk.analysis.interface.d.ts.map +1 -1
  62. package/dist/agents/graph.creator/services/graph.creator.service.d.ts +1 -1
  63. package/dist/agents/graph.creator/services/graph.creator.service.d.ts.map +1 -1
  64. package/dist/agents/graph.creator/services/graph.creator.service.js +43 -0
  65. package/dist/agents/graph.creator/services/graph.creator.service.js.map +1 -1
  66. package/dist/agents/index.d.ts +8 -0
  67. package/dist/agents/index.d.ts.map +1 -1
  68. package/dist/agents/index.js +18 -1
  69. package/dist/agents/index.js.map +1 -1
  70. package/dist/agents/responder/contexts/responder.context.d.ts +3 -0
  71. package/dist/agents/responder/contexts/responder.context.d.ts.map +1 -1
  72. package/dist/agents/responder/contexts/responder.context.js +8 -0
  73. package/dist/agents/responder/contexts/responder.context.js.map +1 -1
  74. package/dist/agents/responder/factories/responder.context.factory.d.ts +1 -0
  75. package/dist/agents/responder/factories/responder.context.factory.d.ts.map +1 -1
  76. package/dist/agents/responder/factories/responder.context.factory.js +2 -0
  77. package/dist/agents/responder/factories/responder.context.factory.js.map +1 -1
  78. package/dist/agents/responder/nodes/responder.answer.node.service.d.ts +22 -0
  79. package/dist/agents/responder/nodes/responder.answer.node.service.d.ts.map +1 -1
  80. package/dist/agents/responder/nodes/responder.answer.node.service.js +155 -0
  81. package/dist/agents/responder/nodes/responder.answer.node.service.js.map +1 -1
  82. package/dist/agents/responder/responder.module.d.ts.map +1 -1
  83. package/dist/agents/responder/responder.module.js +2 -1
  84. package/dist/agents/responder/responder.module.js.map +1 -1
  85. package/dist/agents/responder/services/responder.service.d.ts +17 -1
  86. package/dist/agents/responder/services/responder.service.d.ts.map +1 -1
  87. package/dist/agents/responder/services/responder.service.js +49 -5
  88. package/dist/agents/responder/services/responder.service.js.map +1 -1
  89. package/dist/common/interfaces/agents/graph.creator.interface.d.ts +4 -0
  90. package/dist/common/interfaces/agents/graph.creator.interface.d.ts.map +1 -1
  91. package/dist/config/enums/queue.id.d.ts +2 -1
  92. package/dist/config/enums/queue.id.d.ts.map +1 -1
  93. package/dist/config/enums/queue.id.js +1 -0
  94. package/dist/config/enums/queue.id.js.map +1 -1
  95. package/dist/config/interfaces/config.prompts.interface.d.ts +5 -0
  96. package/dist/config/interfaces/config.prompts.interface.d.ts.map +1 -1
  97. package/dist/foundations/chunk/services/chunk.service.d.ts.map +1 -1
  98. package/dist/foundations/chunk/services/chunk.service.js +8 -0
  99. package/dist/foundations/chunk/services/chunk.service.js.map +1 -1
  100. package/dist/foundations/community/community.module.d.ts +5 -0
  101. package/dist/foundations/community/community.module.d.ts.map +1 -0
  102. package/dist/foundations/community/community.module.js +29 -0
  103. package/dist/foundations/community/community.module.js.map +1 -0
  104. package/dist/foundations/community/entities/community.entity.d.ts +18 -0
  105. package/dist/foundations/community/entities/community.entity.d.ts.map +1 -0
  106. package/dist/foundations/community/entities/community.entity.js +3 -0
  107. package/dist/foundations/community/entities/community.entity.js.map +1 -0
  108. package/dist/foundations/community/entities/community.map.d.ts +8 -0
  109. package/dist/foundations/community/entities/community.map.d.ts.map +1 -0
  110. package/dist/foundations/community/entities/community.map.js +23 -0
  111. package/dist/foundations/community/entities/community.map.js.map +1 -0
  112. package/dist/foundations/community/entities/community.meta.d.ts +3 -0
  113. package/dist/foundations/community/entities/community.meta.d.ts.map +1 -0
  114. package/dist/foundations/community/entities/community.meta.js +10 -0
  115. package/dist/foundations/community/entities/community.meta.js.map +1 -0
  116. package/dist/foundations/community/entities/community.model.d.ts +4 -0
  117. package/dist/foundations/community/entities/community.model.d.ts.map +1 -0
  118. package/dist/foundations/community/entities/community.model.js +15 -0
  119. package/dist/foundations/community/entities/community.model.js.map +1 -0
  120. package/dist/foundations/community/repositories/community.repository.d.ts +138 -0
  121. package/dist/foundations/community/repositories/community.repository.d.ts.map +1 -0
  122. package/dist/foundations/community/repositories/community.repository.js +446 -0
  123. package/dist/foundations/community/repositories/community.repository.js.map +1 -0
  124. package/dist/foundations/community/services/community.service.d.ts +8 -0
  125. package/dist/foundations/community/services/community.service.d.ts.map +1 -0
  126. package/dist/foundations/community/services/community.service.js +28 -0
  127. package/dist/foundations/community/services/community.service.js.map +1 -0
  128. package/dist/foundations/keyconcept/entities/key.concept.entity.d.ts +1 -0
  129. package/dist/foundations/keyconcept/entities/key.concept.entity.d.ts.map +1 -1
  130. package/dist/foundations/keyconcept/entities/key.concept.map.d.ts.map +1 -1
  131. package/dist/foundations/keyconcept/entities/key.concept.map.js +1 -0
  132. package/dist/foundations/keyconcept/entities/key.concept.map.js.map +1 -1
  133. package/dist/foundations/keyconcept/repositories/keyconcept.repository.d.ts +13 -2
  134. package/dist/foundations/keyconcept/repositories/keyconcept.repository.d.ts.map +1 -1
  135. package/dist/foundations/keyconcept/repositories/keyconcept.repository.js +22 -2
  136. package/dist/foundations/keyconcept/repositories/keyconcept.repository.js.map +1 -1
  137. package/package.json +1 -1
@@ -0,0 +1,446 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CommunityRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const crypto_1 = require("crypto");
15
+ const core_1 = require("../../../core");
16
+ const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
17
+ const security_service_1 = require("../../../core/security/services/security.service");
18
+ const community_model_1 = require("../entities/community.model");
19
+ let CommunityRepository = class CommunityRepository {
20
+ constructor(neo4j, embedderService, modelService, securityService) {
21
+ this.neo4j = neo4j;
22
+ this.embedderService = embedderService;
23
+ this.modelService = modelService;
24
+ this.securityService = securityService;
25
+ }
26
+ async onModuleInit() {
27
+ await this.neo4j.writeOne({
28
+ query: `CREATE CONSTRAINT community_id IF NOT EXISTS FOR (community:Community) REQUIRE community.id IS UNIQUE`,
29
+ });
30
+ const dimensions = this.modelService.getEmbedderDimensions();
31
+ await this.neo4j.writeOne({
32
+ query: `
33
+ CREATE VECTOR INDEX communities IF NOT EXISTS
34
+ FOR (community:Community)
35
+ ON community.embedding
36
+ OPTIONS { indexConfig: {
37
+ \`vector.dimensions\`: ${dimensions},
38
+ \`vector.similarity_function\`: 'cosine'
39
+ }};
40
+ `,
41
+ });
42
+ }
43
+ /**
44
+ * Create a new community node with BELONGS_TO company relationship
45
+ * Uses companyId from CLS (current request context)
46
+ */
47
+ async createCommunity(params) {
48
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
49
+ const id = (0, crypto_1.randomUUID)();
50
+ query.queryParams = {
51
+ ...query.queryParams,
52
+ id,
53
+ name: params.name,
54
+ level: params.level,
55
+ memberCount: params.memberCount,
56
+ rating: params.rating ?? 0,
57
+ };
58
+ query.query += `
59
+ CREATE (community:Community {
60
+ id: $id,
61
+ name: $name,
62
+ level: $level,
63
+ memberCount: $memberCount,
64
+ rating: $rating,
65
+ isStale: true,
66
+ staleSince: datetime(),
67
+ createdAt: datetime(),
68
+ updatedAt: datetime()
69
+ })
70
+ CREATE (community)-[:BELONGS_TO]->(company)
71
+ RETURN community
72
+ `;
73
+ return this.neo4j.writeOne(query);
74
+ }
75
+ /**
76
+ * Update community members (HAS_MEMBER relationships to KeyConcepts)
77
+ */
78
+ async updateCommunityMembers(params) {
79
+ // First, remove existing HAS_MEMBER relationships
80
+ const removeQuery = this.neo4j.initQuery();
81
+ removeQuery.queryParams = { ...removeQuery.queryParams, communityId: params.communityId };
82
+ removeQuery.query += `
83
+ MATCH (community:Community {id: $communityId})-[r:HAS_MEMBER]->()
84
+ DELETE r
85
+ `;
86
+ await this.neo4j.writeOne(removeQuery);
87
+ // Then, create new HAS_MEMBER relationships
88
+ if (params.keyConceptIds.length > 0) {
89
+ const addQuery = this.neo4j.initQuery();
90
+ addQuery.queryParams = {
91
+ ...addQuery.queryParams,
92
+ communityId: params.communityId,
93
+ keyConceptIds: params.keyConceptIds,
94
+ };
95
+ addQuery.query += `
96
+ MATCH (community:Community {id: $communityId})
97
+ MATCH (keyconcept:KeyConcept) WHERE keyconcept.id IN $keyConceptIds
98
+ MERGE (community)-[:HAS_MEMBER]->(keyconcept)
99
+ `;
100
+ await this.neo4j.writeOne(addQuery);
101
+ // Update memberCount
102
+ const updateCountQuery = this.neo4j.initQuery();
103
+ updateCountQuery.queryParams = {
104
+ ...updateCountQuery.queryParams,
105
+ communityId: params.communityId,
106
+ memberCount: params.keyConceptIds.length,
107
+ };
108
+ updateCountQuery.query += `
109
+ MATCH (community:Community {id: $communityId})
110
+ SET community.memberCount = $memberCount
111
+ `;
112
+ await this.neo4j.writeOne(updateCountQuery);
113
+ }
114
+ }
115
+ /**
116
+ * Set PARENT_OF relationship between communities (hierarchy)
117
+ */
118
+ async setParentCommunity(params) {
119
+ const query = this.neo4j.initQuery();
120
+ query.queryParams = {
121
+ ...query.queryParams,
122
+ childCommunityId: params.childCommunityId,
123
+ parentCommunityId: params.parentCommunityId,
124
+ };
125
+ query.query += `
126
+ MATCH (parent:Community {id: $parentCommunityId})
127
+ MATCH (child:Community {id: $childCommunityId})
128
+ MERGE (parent)-[:PARENT_OF]->(child)
129
+ `;
130
+ await this.neo4j.writeOne(query);
131
+ }
132
+ /**
133
+ * Mark communities as stale (needs reprocessing)
134
+ */
135
+ async markAsStale(communityIds) {
136
+ if (communityIds.length === 0)
137
+ return;
138
+ const query = this.neo4j.initQuery();
139
+ query.queryParams = {
140
+ ...query.queryParams,
141
+ communityIds,
142
+ };
143
+ query.query += `
144
+ MATCH (community:Community) WHERE community.id IN $communityIds
145
+ SET community.isStale = true, community.staleSince = datetime(), community.updatedAt = datetime()
146
+ `;
147
+ await this.neo4j.writeOne(query);
148
+ }
149
+ /**
150
+ * Find stale communities for cron job processing (oldest first)
151
+ * Filters by company from CLS context
152
+ */
153
+ async findStaleCommunities(limit) {
154
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
155
+ query.queryParams = { ...query.queryParams, limit: Number(limit) };
156
+ query.query += `
157
+ MATCH (community:Community {isStale: true})-[:BELONGS_TO]->(company)
158
+ RETURN community
159
+ ORDER BY community.staleSince ASC
160
+ LIMIT toInteger($limit)
161
+ `;
162
+ const result = await this.neo4j.readMany(query);
163
+ return result ?? [];
164
+ }
165
+ /**
166
+ * Update community summary, embedding, and mark as not stale
167
+ */
168
+ async updateSummary(params) {
169
+ const query = this.neo4j.initQuery();
170
+ query.queryParams = {
171
+ ...query.queryParams,
172
+ communityId: params.communityId,
173
+ name: params.name,
174
+ summary: params.summary,
175
+ embedding: params.embedding,
176
+ rating: params.rating,
177
+ };
178
+ query.query += `
179
+ MATCH (community:Community {id: $communityId})
180
+ SET community.name = $name,
181
+ community.summary = $summary,
182
+ community.embedding = $embedding,
183
+ community.rating = $rating,
184
+ community.isStale = false,
185
+ community.staleSince = null,
186
+ community.lastProcessedAt = datetime(),
187
+ community.updatedAt = datetime()
188
+ `;
189
+ await this.neo4j.writeOne(query);
190
+ }
191
+ /**
192
+ * Find communities by vector similarity search
193
+ * Filters by company from CLS context
194
+ */
195
+ async findByVector(params) {
196
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
197
+ query.queryParams = {
198
+ ...query.queryParams,
199
+ embedding: params.embedding,
200
+ topK: params.topK,
201
+ level: params.level,
202
+ };
203
+ let whereClause = "WHERE community.embedding IS NOT NULL AND community.isStale = false";
204
+ if (params.level !== undefined) {
205
+ whereClause += " AND community.level = $level";
206
+ }
207
+ query.query += `
208
+ CALL db.index.vector.queryNodes('communities', $topK * 2, $embedding)
209
+ YIELD node AS community, score
210
+ MATCH (community)-[:BELONGS_TO]->(company)
211
+ ${whereClause}
212
+ RETURN community, score
213
+ ORDER BY score DESC
214
+ LIMIT toInteger($topK)
215
+ `;
216
+ return this.neo4j.readMany(query);
217
+ }
218
+ /**
219
+ * Find communities by hierarchy level
220
+ * Filters by company from CLS context
221
+ */
222
+ async findByLevel(params) {
223
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
224
+ query.queryParams = {
225
+ ...query.queryParams,
226
+ level: params.level,
227
+ };
228
+ query.query += `
229
+ MATCH (community:Community)-[:BELONGS_TO]->(company)
230
+ WHERE community.level = $level
231
+ RETURN community
232
+ ORDER BY community.rating DESC
233
+ `;
234
+ return this.neo4j.readMany(query);
235
+ }
236
+ /**
237
+ * Find member KeyConcepts for a community
238
+ */
239
+ async findMemberKeyConcepts(communityId) {
240
+ const query = this.neo4j.initQuery();
241
+ query.queryParams = { ...query.queryParams, communityId };
242
+ query.query += `
243
+ MATCH (community:Community {id: $communityId})-[:HAS_MEMBER]->(keyconcept:KeyConcept)
244
+ RETURN keyconcept.id AS id, keyconcept.value AS value, keyconcept.description AS description
245
+ `;
246
+ // Use raw read() to avoid entity serialization - we just need properties
247
+ const result = await this.neo4j.read(query.query, query.queryParams);
248
+ return result.records.map((record) => ({
249
+ id: record.get("id"),
250
+ value: record.get("value"),
251
+ description: record.get("description") ?? undefined,
252
+ }));
253
+ }
254
+ /**
255
+ * Get KeyConceptRelationships between community members
256
+ */
257
+ async findMemberRelationships(communityId) {
258
+ const query = this.neo4j.initQuery();
259
+ query.queryParams = { ...query.queryParams, communityId };
260
+ query.query += `
261
+ MATCH (community:Community {id: $communityId})-[:HAS_MEMBER]->(kc1:KeyConcept)
262
+ MATCH (community)-[:HAS_MEMBER]->(kc2:KeyConcept)
263
+ MATCH (kc1)<-[:RELATES_TO]-(rel:KeyConceptRelationship)-[:RELATES_TO]->(kc2)
264
+ WHERE kc1.value < kc2.value
265
+ RETURN kc1.value AS keyConcept1, kc2.value AS keyConcept2, rel.weight AS weight
266
+ `;
267
+ // Use raw read() to avoid entity serialization - we just need properties
268
+ const result = await this.neo4j.read(query.query, query.queryParams);
269
+ return result.records.map((record) => {
270
+ const weight = record.get("weight");
271
+ return {
272
+ keyConcept1: record.get("keyConcept1"),
273
+ keyConcept2: record.get("keyConcept2"),
274
+ weight: weight?.toNumber?.() ?? weight ?? 1.0,
275
+ };
276
+ });
277
+ }
278
+ /**
279
+ * Get parent community chain (hierarchy)
280
+ */
281
+ async getHierarchy(communityId) {
282
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
283
+ query.queryParams = { ...query.queryParams, communityId };
284
+ query.query += `
285
+ MATCH (child:Community {id: $communityId})
286
+ MATCH path = (parent:Community)-[:PARENT_OF*]->(child)
287
+ UNWIND nodes(path) AS community
288
+ RETURN DISTINCT community
289
+ ORDER BY community.level DESC
290
+ `;
291
+ return this.neo4j.readMany(query);
292
+ }
293
+ /**
294
+ * Get child communities
295
+ */
296
+ async getChildren(communityId) {
297
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
298
+ query.queryParams = { ...query.queryParams, communityId };
299
+ query.query += `
300
+ MATCH (parent:Community {id: $communityId})-[:PARENT_OF]->(child:Community)
301
+ RETURN child AS community
302
+ ORDER BY child.rating DESC
303
+ `;
304
+ return this.neo4j.readMany(query);
305
+ }
306
+ /**
307
+ * Delete a community and its relationships
308
+ */
309
+ async deleteCommunity(communityId) {
310
+ const query = this.neo4j.initQuery();
311
+ query.queryParams = { ...query.queryParams, communityId };
312
+ query.query += `
313
+ MATCH (community:Community {id: $communityId})
314
+ DETACH DELETE community
315
+ `;
316
+ await this.neo4j.writeOne(query);
317
+ }
318
+ /**
319
+ * Delete all communities for the current company (from CLS)
320
+ */
321
+ async deleteAllCommunities() {
322
+ const query = this.neo4j.initQuery();
323
+ query.query += `
324
+ MATCH (community:Community)-[:BELONGS_TO]->(company)
325
+ DETACH DELETE community
326
+ `;
327
+ await this.neo4j.writeOne(query);
328
+ }
329
+ /**
330
+ * Find communities that contain a specific KeyConcept
331
+ */
332
+ async findCommunitiesByKeyConcept(keyConceptId) {
333
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
334
+ query.queryParams = { ...query.queryParams, keyConceptId };
335
+ query.query += `
336
+ MATCH (community:Community)-[:HAS_MEMBER]->(keyconcept:KeyConcept {id: $keyConceptId})
337
+ MATCH (community)-[:BELONGS_TO]->(company)
338
+ RETURN community
339
+ ORDER BY community.level ASC
340
+ `;
341
+ return this.neo4j.readMany(query);
342
+ }
343
+ /**
344
+ * Count communities by level for the current company (from CLS)
345
+ */
346
+ async countByLevel() {
347
+ const query = this.neo4j.initQuery();
348
+ query.query += `
349
+ MATCH (community:Community)-[:BELONGS_TO]->(company)
350
+ RETURN community.level AS level, COUNT(community) AS count
351
+ ORDER BY level ASC
352
+ `;
353
+ // Use raw read() to avoid entity serialization - we just need counts
354
+ const result = await this.neo4j.read(query.query, query.queryParams);
355
+ return result.records.map((record) => {
356
+ const level = record.get("level");
357
+ const count = record.get("count");
358
+ return {
359
+ level: level?.toNumber?.() ?? level ?? 0,
360
+ count: count?.toNumber?.() ?? count ?? 0,
361
+ };
362
+ });
363
+ }
364
+ /**
365
+ * Find community by ID with company scope from CLS
366
+ */
367
+ async findById(communityId) {
368
+ const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
369
+ query.queryParams = { ...query.queryParams, communityId };
370
+ query.query += `
371
+ MATCH (community:Community {id: $communityId})-[:BELONGS_TO]->(company)
372
+ RETURN community
373
+ `;
374
+ return this.neo4j.readOne(query);
375
+ }
376
+ /**
377
+ * Find communities that contain KeyConcepts related to a given KeyConcept
378
+ * Returns affinity scores based on relationship count and weight
379
+ */
380
+ async findCommunitiesByRelatedKeyConcepts(keyConceptId) {
381
+ const query = this.neo4j.initQuery();
382
+ query.queryParams = { ...query.queryParams, keyConceptId };
383
+ query.query += `
384
+ MATCH (kc:KeyConcept {id: $keyConceptId})
385
+ MATCH (kc)<-[:RELATES_TO]-(rel:KeyConceptRelationship)-[:RELATES_TO]->(relatedKc:KeyConcept)
386
+ MATCH (community:Community)-[:HAS_MEMBER]->(relatedKc)
387
+ MATCH (community)-[:BELONGS_TO]->(company)
388
+ WITH community, rel, relatedKc
389
+ RETURN community.id AS communityId,
390
+ community.memberCount AS memberCount,
391
+ count(DISTINCT relatedKc) AS relationshipCount,
392
+ sum(coalesce(rel.weight, 1.0)) AS totalWeight
393
+ ORDER BY totalWeight DESC
394
+ `;
395
+ const result = await this.neo4j.read(query.query, query.queryParams);
396
+ return result.records.map((record) => {
397
+ const relationshipCount = record.get("relationshipCount");
398
+ const totalWeight = record.get("totalWeight");
399
+ const memberCount = record.get("memberCount");
400
+ return {
401
+ communityId: record.get("communityId"),
402
+ memberCount: memberCount?.toNumber?.() ?? memberCount ?? 0,
403
+ relationshipCount: relationshipCount?.toNumber?.() ?? relationshipCount ?? 0,
404
+ totalWeight: totalWeight?.toNumber?.() ?? totalWeight ?? 0,
405
+ };
406
+ });
407
+ }
408
+ /**
409
+ * Add a single KeyConcept to an existing community
410
+ */
411
+ async addMemberToCommunity(communityId, keyConceptId) {
412
+ const query = this.neo4j.initQuery();
413
+ query.queryParams = { ...query.queryParams, communityId, keyConceptId };
414
+ query.query += `
415
+ MATCH (community:Community {id: $communityId})
416
+ MATCH (keyconcept:KeyConcept {id: $keyConceptId})
417
+ MERGE (community)-[:HAS_MEMBER]->(keyconcept)
418
+ SET community.memberCount = community.memberCount + 1,
419
+ community.updatedAt = datetime()
420
+ `;
421
+ await this.neo4j.writeOne(query);
422
+ }
423
+ /**
424
+ * Find KeyConcepts from a content that are not in any community
425
+ */
426
+ async findOrphanKeyConceptsForContent(contentId, label) {
427
+ const query = this.neo4j.initQuery();
428
+ query.queryParams = { ...query.queryParams, contentId };
429
+ query.query += `
430
+ MATCH (content:${label} {id: $contentId})-[:HAS_CHUNK]->()-[:HAS_ATOMIC_FACT]->()-[:HAS_KEY_CONCEPT]->(kc:KeyConcept)
431
+ WHERE NOT EXISTS { (kc)<-[:HAS_MEMBER]-(:Community) }
432
+ RETURN DISTINCT kc.id AS keyConceptId
433
+ `;
434
+ const result = await this.neo4j.read(query.query, query.queryParams);
435
+ return result.records.map((record) => record.get("keyConceptId"));
436
+ }
437
+ };
438
+ exports.CommunityRepository = CommunityRepository;
439
+ exports.CommunityRepository = CommunityRepository = __decorate([
440
+ (0, common_1.Injectable)(),
441
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService,
442
+ core_1.EmbedderService,
443
+ core_1.ModelService,
444
+ security_service_1.SecurityService])
445
+ ], CommunityRepository);
446
+ //# sourceMappingURL=community.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.repository.js","sourceRoot":"","sources":["../../../../src/foundations/community/repositories/community.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { JsonApiService } from "../../../core/jsonapi/services/jsonapi.service";
2
+ import { CommunityRepository } from "../repositories/community.repository";
3
+ export declare class CommunityService {
4
+ private readonly builder;
5
+ private readonly communityRepository;
6
+ constructor(builder: JsonApiService, communityRepository: CommunityRepository);
7
+ }
8
+ //# sourceMappingURL=community.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/community/services/community.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,qBACa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;gBADnB,OAAO,EAAE,cAAc,EACvB,mBAAmB,EAAE,mBAAmB;CAE5D"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CommunityService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const jsonapi_service_1 = require("../../../core/jsonapi/services/jsonapi.service");
15
+ const community_repository_1 = require("../repositories/community.repository");
16
+ let CommunityService = class CommunityService {
17
+ constructor(builder, communityRepository) {
18
+ this.builder = builder;
19
+ this.communityRepository = communityRepository;
20
+ }
21
+ };
22
+ exports.CommunityService = CommunityService;
23
+ exports.CommunityService = CommunityService = __decorate([
24
+ (0, common_1.Injectable)(),
25
+ __metadata("design:paramtypes", [jsonapi_service_1.JsonApiService,
26
+ community_repository_1.CommunityRepository])
27
+ ], CommunityService);
28
+ //# sourceMappingURL=community.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community.service.js","sourceRoot":"","sources":["../../../../src/foundations/community/services/community.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAAgF;AAChF,+EAA2E;AAGpE,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YACmB,OAAuB,EACvB,mBAAwC;QADxC,YAAO,GAAP,OAAO,CAAgB;QACvB,wBAAmB,GAAnB,mBAAmB,CAAqB;IACxD,CAAC;CACL,CAAA;AALY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAGiB,gCAAc;QACF,0CAAmB;GAHhD,gBAAgB,CAK5B"}
@@ -2,6 +2,7 @@ import { Entity } from "../../../common/abstracts/entity";
2
2
  import { AtomicFact } from "../../atomicfact/entities/atomic.fact.entity";
3
3
  export type KeyConcept = Entity & {
4
4
  value: string;
5
+ description?: string;
5
6
  embedding?: any;
6
7
  atomicfact: AtomicFact;
7
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"key.concept.entity.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"key.concept.entity.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"key.concept.map.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,eAAO,MAAM,aAAa,GAAI,QAAQ;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,aAAa,EAAE,aAAa,CAAA;CAAE,KAAG,UAOhG,CAAC"}
1
+ {"version":3,"file":"key.concept.map.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,eAAO,MAAM,aAAa,GAAI,QAAQ;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,aAAa,EAAE,aAAa,CAAA;CAAE,KAAG,UAQhG,CAAC"}
@@ -6,6 +6,7 @@ const mapKeyConcept = (params) => {
6
6
  return {
7
7
  ...(0, entity_1.mapEntity)({ record: params.data }),
8
8
  value: params.data.value,
9
+ description: params.data.description,
9
10
  embedding: params.data.embedding,
10
11
  atomicfact: undefined,
11
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"key.concept.map.js","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":";;;AAAA,6DAA6D;AAItD,MAAM,aAAa,GAAG,CAAC,MAAgE,EAAc,EAAE;IAC5G,OAAO;QACL,GAAG,IAAA,kBAAS,EAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;QACxB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;QAChC,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,aAAa,iBAOxB"}
1
+ {"version":3,"file":"key.concept.map.js","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":";;;AAAA,6DAA6D;AAItD,MAAM,aAAa,GAAG,CAAC,MAAgE,EAAc,EAAE;IAC5G,OAAO;QACL,GAAG,IAAA,kBAAS,EAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;QACxB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;QACpC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;QAChC,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,aAAa,iBAQxB"}
@@ -1,16 +1,17 @@
1
1
  import { OnModuleInit } from "@nestjs/common";
2
2
  import { ClsService } from "nestjs-cls";
3
3
  import { DataLimits } from "../../../common/types/data.limits";
4
- import { EmbedderService } from "../../../core";
4
+ import { EmbedderService, ModelService } from "../../../core";
5
5
  import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
6
6
  import { SecurityService } from "../../../core/security/services/security.service";
7
7
  import { KeyConcept } from "../../keyconcept/entities/key.concept.entity";
8
8
  export declare class KeyConceptRepository implements OnModuleInit {
9
9
  private readonly neo4j;
10
10
  private readonly embedderService;
11
+ private readonly modelService;
11
12
  private readonly securityService;
12
13
  private readonly clsService;
13
- constructor(neo4j: Neo4jService, embedderService: EmbedderService, securityService: SecurityService, clsService: ClsService);
14
+ constructor(neo4j: Neo4jService, embedderService: EmbedderService, modelService: ModelService, securityService: SecurityService, clsService: ClsService);
14
15
  onModuleInit(): Promise<void>;
15
16
  findNeighboursByKeyConcepts(params: {
16
17
  keyConcepts: string[];
@@ -30,6 +31,16 @@ export declare class KeyConceptRepository implements OnModuleInit {
30
31
  createOrphanKeyConcepts(params: {
31
32
  keyConceptValues: string[];
32
33
  }): Promise<void>;
34
+ /**
35
+ * Update descriptions for existing KeyConcepts (only if they don't have a description yet)
36
+ * This preserves existing descriptions and only adds new ones
37
+ */
38
+ updateKeyConceptDescriptions(params: {
39
+ descriptions: {
40
+ keyConcept: string;
41
+ description: string;
42
+ }[];
43
+ }): Promise<void>;
33
44
  createKeyConcept(params: {
34
45
  keyConceptValue: string;
35
46
  atomicFactId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"keyconcept.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/repositories/keyconcept.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAI1E,qBACa,oBAAqB,YAAW,YAAY;IAErD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAHV,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU;IAGnC,YAAY;IAsBZ,2BAA2B,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoC7G,wBAAwB,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkCrG,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9C,qBAAqB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAgB/E,uBAAuB,CAAC,MAAM,EAAE;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgBtF,uBAAuB,CAAC,MAAM,EAAE;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,gBAAgB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1F,wBAAwB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlG,qCAAqC,CAAC,MAAM,EAAE;QAClD,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,EAAE,MAAM,CAAC;SACtB,EAAE,CAAC;KACL,GAAG,OAAO,CAAC,IAAI,CAAC;IA6EX,kDAAkD,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBrG"}
1
+ {"version":3,"file":"keyconcept.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/repositories/keyconcept.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAI1E,qBACa,oBAAqB,YAAW,YAAY;IAErD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAJV,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU;IAGnC,YAAY;IAuBZ,2BAA2B,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoC7G,wBAAwB,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkCrG,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9C,qBAAqB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAgB/E,uBAAuB,CAAC,MAAM,EAAE;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgBtF,uBAAuB,CAAC,MAAM,EAAE;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpF;;;OAGG;IACG,4BAA4B,CAAC,MAAM,EAAE;QACzC,YAAY,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC7D,GAAG,OAAO,CAAC,IAAI,CAAC;IAeX,gBAAgB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1F,wBAAwB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlG,qCAAqC,CAAC,MAAM,EAAE;QAClD,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,EAAE,MAAM,CAAC;SACtB,EAAE,CAAC;KACL,GAAG,OAAO,CAAC,IAAI,CAAC;IA6EX,kDAAkD,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBrG"}
@@ -20,9 +20,10 @@ const security_service_1 = require("../../../core/security/services/security.ser
20
20
  const key_concept_meta_1 = require("../../keyconcept/entities/key.concept.meta");
21
21
  const key_concept_model_1 = require("../../keyconcept/entities/key.concept.model");
22
22
  let KeyConceptRepository = class KeyConceptRepository {
23
- constructor(neo4j, embedderService, securityService, clsService) {
23
+ constructor(neo4j, embedderService, modelService, securityService, clsService) {
24
24
  this.neo4j = neo4j;
25
25
  this.embedderService = embedderService;
26
+ this.modelService = modelService;
26
27
  this.securityService = securityService;
27
28
  this.clsService = clsService;
28
29
  }
@@ -33,13 +34,14 @@ let KeyConceptRepository = class KeyConceptRepository {
33
34
  await this.neo4j.writeOne({
34
35
  query: `CREATE CONSTRAINT keyconcept_value IF NOT EXISTS FOR (keyconcept:KeyConcept) REQUIRE keyconcept.value IS UNIQUE`,
35
36
  });
37
+ const dimensions = this.modelService.getEmbedderDimensions();
36
38
  await this.neo4j.writeOne({
37
39
  query: `
38
40
  CREATE VECTOR INDEX keyconcepts IF NOT EXISTS
39
41
  FOR (keyconcept:KeyConcept)
40
42
  ON keyconcept.embedding
41
43
  OPTIONS { indexConfig: {
42
- \`vector.dimensions\`: 1536,
44
+ \`vector.dimensions\`: ${dimensions},
43
45
  \`vector.similarity_function\`: 'cosine'
44
46
  }};
45
47
  `,
@@ -157,6 +159,23 @@ let KeyConceptRepository = class KeyConceptRepository {
157
159
  }));
158
160
  await this.neo4j.executeInTransaction(data);
159
161
  }
162
+ /**
163
+ * Update descriptions for existing KeyConcepts (only if they don't have a description yet)
164
+ * This preserves existing descriptions and only adds new ones
165
+ */
166
+ async updateKeyConceptDescriptions(params) {
167
+ if (params.descriptions.length === 0)
168
+ return;
169
+ const data = params.descriptions.map((item) => ({
170
+ query: `
171
+ MATCH (keyconcept:KeyConcept {value: $keyConceptValue})
172
+ WHERE keyconcept.description IS NULL OR keyconcept.description = ""
173
+ SET keyconcept.description = $description
174
+ `,
175
+ params: { keyConceptValue: item.keyConcept, description: item.description },
176
+ }));
177
+ await this.neo4j.executeInTransaction(data);
178
+ }
160
179
  async createKeyConcept(params) {
161
180
  const queryCheck = this.neo4j.initQuery({ serialiser: key_concept_model_1.KeyConceptModel, fetchAll: true });
162
181
  queryCheck.queryParams = {
@@ -284,6 +303,7 @@ exports.KeyConceptRepository = KeyConceptRepository = __decorate([
284
303
  (0, common_1.Injectable)(),
285
304
  __metadata("design:paramtypes", [neo4j_service_1.Neo4jService,
286
305
  core_1.EmbedderService,
306
+ core_1.ModelService,
287
307
  security_service_1.SecurityService,
288
308
  nestjs_cls_1.ClsService])
289
309
  ], KeyConceptRepository);