@lucern/graph-primitives 0.1.0-alpha.4 → 0.3.0-alpha.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 (78) hide show
  1. package/dist/beliefDecay.js +229 -1115
  2. package/dist/beliefDecay.js.map +1 -1
  3. package/dist/beliefEvidenceLinks.js +53 -834
  4. package/dist/beliefEvidenceLinks.js.map +1 -1
  5. package/dist/confidencePropagationDispatch.d.ts +3 -3
  6. package/dist/confidencePropagationDispatch.js +30 -308
  7. package/dist/confidencePropagationDispatch.js.map +1 -1
  8. package/dist/contradictions.js +5 -797
  9. package/dist/contradictions.js.map +1 -1
  10. package/dist/edges/contradicts.js +1 -122
  11. package/dist/edges/contradicts.js.map +1 -1
  12. package/dist/edges/dependsOn.js +14 -172
  13. package/dist/edges/dependsOn.js.map +1 -1
  14. package/dist/edges/elaborates.js +1 -49
  15. package/dist/edges/elaborates.js.map +1 -1
  16. package/dist/edges/index.js +14 -277
  17. package/dist/edges/index.js.map +1 -1
  18. package/dist/edges/informs.js +1 -62
  19. package/dist/edges/informs.js.map +1 -1
  20. package/dist/edges/propagationTypes.d.ts +2 -2
  21. package/dist/edges/propagationTypes.js.map +1 -1
  22. package/dist/edges/refutes.js +1 -62
  23. package/dist/edges/refutes.js.map +1 -1
  24. package/dist/edges/supports.js +1 -122
  25. package/dist/edges/supports.js.map +1 -1
  26. package/dist/edges/utils.d.ts +6 -6
  27. package/dist/edges/utils.js +1 -130
  28. package/dist/edges/utils.js.map +1 -1
  29. package/dist/entityBridge.js +2 -17
  30. package/dist/entityBridge.js.map +1 -1
  31. package/dist/entityLifecycle.js +62 -848
  32. package/dist/entityLifecycle.js.map +1 -1
  33. package/dist/epistemicAnswers.js +27 -838
  34. package/dist/epistemicAnswers.js.map +1 -1
  35. package/dist/epistemicBeliefs.js +186 -2214
  36. package/dist/epistemicBeliefs.js.map +1 -1
  37. package/dist/epistemicContractHelpers.js +1 -318
  38. package/dist/epistemicContractHelpers.js.map +1 -1
  39. package/dist/epistemicContracts.js +163 -2467
  40. package/dist/epistemicContracts.js.map +1 -1
  41. package/dist/epistemicEdges.js +60 -863
  42. package/dist/epistemicEdges.js.map +1 -1
  43. package/dist/epistemicEvidence.js +116 -1647
  44. package/dist/epistemicEvidence.js.map +1 -1
  45. package/dist/epistemicHelpers.js +3 -2
  46. package/dist/epistemicHelpers.js.map +1 -1
  47. package/dist/epistemicLinking.js +2 -785
  48. package/dist/epistemicLinking.js.map +1 -1
  49. package/dist/epistemicNodes.js +34 -1427
  50. package/dist/epistemicNodes.js.map +1 -1
  51. package/dist/epistemicQuestions.js +88 -1637
  52. package/dist/epistemicQuestions.js.map +1 -1
  53. package/dist/epistemicSources.js +28 -1421
  54. package/dist/epistemicSources.js.map +1 -1
  55. package/dist/evaluators/index.js +163 -2467
  56. package/dist/evaluators/index.js.map +1 -1
  57. package/dist/index.js +486 -3649
  58. package/dist/index.js.map +1 -1
  59. package/dist/ontology-matching.js +1 -344
  60. package/dist/ontology-matching.js.map +1 -1
  61. package/dist/ontologyApproval.js +1 -13
  62. package/dist/ontologyApproval.js.map +1 -1
  63. package/dist/ontologyDefinitions.js +2 -17
  64. package/dist/ontologyDefinitions.js.map +1 -1
  65. package/dist/ontologyRegistry.js +2 -17
  66. package/dist/ontologyRegistry.js.map +1 -1
  67. package/dist/projectionReconciliation.js +2 -17
  68. package/dist/projectionReconciliation.js.map +1 -1
  69. package/dist/questionEvidenceLinks.js +242 -837
  70. package/dist/questionEvidenceLinks.js.map +1 -1
  71. package/dist/text-matching.js +1 -244
  72. package/dist/text-matching.js.map +1 -1
  73. package/dist/workflowBridge.d.ts +27 -0
  74. package/dist/workflowBridge.js +303 -0
  75. package/dist/workflowBridge.js.map +1 -0
  76. package/dist/workspaceIsolation.js +8 -609
  77. package/dist/workspaceIsolation.js.map +1 -1
  78. package/package.json +6 -6
@@ -1,4 +1,4 @@
1
- import { Opinion, SLOperator } from '@lucern/confidence';
1
+ import { SLOpinion, SLOperator } from '@lucern/confidence';
2
2
  import { PropagationEdgeRecord, PropagationEdgeType, PropagationTraversalDirection, EdgePropagationSpec } from './edges/propagationTypes.js';
3
3
 
4
4
  type PropagationDispatchScope = {
@@ -24,14 +24,14 @@ type ConfidencePropagationDispatch<TNodeId extends string = string> = {
24
24
  edgeType: PropagationEdgeType;
25
25
  traversedDirection: PropagationTraversalDirection;
26
26
  weight: number;
27
- opinion: Opinion;
27
+ opinion: SLOpinion;
28
28
  operator: SLOperator;
29
29
  rationale: string;
30
30
  hop: number;
31
31
  };
32
32
  declare function collectConfidencePropagationDispatches<TNodeId extends string = string>(args: {
33
33
  sourceNodeId: TNodeId;
34
- sourceOpinion: Opinion;
34
+ sourceOpinion: SLOpinion;
35
35
  sourceScope?: PropagationDispatchScope;
36
36
  traversalSpecs?: readonly EdgePropagationSpec<TNodeId>[];
37
37
  queryEdges: (args: {
@@ -1,296 +1,7 @@
1
- // ../confidence/src/v1/operations/subjectiveLogic/index.ts
2
- function opinion(belief, disbelief, uncertainty, baseRate = 0.5) {
3
- const b = Math.max(0, Math.min(1, belief));
4
- const d = Math.max(0, Math.min(1, disbelief));
5
- const u = Math.max(0, Math.min(1, uncertainty));
6
- const a = Math.max(0, Math.min(1, baseRate));
7
- const sum = b + d + u;
8
- if (sum === 0) {
9
- return { b: 0, d: 0, u: 1, a };
10
- }
11
- return {
12
- b: b / sum,
13
- d: d / sum,
14
- u: u / sum,
15
- a
16
- };
17
- }
18
- function vacuous(baseRate = 0.5) {
19
- return { b: 0, d: 0, u: 1, a: baseRate };
20
- }
21
- function project(o) {
22
- return o.b + o.a * o.u;
23
- }
24
- function cumulativeFusion(left, right) {
25
- if (left.u === 0 && right.u === 0) {
26
- return opinion(
27
- (left.b + right.b) / 2,
28
- (left.d + right.d) / 2,
29
- 0,
30
- (left.a + right.a) / 2
31
- );
32
- }
33
- const k = left.u + right.u - left.u * right.u;
34
- if (k === 0) {
35
- return vacuous((left.a + right.a) / 2);
36
- }
37
- return opinion(
38
- (left.b * right.u + right.b * left.u) / k,
39
- (left.d * right.u + right.d * left.u) / k,
40
- left.u * right.u / k,
41
- (left.a + right.a) / 2
42
- );
43
- }
44
- function trustDiscount(sourceOpinion, trust) {
45
- const weight = Math.max(0, Math.min(1, Math.abs(trust)));
46
- return opinion(
47
- weight * sourceOpinion.b,
48
- weight * sourceOpinion.d,
49
- 1 - weight * (sourceOpinion.b + sourceOpinion.d),
50
- sourceOpinion.a
51
- );
52
- }
53
- var EPSILON = 1e-9;
54
- function childBaseRateFallback(ifTrue, ifFalse, fallbackBaseRate) {
55
- if (fallbackBaseRate !== void 0) {
56
- return Math.max(0, Math.min(1, fallbackBaseRate));
57
- }
58
- if (Math.abs(ifTrue.a - ifFalse.a) <= EPSILON) {
59
- return ifTrue.a;
60
- }
61
- return (ifTrue.a + ifFalse.a) / 2;
62
- }
63
- function computeConditionalDeductionBaseRate(opinionA, ifTrue, ifFalse, fallbackBaseRate) {
64
- const denominator = 1 - opinionA.a * ifTrue.u - (1 - opinionA.a) * ifFalse.u;
65
- if (ifTrue.u + ifFalse.u < 2 - EPSILON && Math.abs(denominator) > EPSILON) {
66
- const baseRate = (opinionA.a * ifTrue.b + (1 - opinionA.a) * ifFalse.b) / denominator;
67
- if (baseRate >= -EPSILON && baseRate <= 1 + EPSILON) {
68
- return Math.max(0, Math.min(1, baseRate));
69
- }
70
- }
71
- return fallbackBaseRate;
72
- }
73
- function safeCorrectionTerm(numerator, denominator) {
74
- if (Math.abs(denominator) <= EPSILON) {
75
- return void 0;
76
- }
77
- const value = numerator / denominator;
78
- if (!Number.isFinite(value)) {
79
- return void 0;
80
- }
81
- return Math.max(0, value);
82
- }
83
- function conditionalDeduction(opinionA, ifTrue, ifFalse, fallbackBaseRate) {
84
- const fallbackChildBaseRate = childBaseRateFallback(
85
- ifTrue,
86
- ifFalse,
87
- fallbackBaseRate
88
- );
89
- const childBaseRate = computeConditionalDeductionBaseRate(
90
- opinionA,
91
- ifTrue,
92
- ifFalse,
93
- fallbackChildBaseRate
94
- );
95
- const projectedAntecedent = project(opinionA);
96
- const projectedAntecedentComplement = 1 - projectedAntecedent;
97
- const intermediateBelief = opinionA.b * ifTrue.b + opinionA.d * ifFalse.b + opinionA.u * (ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a));
98
- const intermediateDisbelief = opinionA.b * ifTrue.d + opinionA.d * ifFalse.d + opinionA.u * (ifTrue.d * opinionA.a + ifFalse.d * (1 - opinionA.a));
99
- const intermediateUncertainty = opinionA.b * ifTrue.u + opinionA.d * ifFalse.u + opinionA.u * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));
100
- const projectedVacuousDeduction = ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a) + childBaseRate * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));
101
- const projectedConditionalA = ifTrue.b + childBaseRate * (1 - ifTrue.b - ifTrue.d);
102
- let correction = 0;
103
- if (ifTrue.b > ifFalse.b && ifTrue.d > ifFalse.d || ifTrue.b <= ifFalse.b && ifTrue.d <= ifFalse.d) {
104
- correction = 0;
105
- } else if (ifTrue.b > ifFalse.b && ifTrue.d <= ifFalse.d) {
106
- const beliefGap = ifTrue.b - ifFalse.b;
107
- const disbeliefGap = ifFalse.d - ifTrue.d;
108
- if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent <= opinionA.a) {
109
- correction = safeCorrectionTerm(
110
- opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b),
111
- projectedAntecedent * childBaseRate
112
- ) ?? 0;
113
- } else if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent > opinionA.a) {
114
- correction = safeCorrectionTerm(
115
- opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,
116
- projectedAntecedentComplement * childBaseRate * disbeliefGap
117
- ) ?? 0;
118
- } else if (projectedVacuousDeduction > projectedConditionalA && projectedAntecedent <= opinionA.a) {
119
- correction = safeCorrectionTerm(
120
- (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b) * disbeliefGap,
121
- projectedAntecedent * (1 - childBaseRate) * beliefGap
122
- ) ?? 0;
123
- } else {
124
- correction = safeCorrectionTerm(
125
- (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d),
126
- projectedAntecedentComplement * (1 - childBaseRate)
127
- ) ?? 0;
128
- }
129
- } else {
130
- const beliefGap = ifFalse.b - ifTrue.b;
131
- const disbeliefGap = ifTrue.d - ifFalse.d;
132
- if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent <= opinionA.a) {
133
- correction = safeCorrectionTerm(
134
- (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,
135
- projectedAntecedent * childBaseRate * disbeliefGap
136
- ) ?? 0;
137
- } else if (projectedVacuousDeduction <= projectedConditionalA && projectedAntecedent > opinionA.a) {
138
- correction = safeCorrectionTerm(
139
- (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b),
140
- projectedAntecedentComplement * childBaseRate
141
- ) ?? 0;
142
- } else if (projectedVacuousDeduction > projectedConditionalA && projectedAntecedent <= opinionA.a) {
143
- correction = safeCorrectionTerm(
144
- opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d),
145
- projectedAntecedent * (1 - childBaseRate)
146
- ) ?? 0;
147
- } else {
148
- correction = safeCorrectionTerm(
149
- opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b) * disbeliefGap,
150
- projectedAntecedentComplement * (1 - childBaseRate) * beliefGap
151
- ) ?? 0;
152
- }
153
- }
154
- return opinion(
155
- intermediateBelief - childBaseRate * correction,
156
- intermediateDisbelief - (1 - childBaseRate) * correction,
157
- intermediateUncertainty + correction,
158
- childBaseRate
159
- );
160
- }
161
- function negate(o) {
162
- return { b: o.d, d: o.b, u: o.u, a: 1 - o.a };
163
- }
164
- function constraintFusion(left, right, mode = "pressure") {
165
- if (mode === "redistribute") {
166
- const leftProjected = project(left);
167
- const rightProjected = project(right);
168
- const total = leftProjected + rightProjected;
169
- if (total <= 1) {
170
- return { o1: left, o2: right };
171
- }
172
- const scale = 1 / total;
173
- return {
174
- o1: opinion(
175
- left.b * scale,
176
- left.d + left.b * (1 - scale),
177
- left.u,
178
- left.a
179
- ),
180
- o2: opinion(
181
- right.b * scale,
182
- right.d + right.b * (1 - scale),
183
- right.u,
184
- right.a
185
- )
186
- };
187
- }
188
- const pressureLeft = right.b * 0.5;
189
- const pressureRight = left.b * 0.5;
190
- return {
191
- o1: opinion(
192
- left.b - pressureLeft * 0.3,
193
- left.d + pressureLeft * 0.3,
194
- left.u,
195
- left.a
196
- ),
197
- o2: opinion(
198
- right.b - pressureRight * 0.3,
199
- right.d + pressureRight * 0.3,
200
- right.u,
201
- right.a
202
- )
203
- };
204
- }
1
+ import { conditionalDeduction, mkOpinion, project, dampedDependencyCascade, trustDiscount, applyNegativeSupport, cumulativeFusion, applyNegativeEvidence, hasProjectedOpinionChanged, readOpinionFromRecord } from '@lucern/confidence';
2
+ import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
205
3
 
206
- // ../confidence/src/v1/operations/scoring.ts
207
- function finiteNumber(value) {
208
- return typeof value === "number" && Number.isFinite(value) ? value : void 0;
209
- }
210
- function clamp01(value) {
211
- return Math.max(0, Math.min(1, value));
212
- }
213
- function confidenceFromOpinion(opinion2) {
214
- return clamp01(opinion2.b + opinion2.a * opinion2.u);
215
- }
216
- function readOpinionFromRecord(source, fallback = {}) {
217
- const record = source && typeof source === "object" ? source : {};
218
- return {
219
- b: finiteNumber(record.b) ?? finiteNumber(record.belief) ?? finiteNumber(record.slBelief) ?? finiteNumber(record.opinion_b) ?? fallback.b ?? 0,
220
- d: finiteNumber(record.d) ?? finiteNumber(record.disbelief) ?? finiteNumber(record.slDisbelief) ?? finiteNumber(record.opinion_d) ?? fallback.d ?? 0,
221
- u: finiteNumber(record.u) ?? finiteNumber(record.uncertainty) ?? finiteNumber(record.slUncertainty) ?? finiteNumber(record.opinion_u) ?? fallback.u ?? 1,
222
- a: finiteNumber(record.a) ?? finiteNumber(record.baseRate) ?? finiteNumber(record.slBaseRate) ?? finiteNumber(record.opinion_a) ?? fallback.a ?? 0.5
223
- };
224
- }
225
- function hasProjectedOpinionChanged(current, next, tolerance = 0.01) {
226
- return Math.abs(confidenceFromOpinion(next) - confidenceFromOpinion(current)) >= tolerance;
227
- }
228
-
229
- // ../confidence/src/v1/operations/dynamics/cascade.ts
230
- function dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode = "continuous", threshold = 0.3) {
231
- const dependencyProjection = project(dependencyOpinion);
232
- if (mode === "threshold") {
233
- if (dependencyProjection < threshold) {
234
- return opinion(
235
- 0,
236
- beliefOpinion.d + beliefOpinion.b * 0.5,
237
- 0.5,
238
- beliefOpinion.a
239
- );
240
- }
241
- return beliefOpinion;
242
- }
243
- const dampingFactor = Math.pow(dependencyProjection, 0.5);
244
- return opinion(
245
- beliefOpinion.b * dampingFactor,
246
- beliefOpinion.d + beliefOpinion.b * (1 - dampingFactor) * 0.3,
247
- beliefOpinion.u + beliefOpinion.b * (1 - dampingFactor) * 0.7,
248
- beliefOpinion.a
249
- );
250
- }
251
- function dampedDependencyCascade(dependencyOpinion, beliefOpinion, mode = "continuous") {
252
- return {
253
- opinion: dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode),
254
- operator: "dependency_cascade",
255
- rationale: `Damped dependency cascade (${mode}): prerequisite at ${project(
256
- dependencyOpinion
257
- ).toFixed(2)}`
258
- };
259
- }
260
-
261
- // ../confidence/src/v1/operations/dynamics/defeat.ts
262
- function applyNegativeSupport(source, target, weight, metadata = {}) {
263
- if (metadata.constraint === "xor") {
264
- const result = constraintFusion(
265
- source,
266
- target,
267
- metadata.normalization ?? "pressure"
268
- );
269
- return {
270
- opinion: result.o2,
271
- operator: "constraint_fusion",
272
- rationale: `XOR constraint: source belief at ${project(source).toFixed(
273
- 2
274
- )} pressures target`
275
- };
276
- }
277
- const discounted = trustDiscount(negate(source), Math.abs(weight));
278
- return {
279
- opinion: cumulativeFusion(target, discounted),
280
- operator: "cumulative_fusion",
281
- rationale: `Contradicting evidence (weight=${weight.toFixed(
282
- 2
283
- )}) from source at ${project(source).toFixed(2)}`
284
- };
285
- }
286
- function applyNegativeEvidence(source, target, weight) {
287
- const discounted = trustDiscount(negate(source), Math.abs(weight));
288
- return {
289
- opinion: cumulativeFusion(target, discounted),
290
- operator: "cumulative_fusion",
291
- rationale: `Contradicting evidence (weight=${weight.toFixed(2)})`
292
- };
293
- }
4
+ // src/confidencePropagationDispatch.ts
294
5
 
295
6
  // src/edges/contains.ts
296
7
  var containsPropagationSpec = {
@@ -302,8 +13,6 @@ var containsPropagationSpec = {
302
13
  operator: () => null,
303
14
  description: "Structural containment only. Traversed for explicit semantics, but it never propagates opinions."
304
15
  };
305
-
306
- // src/edges/utils.ts
307
16
  function readEdgeMetadata(edge) {
308
17
  return {
309
18
  constraint: edge.constraint ?? void 0,
@@ -380,8 +89,6 @@ var contradictsPropagationSpec = {
380
89
  },
381
90
  description: "Legacy contradiction edges move negative pressure in either direction, but never beyond one hop."
382
91
  };
383
-
384
- // src/edges/dependsOn.ts
385
92
  var dependsOnPropagationSpec = {
386
93
  edgeType: "depends_on",
387
94
  direction: "incoming",
@@ -397,8 +104,18 @@ var dependsOnPropagationSpec = {
397
104
  if (metadata.conditionalA && metadata.conditionalNotA) {
398
105
  const deducedOpinion = conditionalDeduction(
399
106
  dampedSource,
400
- metadata.conditionalA,
401
- metadata.conditionalNotA,
107
+ mkOpinion(
108
+ metadata.conditionalA.b,
109
+ metadata.conditionalA.d,
110
+ metadata.conditionalA.u,
111
+ metadata.conditionalA.a
112
+ ),
113
+ mkOpinion(
114
+ metadata.conditionalNotA.b,
115
+ metadata.conditionalNotA.d,
116
+ metadata.conditionalNotA.u,
117
+ metadata.conditionalNotA.a
118
+ ),
402
119
  targetOpinion.a
403
120
  );
404
121
  return annotateRationale(
@@ -570,8 +287,6 @@ function getTraversalDirections(direction) {
570
287
  }
571
288
  return ["outgoing", "incoming"];
572
289
  }
573
-
574
- // src/workspaceIsolation.ts
575
290
  function normalizeScopeValue(value) {
576
291
  if (typeof value !== "string") {
577
292
  return;
@@ -626,16 +341,17 @@ function resolveTraversalTargetNodeId(edge, direction) {
626
341
  }
627
342
  function readNodeOpinion(node) {
628
343
  const metadata = node.metadata ?? {};
629
- return readOpinionFromRecord(
630
- {
344
+ try {
345
+ return readOpinionFromRecord({
631
346
  ...metadata,
632
347
  opinion_b: node.opinion_b,
633
348
  opinion_d: node.opinion_d,
634
349
  opinion_u: node.opinion_u,
635
350
  opinion_a: node.opinion_a
636
- },
637
- { b: 0, d: 0, u: 1, a: 0.5 }
638
- );
351
+ });
352
+ } catch {
353
+ return mkOpinion(0, 0, 1, 0.5);
354
+ }
639
355
  }
640
356
  async function collectConfidencePropagationDispatches(args) {
641
357
  const dispatchesByTargetId = /* @__PURE__ */ new Map();
@@ -704,14 +420,20 @@ async function collectConfidencePropagationDispatches(args) {
704
420
  if (!result || !hasProjectedOpinionChanged(targetOpinion, result.opinion)) {
705
421
  continue;
706
422
  }
707
- opinionCache.set(cacheKey, result.opinion);
423
+ const projectedOpinion = mkOpinion(
424
+ result.opinion.b,
425
+ result.opinion.d,
426
+ result.opinion.u,
427
+ result.opinion.a
428
+ );
429
+ opinionCache.set(cacheKey, projectedOpinion);
708
430
  const existingDispatch = dispatchesByTargetId.get(cacheKey);
709
431
  dispatchesByTargetId.set(cacheKey, {
710
432
  targetNodeId,
711
433
  edgeType: spec.edgeType,
712
434
  traversedDirection: direction,
713
435
  weight: edge.weight ?? 1,
714
- opinion: result.opinion,
436
+ opinion: projectedOpinion,
715
437
  operator: result.operator,
716
438
  rationale: existingDispatch ? `${existingDispatch.rationale}; ${result.rationale}` : result.rationale,
717
439
  hop: nextHop
@@ -719,7 +441,7 @@ async function collectConfidencePropagationDispatches(args) {
719
441
  if (canContinueTransitively(spec, nextHop)) {
720
442
  queue.push({
721
443
  nodeId: targetNodeId,
722
- opinion: result.opinion,
444
+ opinion: projectedOpinion,
723
445
  hop: nextHop,
724
446
  visitedNodeIds: /* @__PURE__ */ new Set([
725
447
  ...state.visitedNodeIds,