@carlonicora/nestjs-neo4jsonapi 1.64.0 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/dist/agents/agents.modules.js +3 -3
  2. package/dist/agents/agents.modules.js.map +1 -1
  3. package/dist/agents/graph/graph.module.d.ts +3 -0
  4. package/dist/agents/graph/graph.module.d.ts.map +1 -0
  5. package/dist/agents/{chatbot/chatbot.module.js → graph/graph.module.js} +12 -16
  6. package/dist/agents/graph/graph.module.js.map +1 -0
  7. package/dist/agents/{chatbot → graph}/interfaces/graph.catalog.interface.d.ts +4 -0
  8. package/dist/agents/graph/interfaces/graph.catalog.interface.d.ts.map +1 -0
  9. package/dist/agents/graph/interfaces/graph.catalog.interface.js.map +1 -0
  10. package/dist/agents/graph/interfaces/graph.node.output.interface.d.ts +30 -0
  11. package/dist/agents/graph/interfaces/graph.node.output.interface.d.ts.map +1 -0
  12. package/dist/agents/graph/interfaces/graph.node.output.interface.js +3 -0
  13. package/dist/agents/graph/interfaces/graph.node.output.interface.js.map +1 -0
  14. package/dist/agents/graph/prompts/graph.node.system.prompt.d.ts +3 -0
  15. package/dist/agents/graph/prompts/graph.node.system.prompt.d.ts.map +1 -0
  16. package/dist/agents/graph/prompts/graph.node.system.prompt.js +66 -0
  17. package/dist/agents/graph/prompts/graph.node.system.prompt.js.map +1 -0
  18. package/dist/agents/graph/repositories/user-modules.repository.d.ts.map +1 -0
  19. package/dist/agents/graph/repositories/user-modules.repository.js.map +1 -0
  20. package/dist/agents/{chatbot → graph}/services/descriptor.source.d.ts +2 -0
  21. package/dist/agents/graph/services/descriptor.source.d.ts.map +1 -0
  22. package/dist/agents/{chatbot → graph}/services/descriptor.source.js +18 -3
  23. package/dist/agents/graph/services/descriptor.source.js.map +1 -0
  24. package/dist/agents/graph/services/field-formatting.d.ts.map +1 -0
  25. package/dist/agents/graph/services/field-formatting.js.map +1 -0
  26. package/dist/agents/{chatbot → graph}/services/graph.catalog.service.d.ts +16 -0
  27. package/dist/agents/graph/services/graph.catalog.service.d.ts.map +1 -0
  28. package/dist/agents/{chatbot → graph}/services/graph.catalog.service.js +63 -1
  29. package/dist/agents/graph/services/graph.catalog.service.js.map +1 -0
  30. package/dist/agents/{chatbot/services/chatbot.index.manager.d.ts → graph/services/graph.index.manager.d.ts} +2 -2
  31. package/dist/agents/graph/services/graph.index.manager.d.ts.map +1 -0
  32. package/dist/agents/{chatbot/services/chatbot.index.manager.js → graph/services/graph.index.manager.js} +9 -9
  33. package/dist/agents/graph/services/graph.index.manager.js.map +1 -0
  34. package/dist/agents/graph/services/graph.search.service.d.ts +69 -0
  35. package/dist/agents/graph/services/graph.search.service.d.ts.map +1 -0
  36. package/dist/agents/graph/services/graph.search.service.js +230 -0
  37. package/dist/agents/graph/services/graph.search.service.js.map +1 -0
  38. package/dist/agents/graph/services/humanize-tool.d.ts.map +1 -0
  39. package/dist/agents/graph/services/humanize-tool.js.map +1 -0
  40. package/dist/agents/graph/services/materialise-bridge.d.ts +36 -0
  41. package/dist/agents/graph/services/materialise-bridge.d.ts.map +1 -0
  42. package/dist/agents/graph/services/materialise-bridge.js +69 -0
  43. package/dist/agents/graph/services/materialise-bridge.js.map +1 -0
  44. package/dist/agents/graph/tools/describe-entity.tool.d.ts.map +1 -0
  45. package/dist/agents/{chatbot → graph}/tools/describe-entity.tool.js +1 -0
  46. package/dist/agents/graph/tools/describe-entity.tool.js.map +1 -0
  47. package/dist/agents/{chatbot → graph}/tools/read-entity.tool.d.ts +5 -1
  48. package/dist/agents/graph/tools/read-entity.tool.d.ts.map +1 -0
  49. package/dist/agents/{chatbot → graph}/tools/read-entity.tool.js +37 -8
  50. package/dist/agents/graph/tools/read-entity.tool.js.map +1 -0
  51. package/dist/agents/{chatbot → graph}/tools/resolve-entity.tool.d.ts +2 -2
  52. package/dist/agents/graph/tools/resolve-entity.tool.d.ts.map +1 -0
  53. package/dist/agents/{chatbot → graph}/tools/resolve-entity.tool.js +2 -2
  54. package/dist/agents/graph/tools/resolve-entity.tool.js.map +1 -0
  55. package/dist/agents/{chatbot → graph}/tools/search-entities.tool.d.ts +6 -2
  56. package/dist/agents/graph/tools/search-entities.tool.d.ts.map +1 -0
  57. package/dist/agents/{chatbot → graph}/tools/search-entities.tool.js +36 -12
  58. package/dist/agents/graph/tools/search-entities.tool.js.map +1 -0
  59. package/dist/agents/{chatbot → graph}/tools/tool.factory.d.ts +7 -0
  60. package/dist/agents/graph/tools/tool.factory.d.ts.map +1 -0
  61. package/dist/agents/{chatbot → graph}/tools/tool.factory.js +57 -3
  62. package/dist/agents/graph/tools/tool.factory.js.map +1 -0
  63. package/dist/agents/{chatbot → graph}/tools/traverse.tool.d.ts +5 -1
  64. package/dist/agents/graph/tools/traverse.tool.d.ts.map +1 -0
  65. package/dist/agents/{chatbot → graph}/tools/traverse.tool.js +38 -15
  66. package/dist/agents/graph/tools/traverse.tool.js.map +1 -0
  67. package/dist/agents/index.d.ts +6 -9
  68. package/dist/agents/index.d.ts.map +1 -1
  69. package/dist/agents/index.js +13 -15
  70. package/dist/agents/index.js.map +1 -1
  71. package/dist/agents/responder/contexts/responder.context.d.ts +75 -1
  72. package/dist/agents/responder/contexts/responder.context.d.ts.map +1 -1
  73. package/dist/agents/responder/contexts/responder.context.js +29 -4
  74. package/dist/agents/responder/contexts/responder.context.js.map +1 -1
  75. package/dist/agents/responder/factories/responder.context.factory.d.ts +4 -5
  76. package/dist/agents/responder/factories/responder.context.factory.d.ts.map +1 -1
  77. package/dist/agents/responder/factories/responder.context.factory.js +28 -8
  78. package/dist/agents/responder/factories/responder.context.factory.js.map +1 -1
  79. package/dist/agents/responder/interfaces/entity.reference.interface.d.ts +7 -0
  80. package/dist/agents/responder/interfaces/entity.reference.interface.d.ts.map +1 -0
  81. package/dist/agents/{chatbot/interfaces/chatbot.response.interface.js → responder/interfaces/entity.reference.interface.js} +1 -1
  82. package/dist/agents/responder/interfaces/entity.reference.interface.js.map +1 -0
  83. package/dist/agents/responder/interfaces/responder.response.interface.d.ts +12 -3
  84. package/dist/agents/responder/interfaces/responder.response.interface.d.ts.map +1 -1
  85. package/dist/agents/responder/interfaces/unified.trace.interface.d.ts +64 -0
  86. package/dist/agents/responder/interfaces/unified.trace.interface.d.ts.map +1 -0
  87. package/dist/agents/responder/interfaces/unified.trace.interface.js +3 -0
  88. package/dist/agents/responder/interfaces/unified.trace.interface.js.map +1 -0
  89. package/dist/agents/responder/nodes/graph.node.service.d.ts +31 -0
  90. package/dist/agents/responder/nodes/graph.node.service.d.ts.map +1 -0
  91. package/dist/agents/responder/nodes/graph.node.service.js +319 -0
  92. package/dist/agents/responder/nodes/graph.node.service.js.map +1 -0
  93. package/dist/agents/responder/nodes/planner.node.service.d.ts +14 -0
  94. package/dist/agents/responder/nodes/planner.node.service.d.ts.map +1 -0
  95. package/dist/agents/responder/nodes/planner.node.service.js +121 -0
  96. package/dist/agents/responder/nodes/planner.node.service.js.map +1 -0
  97. package/dist/agents/responder/nodes/responder.answer.node.service.d.ts +5 -23
  98. package/dist/agents/responder/nodes/responder.answer.node.service.d.ts.map +1 -1
  99. package/dist/agents/responder/nodes/responder.answer.node.service.js +257 -432
  100. package/dist/agents/responder/nodes/responder.answer.node.service.js.map +1 -1
  101. package/dist/agents/responder/responder.module.d.ts.map +1 -1
  102. package/dist/agents/responder/responder.module.js +12 -3
  103. package/dist/agents/responder/responder.module.js.map +1 -1
  104. package/dist/agents/responder/services/responder.service.d.ts +15 -22
  105. package/dist/agents/responder/services/responder.service.d.ts.map +1 -1
  106. package/dist/agents/responder/services/responder.service.js +116 -89
  107. package/dist/agents/responder/services/responder.service.js.map +1 -1
  108. package/dist/common/helpers/define-entity.d.ts.map +1 -1
  109. package/dist/common/helpers/define-entity.js +16 -1
  110. package/dist/common/helpers/define-entity.js.map +1 -1
  111. package/dist/common/interfaces/entity.schema.interface.d.ts +15 -0
  112. package/dist/common/interfaces/entity.schema.interface.d.ts.map +1 -1
  113. package/dist/core/llm/interfaces/llm-call-metadata.interface.d.ts +19 -0
  114. package/dist/core/llm/interfaces/llm-call-metadata.interface.d.ts.map +1 -0
  115. package/dist/core/llm/interfaces/llm-call-metadata.interface.js +3 -0
  116. package/dist/core/llm/interfaces/llm-call-metadata.interface.js.map +1 -0
  117. package/dist/core/llm/llm.module.d.ts +1 -0
  118. package/dist/core/llm/llm.module.d.ts.map +1 -1
  119. package/dist/core/llm/llm.module.js +3 -1
  120. package/dist/core/llm/llm.module.js.map +1 -1
  121. package/dist/core/llm/services/llm-call-dumper.service.d.ts +64 -0
  122. package/dist/core/llm/services/llm-call-dumper.service.d.ts.map +1 -0
  123. package/dist/core/llm/services/llm-call-dumper.service.js +204 -0
  124. package/dist/core/llm/services/llm-call-dumper.service.js.map +1 -0
  125. package/dist/core/llm/services/llm.service.d.ts +4 -1
  126. package/dist/core/llm/services/llm.service.d.ts.map +1 -1
  127. package/dist/core/llm/services/llm.service.js +304 -220
  128. package/dist/core/llm/services/llm.service.js.map +1 -1
  129. package/dist/foundations/assistant/assistant.module.d.ts.map +1 -1
  130. package/dist/foundations/assistant/assistant.module.js +3 -2
  131. package/dist/foundations/assistant/assistant.module.js.map +1 -1
  132. package/dist/foundations/assistant/entities/assistant.d.ts +15 -16
  133. package/dist/foundations/assistant/entities/assistant.d.ts.map +1 -1
  134. package/dist/foundations/assistant/entities/assistant.js +21 -9
  135. package/dist/foundations/assistant/entities/assistant.js.map +1 -1
  136. package/dist/foundations/assistant/repositories/assistant.repository.d.ts +13 -0
  137. package/dist/foundations/assistant/repositories/assistant.repository.d.ts.map +1 -1
  138. package/dist/foundations/assistant/services/assistant.service.d.ts +35 -10
  139. package/dist/foundations/assistant/services/assistant.service.d.ts.map +1 -1
  140. package/dist/foundations/assistant/services/assistant.service.js +132 -17
  141. package/dist/foundations/assistant/services/assistant.service.js.map +1 -1
  142. package/dist/foundations/assistant-message/entities/assistant-message.d.ts +30 -10
  143. package/dist/foundations/assistant-message/entities/assistant-message.d.ts.map +1 -1
  144. package/dist/foundations/assistant-message/entities/assistant-message.js +19 -4
  145. package/dist/foundations/assistant-message/entities/assistant-message.js.map +1 -1
  146. package/dist/foundations/assistant-message/repositories/assistant-message.repository.d.ts +53 -4
  147. package/dist/foundations/assistant-message/repositories/assistant-message.repository.d.ts.map +1 -1
  148. package/dist/foundations/assistant-message/repositories/assistant-message.repository.js +43 -3
  149. package/dist/foundations/assistant-message/repositories/assistant-message.repository.js.map +1 -1
  150. package/dist/foundations/assistant-message/services/assistant-message.service.d.ts +26 -0
  151. package/dist/foundations/assistant-message/services/assistant-message.service.d.ts.map +1 -1
  152. package/dist/foundations/chunk/chunk.module.d.ts.map +1 -1
  153. package/dist/foundations/chunk/chunk.module.js +4 -5
  154. package/dist/foundations/chunk/chunk.module.js.map +1 -1
  155. package/dist/foundations/chunk/entities/chunk.entity.d.ts +19 -4
  156. package/dist/foundations/chunk/entities/chunk.entity.d.ts.map +1 -1
  157. package/dist/foundations/chunk/entities/chunk.entity.js +48 -0
  158. package/dist/foundations/chunk/entities/chunk.entity.js.map +1 -1
  159. package/dist/foundations/chunk/index.d.ts +1 -2
  160. package/dist/foundations/chunk/index.d.ts.map +1 -1
  161. package/dist/foundations/chunk/index.js +3 -3
  162. package/dist/foundations/chunk/index.js.map +1 -1
  163. package/dist/foundations/chunk/repositories/chunk.repository.d.ts.map +1 -1
  164. package/dist/foundations/chunk/repositories/chunk.repository.js +8 -8
  165. package/dist/foundations/chunk/repositories/chunk.repository.js.map +1 -1
  166. package/dist/foundations/chunk/services/chunk.service.d.ts.map +1 -1
  167. package/dist/foundations/chunk/services/chunk.service.js +2 -2
  168. package/dist/foundations/chunk/services/chunk.service.js.map +1 -1
  169. package/package.json +1 -1
  170. package/dist/agents/chatbot/chatbot.module.d.ts +0 -3
  171. package/dist/agents/chatbot/chatbot.module.d.ts.map +0 -1
  172. package/dist/agents/chatbot/chatbot.module.js.map +0 -1
  173. package/dist/agents/chatbot/interfaces/chatbot.response.interface.d.ts +0 -25
  174. package/dist/agents/chatbot/interfaces/chatbot.response.interface.d.ts.map +0 -1
  175. package/dist/agents/chatbot/interfaces/chatbot.response.interface.js.map +0 -1
  176. package/dist/agents/chatbot/interfaces/graph.catalog.interface.d.ts.map +0 -1
  177. package/dist/agents/chatbot/interfaces/graph.catalog.interface.js.map +0 -1
  178. package/dist/agents/chatbot/prompts/chatbot.system.prompt.d.ts +0 -3
  179. package/dist/agents/chatbot/prompts/chatbot.system.prompt.d.ts.map +0 -1
  180. package/dist/agents/chatbot/prompts/chatbot.system.prompt.js +0 -60
  181. package/dist/agents/chatbot/prompts/chatbot.system.prompt.js.map +0 -1
  182. package/dist/agents/chatbot/repositories/user-modules.repository.d.ts.map +0 -1
  183. package/dist/agents/chatbot/repositories/user-modules.repository.js.map +0 -1
  184. package/dist/agents/chatbot/services/chatbot.index.manager.d.ts.map +0 -1
  185. package/dist/agents/chatbot/services/chatbot.index.manager.js.map +0 -1
  186. package/dist/agents/chatbot/services/chatbot.search.service.d.ts +0 -46
  187. package/dist/agents/chatbot/services/chatbot.search.service.d.ts.map +0 -1
  188. package/dist/agents/chatbot/services/chatbot.search.service.js +0 -148
  189. package/dist/agents/chatbot/services/chatbot.search.service.js.map +0 -1
  190. package/dist/agents/chatbot/services/chatbot.service.d.ts +0 -36
  191. package/dist/agents/chatbot/services/chatbot.service.d.ts.map +0 -1
  192. package/dist/agents/chatbot/services/chatbot.service.js +0 -220
  193. package/dist/agents/chatbot/services/chatbot.service.js.map +0 -1
  194. package/dist/agents/chatbot/services/descriptor.source.d.ts.map +0 -1
  195. package/dist/agents/chatbot/services/descriptor.source.js.map +0 -1
  196. package/dist/agents/chatbot/services/field-formatting.d.ts.map +0 -1
  197. package/dist/agents/chatbot/services/field-formatting.js.map +0 -1
  198. package/dist/agents/chatbot/services/graph.catalog.service.d.ts.map +0 -1
  199. package/dist/agents/chatbot/services/graph.catalog.service.js.map +0 -1
  200. package/dist/agents/chatbot/services/humanize-tool.d.ts.map +0 -1
  201. package/dist/agents/chatbot/services/humanize-tool.js.map +0 -1
  202. package/dist/agents/chatbot/tools/describe-entity.tool.d.ts.map +0 -1
  203. package/dist/agents/chatbot/tools/describe-entity.tool.js.map +0 -1
  204. package/dist/agents/chatbot/tools/read-entity.tool.d.ts.map +0 -1
  205. package/dist/agents/chatbot/tools/read-entity.tool.js.map +0 -1
  206. package/dist/agents/chatbot/tools/resolve-entity.tool.d.ts.map +0 -1
  207. package/dist/agents/chatbot/tools/resolve-entity.tool.js.map +0 -1
  208. package/dist/agents/chatbot/tools/search-entities.tool.d.ts.map +0 -1
  209. package/dist/agents/chatbot/tools/search-entities.tool.js.map +0 -1
  210. package/dist/agents/chatbot/tools/tool.factory.d.ts.map +0 -1
  211. package/dist/agents/chatbot/tools/tool.factory.js.map +0 -1
  212. package/dist/agents/chatbot/tools/traverse.tool.d.ts.map +0 -1
  213. package/dist/agents/chatbot/tools/traverse.tool.js.map +0 -1
  214. package/dist/foundations/chunk/entities/chunk.map.d.ts +0 -8
  215. package/dist/foundations/chunk/entities/chunk.map.d.ts.map +0 -1
  216. package/dist/foundations/chunk/entities/chunk.map.js +0 -31
  217. package/dist/foundations/chunk/entities/chunk.map.js.map +0 -1
  218. package/dist/foundations/chunk/entities/chunk.model.d.ts +0 -4
  219. package/dist/foundations/chunk/entities/chunk.model.d.ts.map +0 -1
  220. package/dist/foundations/chunk/entities/chunk.model.js +0 -13
  221. package/dist/foundations/chunk/entities/chunk.model.js.map +0 -1
  222. package/dist/foundations/chunk/serialisers/chunk.serialiser.d.ts +0 -14
  223. package/dist/foundations/chunk/serialisers/chunk.serialiser.d.ts.map +0 -1
  224. package/dist/foundations/chunk/serialisers/chunk.serialiser.js +0 -54
  225. package/dist/foundations/chunk/serialisers/chunk.serialiser.js.map +0 -1
  226. /package/dist/agents/{chatbot → graph}/interfaces/graph.catalog.interface.js +0 -0
  227. /package/dist/agents/{chatbot → graph}/repositories/user-modules.repository.d.ts +0 -0
  228. /package/dist/agents/{chatbot → graph}/repositories/user-modules.repository.js +0 -0
  229. /package/dist/agents/{chatbot → graph}/services/field-formatting.d.ts +0 -0
  230. /package/dist/agents/{chatbot → graph}/services/field-formatting.js +0 -0
  231. /package/dist/agents/{chatbot → graph}/services/humanize-tool.d.ts +0 -0
  232. /package/dist/agents/{chatbot → graph}/services/humanize-tool.js +0 -0
  233. /package/dist/agents/{chatbot → graph}/tools/describe-entity.tool.d.ts +0 -0
@@ -0,0 +1,69 @@
1
+ import { EmbedderService } from "../../../core/llm/services/embedder.service";
2
+ import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
3
+ import { CatalogEntity } from "../interfaces/graph.catalog.interface";
4
+ import { GraphIndexManager } from "./graph.index.manager";
5
+ import { GraphCatalogService } from "./graph.catalog.service";
6
+ export declare const GRAPH_EXACT_MAX_RESULTS = 10;
7
+ export declare const GRAPH_FUZZY_MAX_RESULTS = 10;
8
+ export declare const GRAPH_SEMANTIC_MAX_RESULTS = 5;
9
+ export declare const GRAPH_RESOLVE_MAX_RESULTS = 10;
10
+ export declare const GRAPH_SEMANTIC_MIN_SCORE = 0.6;
11
+ export type MatchMode = "exact" | "fuzzy" | "semantic" | "none";
12
+ export interface RunSearchParams {
13
+ entity: CatalogEntity;
14
+ text: string;
15
+ companyId: string;
16
+ limit: number;
17
+ }
18
+ export interface RankedCandidate {
19
+ type: string;
20
+ id: string;
21
+ summary: string;
22
+ score: number;
23
+ }
24
+ export interface ResolveEntityParams {
25
+ text: string;
26
+ companyId: string;
27
+ userModuleIds: string[];
28
+ }
29
+ export interface ResolveEntityResult {
30
+ matchMode: MatchMode;
31
+ items: RankedCandidate[];
32
+ /**
33
+ * When the merged candidate list satisfies a deterministic disambiguation
34
+ * rule (literal-summary match, or score-margin dominance), surface a short
35
+ * actionable hint here. The graph node prompt instructs the LLM to follow
36
+ * this when present, since LLMs apply rules in the tool result more
37
+ * reliably than rules they have to re-derive from the system prompt.
38
+ */
39
+ recommendation?: string;
40
+ }
41
+ /**
42
+ * Decide whether the merged candidate list satisfies a deterministic
43
+ * disambiguation rule worth surfacing to the LLM. Returns the recommendation
44
+ * text or `undefined` when the candidates are genuinely ambiguous.
45
+ *
46
+ * Two rules, in priority order:
47
+ * 1. Literal-summary match: items[0].summary equals the user's literal
48
+ * phrase (case-insensitive). Holds even with a smaller margin because
49
+ * the name match is unambiguous on its own.
50
+ * 2. Score-margin dominance: items[0] beats items[1] by ≥ 0.15 on
51
+ * exact/fuzzy tiers, ≥ 0.08 on semantic.
52
+ */
53
+ export declare function buildResolveRecommendation(items: RankedCandidate[], userText: string, matchMode: MatchMode): string | undefined;
54
+ export declare class GraphSearchService {
55
+ private readonly neo4j;
56
+ private readonly embedder;
57
+ private readonly indexNames;
58
+ private readonly catalog;
59
+ private readonly logger;
60
+ private existingIndexesPromise;
61
+ constructor(neo4j: Neo4jService, embedder: EmbedderService, indexNames: GraphIndexManager, catalog: GraphCatalogService);
62
+ private getExistingIndexes;
63
+ resolveEntity(params: ResolveEntityParams): Promise<ResolveEntityResult>;
64
+ private runTierForEntitySafe;
65
+ private projectSummary;
66
+ private tierFulltext;
67
+ private tierSemantic;
68
+ }
69
+ //# sourceMappingURL=graph.search.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.search.service.d.ts","sourceRoot":"","sources":["../../../../src/agents/graph/services/graph.search.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAK5C,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EAAE,EACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,GACnB,MAAM,GAAG,SAAS,CAepB;AASD,qBACa,kBAAkB;IAY3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAQ9D,OAAO,CAAC,sBAAsB,CAAqC;gBAGhD,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,mBAAmB;IAG/C,OAAO,CAAC,kBAAkB;IAmBpB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YA2BhE,oBAAoB;IAqDlC,OAAO,CAAC,cAAc;YAiBR,YAAY;YAiCZ,YAAY;CAoC3B"}
@@ -0,0 +1,230 @@
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
+ var GraphSearchService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.GraphSearchService = exports.GRAPH_SEMANTIC_MIN_SCORE = exports.GRAPH_RESOLVE_MAX_RESULTS = exports.GRAPH_SEMANTIC_MAX_RESULTS = exports.GRAPH_FUZZY_MAX_RESULTS = exports.GRAPH_EXACT_MAX_RESULTS = void 0;
14
+ exports.buildResolveRecommendation = buildResolveRecommendation;
15
+ const common_1 = require("@nestjs/common");
16
+ const embedder_service_1 = require("../../../core/llm/services/embedder.service");
17
+ const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
18
+ const graph_index_manager_1 = require("./graph.index.manager");
19
+ const graph_catalog_service_1 = require("./graph.catalog.service");
20
+ exports.GRAPH_EXACT_MAX_RESULTS = 10;
21
+ exports.GRAPH_FUZZY_MAX_RESULTS = 10;
22
+ exports.GRAPH_SEMANTIC_MAX_RESULTS = 5;
23
+ exports.GRAPH_RESOLVE_MAX_RESULTS = 10;
24
+ exports.GRAPH_SEMANTIC_MIN_SCORE = 0.6;
25
+ const GRAPH_VECTOR_OVERFETCH = 50;
26
+ const LUCENE_RESERVED_RE = /[+\-&|!(){}[\]^"~*?:\\/]/g;
27
+ /**
28
+ * Decide whether the merged candidate list satisfies a deterministic
29
+ * disambiguation rule worth surfacing to the LLM. Returns the recommendation
30
+ * text or `undefined` when the candidates are genuinely ambiguous.
31
+ *
32
+ * Two rules, in priority order:
33
+ * 1. Literal-summary match: items[0].summary equals the user's literal
34
+ * phrase (case-insensitive). Holds even with a smaller margin because
35
+ * the name match is unambiguous on its own.
36
+ * 2. Score-margin dominance: items[0] beats items[1] by ≥ 0.15 on
37
+ * exact/fuzzy tiers, ≥ 0.08 on semantic.
38
+ */
39
+ function buildResolveRecommendation(items, userText, matchMode) {
40
+ if (items.length === 0)
41
+ return undefined;
42
+ const top = items[0];
43
+ const next = items[1];
44
+ const margin = next ? top.score - next.score : Number.POSITIVE_INFINITY;
45
+ const literalMatch = top.summary.trim().toLowerCase() === userText.trim().toLowerCase();
46
+ const dominantMargin = margin >= (matchMode === "semantic" ? 0.08 : 0.15);
47
+ if (literalMatch && (items.length === 1 || dominantMargin)) {
48
+ return `Use items[0] (id=${top.id}, type=${top.type}): its summary equals the user's literal phrase and dominates by score margin. Do not ask the user to disambiguate.`;
49
+ }
50
+ if (dominantMargin) {
51
+ return `Use items[0] (id=${top.id}, type=${top.type}): it dominates the next candidate by the documented score margin (${margin.toFixed(2)}).`;
52
+ }
53
+ return undefined;
54
+ }
55
+ let GraphSearchService = GraphSearchService_1 = class GraphSearchService {
56
+ constructor(neo4j, embedder, indexNames, catalog) {
57
+ this.neo4j = neo4j;
58
+ this.embedder = embedder;
59
+ this.indexNames = indexNames;
60
+ this.catalog = catalog;
61
+ this.logger = new common_1.Logger(GraphSearchService_1.name);
62
+ // Cached at first use, holds the names of fulltext + vector indexes that
63
+ // actually exist in Neo4j. Pre-checking this set lets us skip the
64
+ // `db.index.fulltext.queryNodes` call entirely for indexes the bootstrap
65
+ // didn't create (silencing the ERROR + WARN spam at source). Stored as a
66
+ // promise to deduplicate concurrent first-time lookups (resolveEntity fans
67
+ // out tier queries via Promise.all).
68
+ this.existingIndexesPromise = null;
69
+ }
70
+ getExistingIndexes() {
71
+ if (this.existingIndexesPromise)
72
+ return this.existingIndexesPromise;
73
+ this.existingIndexesPromise = (async () => {
74
+ try {
75
+ const result = await this.neo4j.read(`SHOW INDEXES YIELD name, type WHERE type IN ["FULLTEXT", "VECTOR"] RETURN name`);
76
+ return new Set((result.records ?? []).map((r) => r.get("name")));
77
+ }
78
+ catch {
79
+ // If SHOW INDEXES itself fails (older Neo4j, permissions, mocked tests
80
+ // that don't expect it), return an empty set. Downstream gating uses
81
+ // `size > 0 && !has(name)` so an empty set means "do not gate" — the
82
+ // tier query proceeds and any error is handled by runTierForEntitySafe.
83
+ return new Set();
84
+ }
85
+ })();
86
+ return this.existingIndexesPromise;
87
+ }
88
+ async resolveEntity(params) {
89
+ const entities = this.catalog.getAllChatEnabledEntities().filter((e) => params.userModuleIds.includes(e.moduleId));
90
+ if (!entities.length) {
91
+ return { matchMode: "none", items: [] };
92
+ }
93
+ const tiers = [
94
+ ["substring", "exact"],
95
+ ["fuzzy", "fuzzy"],
96
+ ["semantic", "semantic"],
97
+ ];
98
+ for (const [tier, label] of tiers) {
99
+ const buckets = await Promise.all(entities.map((e) => this.runTierForEntitySafe(e, params, tier)));
100
+ const merged = buckets.flat();
101
+ if (merged.length) {
102
+ merged.sort((a, b) => b.score - a.score);
103
+ const items = merged.slice(0, exports.GRAPH_RESOLVE_MAX_RESULTS);
104
+ const recommendation = buildResolveRecommendation(items, params.text, label);
105
+ return recommendation ? { matchMode: label, items, recommendation } : { matchMode: label, items };
106
+ }
107
+ }
108
+ return { matchMode: "none", items: [] };
109
+ }
110
+ async runTierForEntitySafe(entity, params, tier) {
111
+ try {
112
+ const runParams = {
113
+ entity,
114
+ text: params.text,
115
+ companyId: params.companyId,
116
+ limit: tier === "semantic"
117
+ ? exports.GRAPH_SEMANTIC_MAX_RESULTS
118
+ : tier === "fuzzy"
119
+ ? exports.GRAPH_FUZZY_MAX_RESULTS
120
+ : exports.GRAPH_EXACT_MAX_RESULTS,
121
+ };
122
+ const inner = tier === "semantic" ? await this.tierSemantic(runParams) : await this.tierFulltext(runParams, tier);
123
+ // Per-tier diagnostic so a future dump can distinguish "fulltext index
124
+ // missing" from "lucene parse failure" from "genuine zero hits". Today
125
+ // these were silently merged into a single matchMode=none response.
126
+ const indexName = tier === "semantic"
127
+ ? this.indexNames.vectorIndexName(entity.labelName)
128
+ : this.indexNames.fulltextIndexName(entity.labelName);
129
+ const existing = await this.getExistingIndexes();
130
+ const indexExists = existing.size === 0 || existing.has(indexName);
131
+ this.logger.debug(`resolve_entity tier=${tier} type=${entity.type} indexExists=${indexExists} items=${inner.items.length}`);
132
+ return inner.items.map((i) => ({
133
+ type: entity.type,
134
+ id: i.id,
135
+ summary: this.projectSummary(entity, i.properties, i.id),
136
+ score: i.score,
137
+ }));
138
+ }
139
+ catch (err) {
140
+ const message = err instanceof Error ? err.message : String(err);
141
+ // Missing fulltext / vector index for an entity type the manager bootstrap
142
+ // didn't create one for: silently skip this tier for this type. The whole
143
+ // Neo4j stack trace was being printed at ERROR level for every resolve_entity
144
+ // call — pure noise. Real failures (other Neo4j errors, network, etc.) still
145
+ // log at WARN as before.
146
+ if (/There is no such fulltext schema index|There is no such vector schema index/i.test(message)) {
147
+ return [];
148
+ }
149
+ this.logger.warn(`resolveEntity: tier=${tier} type=${entity.type} threw: ${message}`);
150
+ return [];
151
+ }
152
+ }
153
+ projectSummary(entity, properties, id) {
154
+ if (entity.summary) {
155
+ try {
156
+ return entity.summary(properties);
157
+ }
158
+ catch {
159
+ /* fall through */
160
+ }
161
+ }
162
+ const name = properties.name;
163
+ if (typeof name === "string" && name.length)
164
+ return name;
165
+ return id;
166
+ }
167
+ async tierFulltext(params, mode) {
168
+ const indexName = this.indexNames.fulltextIndexName(params.entity.labelName);
169
+ const existing = await this.getExistingIndexes();
170
+ if (existing.size > 0 && !existing.has(indexName)) {
171
+ return { matchMode: mode === "substring" ? "exact" : "fuzzy", items: [] };
172
+ }
173
+ const escaped = params.text.replace(LUCENE_RESERVED_RE, "\\$&").toLowerCase();
174
+ const term = mode === "substring" ? `*${escaped}*` : `${escaped}~`;
175
+ const max = mode === "substring" ? exports.GRAPH_EXACT_MAX_RESULTS : exports.GRAPH_FUZZY_MAX_RESULTS;
176
+ const result = await this.neo4j.read(`
177
+ CALL db.index.fulltext.queryNodes($indexName, $term)
178
+ YIELD node, score
179
+ WHERE (node)-[:BELONGS_TO]->(:Company { id: $companyId })
180
+ RETURN node.id AS id, properties(node) AS properties, score
181
+ ORDER BY score DESC
182
+ LIMIT toInteger($limit)
183
+ `, { indexName, term, companyId: params.companyId, limit: Math.min(params.limit, max) });
184
+ const items = result.records.map((r) => ({
185
+ id: r.get("id"),
186
+ score: r.get("score"),
187
+ properties: r.get("properties") ?? {},
188
+ }));
189
+ return { matchMode: mode === "substring" ? "exact" : "fuzzy", items };
190
+ }
191
+ async tierSemantic(params) {
192
+ const indexName = this.indexNames.vectorIndexName(params.entity.labelName);
193
+ const existing = await this.getExistingIndexes();
194
+ if (existing.size > 0 && !existing.has(indexName)) {
195
+ return { matchMode: "semantic", items: [] };
196
+ }
197
+ const queryEmbedding = await this.embedder.vectoriseText({ text: params.text });
198
+ const result = await this.neo4j.read(`
199
+ CALL db.index.vector.queryNodes($indexName, toInteger($overFetch), $queryEmbedding)
200
+ YIELD node, score
201
+ WHERE (node)-[:BELONGS_TO]->(:Company { id: $companyId })
202
+ AND score >= $minScore
203
+ RETURN node.id AS id, properties(node) AS properties, score
204
+ ORDER BY score DESC
205
+ LIMIT toInteger($limit)
206
+ `, {
207
+ indexName,
208
+ overFetch: GRAPH_VECTOR_OVERFETCH,
209
+ queryEmbedding,
210
+ companyId: params.companyId,
211
+ minScore: exports.GRAPH_SEMANTIC_MIN_SCORE,
212
+ limit: Math.min(params.limit, exports.GRAPH_SEMANTIC_MAX_RESULTS),
213
+ });
214
+ const items = result.records.map((r) => ({
215
+ id: r.get("id"),
216
+ score: r.get("score"),
217
+ properties: r.get("properties") ?? {},
218
+ }));
219
+ return { matchMode: items.length ? "semantic" : "none", items };
220
+ }
221
+ };
222
+ exports.GraphSearchService = GraphSearchService;
223
+ exports.GraphSearchService = GraphSearchService = GraphSearchService_1 = __decorate([
224
+ (0, common_1.Injectable)(),
225
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService,
226
+ embedder_service_1.EmbedderService,
227
+ graph_index_manager_1.GraphIndexManager,
228
+ graph_catalog_service_1.GraphCatalogService])
229
+ ], GraphSearchService);
230
+ //# sourceMappingURL=graph.search.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.search.service.js","sourceRoot":"","sources":["../../../../src/agents/graph/services/graph.search.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanize-tool.d.ts","sourceRoot":"","sources":["../../../../src/agents/graph/services/humanize-tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAuBjF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanize-tool.js","sourceRoot":"","sources":["../../../../src/agents/graph/services/humanize-tool.ts"],"names":[],"mappings":";;AAOA,oCAuBC;AA9BD;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,KAA8B;IACvE,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,cAAc,IAAI,GAAG,CAAC;QAC/B,CAAC;QACD,KAAK,iBAAiB;YACpB,OAAO,cAAc,IAAI,SAAS,CAAC;QACrC,KAAK,iBAAiB;YACpB,OAAO,aAAa,IAAI,EAAE,CAAC;QAC7B,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,WAAW,IAAI,MAAM,EAAE,EAAE,CAAC;QACnC,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,cAAc,IAAI,MAAM,GAAG,EAAE,CAAC;QACvC,CAAC;QACD;YACE,OAAO,WAAW,IAAI,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { CatalogEntity } from "../interfaces/graph.catalog.interface";
2
+ import { GraphCatalogService } from "./graph.catalog.service";
3
+ import { EntityServiceRegistry } from "../../../common/registries/entity.service.registry";
4
+ import { UserContext } from "../tools/tool.factory";
5
+ /** Hard cap per cardinality-many materialised relationship. */
6
+ export declare const MATERIALISE_LIMIT = 50;
7
+ export interface BridgeRecordIn {
8
+ id: string;
9
+ /** Already type-converted target-node fields, as returned by buildToolFieldsOutput. */
10
+ fields: Record<string, unknown>;
11
+ }
12
+ export interface BridgeRecordOut {
13
+ id: string;
14
+ type: string;
15
+ summary: string;
16
+ fields: Record<string, unknown>;
17
+ __materialised: string[];
18
+ __truncated?: Record<string, {
19
+ returned: number;
20
+ hasMore: true;
21
+ }>;
22
+ [key: string]: unknown;
23
+ }
24
+ export interface MaterialiseBridgeDeps {
25
+ catalog: GraphCatalogService;
26
+ registry: EntityServiceRegistry;
27
+ }
28
+ export declare function materialiseBridge(params: {
29
+ bridge: CatalogEntity;
30
+ record: BridgeRecordIn;
31
+ ctx: UserContext;
32
+ deps: MaterialiseBridgeDeps;
33
+ /** Counter used by the responder to populate trace.materialisedBridges. Optional. */
34
+ onMaterialised?: (relName: string, count: number) => void;
35
+ }): Promise<BridgeRecordOut>;
36
+ //# sourceMappingURL=materialise-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialise-bridge.d.ts","sourceRoot":"","sources":["../../../../src/agents/graph/services/materialise-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKpD,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IAElE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,qFAAqF;IACrF,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3D,GAAG,OAAO,CAAC,eAAe,CAAC,CAsE3B"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MATERIALISE_LIMIT = void 0;
4
+ exports.materialiseBridge = materialiseBridge;
5
+ const common_1 = require("@nestjs/common");
6
+ const field_formatting_1 = require("./field-formatting");
7
+ const logger = new common_1.Logger("materialiseBridge");
8
+ /** Hard cap per cardinality-many materialised relationship. */
9
+ exports.MATERIALISE_LIMIT = 50;
10
+ async function materialiseBridge(params) {
11
+ const { bridge, record, ctx, deps } = params;
12
+ if (!bridge.bridge) {
13
+ throw new Error(`materialiseBridge called on non-bridge entity "${bridge.type}".`);
14
+ }
15
+ const summary = bridge.summary ? bridge.summary({ id: record.id, ...record.fields }) : record.id;
16
+ const out = {
17
+ id: record.id,
18
+ type: bridge.type,
19
+ summary: String(summary),
20
+ fields: record.fields,
21
+ __materialised: [],
22
+ };
23
+ for (const relName of bridge.bridge.materialiseTo) {
24
+ const rel = bridge.relationships.find((r) => r.name === relName);
25
+ if (!rel) {
26
+ // Should be impossible — defineEntity / catalog buildCatalog enforce this — but
27
+ // be defensive at runtime so a stale catalog doesn't crash a tool call.
28
+ logger.warn(`materialiseBridge: relationship "${relName}" not found on ${bridge.type}; skipping.`);
29
+ continue;
30
+ }
31
+ // Module-gated drop: target type the user can't access disappears from the response.
32
+ const target = deps.catalog.getEntityDetail(rel.targetType, ctx.userModuleIds);
33
+ if (!target) {
34
+ logger.debug(`materialiseBridge: target type ${rel.targetType} not accessible to user; dropping ${bridge.type}.${relName}`);
35
+ continue;
36
+ }
37
+ const targetSvc = deps.registry.get(target.type);
38
+ if (!targetSvc) {
39
+ logger.warn(`materialiseBridge: no service registered for ${target.type}; dropping ${bridge.type}.${relName}`);
40
+ continue;
41
+ }
42
+ const targetDirection = rel.cypherDirection === "out" ? "in" : "out";
43
+ const records = await targetSvc.findRelatedRecordsByEdge({
44
+ cypherLabel: rel.cypherLabel,
45
+ cypherDirection: targetDirection,
46
+ relatedLabel: bridge.labelName,
47
+ relatedId: record.id,
48
+ limit: exports.MATERIALISE_LIMIT + 1, // overfetch by one to detect truncation cheaply
49
+ });
50
+ const truncated = records.length > exports.MATERIALISE_LIMIT;
51
+ const visible = records.slice(0, exports.MATERIALISE_LIMIT);
52
+ const summariser = target.summary ?? ((d) => String(d.name ?? d.id));
53
+ const materialised = visible.map((r) => ({
54
+ id: r.id,
55
+ type: target.type,
56
+ summary: String(summariser(r)),
57
+ fields: (0, field_formatting_1.buildToolFieldsOutput)(target.fields, r),
58
+ }));
59
+ out[relName] = rel.cardinality === "one" ? (materialised[0] ?? null) : materialised;
60
+ out.__materialised.push(relName);
61
+ if (truncated) {
62
+ out.__truncated = out.__truncated ?? {};
63
+ out.__truncated[relName] = { returned: exports.MATERIALISE_LIMIT, hasMore: true };
64
+ }
65
+ params.onMaterialised?.(relName, materialised.length);
66
+ }
67
+ return out;
68
+ }
69
+ //# sourceMappingURL=materialise-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialise-bridge.js","sourceRoot":"","sources":["../../../../src/agents/graph/services/materialise-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-entity.tool.d.ts","sourceRoot":"","sources":["../../../../src/agents/graph/tools/describe-entity.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE1E,QAAA,MAAM,WAAW;;iBAEf,CAAC;AAEH,qBACa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW;IAEjD,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,qBAAqB;IASpE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA6BjH"}
@@ -51,6 +51,7 @@ let DescribeEntityTool = class DescribeEntityTool {
51
51
  cardinality: r.cardinality,
52
52
  description: r.description,
53
53
  })),
54
+ ...(entity.bridge ? { bridge: { materialiseTo: [...entity.bridge.materialiseTo] } } : {}),
54
55
  };
55
56
  }, recorder);
56
57
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-entity.tool.js","sourceRoot":"","sources":["../../../../src/agents/graph/tools/describe-entity.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,iDAA8D;AAC9D,6BAAwB;AACxB,iDAA0E;AAE1E,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CAClE,CAAC,CAAC;AAGI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,YAA6B,OAAoB;QAApB,YAAO,GAAP,OAAO,CAAa;IAAG,CAAC;IAErD,KAAK,CAAC,GAAgB,EAAE,QAA0B;QAChD,OAAO,IAAI,6BAAqB,CAAC;YAC/B,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,oEAAoE;YACjF,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkC,EAAE,GAAgB,EAAE,QAA0B;QAC3F,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CACzB,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAClC,KAAK,IAAI,EAAE;YACT,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,OAAO,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YACrC,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpC,CAAC,CAAC;gBACH,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9C,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC3B,CAAC,CAAC;gBACH,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1F,CAAC;QACJ,CAAC,EACD,QAAQ,CACT,CAAC;IACJ,CAAC;CACF,CAAA;AAzCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAE2B,0BAAW;GADtC,kBAAkB,CAyC9B"}
@@ -1,6 +1,8 @@
1
1
  import { DynamicStructuredTool } from "@langchain/core/tools";
2
2
  import { z } from "zod";
3
3
  import { ToolFactory, ToolCallRecord, UserContext } from "./tool.factory";
4
+ import { GraphCatalogService } from "../services/graph.catalog.service";
5
+ import { EntityServiceRegistry } from "../../../common/registries/entity.service.registry";
4
6
  declare const inputSchema: z.ZodObject<{
5
7
  type: z.ZodString;
6
8
  id: z.ZodString;
@@ -8,7 +10,9 @@ declare const inputSchema: z.ZodObject<{
8
10
  }, z.core.$strip>;
9
11
  export declare class ReadEntityTool {
10
12
  private readonly factory;
11
- constructor(factory: ToolFactory);
13
+ private readonly catalog;
14
+ private readonly registry;
15
+ constructor(factory: ToolFactory, catalog: GraphCatalogService, registry: EntityServiceRegistry);
12
16
  build(ctx: UserContext, recorder: ToolCallRecord[]): DynamicStructuredTool;
13
17
  invoke(input: z.infer<typeof inputSchema>, ctx: UserContext, recorder: ToolCallRecord[]): Promise<unknown>;
14
18
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-entity.tool.d.ts","sourceRoot":"","sources":["../../../../src/agents/graph/tools/read-entity.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAE3F,QAAA,MAAM,WAAW;;;;iBAIf,CAAC;AAEH,qBACa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFR,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,qBAAqB;IAGlD,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,qBAAqB;IASpE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA+FjH"}
@@ -15,14 +15,19 @@ const tools_1 = require("@langchain/core/tools");
15
15
  const zod_1 = require("zod");
16
16
  const tool_factory_1 = require("./tool.factory");
17
17
  const field_formatting_1 = require("../services/field-formatting");
18
+ const materialise_bridge_1 = require("../services/materialise-bridge");
19
+ const graph_catalog_service_1 = require("../services/graph.catalog.service");
20
+ const entity_service_registry_1 = require("../../../common/registries/entity.service.registry");
18
21
  const inputSchema = zod_1.z.object({
19
22
  type: zod_1.z.string(),
20
23
  id: zod_1.z.string(),
21
24
  include: zod_1.z.array(zod_1.z.string()).optional().describe("Relationship names to pull one-hop related records."),
22
25
  });
23
26
  let ReadEntityTool = class ReadEntityTool {
24
- constructor(factory) {
27
+ constructor(factory, catalog, registry) {
25
28
  this.factory = factory;
29
+ this.catalog = catalog;
30
+ this.registry = registry;
26
31
  }
27
32
  build(ctx, recorder) {
28
33
  return new tools_1.DynamicStructuredTool({
@@ -33,16 +38,18 @@ let ReadEntityTool = class ReadEntityTool {
33
38
  });
34
39
  }
35
40
  async invoke(input, ctx, recorder) {
36
- return this.factory.capture({ tool: "read_entity", input }, async () => {
41
+ const localMaterialised = [];
42
+ const result = await this.factory.capture({ tool: "read_entity", input }, async () => {
37
43
  const described = recorder.some((c) => c.tool === "describe_entity" && c.input.type === input.type);
44
+ const entity = this.factory.resolveEntity(input.type, ctx);
45
+ if ("error" in entity)
46
+ return entity;
38
47
  if (!described) {
39
48
  return {
40
- error: `You must call describe_entity({ type: "${input.type}" }) before reading a ${input.type} record. The describe call returns the exact field names and relationships available needed to interpret the response and construct any include argument.`,
49
+ error: `You must call describe_entity({ type: "${input.type}" }) before reading a ${input.type} record. The schema is included below — either call describe_entity({ type: "${input.type}" }) to record the contract and retry this read, or proceed using the listed fields and relationships. Never stop on this error.`,
50
+ schema: { fields: entity.fields, relationships: entity.relationships },
41
51
  };
42
52
  }
43
- const entity = this.factory.resolveEntity(input.type, ctx);
44
- if ("error" in entity)
45
- return entity;
46
53
  const validRels = new Set(entity.relationships.map((r) => r.name));
47
54
  for (const name of input.include ?? []) {
48
55
  if (!validRels.has(name)) {
@@ -85,18 +92,40 @@ let ReadEntityTool = class ReadEntityTool {
85
92
  }));
86
93
  }
87
94
  }
95
+ const baseFields = (0, field_formatting_1.buildToolFieldsOutput)(entity.fields, record);
96
+ // Bridge fanout: if this entity is a bridge, replace the bare payload with
97
+ // the materialised one. The existing `include` block (if any) stacks on top
98
+ // as a sibling `related` map — it carries summary refs, while the bridge
99
+ // fanout fills full records at the top level. They do not collide.
100
+ if (entity.bridge) {
101
+ const materialised = await (0, materialise_bridge_1.materialiseBridge)({
102
+ bridge: entity,
103
+ record: { id: record.id, fields: baseFields },
104
+ ctx,
105
+ deps: { catalog: this.catalog, registry: this.registry },
106
+ onMaterialised: (relName, count) => localMaterialised.push({ relName, count }),
107
+ });
108
+ return input.include?.length ? { ...materialised, related } : materialised;
109
+ }
88
110
  return {
89
111
  id: record.id,
90
112
  type: entity.type,
91
- fields: (0, field_formatting_1.buildToolFieldsOutput)(entity.fields, record),
113
+ fields: baseFields,
92
114
  ...(input.include?.length ? { related } : {}),
93
115
  };
94
116
  }, recorder);
117
+ // Attach materialised summary to the recorder entry that capture() just pushed.
118
+ if (localMaterialised.length && recorder.length) {
119
+ recorder[recorder.length - 1].materialised = localMaterialised;
120
+ }
121
+ return result;
95
122
  }
96
123
  };
97
124
  exports.ReadEntityTool = ReadEntityTool;
98
125
  exports.ReadEntityTool = ReadEntityTool = __decorate([
99
126
  (0, common_1.Injectable)(),
100
- __metadata("design:paramtypes", [tool_factory_1.ToolFactory])
127
+ __metadata("design:paramtypes", [tool_factory_1.ToolFactory,
128
+ graph_catalog_service_1.GraphCatalogService,
129
+ entity_service_registry_1.EntityServiceRegistry])
101
130
  ], ReadEntityTool);
102
131
  //# sourceMappingURL=read-entity.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-entity.tool.js","sourceRoot":"","sources":["../../../../src/agents/graph/tools/read-entity.tool.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { DynamicStructuredTool } from "@langchain/core/tools";
2
2
  import { z } from "zod";
3
3
  import { ToolFactory, ToolCallRecord, UserContext } from "./tool.factory";
4
- import { ChatbotSearchService } from "../services/chatbot.search.service";
4
+ import { GraphSearchService } from "../services/graph.search.service";
5
5
  declare const inputSchema: z.ZodObject<{
6
6
  text: z.ZodString;
7
7
  }, z.core.$strip>;
8
8
  export declare class ResolveEntityTool {
9
9
  private readonly factory;
10
10
  private readonly search;
11
- constructor(factory: ToolFactory, search: ChatbotSearchService);
11
+ constructor(factory: ToolFactory, search: GraphSearchService);
12
12
  build(ctx: UserContext, recorder: ToolCallRecord[]): DynamicStructuredTool;
13
13
  invoke(input: z.infer<typeof inputSchema>, ctx: UserContext, recorder: ToolCallRecord[]): Promise<unknown>;
14
14
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-entity.tool.d.ts","sourceRoot":"","sources":["../../../../src/agents/graph/tools/resolve-entity.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,QAAA,MAAM,WAAW;;iBAEf,CAAC;AAEH,qBACa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,kBAAkB;IAG7C,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,qBAAqB;IAUpE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAYjH"}