@lucern/graph-primitives 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +29 -0
  2. package/dist/beliefDecay-Q_26RTc-.d.ts +72 -0
  3. package/dist/beliefDecay.d.ts +2 -0
  4. package/dist/beliefDecay.js +1628 -0
  5. package/dist/beliefDecay.js.map +1 -0
  6. package/dist/beliefEvidenceLinks-42FlR48t.d.ts +77 -0
  7. package/dist/beliefEvidenceLinks.d.ts +1 -0
  8. package/dist/beliefEvidenceLinks.js +1978 -0
  9. package/dist/beliefEvidenceLinks.js.map +1 -0
  10. package/dist/beliefLifecycle-C-AehZgF.d.ts +43 -0
  11. package/dist/beliefLifecycle.d.ts +1 -0
  12. package/dist/beliefLifecycle.js +98 -0
  13. package/dist/beliefLifecycle.js.map +1 -0
  14. package/dist/confidencePropagationDispatch.d.ts +46 -0
  15. package/dist/confidencePropagationDispatch.js +744 -0
  16. package/dist/confidencePropagationDispatch.js.map +1 -0
  17. package/dist/contradictions-Hdwl7zid.d.ts +71 -0
  18. package/dist/contradictions.d.ts +1 -0
  19. package/dist/contradictions.js +1557 -0
  20. package/dist/contradictions.js.map +1 -0
  21. package/dist/convex.d.ts +23 -0
  22. package/dist/convex.js +17 -0
  23. package/dist/convex.js.map +1 -0
  24. package/dist/edgeValidation-CeI0wc0r.d.ts +35 -0
  25. package/dist/edgeValidation.d.ts +2 -0
  26. package/dist/edgeValidation.js +307 -0
  27. package/dist/edgeValidation.js.map +1 -0
  28. package/dist/edges/contains.d.ts +6 -0
  29. package/dist/edges/contains.js +14 -0
  30. package/dist/edges/contains.js.map +1 -0
  31. package/dist/edges/contradicts.d.ts +6 -0
  32. package/dist/edges/contradicts.js +183 -0
  33. package/dist/edges/contradicts.js.map +1 -0
  34. package/dist/edges/dependsOn.d.ts +6 -0
  35. package/dist/edges/dependsOn.js +240 -0
  36. package/dist/edges/dependsOn.js.map +1 -0
  37. package/dist/edges/derivedFrom.d.ts +6 -0
  38. package/dist/edges/derivedFrom.js +14 -0
  39. package/dist/edges/derivedFrom.js.map +1 -0
  40. package/dist/edges/elaborates.d.ts +6 -0
  41. package/dist/edges/elaborates.js +100 -0
  42. package/dist/edges/elaborates.js.map +1 -0
  43. package/dist/edges/index.d.ts +3 -0
  44. package/dist/edges/index.js +556 -0
  45. package/dist/edges/index.js.map +1 -0
  46. package/dist/edges/informs.d.ts +6 -0
  47. package/dist/edges/informs.js +112 -0
  48. package/dist/edges/informs.js.map +1 -0
  49. package/dist/edges/propagationTypes.d.ts +39 -0
  50. package/dist/edges/propagationTypes.js +17 -0
  51. package/dist/edges/propagationTypes.js.map +1 -0
  52. package/dist/edges/refutes.d.ts +6 -0
  53. package/dist/edges/refutes.js +108 -0
  54. package/dist/edges/refutes.js.map +1 -0
  55. package/dist/edges/supports.d.ts +6 -0
  56. package/dist/edges/supports.js +193 -0
  57. package/dist/edges/supports.js.map +1 -0
  58. package/dist/edges/tests.d.ts +6 -0
  59. package/dist/edges/tests.js +14 -0
  60. package/dist/edges/tests.js.map +1 -0
  61. package/dist/edges/utils.d.ts +12 -0
  62. package/dist/edges/utils.js +188 -0
  63. package/dist/edges/utils.js.map +1 -0
  64. package/dist/embeddingTrigger.d.ts +24 -0
  65. package/dist/embeddingTrigger.js +24 -0
  66. package/dist/embeddingTrigger.js.map +1 -0
  67. package/dist/entityBridge-DMaKooYn.d.ts +59 -0
  68. package/dist/entityBridge.d.ts +1 -0
  69. package/dist/entityBridge.js +663 -0
  70. package/dist/entityBridge.js.map +1 -0
  71. package/dist/entityLifecycle-BkhRJ-XI.d.ts +69 -0
  72. package/dist/entityLifecycle.d.ts +1 -0
  73. package/dist/entityLifecycle.js +2083 -0
  74. package/dist/entityLifecycle.js.map +1 -0
  75. package/dist/entityValidation-KLZ_Xl2D.d.ts +50 -0
  76. package/dist/entityValidation.d.ts +3 -0
  77. package/dist/entityValidation.js +71 -0
  78. package/dist/entityValidation.js.map +1 -0
  79. package/dist/epistemicAnswers-DSP1slZ9.d.ts +67 -0
  80. package/dist/epistemicAnswers.d.ts +1 -0
  81. package/dist/epistemicAnswers.js +1650 -0
  82. package/dist/epistemicAnswers.js.map +1 -0
  83. package/dist/epistemicBeliefs-DtFVTp-k.d.ts +377 -0
  84. package/dist/epistemicBeliefs.d.ts +5 -0
  85. package/dist/epistemicBeliefs.js +6386 -0
  86. package/dist/epistemicBeliefs.js.map +1 -0
  87. package/dist/epistemicContractHelpers.d.ts +1 -0
  88. package/dist/epistemicContractHelpers.js +320 -0
  89. package/dist/epistemicContractHelpers.js.map +1 -0
  90. package/dist/epistemicContracts.d.ts +77 -0
  91. package/dist/epistemicContracts.js +8436 -0
  92. package/dist/epistemicContracts.js.map +1 -0
  93. package/dist/epistemicEdges-DcA8ErUG.d.ts +191 -0
  94. package/dist/epistemicEdges.d.ts +2 -0
  95. package/dist/epistemicEdges.js +2749 -0
  96. package/dist/epistemicEdges.js.map +1 -0
  97. package/dist/epistemicEvidence-Bo638XDP.d.ts +128 -0
  98. package/dist/epistemicEvidence.d.ts +3 -0
  99. package/dist/epistemicEvidence.js +3282 -0
  100. package/dist/epistemicEvidence.js.map +1 -0
  101. package/dist/epistemicHelpers-Bd9xbaib.d.ts +329 -0
  102. package/dist/epistemicHelpers.d.ts +4 -0
  103. package/dist/epistemicHelpers.js +999 -0
  104. package/dist/epistemicHelpers.js.map +1 -0
  105. package/dist/epistemicLinking-CyeLOIzN.d.ts +35 -0
  106. package/dist/epistemicLinking.d.ts +1 -0
  107. package/dist/epistemicLinking.js +1391 -0
  108. package/dist/epistemicLinking.js.map +1 -0
  109. package/dist/epistemicNodes-BpD6Koud.d.ts +167 -0
  110. package/dist/epistemicNodes.d.ts +2 -0
  111. package/dist/epistemicNodes.js +2942 -0
  112. package/dist/epistemicNodes.js.map +1 -0
  113. package/dist/epistemicQuestions-CmEeY6zQ.d.ts +214 -0
  114. package/dist/epistemicQuestions.d.ts +3 -0
  115. package/dist/epistemicQuestions.js +4993 -0
  116. package/dist/epistemicQuestions.js.map +1 -0
  117. package/dist/epistemicSources-ZazxHOK1.d.ts +25 -0
  118. package/dist/epistemicSources.d.ts +1 -0
  119. package/dist/epistemicSources.js +2025 -0
  120. package/dist/epistemicSources.js.map +1 -0
  121. package/dist/evaluators/index.d.ts +9 -0
  122. package/dist/evaluators/index.js +8440 -0
  123. package/dist/evaluators/index.js.map +1 -0
  124. package/dist/evaluators/lintCheckerEvaluator.d.ts +11 -0
  125. package/dist/evaluators/lintCheckerEvaluator.js +155 -0
  126. package/dist/evaluators/lintCheckerEvaluator.js.map +1 -0
  127. package/dist/evaluators/sentryCheckerEvaluator.d.ts +11 -0
  128. package/dist/evaluators/sentryCheckerEvaluator.js +126 -0
  129. package/dist/evaluators/sentryCheckerEvaluator.js.map +1 -0
  130. package/dist/evaluators/shared.d.ts +27 -0
  131. package/dist/evaluators/shared.js +92 -0
  132. package/dist/evaluators/shared.js.map +1 -0
  133. package/dist/evaluators/testRunnerEvaluator.d.ts +17 -0
  134. package/dist/evaluators/testRunnerEvaluator.js +232 -0
  135. package/dist/evaluators/testRunnerEvaluator.js.map +1 -0
  136. package/dist/evaluators/tscCheckerEvaluator.d.ts +11 -0
  137. package/dist/evaluators/tscCheckerEvaluator.js +189 -0
  138. package/dist/evaluators/tscCheckerEvaluator.js.map +1 -0
  139. package/dist/globalId-DKh9d_uD.d.ts +20 -0
  140. package/dist/globalId.d.ts +1 -0
  141. package/dist/globalId.js +15 -0
  142. package/dist/globalId.js.map +1 -0
  143. package/dist/graphTypes-CpgIuCdo.d.ts +52 -0
  144. package/dist/graphTypes.d.ts +1 -0
  145. package/dist/graphTypes.js +120 -0
  146. package/dist/graphTypes.js.map +1 -0
  147. package/dist/helpers-BYHIk5vU.d.ts +27 -0
  148. package/dist/helpers.d.ts +4 -0
  149. package/dist/helpers.js +313 -0
  150. package/dist/helpers.js.map +1 -0
  151. package/dist/index-Dct1T70K.d.ts +25 -0
  152. package/dist/index-Dq-7R-gi.d.ts +31 -0
  153. package/dist/index.d.ts +45 -0
  154. package/dist/index.js +22294 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/invariantEnforcement.d.ts +52 -0
  157. package/dist/invariantEnforcement.js +231 -0
  158. package/dist/invariantEnforcement.js.map +1 -0
  159. package/dist/logicalRoleInference-CJxqWi3u.d.ts +16 -0
  160. package/dist/logicalRoleInference.d.ts +3 -0
  161. package/dist/logicalRoleInference.js +64 -0
  162. package/dist/logicalRoleInference.js.map +1 -0
  163. package/dist/matcherFeedbackUtils.d.ts +33 -0
  164. package/dist/matcherFeedbackUtils.js +95 -0
  165. package/dist/matcherFeedbackUtils.js.map +1 -0
  166. package/dist/ontology-matching-Buhu23ss.d.ts +48 -0
  167. package/dist/ontology-matching.d.ts +2 -0
  168. package/dist/ontology-matching.js +346 -0
  169. package/dist/ontology-matching.js.map +1 -0
  170. package/dist/ontologyApproval-Ba0Jjk1k.d.ts +26 -0
  171. package/dist/ontologyApproval.d.ts +1 -0
  172. package/dist/ontologyApproval.js +78 -0
  173. package/dist/ontologyApproval.js.map +1 -0
  174. package/dist/ontologyDefinitions.d.ts +72 -0
  175. package/dist/ontologyDefinitions.js +635 -0
  176. package/dist/ontologyDefinitions.js.map +1 -0
  177. package/dist/ontologyHelpers.d.ts +79 -0
  178. package/dist/ontologyHelpers.js +81 -0
  179. package/dist/ontologyHelpers.js.map +1 -0
  180. package/dist/ontologyRegistry-B67rPJ16.d.ts +31 -0
  181. package/dist/ontologyRegistry.d.ts +1 -0
  182. package/dist/ontologyRegistry.js +296 -0
  183. package/dist/ontologyRegistry.js.map +1 -0
  184. package/dist/projectionReconciliation-CxrXYGaB.d.ts +20 -0
  185. package/dist/projectionReconciliation.d.ts +1 -0
  186. package/dist/projectionReconciliation.js +261 -0
  187. package/dist/projectionReconciliation.js.map +1 -0
  188. package/dist/projectionStaleness-CAdpIsaW.d.ts +51 -0
  189. package/dist/projectionStaleness.d.ts +1 -0
  190. package/dist/projectionStaleness.js +57 -0
  191. package/dist/projectionStaleness.js.map +1 -0
  192. package/dist/questionEvidenceLinks-BdQD0TkM.d.ts +34 -0
  193. package/dist/questionEvidenceLinks.d.ts +1 -0
  194. package/dist/questionEvidenceLinks.js +1690 -0
  195. package/dist/questionEvidenceLinks.js.map +1 -0
  196. package/dist/resolverTypes-CC8Ea2E2.d.ts +20 -0
  197. package/dist/resolverTypes.d.ts +4 -0
  198. package/dist/resolverTypes.js +3 -0
  199. package/dist/resolverTypes.js.map +1 -0
  200. package/dist/resolvers-Br1a6eLV.d.ts +14 -0
  201. package/dist/resolvers.d.ts +5 -0
  202. package/dist/resolvers.js +308 -0
  203. package/dist/resolvers.js.map +1 -0
  204. package/dist/scopeResolverCompat.d.ts +26 -0
  205. package/dist/scopeResolverCompat.js +242 -0
  206. package/dist/scopeResolverCompat.js.map +1 -0
  207. package/dist/text-matching-CMn2WnVD.d.ts +40 -0
  208. package/dist/text-matching.d.ts +2 -0
  209. package/dist/text-matching.js +246 -0
  210. package/dist/text-matching.js.map +1 -0
  211. package/dist/topicOntologyResolver.d.ts +80 -0
  212. package/dist/topicOntologyResolver.js +67 -0
  213. package/dist/topicOntologyResolver.js.map +1 -0
  214. package/dist/topicProjectOverlay.d.ts +92 -0
  215. package/dist/topicProjectOverlay.js +249 -0
  216. package/dist/topicProjectOverlay.js.map +1 -0
  217. package/dist/topicScope-By_zp4tt.d.ts +34 -0
  218. package/dist/topicScope.d.ts +3 -0
  219. package/dist/topicScope.js +206 -0
  220. package/dist/topicScope.js.map +1 -0
  221. package/dist/workspaceIsolation.d.ts +44 -0
  222. package/dist/workspaceIsolation.js +950 -0
  223. package/dist/workspaceIsolation.js.map +1 -0
  224. package/package.json +46 -0
@@ -0,0 +1,663 @@
1
+ import { v } from 'convex/values';
2
+ import { componentsGeneric, queryGeneric, mutationGeneric, anyApi } from 'convex/server';
3
+
4
+ // src/entityBridge.ts
5
+
6
+ // ../access-control/src/auth.ts
7
+ async function getCurrentUserId(ctx) {
8
+ const identity = await ctx.auth.getUserIdentity();
9
+ return identity?.subject ?? null;
10
+ }
11
+ var permissiveReturn = v.optional(v.any());
12
+ var looseJsonObject = v.record(v.string(), v.any());
13
+ var looseJsonArray = v.array(v.any());
14
+ v.union(
15
+ v.string(),
16
+ v.number(),
17
+ v.boolean(),
18
+ v.null(),
19
+ looseJsonObject,
20
+ looseJsonArray
21
+ );
22
+ componentsGeneric();
23
+ var internal = anyApi;
24
+ var mutation = mutationGeneric;
25
+ var query = queryGeneric;
26
+
27
+ // src/graphTypes.ts
28
+ function getNodeLayer(nodeType) {
29
+ const L4_TYPES = ["decision"];
30
+ const L3_TYPES = ["belief", "question", "theme", "deal"];
31
+ const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
32
+ const L1_TYPES = ["atomic_fact", "excerpt", "source"];
33
+ const ONTOLOGICAL_TYPES = [
34
+ "company",
35
+ "person",
36
+ "investor",
37
+ "function",
38
+ "value_chain"
39
+ ];
40
+ const ORGANIZATIONAL_TYPES = ["topic"];
41
+ if (L4_TYPES.includes(nodeType)) {
42
+ return "L4";
43
+ }
44
+ if (L3_TYPES.includes(nodeType)) {
45
+ return "L3";
46
+ }
47
+ if (L2_TYPES.includes(nodeType)) {
48
+ return "L2";
49
+ }
50
+ if (L1_TYPES.includes(nodeType)) {
51
+ return "L1";
52
+ }
53
+ if (ONTOLOGICAL_TYPES.includes(nodeType)) {
54
+ return "ontological";
55
+ }
56
+ if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
57
+ return "organizational";
58
+ }
59
+ console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
60
+ return "L2";
61
+ }
62
+
63
+ // src/edgeValidation.ts
64
+ function getLayerDepth(layer) {
65
+ switch (layer) {
66
+ case "L4":
67
+ return 4;
68
+ case "L3":
69
+ return 3;
70
+ case "L2":
71
+ return 2;
72
+ case "L1":
73
+ return 1;
74
+ case "ontological":
75
+ return 0;
76
+ default:
77
+ return -1;
78
+ }
79
+ }
80
+ function isValidLayerConnection(fromLayer, toLayer) {
81
+ if (fromLayer === toLayer) {
82
+ return true;
83
+ }
84
+ if (fromLayer === "ontological" && toLayer === "ontological") {
85
+ return true;
86
+ }
87
+ if (fromLayer === "ontological" && (toLayer === "L3" || toLayer === "L2" || toLayer === "L1")) {
88
+ return true;
89
+ }
90
+ if ((fromLayer === "L3" || fromLayer === "L2" || fromLayer === "L1") && toLayer === "ontological") {
91
+ return true;
92
+ }
93
+ if (fromLayer === "L2" && toLayer === "L1") {
94
+ return true;
95
+ }
96
+ if (fromLayer === "L2" && toLayer === "L3") {
97
+ return true;
98
+ }
99
+ if (fromLayer === "L3" && toLayer === "L2") {
100
+ return true;
101
+ }
102
+ if (fromLayer === "L3" && toLayer === "L4") {
103
+ return true;
104
+ }
105
+ if (fromLayer === "L4" && toLayer === "L3") {
106
+ return true;
107
+ }
108
+ if (fromLayer === "L3" && toLayer === "organizational") {
109
+ return true;
110
+ }
111
+ if (fromLayer === "organizational" && toLayer === "L3") {
112
+ return true;
113
+ }
114
+ const fromDepth = getLayerDepth(fromLayer);
115
+ const toDepth = getLayerDepth(toLayer);
116
+ if (Math.abs(fromDepth - toDepth) > 1) {
117
+ return false;
118
+ }
119
+ return true;
120
+ }
121
+ var EDGE_LAYER_RULES = {
122
+ // === 6 Canonical Epistemic Types ===
123
+ supports: {
124
+ from: ["L3"],
125
+ to: ["L3"],
126
+ description: "Belief bears on Belief (weight: +1 supports, -1 contradicts)"
127
+ },
128
+ informs: {
129
+ from: ["L2"],
130
+ to: ["L3"],
131
+ description: "Evidence -> Belief (L2 -> L3)"
132
+ },
133
+ depends_on: {
134
+ from: ["L3"],
135
+ to: ["L3"],
136
+ description: "Belief B requires Belief A (structural gate)"
137
+ },
138
+ derived_from: {
139
+ from: ["L2", "L3", "L4"],
140
+ to: ["L1", "L2", "L3"],
141
+ description: "A was produced from B (provenance chain)"
142
+ },
143
+ contains: {
144
+ from: ["L3", "L4", "ontological"],
145
+ to: ["L2", "L3", "ontological"],
146
+ description: "A scopes/aggregates B (hierarchy)"
147
+ },
148
+ tests: {
149
+ from: ["L3"],
150
+ to: ["L3"],
151
+ description: "Question -> Belief (L3 -> L3)"
152
+ },
153
+ // === Structural / Lifecycle ===
154
+ supersedes: {
155
+ from: ["L3"],
156
+ to: ["L3"],
157
+ description: "NewNode -> OldNode (fork lineage)"
158
+ },
159
+ responds_to: {
160
+ from: ["L2", "L3"],
161
+ to: ["L3"],
162
+ description: "Answer -> Question (L2/L3 -> L3)"
163
+ },
164
+ belongs_to: {
165
+ from: ["L2", "L3", "ontological"],
166
+ to: ["L3"],
167
+ description: "Membership (migrating to contains)"
168
+ },
169
+ relates_to_thesis: {
170
+ from: ["L3"],
171
+ to: ["L3"],
172
+ description: "Belief -> Theme (L3 -> L3)"
173
+ },
174
+ // === Ontological (entity-entity or entity-epistemic bridge) ===
175
+ works_at: {
176
+ from: ["ontological"],
177
+ to: ["ontological"],
178
+ description: "Person -> Company"
179
+ },
180
+ invested_in: {
181
+ from: ["ontological"],
182
+ to: ["ontological"],
183
+ description: "Investor -> Company"
184
+ },
185
+ competes_with: {
186
+ from: ["ontological"],
187
+ to: ["ontological"],
188
+ description: "Company -> Company"
189
+ },
190
+ participates_in: {
191
+ from: ["ontological"],
192
+ to: ["ontological"],
193
+ description: "Company -> ValueChain"
194
+ },
195
+ founded_by: {
196
+ from: ["ontological"],
197
+ to: ["ontological"],
198
+ description: "Company -> Person"
199
+ },
200
+ evaluates: {
201
+ from: ["ontological"],
202
+ to: ["ontological"],
203
+ description: "Deal -> Company"
204
+ },
205
+ performs: {
206
+ from: ["ontological"],
207
+ to: ["ontological"],
208
+ description: "Company -> Function"
209
+ },
210
+ function_in: {
211
+ from: ["ontological"],
212
+ to: ["ontological"],
213
+ description: "Function -> ValueChain"
214
+ },
215
+ impacts: {
216
+ from: ["ontological", "L3"],
217
+ to: ["ontological"],
218
+ description: "Theme/Entity -> ValueChain"
219
+ },
220
+ raised_from: {
221
+ from: ["ontological"],
222
+ to: ["ontological"],
223
+ description: "Company -> Investor"
224
+ },
225
+ mentioned_in: {
226
+ from: ["ontological"],
227
+ to: ["L1", "L2"],
228
+ description: "Entity -> Source/Evidence"
229
+ },
230
+ perspective_on: {
231
+ from: ["ontological"],
232
+ to: ["L3"],
233
+ description: "Person -> Belief/Theme"
234
+ },
235
+ plays_theme: {
236
+ from: ["ontological"],
237
+ to: ["L3"],
238
+ description: "Deal -> Theme"
239
+ }
240
+ };
241
+ function validateEdgeLayers(edgeType, fromLayer, toLayer) {
242
+ const rules = EDGE_LAYER_RULES[edgeType];
243
+ if (!rules) {
244
+ console.warn(
245
+ `[EdgeValidation] Unknown edge type: ${edgeType}, allowing by default`
246
+ );
247
+ return { valid: true };
248
+ }
249
+ if (edgeType === "supersedes") {
250
+ if (fromLayer !== toLayer) {
251
+ return {
252
+ valid: false,
253
+ reason: `${edgeType} edges must be between nodes of the same layer. Got ${fromLayer} -> ${toLayer}`
254
+ };
255
+ }
256
+ return { valid: true };
257
+ }
258
+ if (!rules.from.includes(fromLayer)) {
259
+ return {
260
+ valid: false,
261
+ reason: `Edge type '${edgeType}' does not allow source layer ${fromLayer}. Allowed: ${rules.from.join(", ")}`
262
+ };
263
+ }
264
+ if (!rules.to.includes(toLayer)) {
265
+ return {
266
+ valid: false,
267
+ reason: `Edge type '${edgeType}' does not allow target layer ${toLayer}. Allowed: ${rules.to.join(", ")}`
268
+ };
269
+ }
270
+ if (!isValidLayerConnection(fromLayer, toLayer)) {
271
+ return {
272
+ valid: false,
273
+ reason: `Layer transition ${fromLayer} -> ${toLayer} is not permitted`
274
+ };
275
+ }
276
+ return { valid: true };
277
+ }
278
+ function readMaterializedTopicTableId(topicNode) {
279
+ if (!topicNode) {
280
+ return;
281
+ }
282
+ const metadata = topicNode.metadata || {};
283
+ const topicTableId = metadata.topicTableId || metadata.topicId;
284
+ return typeof topicTableId === "string" && topicTableId.trim().length > 0 ? topicTableId.trim() : void 0;
285
+ }
286
+ ({
287
+ projectId: v.optional(v.string()),
288
+ topicId: v.optional(v.string())
289
+ });
290
+
291
+ // src/entityBridge.ts
292
+ var ENTITY_BRIDGE_EDGE_TYPES = [
293
+ "contains",
294
+ "evaluates",
295
+ "perspective_on",
296
+ "impacts",
297
+ "mentioned_in"
298
+ ];
299
+ var getBeliefsForEntity = query({
300
+ args: {
301
+ entityNodeId: v.id("epistemicNodes"),
302
+ edgeTypes: v.optional(v.array(v.string()))
303
+ },
304
+ returns: permissiveReturn,
305
+ handler: async (ctx, args) => {
306
+ const entity = await ctx.db.get(args.entityNodeId);
307
+ if (!entity || entity.epistemicLayer !== "ontological") {
308
+ return { beliefs: [], entity: null };
309
+ }
310
+ const filterTypes = args.edgeTypes || [
311
+ "contains",
312
+ "evaluates",
313
+ "perspective_on",
314
+ "impacts"
315
+ ];
316
+ const inboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.entityNodeId)).collect();
317
+ const outboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.entityNodeId)).collect();
318
+ const beliefNodeIds = /* @__PURE__ */ new Set();
319
+ const edgeMap = {};
320
+ for (const edge of inboundEdges) {
321
+ if (!filterTypes.includes(edge.edgeType) || !edge.fromNodeId) {
322
+ continue;
323
+ }
324
+ const id = String(edge.fromNodeId);
325
+ beliefNodeIds.add(id);
326
+ edgeMap[id] = {
327
+ edgeType: edge.edgeType,
328
+ weight: edge.weight ?? void 0,
329
+ context: edge.context ?? void 0
330
+ };
331
+ }
332
+ for (const edge of outboundEdges) {
333
+ const et = edge.edgeType;
334
+ if (!filterTypes.includes(et) || !edge.toNodeId || et === "mentioned_in") {
335
+ continue;
336
+ }
337
+ const id = String(edge.toNodeId);
338
+ beliefNodeIds.add(id);
339
+ edgeMap[id] = {
340
+ edgeType: edge.edgeType,
341
+ weight: edge.weight ?? void 0,
342
+ context: edge.context ?? void 0
343
+ };
344
+ }
345
+ const beliefs = await Promise.all(
346
+ [...beliefNodeIds].map(async (nodeId) => {
347
+ const node = await ctx.db.get(nodeId);
348
+ if (!node || node.status !== "active") {
349
+ return null;
350
+ }
351
+ return {
352
+ ...node,
353
+ _edge: edgeMap[nodeId]
354
+ };
355
+ })
356
+ );
357
+ return {
358
+ beliefs: beliefs.filter(Boolean),
359
+ entity: {
360
+ _id: entity._id,
361
+ globalId: entity.globalId,
362
+ nodeType: entity.nodeType,
363
+ title: entity.title,
364
+ metadata: entity.metadata
365
+ }
366
+ };
367
+ }
368
+ });
369
+ var getEntitiesForBelief = query({
370
+ args: {
371
+ beliefNodeId: v.id("epistemicNodes"),
372
+ edgeTypes: v.optional(v.array(v.string()))
373
+ },
374
+ returns: permissiveReturn,
375
+ handler: async (ctx, args) => {
376
+ const belief = await ctx.db.get(args.beliefNodeId);
377
+ if (!belief) {
378
+ return { entities: [], belief: null };
379
+ }
380
+ const filterTypes = args.edgeTypes || [
381
+ "contains",
382
+ "evaluates",
383
+ "perspective_on",
384
+ "impacts"
385
+ ];
386
+ const outboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.beliefNodeId)).collect();
387
+ const inboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.beliefNodeId)).collect();
388
+ const entityNodeIds = /* @__PURE__ */ new Set();
389
+ const edgeMap = {};
390
+ for (const edge of outboundEdges) {
391
+ if (!filterTypes.includes(edge.edgeType) || !edge.toNodeId) {
392
+ continue;
393
+ }
394
+ const id = String(edge.toNodeId);
395
+ entityNodeIds.add(id);
396
+ edgeMap[id] = {
397
+ edgeType: edge.edgeType,
398
+ weight: edge.weight ?? void 0,
399
+ context: edge.context ?? void 0
400
+ };
401
+ }
402
+ for (const edge of inboundEdges) {
403
+ if (!filterTypes.includes(edge.edgeType) || !edge.fromNodeId) {
404
+ continue;
405
+ }
406
+ const id = String(edge.fromNodeId);
407
+ entityNodeIds.add(id);
408
+ edgeMap[id] = {
409
+ edgeType: edge.edgeType,
410
+ weight: edge.weight ?? void 0,
411
+ context: edge.context ?? void 0
412
+ };
413
+ }
414
+ const entities = await Promise.all(
415
+ [...entityNodeIds].map(async (nodeId) => {
416
+ const node = await ctx.db.get(nodeId);
417
+ if (!node || node.status !== "active" || node.epistemicLayer !== "ontological") {
418
+ return null;
419
+ }
420
+ return {
421
+ ...node,
422
+ _edge: edgeMap[nodeId]
423
+ };
424
+ })
425
+ );
426
+ return {
427
+ entities: entities.filter(Boolean),
428
+ belief: {
429
+ _id: belief._id,
430
+ globalId: belief.globalId,
431
+ nodeType: belief.nodeType,
432
+ title: belief.title,
433
+ canonicalText: belief.canonicalText
434
+ }
435
+ };
436
+ }
437
+ });
438
+ var getEntityTopicScope = query({
439
+ args: {
440
+ entityNodeId: v.id("epistemicNodes")
441
+ },
442
+ returns: permissiveReturn,
443
+ handler: async (ctx, args) => {
444
+ const entity = await ctx.db.get(args.entityNodeId);
445
+ if (!entity || entity.epistemicLayer !== "ontological") {
446
+ return { topics: [], projectIds: [] };
447
+ }
448
+ const inboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.entityNodeId)).collect();
449
+ const outboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.entityNodeId)).collect();
450
+ const connectedNodeIds = /* @__PURE__ */ new Set();
451
+ for (const edge of inboundEdges) {
452
+ if (ENTITY_BRIDGE_EDGE_TYPES.includes(edge.edgeType) && edge.fromNodeId) {
453
+ connectedNodeIds.add(String(edge.fromNodeId));
454
+ }
455
+ }
456
+ for (const edge of outboundEdges) {
457
+ if (ENTITY_BRIDGE_EDGE_TYPES.includes(edge.edgeType) && edge.toNodeId) {
458
+ connectedNodeIds.add(String(edge.toNodeId));
459
+ }
460
+ }
461
+ const projectIds = /* @__PURE__ */ new Set();
462
+ const topicIds = /* @__PURE__ */ new Set();
463
+ for (const nodeId of connectedNodeIds) {
464
+ const node = await ctx.db.get(nodeId);
465
+ if (!node || node.status !== "active") {
466
+ continue;
467
+ }
468
+ if (node.projectId) {
469
+ projectIds.add(String(node.projectId));
470
+ }
471
+ if (node.topicId) {
472
+ topicIds.add(String(node.topicId));
473
+ }
474
+ }
475
+ for (const nodeId of connectedNodeIds) {
476
+ const scopeEdges = await ctx.db.query("epistemicEdges").withIndex(
477
+ "by_from",
478
+ (q) => q.eq("fromNodeId", nodeId)
479
+ ).collect();
480
+ for (const edge of scopeEdges) {
481
+ if (edge.edgeType === "contains" && edge.toNodeId) {
482
+ const scopedTopicNode = await ctx.db.get(
483
+ edge.toNodeId
484
+ );
485
+ const canonicalTopicId = readMaterializedTopicTableId(
486
+ scopedTopicNode
487
+ );
488
+ if (canonicalTopicId) {
489
+ topicIds.add(canonicalTopicId);
490
+ }
491
+ }
492
+ }
493
+ }
494
+ return {
495
+ topics: [...topicIds],
496
+ projectIds: [...projectIds],
497
+ connectedNodeCount: connectedNodeIds.size
498
+ };
499
+ }
500
+ });
501
+ var getEvidenceForEntity = query({
502
+ args: {
503
+ entityNodeId: v.id("epistemicNodes"),
504
+ limit: v.optional(v.number())
505
+ },
506
+ returns: permissiveReturn,
507
+ handler: async (ctx, args) => {
508
+ const entity = await ctx.db.get(args.entityNodeId);
509
+ if (!entity || entity.epistemicLayer !== "ontological") {
510
+ return [];
511
+ }
512
+ const effectiveLimit = args.limit ?? 50;
513
+ const outboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.entityNodeId)).collect();
514
+ const evidenceEdges = outboundEdges.filter((e) => {
515
+ const et = e.edgeType;
516
+ return et === "contains" || et === "mentioned_in";
517
+ });
518
+ const results = await Promise.all(
519
+ evidenceEdges.slice(0, effectiveLimit).map(async (edge) => {
520
+ if (!edge.toNodeId) {
521
+ return null;
522
+ }
523
+ const node = await ctx.db.get(edge.toNodeId);
524
+ if (!node || node.status !== "active") {
525
+ return null;
526
+ }
527
+ return {
528
+ ...node,
529
+ _edge: {
530
+ edgeType: edge.edgeType,
531
+ weight: edge.weight,
532
+ context: edge.context
533
+ }
534
+ };
535
+ })
536
+ );
537
+ return results.filter(Boolean);
538
+ }
539
+ });
540
+ var linkEntityToBelief = mutation({
541
+ args: {
542
+ entityNodeId: v.id("epistemicNodes"),
543
+ beliefNodeId: v.id("epistemicNodes"),
544
+ edgeType: v.optional(v.string()),
545
+ weight: v.optional(v.number()),
546
+ context: v.optional(v.string())
547
+ },
548
+ returns: permissiveReturn,
549
+ handler: async (ctx, args) => {
550
+ const userId = await getCurrentUserId(ctx);
551
+ if (!userId) {
552
+ throw new Error("Authentication required to create entity-belief links.");
553
+ }
554
+ const entity = await ctx.db.get(args.entityNodeId);
555
+ if (!entity || entity.epistemicLayer !== "ontological") {
556
+ throw new Error("Source node must be an ontological entity.");
557
+ }
558
+ const belief = await ctx.db.get(args.beliefNodeId);
559
+ if (!belief) {
560
+ throw new Error("Target belief/question/theme node not found.");
561
+ }
562
+ if (!entity.globalId) {
563
+ throw new Error("Source entity is missing a globalId.");
564
+ }
565
+ if (!belief.globalId) {
566
+ throw new Error(
567
+ "Target belief/question/theme node is missing a globalId."
568
+ );
569
+ }
570
+ const effectiveEdgeType = args.edgeType || "contains";
571
+ const fromLayer = getNodeLayer(entity.nodeType);
572
+ const toLayer = getNodeLayer(belief.nodeType);
573
+ let fromNodeId;
574
+ let toNodeId;
575
+ let fromGlobalId;
576
+ let toGlobalId;
577
+ let fromNodeType;
578
+ let toNodeType;
579
+ let edgeFromLayer;
580
+ let edgeToLayer;
581
+ if (effectiveEdgeType === "contains" && entity.epistemicLayer === "ontological") {
582
+ fromNodeId = args.beliefNodeId;
583
+ toNodeId = args.entityNodeId;
584
+ fromGlobalId = belief.globalId;
585
+ toGlobalId = entity.globalId;
586
+ fromNodeType = belief.nodeType;
587
+ toNodeType = entity.nodeType;
588
+ edgeFromLayer = getNodeLayer(belief.nodeType);
589
+ edgeToLayer = "ontological";
590
+ } else if (effectiveEdgeType === "mentioned_in" || effectiveEdgeType === "perspective_on") {
591
+ fromNodeId = args.entityNodeId;
592
+ toNodeId = args.beliefNodeId;
593
+ fromGlobalId = entity.globalId;
594
+ toGlobalId = belief.globalId;
595
+ fromNodeType = entity.nodeType;
596
+ toNodeType = belief.nodeType;
597
+ edgeFromLayer = "ontological";
598
+ edgeToLayer = getNodeLayer(belief.nodeType);
599
+ } else {
600
+ const validation = validateEdgeLayers(
601
+ effectiveEdgeType,
602
+ fromLayer,
603
+ toLayer
604
+ );
605
+ if (validation.valid) {
606
+ fromNodeId = args.entityNodeId;
607
+ toNodeId = args.beliefNodeId;
608
+ fromGlobalId = entity.globalId;
609
+ toGlobalId = belief.globalId;
610
+ fromNodeType = entity.nodeType;
611
+ toNodeType = belief.nodeType;
612
+ edgeFromLayer = fromLayer;
613
+ edgeToLayer = toLayer;
614
+ } else {
615
+ const reversed = validateEdgeLayers(
616
+ effectiveEdgeType,
617
+ toLayer,
618
+ fromLayer
619
+ );
620
+ if (!reversed.valid) {
621
+ throw new Error(
622
+ `Edge type '${effectiveEdgeType}' is not valid between ${entity.nodeType} (${fromLayer}) and ${belief.nodeType} (${toLayer}): ${validation.reason}`
623
+ );
624
+ }
625
+ fromNodeId = args.beliefNodeId;
626
+ toNodeId = args.entityNodeId;
627
+ fromGlobalId = belief.globalId;
628
+ toGlobalId = entity.globalId;
629
+ fromNodeType = belief.nodeType;
630
+ toNodeType = entity.nodeType;
631
+ edgeFromLayer = toLayer;
632
+ edgeToLayer = fromLayer;
633
+ }
634
+ }
635
+ const existing = await ctx.db.query("epistemicEdges").withIndex(
636
+ "by_from_to",
637
+ (q) => q.eq("fromNodeId", fromNodeId).eq("toNodeId", toNodeId)
638
+ ).first();
639
+ if (existing && existing.edgeType === effectiveEdgeType) {
640
+ return { edgeId: existing._id, existed: true };
641
+ }
642
+ const globalId = `edge-${effectiveEdgeType}-${fromNodeId}-${toNodeId}-${Date.now()}`;
643
+ await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {
644
+ globalId,
645
+ fromGlobalId,
646
+ toGlobalId,
647
+ edgeType: effectiveEdgeType,
648
+ weight: args.weight ?? 1,
649
+ context: args.context || `Entity-belief bridge: ${effectiveEdgeType}`,
650
+ topicId: belief.projectId || entity.projectId ? String(belief.projectId || entity.projectId) : void 0,
651
+ createdBy: userId,
652
+ fromNodeType,
653
+ toNodeType,
654
+ fromLayer: edgeFromLayer,
655
+ toLayer: edgeToLayer
656
+ });
657
+ return { globalId, edgeType: effectiveEdgeType, existed: false };
658
+ }
659
+ });
660
+
661
+ export { getBeliefsForEntity, getEntitiesForBelief, getEntityTopicScope, getEvidenceForEntity, linkEntityToBelief };
662
+ //# sourceMappingURL=entityBridge.js.map
663
+ //# sourceMappingURL=entityBridge.js.map